3.5.6 efiction version 3.5.6
3.5.6 efiction version

file:a/README.md -> file:b/README.md
--- a/README.md
+++ b/README.md
@@ -1,3 +1,54 @@
-# efiction-3.5.6
-Efiction CMS version 3.5.6 
+# efiction v3.5.6
 
+non official version of 3.5.x efiction software
+
+## Only for testing purposes
+
+
+### Database changes:
+
+- all date fields from datestamp format to unix time format
+
+### File's changes
+
+- related date field type changes
+- found issues fixed
+- deleted bridges 
+
+### Looking for missing modules
+If you have source code of missing and used modules, share it and I can try to add and fix them
+
+
+### Installation
+No change
+
+### Update
+Classic as before, run update process that should change your date fields without lossing your data. It works only for update from 3.5.5, not sooner.
+
+
+
+<code>
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+see more in README.txt file
+</code>
+

file:b/README.txt (new)
--- /dev/null
+++ b/README.txt
@@ -1,1 +1,148 @@
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+
+There are notes in the docs/ folder about the changes to skins in this version.
+However, there is no tutorial as of yet.  
+
+It's also strongly suggested that you NOT put the site into maintenance mode or 
+start modifying the script (even by adding modules or blocks) until you've 
+actually confirmed that the install was successful.
+
+
+Upgrading from v.1.1:
+
+BACK UP YOUR FILES AND YOUR DATABASE FIRST!!  Upload the 3.0 files OVER your 1.1
+files.  DO NOT DELETE YOUR 1.1 FILES UNTIL THE UPGRADE IS COMPLETE!  Go to your site.  
+The script will detect that the config.php file is for 1.1 and start the upgrade.  
+
+Note: You're encouraged to choose one of the skins provided with the 3.0 
+script until you can update your 1.1 skins.  There are numerous changes in the
+skins from 1.1 to 3.0.  
+
+Note 2: Make sure your config.php file is CHMOD'd to 666.
+
+Upgrading from v.2.0.X:
+
+BACK UP YOUR FILES AND YOUR DATABASE FIRST!!  Upload the 3.0 files OVER your 2.0
+files.  DO NOT DELETE YOUR 2.0 FILES UNTIL THE UPGRADE IS COMPLETE!  Go to your site.  
+The script will detect that the config.php file is for 2.0 and start the upgrade.  
+
+Note: You're encouraged to choose one of the skins provided with the 3.0 
+script until you can update your 2.0 skins.
+
+Note 2: Make sure your config.php file is CHMOD'd to 666.
+
+Note 3: If you have installed blocks that did not come with the 2.0 package, 
+turn them off before starting the upgrade.  They will most likely be
+incompatible!
+
+Minor Upgrade from v.3.X to v.3.Y:
+
+BACK UP YOUR FILES AND YOUR DATABASE FIRST!!  Upload the 3.Y files OVER your 3.X
+files making sure you do not over-write your config.php file.  Generally, the images,
+tinymce, and skins folders will contain no updates and do not need to be replaced.
+Go to your eFiction site.  The script should detect the updated files and ask you 
+to update.  If it doesn't go to http://www.yoursite.com/update.php. 
+
+NOTE: If you have your site bridged, remember to put the bridge back in place 
+before running the update. 
+
+Brand New Install:
+
+If you know basic web stuff like CHMODing, look below at step #1. If you have
+no clue what you're doing, just go to http://www.yoursite.com/ after uploading 
+all the files to your server.
+
+1) If you intend to write the story texts to the server or allow image uploads, you
+must create a folder where these files will be stored. CHMOD this folder to 777.  
+During installation, the script will ask you for the location of this folder.  
+If this folder is missing the script will attempt to create it for you during the 
+install, but it is best if you create the folder yourself before beginning the
+installation script.  
+
+2) Move config.php from the docs folder to the main eFiction folder.  This file was
+placed in the docs folder to help prevent accidental overwriting of config.php
+for upgrades. If the config.php is missing the install script will attempt to 
+create it, but it's best if you move it.
+
+3) CHMOD config.php to 666.  
+
+4) Go to http://www.yoursite.com/ to run the install and set up the admin login.
+
+5) Login with the admin login and password set in step #4, and complete the
+configuration of your site through the Admin panel.
+
+Other info:
+
+1) As written, the script is intended to be used in the following way:
+
+- Categories: you can have only one category, or as many as you want, including 
+sub-categories.  Categories were written with the intention that they would 
+indicate different fandoms or categories of story.
+- Characters: Intended to mean the characters that fall within that fandom or 
+category.
+- Classifications: Beyond categories and characters you can set up your own 
+classifications such as genres, warnings, spoilers, story type, couple, etc.  
+- Series: Series are collections of related stories by the same or multiple 
+authors.  A story and its sequels, for example, would be a series.  Series 
+might also be used for a "shared universe" in which multiple authors write.  
+The person who creates the series is considered the series "owner" and
+controls whether or not the series is "open" to contributions by other 
+authors or not.  Even if the series is "closed", the series owner has the 
+option to include stories from other authors in the series.  
+- Challenges: Challenges are ideas/wishes for stories that a member or an 
+anonymous visitor "challenges" authors to write.  Stories written in response 
+to the challenge can be listed under the challenge by the story author or an admin.  
+Note: in 3.0 challenges have been made into an optional module.  To install 
+challenges goto http://www.yoursite.com/modules/challenges/install.php.
+
+Check out the Admin area for more information on all of these settings and more.
+
+2) You can modify most of the text that is displayed in the script by changing the 
+language file in the languages/ folder for the language you selected. Just change 
+the text within the quotes for each line to whatever you want it to say.  Some 
+wording is included within the skin's files.  If you have created a translation for 
+eFiction, we encourage you to share it!
+
+Original Developer:
+Rebecca Smallwood (Rivka)
+http://orodruin.sourceforge.net
+
+2.0 Developer: Tammy Keefer
+
+Released under the GPL.
+
+
+Credits:
+
+Fanfiction Script: Rebecca Smallwood (Rivka)
+TemplatePower Templating System: R.P.J. Velzeboer, http://templatepower.codocad.com/
+
+A Big Thank You to my original Beta-testers: Theresa Sanchez, Khuffie, Mona Carol-Kaufman, 
+Michele Bumbarger, Stephanie Smith, eFanfiction, Amy Cheng, arakune, Peganino, Ceit, 
+brihana25, Annabelle Crane
+
+Big thanks also to the 2.0 beta-testers: babaca, Jayelle, Carrie, Nicole, eyedam, 
+Dreamhowler, Roberto-san, Calic0cat, West4me, emmekappa, Osfer, Sarit, Silvermoon, 
+Carissa, Jan_AQ, Lazuli
+
+Also thanks for our 3.0 Beta testers who were too many to name.

file:b/admin.php (new)
--- /dev/null
+++ b/admin.php
@@ -1,1 +1,91 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+$current = "adminarea";
+
+if(isset($_GET['action']) && ($_GET['action'] == "categories" || $_GET['action'] == "admins")) $displayform = 1;
+
+$disableTiny = true;
+
+include ("header.php");
+
+
+
+//make a new TemplatePower object
+if(file_exists("$skindir/default.tpl")) $tpl = new TemplatePower( "$skindir/default.tpl" );
+else $tpl = new TemplatePower("default_tpls/default.tpl");
+include("includes/pagesetup.php");
+if(file_exists("languages/".$language."_admin.php")) include_once("languages/".$language."_admin.php");
+else include_once("languages/en_admin.php");
+// end basic page setup
+
+// check that user has permissions to perform this action before going further.  Otherwise kick 'em
+	if(!isADMIN) accessDenied( );
+	$adminquery = dbquery("SELECT categories FROM ".TABLEPREFIX."fanfiction_authorprefs WHERE uid = '".USERUID."' LIMIT 1");
+	list($admincats) = dbrow($adminquery);
+	if(empty($admincats)) $admincats = "0";
+	$output = "<div style='text-align: center; margin: 1em;'>";
+	$panelquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_hidden != '1' AND panel_type = 'A' AND panel_level >= ".uLEVEL." ORDER BY panel_level DESC, panel_order ASC, panel_title ASC");
+	if(!dbnumrows($panelquery)) $output .= _FATALERROR;
+	$panellist = array();
+	while($panel = dbassoc($panelquery)) {
+		if(!$panel['panel_url']) $panellist[$panel['panel_level']][]= "<a href=\"admin.php?action=".$panel['panel_name']."\">".$panel['panel_title']."</a>";
+		else $panellist[$panel['panel_level']][] = "<a href=\"".$panel['panel_url']."\">".$panel['panel_title']."</a>";
+	}
+	foreach($panellist as $accesslevel => $row) {
+		$output .= implode(" | ", $row)."<br />";
+	}
+	$output .= "</div>\n";
+	if($action) {
+		$panelquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_name = '$action' AND panel_type = 'A' LIMIT 1");
+		if(dbnumrows($panelquery)) {
+			$panel = dbassoc($panelquery);
+			if((isset($panel['panel_level']) ? $panel['panel_level'] : 0) >= uLEVEL) {
+				if($panel['panel_url'] && file_exists(_BASEDIR.$panel['panel_url'])) require_once(_BASEDIR.$panel['panel_url']);
+				else if (file_exists("admin/{$action}.php")) require_once("admin/{$action}.php");
+			}
+			else accessDenied( );
+		}
+	}
+	else {
+		if (file_exists("install"))
+			$output .= write_error(_SECURITYDELETE);
+		$adminnotices = "";
+		$countquery = dbquery("SELECT COUNT(DISTINCT chapid) FROM ".TABLEPREFIX."fanfiction_chapters WHERE validated < 1");
+		list($count) = dbrow($countquery);
+		if($count) $adminnotices .= write_message(sprintf(_QUEUECOUNT, $count));
+		$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'adminnotices'");
+		while($code = dbassoc($codequery)) {
+			eval($code['code_text']);
+		}
+
+		$output .= write_message("Actual time: ". time() );
+		$output .= write_message("Date format: " . $dateformat);
+		$output .= write_message(date("$dateformat", time())); 	
+ 
+		$output .= write_message($adminnotices);
+		$output .= write_message(_RUNNINGVERSION);
+	}	
+	$tpl->assign( "output", $output );
+	$tpl->printToScreen();
+	dbclose( );
+?>

file:b/admin/admins.php (new)
--- /dev/null
+++ b/admin/admins.php
@@ -1,1 +1,118 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+	if(isset($_GET['do'])) $do = $_GET["do"];
+	else $do = false;
+	if(isset($_GET["revoke"])) {
+		if(isset($_GET["confirm"])) {
+			$output .= "<div id='pagetitle'>"._REVOKEADMIN."</div>";
+			if($_GET["confirm"] == "yes" && USERUID != $_GET['revoke']) {
+				$result = dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET level = '0' WHERE uid = '".$_GET['revoke']."'");
+				if($result) $output .=  write_message(_ACTIONSUCCESSFUL);
+				else {
+					$result = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_authorprefs(`level`, `uid`) VALUES ('0', '".$_GET['revoke']."')"); // shouldn't be possible, but better safe than sorry.
+					$output .= write_error(_ERROR." "._TRYAGAIN);
+				}
+			}
+			else 
+			$output .= write_message(_ACTIONCANCELLED);
+		}
+		else {
+			$output .= write_message(_CONFIRMADMINREVOKE." [ <a href=\"admin.php?action=admins&confirm=yes&revoke=".$_GET['revoke']."\">"._YES."</a> | <a href=\"admin.php?action=admins&confirm=no&revoke=".$_GET['revoke']."\">"._NO."</a> ]</center>");
+		}
+	}
+	else if($do) {
+		if(isset($_POST['submit'])) {
+			$contact = (isset($_POST['contact']) && $_POST['contact'] == "on" ? "1" : "0");
+			if($_POST['catid']) $categories = $_POST['catid'];
+			else $categories = "0";
+			if(check_prefs($_POST['uid'])) $result = dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET level = '".$_POST['adlevel']."', contact = '$contact', categories = '$categories' WHERE uid = '".$_POST['uid']."'");
+			else $result = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_authorprefs(`level`, `contact`, `categories`,  `uid`) VALUES ('".$_POST['adlevel']."', '$contact', '$categories', '".$_POST['uid']."')");
+			if($result) $output .= write_message(_ACTIONSUCCESSFUL._BACK2ADMIN);
+			else $output .= write_message(_ERROR);
+		}
+		else {
+			if($do == "edit") {
+				$uid = $_GET['uid'];
+				$info = dbquery("SELECT "._PENNAMEFIELD." as penname, level, categories, contact FROM "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs as ap ON ap.uid = "._UIDFIELD." WHERE "._UIDFIELD." = '$uid' LIMIT 1");
+				list($penname, $adlevel, $adcategories, $adcontact) = dbrow($info);
+				$catid = explode(",", $adcategories);
+			}
+			$uid = isset($_REQUEST['uid']) ? $_REQUEST['uid'] : false;
+			if(!isNumber($uid)) $uid = false;
+			$output .= "<div id=\"pagetitle\">".($do == "edit" ? _EDITADMIN : _ADDADMIN)."</div>
+				<form method=\"POST\" name=\"form\" enctype=\"multipart/form-data\" action=\"admin.php?action=admins&do=$do\">
+				<div><label for=\"uid\">"._PENNAME.": </label>";
+			if($do == "new") {
+				$query = dbquery("SELECT "._PENNAMEFIELD." AS penname, "._UIDFIELD." AS uid, ap.level FROM "._AUTHORTABLE." LEFT  JOIN ".TABLEPREFIX."fanfiction_authorprefs AS ap ON "._UIDFIELD." = ap.uid ORDER  BY "._PENNAMEFIELD);
+				$output .= "<select name=\"uid\">";
+				while($users = dbassoc($query)) {
+					if(!$users['level']) $output .= "<option value=\"".$users['uid']."\"".($uid == $users['uid'] ? " selected" : "").">".$users['penname']."</option>";
+				}	
+				$output .= "</select></div>";
+			}
+			else if($do == "edit" && !empty($uid)) {
+				$output .= $penname."<input type=\"hidden\" name=\"uid\" value=\"$uid\"></div>";
+			}
+			$output .= "<div><label for=\"adlevel\">"._LEVEL.":</label>  <select name=\"adlevel\">";
+				for($x = 1; $x < 5; $x++) {
+					$output .= "<option value=\"$x\"".(isset($adlevel) && $adlevel == $x ? " selected" : "").">$x</option>";
+				}
+			$output .= "</select><A HREF=\"#adlevel\" class=\"pophelp\">[?]<span>"._HELP_ADLEVEL."</span></A></div>";
+			include("includes/categories.php");
+			$output .= (isset($adcategories) ? "<input type=\"hidden\" name=\"oldcats\" value=\"$adcategories\">" : "")."
+				<div><label for=\"contact\">"._CONTACT.":</label>
+				<INPUT type=\"checkbox\" class=\"checkbox\" name=\"contact\"".(isset($adcontact) && $adcontact == 1 ? " checked" : "").">
+				<A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_CONTACTSUB."</span></A></div>
+				<INPUT type=\"submit\" class=\"button\" id=\"submit\" value=\""._SUBMIT."\" name=\"submit\">
+				</form>";
+		}
+	}
+	else if(isset($_GET['category'])) {
+		$where = "WHERE (categories = '0' OR FIND_IN_SET('".$_GET['category']."', categories) > 0) AND ap.level > 0";
+		list($category) = dbrow(dbquery("SELECT category FROM ".TABLEPREFIX."fanfiction_categories WHERE catid = '".$_GET['category']."' LIMIT 1"));
+		$output .= "<center><p><b>$category "._ADMINS."</b></p>";
+		$authorlink = "<a href=\"admin.php?action=admins&amp;do=edit&amp;uid=";
+		$pagelink = "admin.php?action=admin&amp;category=".$_GET['category']."&amp;";
+		$countquery = "SELECT count(uid) FROM ".TABLEPREFIX."fanfiction_authorprefs as ap $where";
+		$authorquery = "SELECT count(stories.sid) as stories, "._PENNAMEFIELD." as penname, "._UIDFIELD." as uid FROM ".TABLEPREFIX."fanfiction_authorprefs as ap, "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_stories as stories ON ("._UIDFIELD." = stories.uid) AND "._UIDFIELD." > 0 AND stories.validated > 0 $where AND ap.level > 0 ".(isset($letter) ? " AND $letter" : "")." AND ap.uid = "._UIDFIELD." GROUP BY "._UIDFIELD;
+		include("includes/members_list.php");
+		$output .= "<p><a href=\"admin.php?action=admins&do=new&category=".$_GET['category']."\">"._ADDADMIN."</a></p>";
+	}
+	else {
+
+		if($let == _OTHER) $letter = _PENNAMEFIELD." REGEXP '^[^a-z]'";
+		else $letter = _PENNAMEFIELD." LIKE '".$let."%'";
+		$output .= "<div class=\"sectionheader\">"._ADMINS."</div>";
+		$authorlink = "<a href=\"admin.php?action=admins&amp;do=edit&amp;uid=";
+		$pagelink = "admin.php?action=admins&amp;";
+		$countquery = "SELECT count(uid) FROM ".TABLEPREFIX."fanfiction_authorprefs WHERE level > 0";
+		$authorquery = "SELECT "._PENNAMEFIELD." as penname, "._UIDFIELD." as uid, count(stories.uid) as stories FROM (".TABLEPREFIX."fanfiction_authorprefs as ap, "._AUTHORTABLE.") LEFT JOIN ".TABLEPREFIX."fanfiction_stories as stories ON ("._UIDFIELD." = stories.uid) AND stories.validated > 0 WHERE ap.level > 0 ".(isset($letter) ? " AND $letter" : "")." AND ap.uid = "._UIDFIELD." GROUP BY "._UIDFIELD;
+		include("includes/members_list.php");
+		$output .= write_message("<a href=\"admin.php?action=admins&do=new\">"._ADDADMIN."</a>");
+	}
+
+?>

--- /dev/null
+++ b/admin/authorfields.php
@@ -1,1 +1,126 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+$field = isset($_GET['field']) ? $_GET['field'] : false;
+$list = true;
+$fieldtypes = array("1" => _FIELDURL, "2" => _FIELDSELECT, "3" => _FIELDYESNO, "4" => _FIELDIDURL, "5" => _FIELDCUSTOM, "6" => _TEXT);
+if(!empty($_GET['delete'])) {
+	$delete = $_GET['delete'];
+	$confirm = isset($_GET['confirm']) ? $_GET['confirm'] : false;
+	if($confirm == "yes" && isNumber($delete)) {
+		$result = dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_authorfields WHERE field_id = '$delete' LIMIT 1");
+		if($result) $output .= write_message(_ACTIONSUCCESSFUL);
+		else $output .= write_error(_ERROR);
+
+	}
+	else if($confirm == "no") {
+		$output .= write_message(_ACTIONCANCELLED);
+	}
+	else {
+		$output .= write_message(_CONFIRMDELETE."<br /><br />
+					[ <a href=\"admin.php?action=authorfields&amp;delete=$delete&amp;confirm=yes\">"._YES."</a> | <a href=\"admin.php?action=authorfields&amp;delete=$delete&amp;confirm=no\">"._NO."</a> ]");
+
+	}
+}
+if(!empty($_GET['edit'])) {
+	$new = $_GET['edit'] == "new" ? true : false;
+	if(isset($_POST['submit'])) {
+		$field_name = isset($_POST['field_name']) ? descript($_POST['field_name']) : "";
+		$field_title = isset($_POST['field_title']) ? descript($_POST['field_title']) : "";
+		$field_type = isset($_POST['field_type']) && isNumber($_POST['field_type'])? $_POST['field_type'] : "0";
+		$field_on = isset($_POST['field_on']) && $_POST['field_on'] == "on" ? "1" : "0";
+		$field_options = "";
+		$code_in = "";
+		$code_out = "";
+		if(!$field_type) {
+			$output .= write_error(_NOFIELDTYPE);	
+		}
+		else {
+			if($field_type == 4) $field_options = isset($_POST['options_4']) ? descript($_POST['options_4']) : "";
+			if($field_type == 2) $field_options = implode("|#|", explode("\r\n", ltrim(strip_tags(preg_replace( '!<p>!iU', "\r\n",  stripslashes(trim($_POST['options_2']))), preg_replace("!<p>!iu", "", $allowed_tags)))));
+			if($field_type == 5) {
+				$code_in = isset($_POST['code_in']) ? descript($_POST['code_in']) : "";
+				$code_out = isset($_POST['code_out']) ? descript($_POST['code_out']) : "";
+			}
+			if($new) {
+				$result = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_authorfields(`field_name`, `field_title`, `field_type`, `field_options`, `field_code_in`, `field_code_out`, `field_on`) 
+					VALUES('".escapestring($field_name)."', '".escapestring($field_title)."', '$field_type', '".escapestring($field_options)."', '".escapestring($code_in)."', '".escapestring($code_out)."', '$field_on');");
+			}
+			else {
+				$result = dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorfields SET field_type = '$field_type', field_name = '".escapestring($field_name)."', field_title = '".escapestring($field_title)."', field_options = '".escapestring($field_options)."', field_code_in = '".escapestring($code_in)."', field_code_out = '".escapestring($code_out)."', field_on = '$field_on' WHERE field_id = '".$_GET['edit']."'");
+			}
+			if($result) $output .= write_message(_ACTIONSUCCESSFUL);
+			else $output .= write_error(_ERROR);
+		}
+	}
+	else {
+		if($new) {
+			$fieldinfo = array("field_type" => "", "field_id" => "", "field_name" => "", "field_title" => "", "field_options" => "", "field_code_in" => "", "field_code_out" => "", "field_on" => "0");
+		}
+		else {
+			$fieldinfo = dbassoc(dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_authorfields WHERE field_id = '".$_GET['edit']."' LIMIT 1"));
+		}
+		$output .= "
+		<div class='sectionheader'>".($new ? _ADDFIELD : _EDITFIELD)."</div>
+			<div><form method=\"POST\" id='settingsform' enctype=\"multipart/form-data\" action=\"admin.php?action=authorfields&amp;edit=".$_GET['edit']."\">
+			<label for='field_name'>"._NAME.":</label> <input type='text' class='textbox' name='field_name' id='field_name' value='".$fieldinfo['field_name']."'><br />
+			<label for='field_title'>"._TITLE.":</label> <input type='text' class='textbox' name='field_title' id='field_title' value='".$fieldinfo['field_title']."'><br />
+			<div><label for='field_on'>"._FIELDON.":</label> <input type='checkbox' name='field_on' id='field_on'".($fieldinfo['field_on'] ? " checked='checked'" : "")."></div>
+			<label for='field_type'>"._TYPE.":</label> <select name='field_type' id='field_type' onchange=\"javascript:displayTypeOpts()\">";
+		foreach($fieldtypes as $id => $name) {
+				$output .= "<option value='$id'".(isset($fieldinfo) && $fieldinfo['field_type'] == $id ? " selected" : "").">$name</option>";
+		}
+		$output .= "</select> <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_FIELDTYPE."</span></A><br />
+			<div id='opt_2'".($fieldinfo['field_type'] == 2 ? "" :"style='display: none;'")."><label for='options_2'>"._FIELDSELECT.":</label><A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_FIELDSELECT."</span></A><div style='margin-left: 30%; padding-left: 1em;'><textarea style='width: 100%; height: 150px;' name='options_2' cols='35' rows='4' class='mceNoEditor' id='options_2'>".($fieldinfo['field_type'] == 2 ? preg_replace("@\|#\|@", "\n", stripslashes($fieldinfo['field_options'])) : "")."</textarea></div>";
+				if($tinyMCE) 
+				$output .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('options_2');\"><label for='toggle'>"._TINYMCETOGGLE."</label></div>";
+		$output .= "</div>
+			<div id='opt_4'".($fieldinfo['field_type'] == 4 ? "" :"style='display: none;'")."><label for='options_4'>"._FIELDIDURL.":</label><input type='text' name='options_4' id='options_4' ".($fieldinfo['field_type'] == 4 ? "value='".stripslashes($fieldinfo['field_options'])."'" : "")."><A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_FIELDIDURL."</span></A></div>
+			<div id='opt_5'".($fieldinfo['field_type'] == 5 ? "" :"style='display: none;'").">
+				<label for='code_in'>"._FIELDCODEIN.":</label><A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_FIELDCODEIN."</span></A><div style='margin-left: 30%; padding-left: 1em;'><textarea cols='35' rows='4' style='width: 100%; height: 150px;' name='code_in' class='mceNoEditor' id='code_in'>".stripslashes($fieldinfo['field_code_in'])."</textarea>";
+		$output .= "</div>
+				<label for='code_out'>"._FIELDCODEOUT.":</label><A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_FIELDCODEOUT."</span></A><div style='margin-left: 30%; padding-left: 1em;'><textarea name='code_out' cols='35' rows='4'  style='width: 100%; height: 150px;' class='mceNoEditor' id='code_out'>".stripslashes($fieldinfo['field_code_out'])."</textarea>";
+		$output .= "</div>
+			</div>
+			<div id='submitdiv'><INPUT type='submit' id='submit' class='button' value='"._SUBMIT."' name='submit'></div></form><div class='cleaner'>&nbsp;</div></div>";
+
+		$list = false;
+	}
+}
+else if(!empty($_GET['delete'])) {
+
+}
+if($list) {
+	$fields = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_authorfields");
+	if(dbnumrows($fields) > 0) {
+		$output .= "<table class='tblborder' style='margin: 0 auto;'><tr><th class='tblborder'>"._NAME."</th><th class='tblborder'>"._STATUS."</th><th class='tblborder'>"._OPTIONS."</th></tr>";
+		while($field = dbassoc($fields)) {
+			$output .= "<tr><td class='tblborder'>".(empty($field['field_title']) ? $field['field_name'] : $field['field_title'])."</td><td class='tblborder' style='text-align: center;'>".($field['field_on'] ? _ON : _OFF)."</td><td class='tblborder'><a href='admin.php?action=authorfields&amp;edit=".$field['field_id']."'>"._EDIT."</a> | <a href='admin.php?action=authorfields&amp;delete=".$field['field_id']."'>"._DELETE."</a></td></tr>";
+		}
+		$output .= "<tr><td class='tblborder' colspan='3' style='text-align: center;'><a href='admin.php?action=authorfields&amp;edit=new'>"._ADDNEWFIELD."</a></td></tr></table>";
+	}
+}
+?>

file:b/admin/backup.php (new)
--- /dev/null
+++ b/admin/backup.php
@@ -1,1 +1,84 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+//
+// Size fix / UTF-8 feature 2016-05-18
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+define("_BASEDIR", "../");
+include("../config.php");
+
+$settingsresults = dbquery("SELECT * FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '$sitekey'");
+$settings = dbassoc($settingsresults);
+foreach($settings as $var => $val) {
+	$$var = stripslashes($val);
+	$settings[$var] = htmlspecialchars($val);
+}
+if(!defined("SITEKEY")) define("SITEKEY", $settings['sitekey']);
+unset($settings['sitekey']);
+if(!defined("TABLEPREFIX")) define("TABLEPREFIX", $settings['tableprefix']);
+unset($settings['tableprefix']);
+$debug = 0;
+include("../languages/".$language.".php");
+include("../languages/".$language."_admin.php");
+$file_name = str_replace(" ", "_", $sitename).date("m-d-Y").".sql";
+Header("Content-type: application/octet-stream");
+Header("Content-Disposition: attachment; filename=" . $file_name . "");
+
+session_start( );
+require_once("../includes/queries.php");
+require_once("../includes/get_session_vars.php");
+$debug = false;  // Because we don't want debug info mucking up our backup.
+
+if(!isADMIN) die( );
+
+// Database backup
+function datadump ($table) {
+    echo "# Dump of $table \r\n";
+    echo "# Dump DATE : " . date("d-M-Y") ."\r\n\r\n";
+
+    $tabledata = dbquery("SELECT * FROM $table");
+
+	while($t = dbassoc($tabledata)) {
+		echo "INSERT INTO ".$table." ";
+		$row = array( );
+		foreach($t AS $field => $value) {			
+			$value = escapestring($value);
+			$value = str_replace("\n","\\n",$value);
+			if (isset($value)) $row[$field] = "\"$value\"";
+			else $row[$field] = "\"\"";
+		}   
+		echo "VALUES(".implode(", ", $row).");\r\n";
+	}
+	echo "\r\n\r\n\r\n";
+}
+
+	$alltables = dbquery("SHOW TABLES");
+
+	while ($table = dbassoc($alltables)) {
+			datadump(current($table));
+	}
+
+ 	if($logging) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_BACKUP, USERPENNAME, USERUID))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'AM', " . time() . ")");
+	exit( );
+
+?>

--- /dev/null
+++ b/admin/backup_utf8.php
@@ -1,1 +1,86 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+//
+// Size fix / UTF-8 feature 2016-05-18
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+define("_BASEDIR", "../");
+$action = "backup";
+include("../config.php");
+
+$settingsresults = dbquery("SELECT * FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '$sitekey'");
+$settings = dbassoc($settingsresults);
+foreach($settings as $var => $val) {
+	$$var = stripslashes($val);
+	$settings[$var] = htmlspecialchars($val);
+}
+if(!defined("SITEKEY")) define("SITEKEY", $settings['sitekey']);
+unset($settings['sitekey']);
+if(!defined("TABLEPREFIX")) define("TABLEPREFIX", $settings['tableprefix']);
+unset($settings['tableprefix']);
+$debug = 0;
+include("../languages/".$language.".php");
+include("../languages/".$language."_admin.php");
+$file_name = str_replace(" ", "_", $sitename).date("m-d-Y").".sql";
+header("Content-Type: text/html; charset=utf-8");
+Header("Content-type: application/octet-stream");
+Header("Content-Disposition: attachment; filename=".$file_name."");
+
+session_start( );
+require_once("../includes/queries.php");
+require_once("../includes/get_session_vars.php");
+$debug = false;  // Because we don't want debug info mucking up our backup.
+
+if(!isADMIN) die( );
+
+// Database backup
+function datadump ($table) {
+    echo "# Dump of $table \r\n";
+    echo "# Dump DATE : " . date("d-M-Y") ."\r\n\r\n";
+
+    $tabledata = dbquery("SELECT * FROM $table");
+
+	while($t = dbassoc($tabledata)) {
+		echo "INSERT INTO ".$table." ";
+		$row = array( );
+		foreach($t AS $field => $value) {			
+			$value = utf8_encode (escapestring($value) );
+			$value = str_replace("\n","\\n",$value);
+			if (isset($value)) $row[$field] = "\"$value\"";
+			else $row[$field] = "\"\"";
+		}   
+		echo "VALUES(".implode(", ", $row).");\r\n";
+	}
+	echo "\r\n\r\n\r\n";
+}
+
+	$alltables = dbquery("SHOW TABLES");
+
+	while ($table = dbassoc($alltables)) {
+			datadump(current($table));
+	}
+
+ 	if($logging) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_BACKUP, USERPENNAME, USERUID))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'AM', " . time() . ")");
+	exit( );
+
+?>

file:b/admin/blocks.php (new)
--- /dev/null
+++ b/admin/blocks.php
@@ -1,1 +1,117 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+function save_blocks( $blocks ) {
+	
+	foreach($blocks as $block =>$value) {
+		unset($blockvars);
+		if((isset($_GET['admin']) && $_GET['admin'] != $block) || (isset($_GET['init']) && $_GET['init'] != $block)) continue;
+		foreach($value as $var=>$val) {
+			if($var != "name" && $var != "title" && $var != "file" && $var != "status") $blockvars[$var] = $val;
+		}
+		$tmp_title = isset($value['title']) ? escapestring($value['title']) : "";
+		$tmp_file  = isset($value['file']) ?  $value['file'] : "";
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_blocks SET block_name = '$block', block_title = '". $tmp_title."', block_file = '". $tmp_file."', block_status = '".$value['status']."', block_variables =  '".(isset($blockvars) ? addslashes(serialize($blockvars)) : "")."' WHERE block_name = '$block'");
+	}
+}
+if(isset($_GET['admin'])) $admin = $_GET['admin'];
+else $admin = false;
+$content = "";
+
+	if($admin) {
+		$output .= "<div id='pagetitle'>"._ADMIN." - ".(isset($blocks[$_GET['admin']]['title']) ? $blocks[$_GET['admin']]['title'] : "")."</div>";
+		include("blocks/".$_GET['admin']."/admin.php");
+		save_blocks( $blocks );
+	}
+	if(isset($_GET['init'])) {
+		if(file_exists("blocks/".$_GET['init']."/init.php")) include("blocks/".$_GET['init']."/init.php");
+		else return _ERROR;
+		save_blocks( $blocks );
+	}
+
+	if(isset($_POST['submit']) && empty($admin)) {
+		$x = 1;
+ 
+		while(isset($_POST[$x])) {
+			// activate inactive blocks.
+			if(isset($blocks[$_POST[$x]])) {
+				$tmp_title  = isset($_POST[$x . "_title"]) ? descript($_POST[$x . "_title"]) : "";
+				$tmp_status = isset($_POST[$x . "_status"]) ? descript($_POST[$x . "_status"]) : "";
+				$blocks[$_POST[$x]]['title'] = $tmp_title;
+				$blocks[$_POST[$x]]["status"] = $tmp_status;
+			}
+			$x++;	
+		}
+		save_blocks( $blocks );
+		$output .= write_message(_ACTIONSUCCESSFUL);
+	}
+// In case the skin has already overridden the block settings or we've just changed the settings.
+
+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks");
+while ($block = dbassoc($blockquery))
+{
+	if ($block['block_variables'] > 0)
+	{
+		$block_vars = @unserialize($block['block_variables']);
+		if ($block_vars)
+		{
+			$blocks[$block['block_name']] = $block_vars;
+		}
+		//else
+		//{
+		//	print_r($block);
+		//}
+	}
+	$blocks[$block['block_name']]['title'] = $block['block_title'];
+	$blocks[$block['block_name']]['file'] = $block['block_file'];
+	$blocks[$block['block_name']]['status'] = $block['block_status'];
+}
+	unset($content);
+
+if(empty($admin)) {
+	$output .= "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=blocks\"><center><table class=\"tblborder\" cellpadding=\"3\"><tr><th>"._NAME."</th><th>"._TITLE."</th><th>"._STATUS."</th><th>"._ADMIN."</th></tr>";
+	$x = 1;
+	$directory = opendir("blocks");
+	while($filename = readdir($directory)) {
+			if($filename=="." || $filename==".." || !is_dir("blocks/".$filename)) continue;
+			$output .= "<tr><td class=\"tblborder\"><input type=\"hidden\" name=\"$x\" value=\"$filename\">$filename</td>";
+			if(isset($blocks[$filename]['file'])) $output .= "<td class=\"tblborder\"><input name=\"{$x}_title\" type=\"text\" class=\"textbox\" value=\"".stripslashes($blocks[$filename]['title'])."\"><input name=\"{$x}_file\" type=\"hidden\" value=\"".$blocks[$filename]['file']."\"></td>
+				<td class=\"tblborder\"><select name=\"{$x}_status\">
+					<option value=\"0\"".(!$blocks[$filename]['status'] ? " selected" : "").">"._INACTIVE."</option>
+					<option value=\"1\"".($blocks[$filename]['status'] == 1? " selected" : "").">"._ACTIVE."</option>
+					<option value=\"2\"".($blocks[$filename]['status'] == 2 ? " selected" : "").">"._INDEXONLY."</option>
+					</select></td>
+				<td class=\"tblborder\">".(file_exists("blocks/$filename/admin.php") ? "<a href=\"admin.php?action=blocks&admin=$filename\">"._OPTIONS."</a>" :  _NONE);
+			else $output .= "<td class=\"tblborder\" colspan=\"3\" align=\"center\"><a href=\"admin.php?action=blocks&init=$filename\">"._INITIALIZE."</a>";
+			$output .= "</td></tr>";
+			$x++;
+	}
+	closedir($directory);
+	$output .= "</table><br /><INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></form>";
+}
+// Now load the skin settings back in.
+	if(file_exists("$skindir/variables.php")) include("$skindir/variables.php"); 
+?>

--- /dev/null
+++ b/admin/categories.php
@@ -1,1 +1,235 @@
-
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+function build_cat_row($thiscat, $thiscatinfo) {
+	global $catlist, $oddeven, $onpic, $down, $up;
+	$space = "";
+	if($thiscatinfo['leveldown'] % 2) $class = "odd";
+	else $class = "even";
+	for($count = 0; $count < $thiscatinfo['leveldown']; $count++) {
+		$space .= "&nbsp;&nbsp;&nbsp;";
+	}
+	$output = "<tr id='catid_".$thiscat."' ".($thiscatinfo['leveldown'] > 0 ? "style='display: none;'" : "")." class='$class'>\n\t<td class='tblborder'>".$space;
+	$subs = ""; $downlink = "&nbsp;"; $uplink = "&nbsp;";
+	$$thiscat = $catlist;
+	foreach($$thiscat as $cat => $catinfo) {
+		if($catinfo['pid'] == $thiscatinfo['pid'] && $thiscatinfo['order'] > $catinfo['order']) $uplink = "<a href=\"admin.php?action=categories&go=up&displayorder=".$thiscatinfo['order']."&parentcatid=".$thiscatinfo['pid']."\">$up</a>";
+		if($catinfo['pid'] == $thiscatinfo['pid'] && $thiscatinfo['order'] < $catinfo['order']) $downlink = "<a href=\"admin.php?action=categories&go=down&displayorder=".$thiscatinfo['order']."&parentcatid=".$thiscatinfo['pid']."\">$down</a>";
+		if($catinfo['pid'] == $thiscat) $subs .= build_cat_row($cat, $catinfo);
+	}
+	if($subs) $output .= "<img onclick=\"javascript:displayCatRows('$thiscat')\" name='c_$thiscat' alt='on' src='".($onpic ? $onpic : "images/row_on.gif")."'> ";
+	$output .= $thiscatinfo['name']."</td>\n
+	<td class='tblborder'>$downlink</td>\n
+	<td class='tblborder' width=\"13\">$uplink</td>\n
+	<td class='tblborder'><a href=\"admin.php?action=categories&cat=$thiscat\">"._EDIT."</a> | <a href=\"admin.php?action=categories&delete=$thiscat\">"._DELETE."</a> 
+			| <span class='label'>"._ADD.":</span> $space <a href=\"admin.php?action=categories&cat=new&subof=$thiscat\">"._SUBCATEGORY."</a>, <a href=\"admin.php?action=characters&do=addform&catid=$thiscat\">"._CHARACTERS."</a>,  <a href=\"admin.php?action=admins&category=$thiscat\">"._ADMINS."</a></td>\r\n</tr>$subs";
+	return $output;
+}
+
+function relevelcategory($cat, $leveldown) {
+	global $action;
+
+	$subs = dbquery("SELECT catid FROM ".TABLEPREFIX."fanfiction_categories WHERE parentcatid = '$cat'");
+	if(dbnumrows($subs)) {
+		while($sub = dbassoc($subs)) {relevelcategory($sub[catid], $leveldown + 1); }
+	}
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET leveldown = $leveldown WHERE catid = '$cat'");
+}
+
+
+	$showlist = 1;
+	$output .= "<div id=\"pagetitle\">"._CATEGORIES." </div>";
+	if(isset($_GET['catcounts'])) 
+		$output .= catcounts( );
+	if(isset($_GET["delete"]) && isNumber($_GET["delete"])) {
+		$catid = $_GET["delete"];
+		$confirm = isset($_GET['confirm']) ? $_GET['confirm'] : false;
+		if($confirm == "yes") {
+			$result = dbquery("SELECT displayorder,leveldown, parentcatid FROM ".TABLEPREFIX."fanfiction_categories WHERE catid = '$catid'");
+			$cat = dbassoc($result);
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET displayorder = (displayorder - '1') WHERE displayorder > '$cat[displayorder]' AND parentcatid = '$cat[parentcatid]'");
+			dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_categories WHERE catid = '$catid'");
+			dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_categories WHERE parentcatid = '$catid'");
+			$stories = dbquery("SELECT title,sid, catid FROM ".TABLEPREFIX."fanfiction_stories WHERE FIND_IN_SET(catid, '$catid')");
+			while($story = dbassoc($stories)) {
+				$cats = explode(",", $story[catid]);
+				if(count($cats) == 1) $newcat = "-1";
+				else $newcat = implode(",", array_dif($cats, array($catid)));
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET catid = '$newcat' WHERE sid = '$story[sid]' LIMIT 1");					
+			}
+			$code = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'delcategory'");
+			while($c = dbassoc($code)) {
+				eval($c['code_text']);
+			}
+			$output .= write_message(_ACTIONSUCCESSFUL);
+		}
+		else if ($confirm == "no") {
+			$output .= write_message(_ACTIONCANCELLED);
+		}
+		else {
+			$showlist = 0;
+			$output .= write_message(_CONFIRMDELETE."<br /><br />
+[ <a href=\"admin.php?action=categories&delete=$catid&confirm=yes\">"._YES."</a> | <a href=\"admin.php?action=categories&delete=$catid&confirm=no\">"._NO."</a> ]");
+		}
+	}
+	if (isset($_POST["submit"]) && !isset($_GET['catcounts'])) {
+		if(isset($_POST['catid']) && $_POST['parentcatid'] == $_POST['catid']) {
+			$output .= write_error(_ACTIONCANCELLED." "._CATERROR);
+			$tpl->assign( "output", $output );
+			$tpl->printToScreen();
+			dbclose( );
+			exit( );
+		}
+		if($_POST['parentcatid'] != "-1") 	{
+			$parentquery = dbquery("SELECT leveldown FROM ".TABLEPREFIX."fanfiction_categories WHERE catid = '$_POST[parentcatid]'");
+			$parentresult = dbassoc($parentquery);
+			$leveldown = $parentresult['leveldown'] + 1;
+		}
+		else $leveldown = 0;
+		$locked = (isset($_POST['locked']) && $_POST['locked'] == "on" ? "1" : "0");
+
+		$displayorder = (isNumber($_POST['orderafter']) ? $_POST['orderafter'] : 0) + 1;
+		if($_GET["cat"] == "new") { 
+			$query = dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET displayorder = (displayorder + 1) WHERE displayorder > '".$_POST['orderafter']."' AND leveldown = '$leveldown' AND parentcatid ='".$_POST['parentcatid']."'");
+			$catresult = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_categories (category, parentcatid, description, locked, image, leveldown, displayorder) VALUES ('".addslashes(descript(strip_tags(trim($_POST['category']))))."', '".$_POST['parentcatid']."', '".addslashes(descript($_POST['description']))."', '$locked', '".$_POST['image']."', '$leveldown', '$displayorder')");
+		}
+		else {
+			$oldinfo = dbquery("SELECT displayorder, parentcatid, leveldown FROM ".TABLEPREFIX."fanfiction_categories WHERE catid = '$_GET[cat]' LIMIT 1");
+			list($oldorder, $oldparent, $oldleveldown) = dbrow($oldinfo);
+			$catresult = "UPDATE ".TABLEPREFIX."fanfiction_categories SET category = '".addslashes(descript($_POST['category']))."', description = '".addslashes(descript($_POST['description']))."', locked = '$locked', parentcatid = '".$_POST['parentcatid']."', image = '".$_POST['image']."', leveldown = '$leveldown', displayorder = '$displayorder' WHERE catid = '".$_POST['catid']."'";
+			if($oldparent == $_POST['parentcatid']) {
+				if($oldorder && $oldorder < $displayorder) {
+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET displayorder = displayorder - 1 WHERE displayorder > $oldorder AND displayorder < $displayorder");
+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET displayorder = $displayorder - 1 WHERE catid = '".$_GET['cat']."'");
+				}
+				if($oldorder > $displayorder) {
+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET displayorder = displayorder + 1 WHERE displayorder >= $displayorder AND displayorder < $oldorder");
+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET displayorder = $displayorder WHERE catid = '".$_GET['cat']."'");
+				}
+			} 
+			else {
+				if($oldleveldown != $leveldown) relevelcategory($_GET['cat'], $leveldown);
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET displayorder = displayorder -1 WHERE displayorder > $oldorder AND parentcatid = '$oldparent'");
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET displayorder = displayorder + 1 WHERE displayorder > '".$_POST['orderafter']."' AND parentcatid = '".$_POST['parentcatid']."'");
+			}
+			$success = dbquery($catresult);
+		}
+		$selectA = "SELECT category, catid FROM ".TABLEPREFIX."fanfiction_categories WHERE parentcatid = -1 ORDER BY displayorder";
+		$resultA = dbquery($selectA);
+		$countA = 1;
+		while($cat = dbassoc($resultA)) {
+			$count = 1;
+			if($cat['parentcatid'] = -1) {
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET displayorder = $countA WHERE catid = $cat[catid]");
+				$countA++;
+			}
+			$selectB = "SELECT category, catid FROM ".TABLEPREFIX."fanfiction_categories WHERE parentcatid = '$cat[catid]' ORDER BY displayorder";
+			$resultB = dbquery($selectB);
+			while($sub = dbassoc($resultB)) {
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET displayorder = $count WHERE catid = $sub[catid]");
+				$count++;
+			}
+		}
+		$showlist = false;
+		$output .= write_message(_ACTIONSUCCESSFUL."<br /><br />"."<a href='admin.php?action=categories'>"._CONTINUE."</a>");
+	}
+	else {
+		if(isset($_GET["go"])) {
+			$displayorder = $_GET["displayorder"];
+			$oneabove =  ($_GET["go"] == "up" ?  $displayorder -1 : $displayorder + 1);
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET displayorder = '-1' WHERE displayorder = '$displayorder' AND parentcatid = '".$_GET['parentcatid']."'");
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET displayorder = '$displayorder' WHERE displayorder = '$oneabove' AND parentcatid = '".$_GET['parentcatid']."'");
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET displayorder = '$oneabove' WHERE displayorder = '-1' AND parentcatid = '".$_GET['parentcatid']."'");
+			$catlist = array( );
+			$catresults = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_categories ORDER BY leveldown, displayorder");
+			while($cat = dbassoc($catresults)) {
+				$catlist[$cat['catid']] = array("name" => stripslashes($cat['category']), "pid" => $cat['parentcatid'], "order" => $cat['displayorder'], "locked" => $cat['locked'], "leveldown" => $cat['leveldown']);
+			}
+		}
+
+		if(isset($_GET["cat"])) {
+			$subof = isset($_GET['subof']) ? $_GET['subof'] : -1;
+			$after = isset($_GET['after']) ? $_GET['after'] : false;
+			$cat = isset($_GET['cat']) ? $_GET['cat'] : "new";
+			$new = isNumber($cat) ? false : true;
+			if(isNumber($cat)) {
+				$query = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_categories WHERE catid='$cat' LIMIT 1");
+				$cat1 = dbassoc($query);
+				$subof  = $cat1['parentcatid'];
+				$after = $cat1['displayorder'] -1;
+			}
+			$showlist = 0;	
+			$output .= "<div style='width: 100%;'><div  id=\"settingsform\"><form method='POST' enctype='multipart/form-data' name='form' action='admin.php?action=categories".($cat ? "&cat=$cat" : "")."'>
+				<div class='sectionheader'>".(!$new ? _EDITCAT : _NEWCAT)."</div>
+				<div><label for='parentcatid'>"._CATLEVEL.": </label>
+				<select name='parentcatid' id='parentcatid' onchange=\"setCategoryForm(this);\"><option value='-1'>"._TOPLEVEL."</option>";
+			if(count($catlist) > 0) {
+				$opt2 = "";
+				foreach($catlist as $c=> $cinfo) {
+					if($subof == $cinfo['pid'] || $subof == $c) 
+						$output .= "<option value='$c'".($subof == $c ? " selected" : "").">".$cinfo['name']."</option>";
+					if($subof == $cinfo['pid'] || (!$subof && $cinfo['pid'] == -1))
+						$opt2 .= "<option value='".$cinfo['order']."'".($after == $cinfo['order'] ? " selected" : "").">".$cinfo['name']."</option>";
+				}
+			}
+			$output .= "</select> <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_CATLEVEL."</span></A></div>";
+			$output .= "<div><label for='orderafter'>"._ORDERAFTER.":</label> 
+					<select name='orderafter' id='orderafter'>";
+			$output .= "<option value='0'>"._MOVETOP."</option>".(isset($opt2) ? $opt2 : "")."</select> <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_ORDERAFTER."</span></A></div>
+				<div><label for='category'>"._CATNAME.": </label>
+				<INPUT  type='text' class='textbox=' name='category'".($new ? ">" : "value='$cat1[category]'><input type='hidden' name='catid' value='$cat1[catid]'>")." <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_CATNAME."</span></A></div>
+				<div><label for='description'>"._DESC.": </label><A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_CATDESC."</span></A>
+				<div style='margin-left: 30%; padding-left: 1em;'><textarea class='textbox' id='description' name='description' id='description' cols='35' rows='4'>".(!$new ? $cat1['description'] : "")."</textarea></div>";
+			if($tinyMCE) 
+				$output .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('description');\" checked><label for='toggle'>"._TINYMCETOGGLE."</label></div>";
+			
+			$output.= "</div>
+				<div><label for='locked'>"._LOCKED.": </label>
+				<INPUT type='checkbox' class='checkbox' name='locked'".(!$new && $cat1['locked'] == 1 ? "checked" : "")."> <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_LOCKED."</span></A></div>
+				<div><label for='image'>"._IMAGE.": </label>
+				<INPUT  type='text' class='textbox='  name='image'".(!$new && $cat1['image'] != "" ? "value='$cat1[image]'": "")."> <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_CATIMAGE."</span></A></div>
+				<INPUT type='submit' class='button' id='submit' value='"._SUBMIT."' name='submit'>
+				</form></div><div style='clear: both;'>&nbsp;</div></div>";
+		}
+	}
+
+	if($showlist) {
+		// Rebuild the category list to reflect any changes we just did.
+			$catlist = array( );
+			$catresults = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_categories ORDER BY leveldown, displayorder");
+			while($cat = dbassoc($catresults)) {
+				$catlist[$cat['catid']] = array("name" => stripslashes($cat['category']), "pid" => $cat['parentcatid'], "order" => $cat['displayorder'], "locked" => $cat['locked'], "leveldown" => $cat['leveldown']);
+			}
+		$output .= "
+<table class=\"tblborder\" align=\"center\" cellspacing=\"0\" cellpadding=\"3\" style='margin: 0 auto;' width=\"90%\">
+		<tr><th class=\"tblborder\"><b>"._CATEGORY."</b></th><th class=\"tblborder\" colspan=\"2\"><b>"._MOVE."</b></th><th class=\"tblborder\"><b>"._OPTIONS."</b></th></tr>";
+		foreach($catlist as $cat => $catinfo) {
+				if($catinfo['pid'] == -1) $output .= build_cat_row($cat, $catinfo);
+		}
+		$output .= "<tr><td class=\"tblborder\" colspan=\"4\" align=\"center\"><a href=\"admin.php?action=categories&cat=new\">"._NEWMAIN."</a></td></tr></table>";
+	}	
+
+?>

file:b/admin/censor.php (new)
--- /dev/null
+++ b/admin/censor.php
@@ -1,1 +1,47 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+	$output .= "<div id=\"pagetitle\">"._CENSOR."</div>";
+	if(isset($_POST['submit'])) {
+		if($_POST["words"]) {
+			$wordlist = explode(",", trim(strip_tags($_POST['words'])));
+			foreach($wordlist as $word) {
+				$word = trim($word);
+				if(strlen($word) > 0) $newwords[] = $word;
+			}
+		}
+		$result = dbquery("UPDATE ".$settingsprefix."fanfiction_settings SET words = '".(is_array($newwords) ? implode(", ", $newwords) : "")."' WHERE sitekey = '".SITEKEY."'");
+		if($result) $output .= write_message(_ACTIONSUCCESSFUL);
+		else $output .= write_error(_ERROR);
+	}
+	else {
+		if(is_array($words)) $wordlist = implode(", ", $words);
+		else $wordlist = "";
+		$output .= "<div style=\"text-align: center; margin: 1em; \">"._CENSORDIRS."</div>";
+		$output .= "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=censor\" style=\"width: 500px; margin: 0 auto;\">
+			<textarea name=\"words\" rows=\"7\" cols=\"60\">$wordlist</textarea><br /><INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></form>";
+	}
+
+?>

--- /dev/null
+++ b/admin/characters.php
@@ -1,1 +1,147 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+	$output .= "<div id='pagetitle'>"._CHARACTERS."</div>";
+	if(isset($_GET["delete"])) {
+		$charid = $_GET["delete"];
+		$confirm = isset($_GET['confirm']) ? $_GET['confirm'] : false;
+		if($confirm == "yes" && isNumber($charid))
+		{
+			$result5 = dbquery("SELECT catid, charname FROM ".TABLEPREFIX."fanfiction_characters WHERE charid = '$charid'");
+			$chars = dbassoc($result5);
+			dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_characters where charid = '$charid'");
+			$storyquery = dbquery("SELECT charid, sid FROM ".TABLEPREFIX."fanfiction_stories WHERE FIND_IN_SET('$charid', charid) > 0");
+			while($story = dbassoc($storyquery)) {
+				$newcharlist = array_diff(explode(",", $story['charid']), array($charid));
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET charid = '".($newcharlist ? implode(",", $newcharlist) : "")."' WHERE sid = '$story[sid]'");
+			}
+			$seriesquery = dbquery("SELECT characters, seriesid FROM ".TABLEPREFIX."fanfiction_series WHERE FIND_IN_SET('$charid', characters) > 0");
+			while($series = dbassoc($seriesquery)) {
+				$newcharlist = array_diff(explode(",", $series['characters']), array($charid));
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_series SET characters = '".($newcharlist ? implode(",", $newcharlist) : "")."' WHERE seriesid = '$series[seriesid]'");
+			}
+			$code = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'delchar'");
+			while($c = dbassoc($code)) {
+				eval($c['code_text']);
+			}
+			$output .= write_message(_ACTIONSUCCESSFUL);
+		}
+		else if ($confirm  == "no") 	{
+			$output .= write_message(_ACTIONCANCELLED);
+		}
+		else {
+			$output .= write_message(_CONFIRMDELETE."<br /><br />
+				[ <a href=\"admin.php?action=characters&amp;delete=$charid&amp;confirm=yes\">"._YES."</a> | <a href=\"admin.php?action=characters&amp;delete=$charid&amp;confirm=no\">"._NO."</a> ]");
+		}
+	}		
+	if(isset($_GET['do']) && $_GET['do'] == "addform") {
+		if(isset($_GET['charid']) && isNumber($_GET['charid'])) $charid = $_GET['charid'];
+		if(isset($_POST['numchars']) &&  isNumber($_POST['numchars'])) $numchars = $_POST['numchars'];
+		if(!isset($numchars)) $numchars = $itemsperpage;
+		if(isset($charid)) {
+			$charquery = dbquery("SELECT charname, bio FROM ".TABLEPREFIX."fanfiction_characters WHERE charid = '$charid' LIMIT 1");
+			$charinfo = dbassoc($charquery);
+			$output .= "<form method=\"POST\" enctype=\"multipart/form-data\" id='settingsform' action=\"admin.php?action=characters&do=update\">
+				<input type=\"hidden\" name=\"charid\" value=\"$charid\">";
+			$numchars = 1;
+		}
+		else if(isset($_GET['catid'])) {
+			$output .= "<form method=\"POST\" enctype=\"multipart/form-data\" id='settingsform' action=\"admin.php?action=characters&do=add\"><input type=\"hidden\" name=\"numchars\" value=\"$numchars\"><input type=\"hidden\" name=\"catid\" value=\"".$_GET['catid']."\">";
+		}
+		else {
+			$output .= "<div style='width: 100%;'><div  id=\"settingsform\"><form method=\"POST\" enctype=\"multipart/form-data\" id='settingsform'  action=\"admin.php?action=characters&do=add\"><input type=\"hidden\" name=\"numchars\" value=\"$numchars\"><input type=\"hidden\" name=\"catid\" value=\"".$_POST['catid']."\">";
+		}
+		for($x = 1; $x <= $numchars; $x++) {
+			$output .= "<div class='sectionheader'>".(isset($charid) ? _EDITCHAR : _NEWCHAR." $x")."</div>
+				<div><label for='character$x'>"._CHARACTER.":</label><input type=\"text\" class=\"textbox\" name=\"character$x\" size=\"35\"".(isset($charinfo['charname']) ? " value=\"".$charinfo['charname']."\"" : "")."> <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_CHARS."</span></A></div>
+				<div><label for='bio$x'>"._DESC.":</label><textarea class=\"textbox\" rows=\"6\" cols=\"40\" id= 'bio$x' name=\"bio$x\">".(isset($charinfo) ? $charinfo['bio'] : "")."</textarea></div>";
+			if($tinyMCE) 
+				$output .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('bio$x');\" checked><label for='toggle'>"._TINYMCETOGGLE."</label></div>";	
+		}
+		$output .= "<div id='submitdiv'><INPUT type=\"submit\" id=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></div></form></div><div style='clear: both;'>";
+		unset($_POST['submit']);
+	}
+	if(isset($_POST["submit"])) {
+		if($_GET["do"] == "add") {
+			$numchars = $_POST["numchars"];
+			if(!isNumber($numchars)) $numchars = $itempsperpage;
+			for($x = 1; $x <= $numchars; $x++) {
+				if(isset($_POST["character$x"]) && $_POST["character$x"] != "") {
+					$result = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_characters (charname, bio, catid) VALUES('".escapestring(descript(strip_tags(trim($_POST["character$x"]))))."', '".escapestring(descript($_POST["bio$x"]))."', '$_POST[catid]')");
+				}
+			}
+		}
+		else if($_GET["do"] == "update") {
+			$result = dbquery("UPDATE ".TABLEPREFIX."fanfiction_characters SET charname = '".escapestring(descript(strip_tags(trim($_POST["character1"]))))."', bio = '".escapestring(descript($_POST["bio1"]))."' WHERE charid = '$_POST[charid]'");
+		}
+		$output .= write_message(_ACTIONSUCCESSFUL);
+	}
+	if(!isset($_GET['do']) || isset($_POST['submit'])) {
+		if(isset($_GET['cat']) && isNumber($_GET['cat'])) $cat =  $_GET['cat'];
+		else $cat = -1;
+	
+		$output .= "<div style='text-align: center;'><form method=\"POST\" name=\"form\" enctype=\"multipart/form-data\" action=\"admin.php?action=characters&do=addform\">
+			<label for='catid'>"._CATEGORY.": </label>
+			<select name=\"catid\" onChange='document.location = document.location.pathname + \"?action=characters&cat=\"+ document.form.catid.options[document.form.catid.selectedIndex].value;'>
+			<option value=\"-1\">"._BACK2CATS."</option><option value=\"-1\"".($cat == "-1" ? " selected" : "").">"._SITEWIDE."</option>";
+		foreach($catlist as $category => $info){
+			if($category == $cat || $info['pid'] == $cat) $output .= "<option value=\"$category\"".($category == $cat ? " selected" : "").">".$info['name']."</option>";
+		}
+		$output .= "</select></form></div>";
+
+		// Repopulate the characters list to reflect any changes we made.
+		$charlist = array( );
+		$result = dbquery("SELECT charname, catid, charid FROM ".TABLEPREFIX."fanfiction_characters ORDER BY charname");
+		while($char = dbassoc($result)) {
+			$charlist[$char['charid']] = array("name" => stripslashes($char['charname']), "catid" => $char['catid']);
+		}
+
+		//List of current characters
+		$output .= "<center>"._CHOOSECATNOTE."</center><br /><table class=\"tblborder\" cellspacing=\"0\" cellpadding=\"3\" style='margin: 0 auto;' align=\"center\">
+		<tr>
+		<th class=\"tblborder\">"._CHARACTER."</th><th class=\"tblborder\">"._OPTIONS."</th>
+		</tr>";
+		$count = 0;
+		foreach($charlist as $char =>$charinfo) {
+			if($charinfo['catid'] == $cat) {
+				$output .= "<tr><td class=\"tblborder\">
+				<a href=\"browse.php?type=characters&amp;charid=$char\">".$charinfo['name']."</a></td><td class=\"tblborder\"><a href=\"admin.php?action=characters&amp;do=addform&amp;charid=$char&amp;cat=$cat\">"._EDIT."</a> | <a href=\"admin.php?action=characters&amp;delete=$char&amp;cat=$cat\">"._DELETE."</a></td></tr>";
+				$count++;
+			}
+		}	
+		if($count == 0) $output .= "<tr><td class=\"tblborder\" colspan=\"2\" style=\"text-align: center;\">"._NORESULTS."</td></tr>";
+		$output .= "</table></p>";
+		$output .= "<div class='sectionheader'>"._ADDNEWCHARS."</div>
+		<div><form method=\"POST\" name=\"addform\" enctype=\"multipart/form-data\" id='settingsform' action=\"admin.php?action=characters&do=addform&catid=$cat\">
+		<div><label for='numchars'>"._NUMCHARS.":</label><select name=\"numchars\">";
+		for($x = 1; $x < $itemsperpage + 1; $x++) {
+			$output .= "<option value=\"$x\">$x</option>";
+		}
+		$output .= "</select><A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_NUMCHARS."</span></A></div><div id='submitdiv'><INPUT type=\"submit\" class=\"button\" id='submit' value=\""._SUBMIT."\" name=\"submit\"></div>
+			</form><div style='clear: both;'>&nbsp;</div></div>";
+	}
+?>

--- /dev/null
+++ b/admin/classifications.php
@@ -1,1 +1,168 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+
+$list = true;
+
+if(isset($_GET['type_id']) && isNumber($_GET['type_id'])) $type_id = $_GET['type_id'];
+if(isset($_GET['listtype']) && isNumber($_GET['listtype'])) $listtype = $_GET['listtype'];
+
+if(isset($_GET['delete'])) {
+	if($_GET['delete'] == "class" && isNumber($_GET["class"])) $thislist = dbquery("SELECT class_id FROM ".TABLEPREFIX."fanfiction_classes WHERE class_id = '".$_GET["class"]."'");
+	else {
+		list($classname) = dbrow(dbquery("SELECT classtype_name FROM ".TABLEPREFIX."fanfiction_classtypes WHERE classtype_id = '$type_id'"));
+		dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_pagelinks WHERE link_name = '".$classname."_link' LIMIT 1");
+		$thislist = dbquery("SELECT class_id FROM ".TABLEPREFIX."fanfiction_classes WHERE class_type = '$type_id'");
+		dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_classtypes WHERE classtype_id = '$type_id'");
+	}
+	while($thisclass = dbassoc($thislist)) {
+		$class = $thisclass['class_id'];
+		$stories = dbquery("SELECT sid, classes FROM ".TABLEPREFIX."fanfiction_stories WHERE FIND_IN_SET('$class', classes) > 0");
+		while($s = dbassoc($stories)) {
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET classes = '".implode(",", array_diff(explode(",", $s['classes']), array($class)))."' WHERE sid = '$s[sid]' LIMIT 1");
+		}
+		$series = dbquery("SELECT seriesid, classes FROM ".TABLEPREFIX."fanfiction_series WHERE FIND_IN_SET('$class', classes) > 0");
+		while($s = dbassoc($series)) {
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_series SET classes = '".implode(",", array_diff(explode(",", $s['classes']), array($class)))."' WHERE seriesid = '$s[seriesid]' LIMIT 1");
+		}
+		$code = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'delclass'");
+		while($c = dbassoc($code)) {
+			eval($c['code_text']);
+		}
+		dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_classes WHERE class_id = '$class' LIMIT 1");
+	}
+}
+if(isset($_GET['newitems']) && isNumber($_GET['newitems'])) {
+	if(isset($_POST['submit'])) {
+		for($x = 1; $x <= $itemsperpage; $x++) {
+			$item = escapestring(descript(strip_tags($_POST["item_$x"])));
+			if($item) {
+				$result = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_classes(`class_type`, `class_name`) VALUES('$_GET[newitems]', '$item')");
+				if(!$result) $output .= write_error(magicunquote($item).": "._ERROR."<br />");
+			}
+		}
+		$listtype = $_GET['newitems'];
+	}
+	else {
+		$type = dbquery("SELECT classtype_title FROM ".TABLEPREFIX."fanfiction_classtypes WHERE classtype_id = '$_GET[newitems]' LIMIT 1");
+		list($thistype) = dbrow($type);
+		$output .= "<div id=\"pagetitle\">$thistype</div><div id='settingsform'><form method=\"POST\" enctype=\"multipart/form-data\" style=\"width: 450px; margin: 1em auto;\" action=\"admin.php?action=classifications&amp;newitems=$_GET[newitems]\">\n";
+		for($x = 1; $x <= $itemsperpage; $x ++) {
+			$output .=  "<div><label for=\"item_$x\">"._NEWITEM." $x: </label><input type=\"text\" class=\"textbox\" size='30' name=\"item_$x\"></div>\n";
+		}
+		$output .= "<div style='text-align: center; margin: 1em auto;'><INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></form></div></div>";
+		$list = false;
+	}
+}
+if(isset($listtype)) {
+	$thislist = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_classes WHERE class_type = '$listtype'");
+	$output .= "<table class=\"tblborder\" style=\"margin: 0 auto;\"><tr><th clas=\"tblborder\">"._CLASS."</th><th clas=\"tblborder\">"._OPTIONS."</th></tr>";
+	if(!dbnumrows($thislist)) $output .= "<tr><td class=\"tblborder\" colspan='2'>"._NORESULTS."</td></tr>";
+	while($class = dbassoc($thislist)) {
+		$output .= "<tr>
+			<td class=\"tblborder\">
+				$class[class_name]
+			</td>
+			<td class=\"tblborder\">
+				<a href=\"admin.php?action=classifications&amp;class=$class[class_id]\">"._EDIT."</a> |
+				<a href=\"admin.php?action=classifications&amp;delete=class&amp;class=$class[class_id]&amp;listtype=$listtype\">"._DELETE."</a>
+			</td></tr>";
+	}	
+	$output .= "<tr><td class=\"tblborder\" colspan=\"2\" style=\"text-align: center;\"><a href=\"admin.php?action=classifications&newitems=$listtype\">"._ADDNEWCLASSES."</a></td></tr></table>";
+	$list = false;
+}
+if(isset($_GET['type']) && empty($_GET['delete'])) {
+	if(isset($_POST['submit'])) {
+		$type_name = escapestring(descript(strip_tags($_POST['type_name'])));
+		$type_title = escapestring(descript(strip_tags($_POST['type_title'])));
+		if(isset($_POST['type_id'])) $result = dbquery("UPDATE ".TABLEPREFIX."fanfiction_classtypes SET classtype_name = '$type_name', classtype_title = '$type_title' WHERE classtype_id = '".$_POST['type_id']."' LIMIT 1");
+		else {
+			$result = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_classtypes(classtype_name, classtype_title) VALUES('$type_name', '$type_title')");
+			$id = dbinsertid($result);
+			$result2 = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_pagelinks(link_name, link_text, link_url) VALUES('".$type_name."_link', '$type_title', 'browse.php?type=class&amp;type_id=$id')");
+		}
+		if($result) $output .= write_message(_ACTIONSUCCESSFUL);
+		else $output .= write_error(_ERROR);
+	}
+	else {
+		if(isNumber($_GET['type'])) {
+			$typequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_classtypes WHERE classtype_id = '$_GET[type]' LIMIT 1");
+			$thistype = dbassoc($typequery);
+		}
+		$output .= "<div id='settingsform'><form method=\"POST\" style=\"width: 100%; margin: 1em auto;\" enctype=\"multipart/form-data\" action=\"admin.php?action=classifications&amp;type=$_GET[type]\">";
+		if(isset($thistype)) $output .= "<input type=\"hidden\" name=\"type_id\" value=\"".$thistype['classtype_id']."\">";
+		$output .= "<div><label for=\"type_name\">"._NAME.": </label> <input type=\"text\" class=\"textbox\" name=\"type_name\" value=\"".(isset($thistype) ? $thistype['classtype_name'] : "")."\"></div>
+			<div><label for=\"type_name\">"._TITLE.": </label> <input type=\"text\" class=\"textbox\" name=\"type_title\" value=\"".(isset($thistype) ? $thistype['classtype_title'] : "")."\"></div>
+			<div style='text-align: center; margin: 1em auto;'><INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></div></form></div>";
+		$output .= write_message(_CLASSNOTE);
+		$list = false;
+	}
+}
+if(isset($_GET['class']) && empty($_GET['delete'])) {
+	if(isset($_POST['submit'])) {
+		if(isset($_GET['class']) && isNumber($_GET['class'])) $class_id = $_GET['class'];
+		$class_name = escapestring(descript(strip_tags($_POST['class_name'])));
+		$class_type = isNumber($_POST['type_id']) ? $_POST['type_id'] : false;
+		if(isset($class_id)) $result = dbquery("UPDATE ".TABLEPREFIX."fanfiction_classes SET class_name = '$class_name', class_type = '$class_type' WHERE class_id = '$class_id' LIMIT 1");
+		if($result) $output .= write_message(_ACTIONSUCCESSFUL);
+		else $output .= write_error(_ERROR);
+	}
+	else {
+		if(isNumber($_GET['class'])) {
+			$typequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_classes WHERE class_id = '$_GET[class]' LIMIT 1");
+			$thisclass = dbassoc($typequery);
+		}
+		$output .= "<div id='settingsform'><form method=\"POST\" style=\"width: 90%; margin: 1em auto;\" enctype=\"multipart/form-data\" action=\"admin.php?action=classifications&amp;class=$_GET[class]\">";
+		if(isset($thisclass)) $output .= "<div><label for=\"class_name\">"._NAME.": </label> <input type=\"text\" class=\"textbox\" name=\"class_name\" value=\"".(isset($thisclass) ? $thisclass['class_name'] : "")."\"></div>
+			<div><label for=\"type_id\">"._CLASSTYPES.":</label> <select name=\"type_id\" id=\"type_id\">";
+		$types = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_classtypes");
+		while($t = dbassoc($types)) {
+			$output .= "<option value='".$t['classtype_id']."'".($t['classtype_id'] == $thisclass['class_type'] ? " selected" : "").">".$t['classtype_title']."</option>";
+		}
+		$output .= "</select></div>
+			<div id='submitdiv'><INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></div></form><div class='cleaner'>&nbsp;</div></div>";
+		$output .= write_message(_CLASSNOTE);
+		$list = false;
+	}
+}
+if($list) {
+	$types = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_classtypes");
+	$output .= "<div style='text-align: center;'><table class=\"tblborder\" style=\"margin: 0 auto; text-align: left;\"><tr><th clas=\"tblborder\">"._CLASSTYPES."</th><th clas=\"tblborder\">"._OPTIONS."</th></tr>";
+	if(!dbnumrows($types)) $output .= "<tr><td class=\"tblborder\" colspan='2'>"._NORESULTS."</td></tr>";
+	while($type = dbassoc($types)) {
+		$output .= "<tr>
+			<td class=\"tblborder\">
+				<a href=\"admin.php?action=classifications&amp;listtype=$type[classtype_id]\">$type[classtype_title]</a>
+			</td>
+			<td class=\"tblborder\">
+				<a href=\"admin.php?action=classifications&amp;type=$type[classtype_id]\">"._EDIT."</a> |
+				<a href=\"admin.php?action=classifications&amp;delete=type&amp;type_id=$type[classtype_id]\">"._DELETE."</a>
+			</td></tr>";
+	}	
+	$output .= "<tr><td class=\"tblborder\" colspan=\"2\" style=\"text-align: center;\"><a href=\"admin.php?action=classifications&type=new\">"._ADDNEWCLASSTYPE."</a></td></tr></table></div>";
+	$output .= write_message(_CLASSLISTNOTE);
+}
+?>

--- /dev/null
+++ b/admin/custpages.php
@@ -1,1 +1,105 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+
+	$output .= "<div id=\"pagetitle\">"._CUSTPAGES."</div>";
+if(isset($_GET['delete']) && isNumber($_GET['delete'])) {
+	$result = dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_messages WHERE message_id = ".$_GET['delete']." LIMIT 1");
+	if($result) $output .= write_message(_ACTIONSUCCESSFUL);
+	else $output .= write_error(_ERROR);
+}
+if(isset($_POST['submit'])) {
+	if(!preg_match("!^[a-z0-9_]{3,30}$!i", $_POST['name'])) $output .= write_error(_BADVARNAME);
+	else {
+		$pagename = descript($_POST['name']);
+		$pagetitle = descript($_POST['title']);
+		if(isset($_GET['edit']) && isNumber($_GET['edit'])) 
+			$result = dbquery("UPDATE ".TABLEPREFIX."fanfiction_messages SET message_name = '".escapestring($pagename)."', message_title = '".escapestring($pagetitle)."', message_text = '".escapestring(descript($_POST['text']))."' WHERE message_id = ".$_GET['edit']." LIMIT 1");
+		else {
+			$result = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_messages(`message_name`, `message_title`, `message_text`) VALUES( '".escapestring($pagename)."', '".escapestring($pagetitle)."', '".escapestring(descript($_POST['text']))."')");
+			if($result) $result = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_pagelinks(`link_name`, `link_text`, `link_url`, `link_target`, `link_access`) VALUES('".escapestring($pagename)."_link', '".escapestring($pagetitle)."', 'viewpage.php?page=$pagename', '0', '0')");
+		}
+		if($result) $output .= write_message(_ACTIONSUCCESSFUL."<br /><br /><a href='viewpage.php?page=$pagename'>$pagetitle</a>");
+		else $output .= write_error(_ERROR);
+		unset($_GET['edit']);
+	}
+}
+if((isset($_GET['edit']) && isNumber($_GET['edit'])) || isset($_GET["new"]) || isset($_POST['preview'])) {
+	unset($message, $id, $name, $title, $text);
+	if(isset($_POST['preview'])) {
+		$name = descript($_POST['name']);
+		$title = descript($_POST['title']);
+		$thistext = descript($_POST['text']);
+		$edit = isset($_GET['edit']) ? $_GET['edit'] : "";
+		if(strpos($thistext, "?>") === false) $output .= "<div id='pagetitle'>$title</div>\n\n$thistext";
+		else {
+			$text = "";
+			eval("?>".$thistext."<?php ");
+			$output .= "<div id='pagetitle'>$title</div>\n\n$text";
+		}
+		$text = $thistext;
+	}
+	else if(isset($_GET['edit'])) {
+		$edit = $_GET['edit'];
+		$pagequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_messages WHERE message_id = $edit LIMIT 1");
+		$message =  dbassoc($pagequery);
+		$id = $message['message_id'];
+		$name = $message['message_name'];
+		$title = $message['message_title'];
+		$text = $message['message_text'];
+	}
+	else {
+		$name = "";
+		$title = "";
+		$text = "";
+	}
+	$output .= "<div id='settingsform'><form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=custpages".(isset($edit) ? "&amp;edit=$edit" : "")."\">
+		<div><label for=\"name\">"._NAME.":</label> <input type=\"text\" class=\"textbox\" name=\"name\" value=\"$name\"></div>
+		<div><label for=\"title\">"._TITLE.":</label> <input type=\"text\" class=\"textbox\" name=\"title\" value=\"$title\" size=\"30\"></div>
+		<div><label for=\"text\">"._TEXT.":</label><br />
+		<textarea class=\"textbox\" rows=\"10\" cols=\"60\" style='width: 100%;' name=\"text\">$text</textarea>";
+	if($tinyMCE) 
+		$output .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('text');\" checked><label for='toggle'>"._TINYMCETOGGLE."</label></div>";
+	$output .= "</div><INPUT type=\"submit\" class=\"button\" name=\"preview\" id=\"preview\" value=\""._PREVIEW."\"><INPUT type=\"submit\" class=\"button\" name=\"submit\" id=\"submit\" value=\""._SUBMIT."\"></form></div>";
+	$output .= write_message(_CUSTPAGENOTE);
+}
+else {
+	$listquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_messages");
+	$output .= "<table class=\"tblborder\" style=\"margin: 0 auto;\"><tr><th class=\"tblborder\">"._ID."</th><th class=\"tblborder\">"._NAME."</th><th class=\"tblborder\">"._TITLE."</th><th class=\"tblborder\">"._OPTIONS."</th></tr>";
+	while($msg = dbassoc($listquery)) {
+		// Hidden messages they're listed in the settings.
+		if($msg['message_name'] == "welcome" ||  $msg['message_name'] == "nothankyou" || $msg['message_name'] == "thankyou" ||
+		$msg['message_name'] == "copyright" || $msg['message_name'] == "printercopyright") continue;
+		$output .= "<tr><td class=\"tblborder\">$msg[message_id]</td><td class=\"tblborder\">$msg[message_name]</td><td class=\"tblborder\"><a href='viewpage.php?page=$msg[message_name]'>$msg[message_title]</a></td>
+		<td class=\"tblborder\"><a href=\"admin.php?action=custpages&amp;edit=$msg[message_id]\">"._EDIT."</a> | 
+		<a href=\"admin.php?action=custpages&amp;delete=$msg[message_id]\">"._DELETE."</a></td></tr>";
+	}
+	if(!dbnumrows($listquery)) $output .= "<tr><td class=\"tblborder\" colspan=\"3\" align=\"center\">"._NORESULTS."</td></tr>";
+	$output .= "<tr><td class=\"tblborder\" colspan=\"4\" align=\"center\"><a href=\"admin.php?action=custpages&amp;new=1\">"._ADDCUSTPAGE."</a></td></tr>";
+	$output .= "</table>";
+	$output .= write_message(_CUSTPAGENOTE);
+}
+?>

--- /dev/null
+++ b/admin/featured.php
@@ -1,1 +1,45 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+	if(isset($_GET['retire']) && preg_match("/^[0-9]+$/", $_GET['retire']))
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET featured = 2 WHERE sid = ".$_GET['retire']);
+	if(isset($_GET['remove']) && preg_match("/^[0-9]+$/", $_GET['remove']))
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET featured = 0 WHERE sid = ".$_GET['remove']);
+	if(isset($_GET['feature']))
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET featured = 1 WHERE sid = ".$_GET['feature']);
+	$fresult = dbquery("SELECT stories.*, stories.title as title, "._PENNAMEFIELD." as penname, stories.updated as updated, stories.date as date FROM "._AUTHORTABLE.", ".TABLEPREFIX."fanfiction_stories as stories WHERE stories.featured > 0 AND stories.uid = "._UIDFIELD." ORDER BY stories.featured");
+	$output .= "<div id='pagetitle'>"._FEATUREDSTORIES."</div>";
+	if(!dbnumrows($fresult)) $output .= write_message(_NORESULTS);
+	else {
+		$output .= "<table class=\"tblborder\" cellpadding=\"5\" style=\"margin: 1em auto;\"><tr><th class=\"tblborder\">"._STORIES."</th><th class=\"tblborder\">"._STATUS."</th><th class=\"tblborder\">"._OPTIONS."</th></tr>";
+		while($story = dbassoc($fresult)) {
+			$output .= "<tr><td class=\"tblborder\"><a href=\"viewstory.php?sid=$story[sid]\">$story[title]</a> "._BY." <a href=\"viewuser.php?uid=$story[uid]\">$story[penname]</a></td><td class=\"tblborder\" align=\"center\">".($story['featured'] == 1 ? _ACTIVE : _RETIRED)."</td><td class=\"tblborder\" align=\"center\">".($story['featured'] == 1 ? "<a href=\"admin.php?action=featured&retire=$story[sid]\">"._RETIRE."</a>" : "<a href=\"admin.php?action=featured&feature=$story[sid]\">"._CURRENT."</a>")." | <a href=\"admin.php?action=featured&remove=$story[sid]\">"._REMOVE."</a></td></tr>";
+		}
+		$output .= "</table>";
+		$output .= write_message(_FEATUREDNOTE);
+	}
+?>

file:b/admin/genres.php (new)
--- /dev/null
+++ b/admin/genres.php
@@ -1,1 +1,104 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+function genres( ) {
+	global $allowed_tags;
+
+	$output .= "<center><h4>"._GENRES."</h4></center>";
+	if($_GET["delete"]) {
+		$gid = $_GET["delete"];
+		if($_GET["confirm"] == "yes")
+		{
+			$result5 = dbquery("SELECT genre FROM ".TABLEPREFIX."fanfiction_genres WHERE gid = '$gid'") or die(_FATALERROR."Query: SELECT genre FROM ".TABLEPREFIX."fanfiction_genres WHERE gid = '$gid'<br />Error: (".mysql_errno( ).") ".mysql_error( ));
+			$genres = dbassoc($result5);
+			$newquery5 = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_stories WHERE gid LIKE '%$genres[genre]%'") or die(_FATALERROR."Query: SELECT * FROM ".TABLEPREFIX."fanfiction_stories WHERE gid LIKE '%$genres[genre]%'<br />Error: (".mysql_errno( ).") ".mysql_error( ));
+				while($genreresult = dbassoc($newquery5))
+				{
+					$tok = strtok($genreresult[gid], ", ");// tokenize the old list of names
+					$newString = "";// the new list of good names
+					while($tok)
+					{
+						if( $tok != $genres[genre] )// oldname is the thing that is going away
+						{
+							// It's a keeper, so decide if it is first or not for comma-age, then add it in
+							if( $newString != "" )
+								$newString .= ", ";
+							$newString .= $tok;
+						}
+						$tok = strtok(", "); //advance to the next token
+					}
+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET gid = '$newString' WHERE sid = '$genreresult[sid]'")  or die(_FATALERROR."Query: UPDATE ".TABLEPREFIX."fanfiction_stories SET gid = '$newString' WHERE sid = '$genreresult[sid]'<br />Error: (".mysql_errno( ).") ".mysql_error( ));
+				}
+			dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_genres where gid = '$gid'") or die(_FATALERROR."Query: DELETE FROM ".TABLEPREFIX."fanfiction_genres where gid = '$gid'<br />Error: (".mysql_errno( ).") ".mysql_error( ));
+			$output .= "<center>"._ACTIONSUCCESSFUL."</center>";
+		}
+		else if ($_GET["confirm"] == "no")
+		{
+			$output .= "<center>"._ACTIONCANCELLED."</center>";
+		}
+		else
+		{
+			$output .= "<center>"._CONFIRMDELETE."<br /><br />";
+			$output .= "[ <a href=\"admin.php?action=genres&amp;delete=$gid&amp;confirm=yes\">"._YES."</a> | <a href=\"admin.php?action=genres&delete=$gid&confirm=no\">"._NO."</a> ]</center>";
+			return $output;
+		}
+	}
+	if ($_POST[submit]) {
+		if($_GET[genre] == "new") dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_genres (genre) VALUES ('".addslashes(stripinput(strip_tags($_POST[genre])))."')") or die(_FATALERROR."<br />Error: (".mysql_errno( ).") ".mysql_error( ));
+		else dbquery("UPDATE ".TABLEPREFIX."fanfiction_genres set genre = '".addslashes(stripinput(strip_tags($_POST[genre])))."' WHERE gid = '$_GET[genre]'") or die(_FATALERROR."<br />Error: (".mysql_errno( ).") ".mysql_error( ));
+			$output .= "<center>"._ACTIONSUCCESSFUL."</center>";
+	}
+	else {
+		if(isset($_GET[genre])) {
+			if($_GET[genre] != "new") {
+				$genrequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_genres WHERE gid = '$_GET[genre]' LIMIT 1") or die(_FATALERROR."<br />Error: (".mysql_errno( ).") ".mysql_error( ));
+				$genre = dbassoc($genrequery);
+			}
+			$output .= "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=genres&genre=$_GET[genre]\">
+			<table align=\"center\"><tr><td colspan=\"2\" align=\"center\"><b>".($_GET[genre] == "new" ? _NEWGENRE : _EDITGENRE)."</b></td></tr>
+			<tr><td>"._GENRE.": <A HREF=\"javascript:pop('docs/adminhints.htm#genres');\">[?]</A></td>
+			<td><INPUT type=\"text\" class=\"textbox=\"  name=\"genre\"".($_GET[genre] != "new" ? "value=\"$genre[genre]\"" : "")."></td></tr>
+			<tr><td colspan=\"2\" align=\"right\"><INPUT type=\"submit\" class=\"button\" value=\""._SUBMIT."\" name=\"submit\"></td></tr></table></form>";
+		}
+		else {
+
+			$result = dbquery("SELECT * from ".TABLEPREFIX."fanfiction_genres");
+
+			//List of current genres
+
+			$output .= "<table class=\"tblborder\" cellpadding=\"3\" cellspacing=\"0\" align=\"center\">
+			<tr><th colspan=\"2\" align=\"center\">"._GENRES."</th></tr>
+			<tr><td colspan=\"2\" align=\"center\" class=\"tblborder\"><a href=\"admin.php?action=genres&genre=new\">"._ADDGENRE."</a></td></tr>";
+			while ($genreresults = dbassoc($result))
+			{
+				$output .= "<tr><td class=\"tblborder\">$genreresults[genre]";
+				$output .= "</td><td class=\"tblborder\"><a href=\"admin.php?action=genres&genre=$genreresults[gid]\">"._EDIT."</a> | <a href=\"admin.php?action=genres&delete=$genreresults[gid]\">"._DELETE."</td></tr>";
+			}
+			$output .= "</table>";
+
+		}
+	}
+	return $output;
+}
+// end genres function
+
+?>

file:b/admin/index.php (new)
--- /dev/null
+++ b/admin/index.php

file:b/admin/links.php (new)
--- /dev/null
+++ b/admin/links.php
@@ -1,1 +1,122 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+	$output .= "<div id=\"pagetitle\">"._LINKS."</div>";
+if(isset($_GET['delete']) && isNumber($_GET['delete'])) {
+	$result = dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_pagelinks WHERE link_id = $_GET[delete] LIMIT 1");
+	if($result) $output .= write_message(_ACTIONSUCCESSFUL);
+	else $output .= write_error(_ERROR);
+}
+if(isset($_POST['submit'])) {
+	if(!preg_match("!^[a-z0-9_]{3,30}$!i", $_POST['link_name'])) $output .= write_error(_BADVARNAME);
+	else {
+		if(isNumber($_POST['link_access'])) $link_access = $_POST['link_access'];
+		else $link_access = 0;
+		$link_name = descript($_POST['link_name']);
+		$link_text = descript($_POST['link_text']);
+		$link_url = descript(strip_tags($_POST['link_url']));
+		$link_target = descript($_POST['link_target']);
+		$link_key = strlen($_POST['link_key']) > 1 ? substr($_POST['link_key'], 0, 1) : $_POST['link_key']; // only one letter please.
+		if(isset($_GET['edit']) && isNumber($_GET['edit'])) 
+			$result = dbquery("UPDATE ".TABLEPREFIX."fanfiction_pagelinks SET link_name = '".escapestring($link_name)."', link_text = '".escapestring($link_text)."', link_key = '$link_key', link_url = '".escapestring($link_url)."', link_target = '$link_target', link_access = '$link_access' WHERE link_id = $_GET[edit] LIMIT 1");
+		else $result = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_pagelinks(`link_name`, `link_text`, `link_key`, `link_url`, `link_target`, `link_access`) VALUES('".escapestring($link_name)."', '".escapestring($link_text)."', '".escapestring($link_key)."', '".escapestring($link_url)."', '$link_target', '$link_access')");
+		if($result) {
+			$output .= write_message(_ACTIONSUCCESSFUL);
+			$linkquery = dbquery("SELECT * from ".TABLEPREFIX."fanfiction_pagelinks ORDER BY link_access ASC");
+			if(!isset($current)) $current = "";
+
+			while($link = dbassoc($linkquery)) {
+				if($link['link_access'] && !isMEMBER) continue;
+				if($link['link_access'] == 2 && !isADMIN) continue;
+				$tpl->assignGlobal($link['link_name'], "<a href=\""._BASEDIR.$link['link_url']."\" title=\"".$link['link_text']."\"".($link['link_target'] ? " target=\"_blank\"" : "").($current == $link['link_name'] ? " id=\"current\"" : "").">".$link['link_text']."</a>");
+				$pagelinks[$link['link_name']] = array("id" => $link['link_id'], "text" => $link['link_text'], "url" => _BASEDIR.$link['link_url'], "link" => "<a href=\""._BASEDIR.$link['link_url']."\" title=\"".$link['link_text']."\"".($link['link_target'] ? " target=\"_blank\"" : "").($current == $link['link_name'] ? " id=\"current\"" : "").">".$link['link_text']."</a>");
+			}
+		}
+		else $output .= write_error(_ERROR);
+		unset($_GET['edit']);
+	}
+}
+if(isset($_GET['edit']) || isset($_GET["new"])) {
+	if(isset($_GET['edit'])) {
+		$pagequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_pagelinks WHERE link_id = ".$_GET['edit']." LIMIT 1");
+		$link =  dbassoc($pagequery);
+		$id = $link['link_id'];
+		$name = $link['link_name'];
+		$text = $link['link_text'];
+		$url = $link['link_url'];
+		$target = $link['link_target'];
+		$access = $link['link_access'];
+		$edit = $_GET['edit'];
+		$accesskey = $link['link_key'];
+	}
+	else {
+		$link = "";
+		$id = "";
+		$name = "";
+		$text = "";
+		$url = "";
+		$target = "";
+		$link = "";
+		$edit = "";
+		$access = 0;
+		$accesskey = "";
+	}
+	$output .= "<form method=\"POST\" id=\"settingsform\" enctype=\"multipart/form-data\" action=\"admin.php?action=links".($edit ? "&amp;edit=$edit" : "")."\">
+	<p><label for=\"link_name\">"._NAME.":</label> <input type=\"text\" class=\"textbox\" name=\"link_name\" value=\"$name\"> <br />
+	<label for=\"link_text\">"._LINKTEXT.":</label> <input type=\"text\" class=\"textbox\" name=\"link_text\" value=\"$text\"><br />
+	<label for=\"link_key\">"._LINKKEY.":</label> <input type=\"text\" class=\"textbox\" name=\"link_key\" value=\"$accesskey\" size=\"1\"><br />
+	<label for=\"link_url\">"._URL.":</label> <input type=\"text\" class=\"textbox\" name=\"link_url\" value=\"$url\"><br />
+	<label for=\"link_target\">"._TARGET.":</label> <select name=\"link_target\" class=\"textbox\">
+		<option value=\"0\"".($target ? "" : " selected").">"._SAMEWINDOW."</option>
+		<option value=\"1\"".($target ? " selected" : "").">"._NEWWINDOW."</option>
+	</select><br />
+	<label for=\"link_access\">"._LINKACCESS.":</label> <select name=\"link_access\" class=\"textbox\">
+		<option value=\"0\"".($access ? "" : " selected").">"._ALL."</option>
+		<option value=\"1\"".($access == 1 ? " selected" : "").">"._MEMBERS."</option>
+		<option value=\"2\"".($access == 2 ? " selected" : "").">"._ADMINS."</option>
+	</select><br />
+	<INPUT type=\"submit\" class=\"button\" name=\"submit\" id=\"submit\" value=\""._SUBMIT."\"></form>";
+	$output .= write_message(_NAMECONVENTIONS);
+}
+else {
+// Re-populate the list of links to reflect any changes we just made.
+$linkquery = dbquery("SELECT * from ".TABLEPREFIX."fanfiction_pagelinks ORDER BY link_access ASC");
+if(!isset($current)) $current = "";
+unset($pagelinks);
+	$output .= "<table class=\"tblborder\" style=\"margin: 0 auto;\"><tr><th class=\"tblborder\">"._LINKS."</th><th class=\"tblborder\">"._OPTIONS."</th></tr>";
+while($link = dbassoc($linkquery)) {
+	if($link['link_access'] && !isMEMBER) continue;
+	if($link['link_access'] == 2 && !isADMIN) continue;
+	$tpl->assignGlobal($link['link_name'], "<a href=\""._BASEDIR.$link['link_url']."\" title=\"".$link['link_text']."\"".($link['link_target'] ? " target=\"_blank\"" : "").($current == $link['link_name'] ? " id=\"current\"" : "").">".$link['link_text']."</a>");
+	$pagelinks[$link['link_name']] = array("id" => $link['link_id'], "text" => $link['link_text'], "url" => _BASEDIR.$link['link_url'], "link" => "<a href=\""._BASEDIR.$link['link_url']."\" title=\"".$link['link_text']."\"".($link['link_target'] ? " target=\"_blank\"" : "").($current == $link['link_name'] ? " id=\"current\"" : "").">".$link['link_text']."</a>");
+	$output .= "<tr><td class=\"tblborder\"><a href=\""._BASEDIR.$link['link_url']."\" title=\"".$link['link_text']."\"".($link['link_target'] ? " target=\"_blank\"" : "").">".$link['link_text']."</a></td></td>
+		<td class=\"tblborder\"><a href=\"admin.php?action=links&amp;edit=".$link['link_id']."\">"._EDIT."</a> | 
+		<a href=\"admin.php?action=links&amp;delete=".$link['link_id']."\">"._DELETE."</a></td></tr>";
+}
+
+	if(!dbnumrows($linkquery)) $output .= "<tr><td class=\"tblborder\" colspan=\"2\" align=\"center\">"._NORESULTS."</td></tr>";
+	$output .= "<tr><td class=\"tblborder\" colspan=\"2\" align=\"center\"><a href=\"admin.php?action=links&amp;new=1\">"._ADDNEWLINK."</a></td></tr>";
+	$output .= "</table>";
+}
+?>

file:b/admin/lock.php (new)
--- /dev/null
+++ b/admin/lock.php
@@ -1,1 +1,84 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+	if(uLEVEL > 1) accessDenied( );
+	$do = $_GET["do"];
+	if(isset($_GET["unlock"]) && isNumber($_GET['unlock'])) {
+		$output .= "<div id=\"pagetitle\">"._UNLOCK."</div>";
+		if($_GET["confirm"] == "yes")
+		{
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_authors SET level = '0' WHERE uid = '".$_GET['unlock']."'");
+			$output .= "<center>"._ACTIONSUCCESSFUL."</center>";
+		}
+		else if ($_GET["confirm"] == "no")
+		{
+			$output .= "<center>"._ACTIONCANCELLED."</center>";
+		}
+		else
+		{
+			$output .= "<div id=\"pagetitle\">"._CONFIRMUNLOCK."</div>";
+			$output .= "<center>[ <a href=\"admin.php?action=lock&confirm=yes&unlock=".$_GET['unlock']."\">"._YES."</a> | <a href=\"admin.php?action=lock&confirm=no&unlock=".$_GET['unlock']."\">"._NO."</a> ]</center>";
+		}
+	
+	}
+
+	else if(isset($do)) {
+	
+		if($_POST['submit'] && isNumber($_POST['uid'])) {
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_authors SET level = '-1' WHERE uid = '".$_POST['uid']."'");
+			
+			$output .= "<center>"._BACK2ADMIN."</center>";
+			return $output;
+		}
+
+		$action = $_GET['action'];
+		if(isset($_GET["uid"])) $uid = $_GET["uid"];
+		else $uid = $_POST["uid"];
+		if(!isNumber($uid)) $uid = 0;
+		$output .= "<div id=\"pagetitle\">"._MEMLOCK."</div><form method=\"POST\" name=\"form\" enctype=\"multipart/form-data\" action=\"/admin.php?action=lock&do=$do\">";
+		$output .= "<table align=\"center\" width=\"250\" class=\"tblborder\"><tr><td><label for=\"uid\">"._PENNAME.": </label>";
+			$query = dbquery("SELECT penname, uid FROM ".TABLEPREFIX."fanfiction_authors WHERE level = '0' ORDER BY penname");
+			$output .= "<select name=\"uid\">";
+			while($users = dbassoc($query)) {
+				$output .= "<option value=\"".$users['uid']."\"".($_GET['uid'] == $users['uid'] ? " selected" : "").">".$users['penname']."</option>";
+			}	
+		
+			$output .= "</select></td></tr><tr align\"center\"><td colspan=\"2\">
+			<INPUT type=\"submit\" class=\"button\" value=\""._SUBMIT."\" name=\"submit\">
+			</form></td></tr></table>";	
+	}
+	
+	else {
+
+		if($let == _OTHER) $letter= _PENNAMEFIELD." REGEXP '^[^a-z]'";
+		else $letter .= _PENNAMEFIELD." LIKE '".$_GET['let']."%'";
+		$output .= "<div class='sectionheader'>"._MEMLOCK."</div>";
+		$pagelink = "<a href=\"admin.php?action=lock&let=";
+		$countquery = "SELECT count("._UIDFIELD.") FROM "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs as ap ON ap.uid = "._UIDFIELD." WHERE ap.level = -1";
+		$authorquery = "SELECT "._PENNAMEFIELD." as penname, "._UIDFIELD." as uid, count(stories.uid) as stories FROM "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_stories as stories ON ("._UIDFIELD." = stories.uid) AND "._UIDFIELD." > 0 AND stories.validated > 0 LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs as ap ON ap.uid = "._UIDFIELD." WHERE ap.level = -1 GROUP BY "._UIDFIELD;
+		include("includes/members_list.php");
+
+	
+		$output .= "<div class=\"respond\"><a href=\"admin.php?action=lock&do=new\">"._LOCKNEW."</a></div>";
+	}
+
+?>

--- /dev/null
+++ b/admin/mailusers.php
@@ -1,1 +1,73 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+	include("includes/emailer.php");
+	$cat = isset($_GET['cat']) ? $_GET['cat'] : -1;
+
+	$output .= "<div style='text-align: center;'><h4>"._MAILUSERS."</h4></div>";
+	if(isset($_POST['submit'])) {
+		$who = isset($_POST['who']) ? $_POST['who'] : false;
+		$category = isset($_POST['category']) ? $_POST['category'] : false;
+		if($who == "authors") $select = "SELECT "._EMAILFIELD." as email, "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE.", ".TABLEPREFIX."fanfiction_authorprefs as ap WHERE "._UIDFIELD." = ap.uid AND ap.stories > 0";
+		else if($who == "admins") $select = "SELECT "._EMAILFIELD." as email, "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE.", ".TABLEPREFIX."fanfiction_authorprefs as ap WHERE "._UIDFIELD." = ap.uid AND ap.level > 0";
+		else $select = "SELECT "._EMAILFIELD." as email, "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE;
+		if($who == "admins" && $_POST['category'] != "all" && isNumber($_POST['category'])) $select .= " AND (FIND_IN_SET(".$_POST['category'].", ap.categories) > 0 OR ap.categories = 0)";
+		$query = dbquery($select);
+		$subject = strip_tags(descript($_POST['subject']));
+		$mailtext = descript($_POST['mailtext']);
+		$sent = 0;
+		while($result = dbassoc($query)){
+			$mailresult = sendemail($result['penname'], $result['email'], $sitename, $siteemail, $subject, $mailtext, "html");
+			if($mailresult) $sent++;
+			$output .= $result['penname']." <img src=\"images/".($mailresult ? "check.gif\" alt=\"check\" title=\"check\"" : "X.gif\" alt=\"X\" title=\"X\"")."><br />";		
+		}
+		if($sent) $output .= write_message(_MESSAGESENT." $sent<br/>"._ACTIONSUCCESSFUL);
+		else $output .= write_message(_NOMAILSENT);
+	}
+	else {
+		$output .= "<form method=\"POST\" name=\"form\" enctype=\"multipart/form-data\" action=\"admin.php?action=mailusers\">
+		<table align=\"center\"><tr><td><label for=\"who\">"._EMAIL.":</label> </td><td><select name=\"who\" id=\"who\">
+			<option value=\"all\">"._ALLMEMBERS."</option>
+			<option value=\"authors\">"._AUTHORSONLY."</option>
+			<option value=\"admins\">"._ADMINS."</option>
+		</select></td></tr><tr><td><label for=\"category\">"._CATEGORY.":</label> </td><td><select name=\"category\" id=\"category\" onChange='if(this.selectedIndex.value == false) return false; else document.location = document.location.pathname + \"?action=mailusers&amp;cat=\" + document.form.category.options[document.form.category.selectedIndex].value;'><option value=\"all\">"._ALL."</option>";
+		$result = dbquery("SELECT category, catid, parentcatid FROM ".TABLEPREFIX."fanfiction_categories ORDER BY leveldown, displayorder");
+		while($cats = dbassoc($result)) {
+			if($cats['catid'] == $cat || $cats['parentcatid'] == $cat) {
+				$output .= "<option value=\"".$cats['catid']."\"";
+				if($cats['catid'] == $cat) $output .= " selected";
+				$output .= ">".$cats['category'];
+				$output .= "</option>";
+			}		
+		}
+		$output .= "</select></td></tr>
+		<tr><td><label for=\"subject\">"._SUBJECT.":</label> </td><td><INPUT  type=\"text\" class=\"textbox=\" name=\"subject\"></td></tr>
+		<tr><td valign=\"top\"><label for=\"mailtext\">"._TEXT.":</label> </td><td><textarea class=\"textbox\" name=\"mailtext\" cols=\"40\" rows=\"6\"></TEXTAREA></td></tr>
+		<tr><td><INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></td></tr></table></form>";
+		$output .= "<br /><br /><div style='text-align: center;'>"._EMAILWARNING."</div><br />";
+	}
+
+?>

--- /dev/null
+++ b/admin/maintenance.php
@@ -1,1 +1,215 @@
-
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+$maint = isset($_GET['maint']) ? $_GET['maint'] : false;
+$output .= "<div id='pagetitle'>"._ARCHIVEMAINT."</div>";
+if($maint == "update") {
+	if(file_exists("admin/update.php")) include_once("admin/update.php");
+}
+if($maint == "reviews") {
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET rating = '0', reviews = '0'"); // Set them all to 0 before we re-insert.
+	$stories = dbquery("SELECT AVG(rating) as average, item FROM ".TABLEPREFIX."fanfiction_reviews WHERE type = 'ST' AND rating != '-1' GROUP BY item");
+	while($s = dbassoc($stories)) {
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET rating = '".round($s['average'])."' WHERE sid = '".$s['item']."'");
+	}
+	$stories = dbquery("SELECT COUNT(reviewid) as count, item FROM ".TABLEPREFIX."fanfiction_reviews WHERE type = 'ST' AND review != 'No Review' GROUP BY item");
+	while($s = dbassoc($stories)) {
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET reviews = '".$s['count']."' WHERE sid = '".$s['item']."'");
+	}
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET rating = '0', reviews = '0'");
+	$chapters = dbquery("SELECT AVG(rating) as average, chapid FROM ".TABLEPREFIX."fanfiction_reviews WHERE type = 'ST' AND rating != '-1' GROUP BY chapid");
+	while($c = dbassoc($chapters)) {
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET rating = '".round($c['average'])."' WHERE chapid = '".$c['chapid']."'");
+	}
+	$chapters = dbquery("SELECT COUNT(reviewid) as count, chapid FROM ".TABLEPREFIX."fanfiction_reviews WHERE type = 'ST' AND review != 'No Review' GROUP BY chapid");
+	while($c = dbassoc($chapters)) {
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET reviews = '".$c['count']."' WHERE chapid = '".$c['chapid']."'");
+	}
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_series SET rating = '0', reviews = '0'");
+	$series = dbquery("SELECT seriesid FROM ".TABLEPREFIX."fanfiction_series");
+	while($s = dbassoc($series)) {
+		$thisseries = $s['seriesid'];
+		include("includes/seriesreviews.php");
+	}
+	// For modules which may allow reviews.
+	$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'revfix'");
+	while($code = dbassoc($codequery)) {
+		$eval($code['code_text']);
+	}
+	if($logging) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_RECALCREVIEWS, USERPENNAME, USERUID))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'AM', " . time() . ")");
+	$output .= write_message(_ACTIONSUCCESSFUL);
+}
+else if($maint == "stories") {
+		$authors = dbquery("SELECT uid, count(uid) AS count FROM ".TABLEPREFIX."fanfiction_stories WHERE validated > 0 GROUP BY uid");
+		while($a = dbassoc($authors)) {
+			$alist[$a['uid']] = $a['count'];
+		}
+		$coauthors = dbquery("SELECT uid, count(sid) AS count FROM ".TABLEPREFIX."fanfiction_coauthors GROUP BY uid");
+		while($ca = dbassoc($coauthors)) {
+			if(isset($alist[$ca['uid']])) $alist[$ca['uid']] = $alist[$ca['uid']] + $ca['count'];
+			else $alist[$ca['uid']] = $ca['count'];
+		}
+		foreach($alist AS $a => $s) {
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET stories = '$s' WHERE uid = '$a' LIMIT 1");
+		}
+		$count =  dbquery("SELECT SUM(wordcount) as count, sid FROM ".TABLEPREFIX."fanfiction_chapters WHERE validated = '1' GROUP BY sid");
+		while($c = dbassoc($count)) {
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET wordcount = '".$c['count']."' WHERE sid = '".$c['sid']."'");
+		}
+	$output .= write_message(_ACTIONSUCCESSFUL);
+}
+else if($maint == "categories") {
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET numitems = '0'");
+	$cats = dbquery("SELECT catid FROM ".TABLEPREFIX."fanfiction_categories ORDER BY leveldown DESC");
+	while($cat = dbrow($cats)) {
+		unset($subcats);
+		$subs = dbquery("SELECT catid FROM ".TABLEPREFIX."fanfiction_categories WHERE parentcatid = $cat[0]");
+		$subcats = array( );
+		while($sub = dbrow($subs)) {
+			$subcats[] = $sub[0];
+			if($categories[$sub[0]]) $subcats = array_merge($subcats, $categories[$sub[0]]);
+		}
+		$categories[$cat[0]] = $subcats;
+		$countquery = dbquery("SELECT count(sid) FROM ".TABLEPREFIX."fanfiction_stories WHERE FIND_IN_SET('$cat[0]', catid) ".(count($subcats) > 0 ? " OR FIND_IN_SET(". implode(", catid) OR FIND_IN_SET(",$subcats).", catid)" : "")." AND validated > 0");
+		list($count) = dbrow($countquery);
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET numitems = $count WHERE catid = $cat[0]");
+	}
+	if($logging) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_CATCOUNTS, USERPENNAME, USERUID))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'AM', " . time() . ")");
+	$output .= write_message(_CATCOUNTSUPDATED);
+}
+else if($maint == "categories2") {
+	$selectA = "SELECT category, catid FROM ".TABLEPREFIX."fanfiction_categories WHERE parentcatid = -1 ORDER BY displayorder";
+	$resultA = dbquery($selectA);
+	$countA = 1;
+	while($cat = dbassoc($resultA)) {
+		$count = 1;
+		if($cat['parentcatid'] = -1) {
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET displayorder = $countA WHERE catid = $cat[catid]");
+			$countA++;
+		}
+		$selectB = "SELECT category, catid FROM ".TABLEPREFIX."fanfiction_categories WHERE parentcatid = '$cat[catid]' ORDER BY displayorder";
+		$resultB = dbquery($selectB);
+		while($sub = dbassoc($resultB)) {
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET displayorder = $count WHERE catid = $sub[catid]");
+			$count++;
+		}
+	}
+	$output .= write_message(_ACTIONSUCCESSFUL);
+}
+else if($maint == "stats") {
+	// check that the statisics is working before doing anything else
+	$check = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_stats WHERE sitekey = '".SITEKEY."' LIMIT 1");
+	if(dbnumrows($check) < 1) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_stats(`sitekey`) VALUES('".SITEKEY."')");
+
+	$serieslist = dbquery("SELECT seriesid FROM ".TABLEPREFIX."fanfiction_series");
+	$totalseries = dbnumrows($serieslist);
+	while($s = dbassoc($serieslist)) {
+		$numstories = count(storiesInSeries($s['seriesid']));
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_series SET numstories = '$numstories' WHERE seriesid = ".$s['seriesid']." LIMIT 1");
+	}
+
+	$newslist = dbquery("SELECT count(cid) as count, nid FROM ".TABLEPREFIX."fanfiction_comments GROUP BY nid");
+	while($n = dbassoc($newslist)) {
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_news SET comments = '".$n['count']."' WHERE nid = ".$n['nid']);
+	}
+
+	$storiesquery =dbquery("SELECT COUNT(sid) as totals, SUM(wordcount) as totalwords FROM ".TABLEPREFIX."fanfiction_stories WHERE validated > 0 ");
+
+	list($stories, $words) = dbrow($storiesquery);
+	list($authors) = dbrow(dbquery("SELECT count(uid) FROM ".TABLEPREFIX."fanfiction_authorprefs WHERE stories > 0"));
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET stories = '$stories', authors = '$authors', wordcount = '$words' WHERE sitekey = '".SITEKEY."'"); 
+
+	$chapterquery = dbquery("SELECT COUNT(chapid) as chapters FROM ".TABLEPREFIX."fanfiction_chapters where validated > 0");
+	list($chapters) = dbrow($chapterquery);
+
+	$authorquery = dbquery("SELECT COUNT("._UIDFIELD.") as totalm FROM "._AUTHORTABLE);
+	list($members) = dbrow($authorquery);
+
+	list($newest) = dbrow(dbquery("SELECT "._UIDFIELD." as uid FROM "._AUTHORTABLE." ORDER BY "._UIDFIELD." DESC LIMIT 1"));
+	$reviewquery = dbquery("SELECT COUNT(reviewid) as totalr FROM ".TABLEPREFIX."fanfiction_reviews WHERE review != 'No Review'");
+	list($reviews) = dbrow($reviewquery);
+	$reviewquery = dbquery("SELECT COUNT(DISTINCT uid) FROM ".TABLEPREFIX."fanfiction_reviews WHERE review != 'No Review' AND uid != 0");
+	list($reviewers) = dbrow($reviewquery);
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET series = '$totalseries', chapters = '$chapters', members = '$members', newestmember = '$newest', reviews = '$reviews', reviewers = '$reviewers' WHERE sitekey = '".SITEKEY."'"); 
+	$news = dbquery("SELECT count(nid) as count, nid FROM ".TABLEPREFIX."fanfiction_comments GROUP BY nid");
+	while($n = dbassoc($news)) {
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_news SET comments = '".$n['count']."' WHERE nid = '".$n['nid']."' LIMIT 1");
+	}
+	$output .= write_message(_ACTIONSUCCESSFUL);
+}
+else if($maint == "panels") {
+	$ptypes = dbquery("SELECT panel_type FROM ".TABLEPREFIX."fanfiction_panels GROUP BY panel_type");
+	while($ptype = dbassoc($ptypes)) {
+		if($ptype['panel_type'] == "A") {
+			for($x = 1; $x < 5; $x++) {
+				$count = 1;
+				$plist = dbquery("SELECT panel_name, panel_id FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_hidden = '0' AND panel_type = '".$ptype['panel_type']."' AND panel_level = '$x' ORDER BY panel_level, panel_order");
+				while($p = dbassoc($plist)) {
+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_panels SET panel_order = '$count' WHERE panel_id = '".$p['panel_id']."' LIMIT 1");
+					$count++;
+				}
+			}
+		}
+		else {
+			$count = 1;
+			$plist = dbquery("SELECT panel_name, panel_id FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_hidden = '0' AND panel_type = '".$ptype['panel_type']."' ORDER BY ".($ptype['panel_type'] == "A" ? "panel_level," : "")."panel_order");
+			while($p = dbassoc($plist)) {
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_panels SET panel_order = '$count' WHERE panel_id = '".$p['panel_id']."' LIMIT 1");
+				$count++;
+			}
+		}
+	}
+	$output .= write_message(_ACTIONSUCCESSFUL);
+}
+else if($maint == "optimize") {
+	$alltables = dbquery("SHOW TABLES");
+
+	while ($table = dbassoc($alltables)) {
+		foreach ($table as $db => $tablename) {
+			dbquery("OPTIMIZE TABLE `".$tablename."`");
+		}
+	}
+ 	if($logging) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_OPTIMIZE, USERPENNAME, USERUID))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'AM', " . time() . ")");
+	$output .= write_message(_ACTIONSUCCESSFUL);
+}
+else if($maint == "backup") {
+}
+else {
+	$output .= "
+<ul>
+	<li><a href='admin.php?action=maintenance&amp;maint=reviews'>"._RECALCREVIEWS."</a> <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_RECALCREVIEWS."</span></A></li>
+	<li><a href='admin.php?action=maintenance&amp;maint=stories'>"._RECALCSTORIES."</a> <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_RECALCSTORIES."</span></A></li>
+	<li><a href='admin.php?action=maintenance&amp;maint=categories'>"._COUNTCATS."</a> <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_CATCOUNTS."</span></A></li>
+	<li><a href='admin.php?action=maintenance&amp;maint=categories2'>"._CATORDER."</a> <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_CATORDER."</span></A></li>
+	<li><a href='admin.php?action=maintenance&amp;maint=stats'>"._STATS."</a> <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_STATS."</span></A></li>
+	<li><a href='admin.php?action=maintenance&amp;maint=panels'>"._PANELORDER."</a> <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_PANELORDER."</span></A></li>
+	<li><a href='admin.php?action=maintenance&amp;maint=optimize'>"._OPTIMIZE."</a> <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_OPTIMIZE."</span></A></li>
+	<li><a href='admin/backup.php' target='_new'>"._BACKUP."</a> <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_BACKUP."</span></A></li>
+	<li><a href='admin/backup_utf8.php' target='_new'>"._BACKUP."</a> (UTF-8) <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_BACKUP."</span></A></li>
+	<li><a href='admin.php?action=maintenance&amp;maint=update'>"._UPDATE."</a>  <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_UPDATE."</span></A></li>
+</ul>";
+}
+?>

file:b/admin/manual.php (new)
--- /dev/null
+++ b/admin/manual.php
@@ -1,1 +1,32 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+if(file_exists("docs/adminmanual_{$language}.htm")) $file = "docs/adminmanual_{$language}.htm";
+else $file = "docs/adminmanual_en.htm";
+$log_file = @fopen($file, "r");
+$output .= @fread($log_file, filesize($file));
+@fclose($log_file);
+?>

file:b/admin/members.php (new)
--- /dev/null
+++ b/admin/members.php
@@ -1,1 +1,272 @@
-
+<?php
+
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+function random_char($string)
+{
+	$length = strlen($string);
+	$position = mt_rand(0, $length - 1);
+	return($string[$position]);
+}
+
+function random_string ($charset_string, $length)
+{
+	$return_string = random_char($charset_string);
+	for ($x = 1; $x < $length; $x++)
+	$return_string .= random_char($charset_string);
+	return($return_string);
+}
+
+unset($countquery, $authorquery);
+$confirm = isset($_GET['confirm']) ? $_GET['confirm'] : false;
+	if(isset($_GET['lock']) && isNumber($_GET['lock'])) {
+		$output .= "<div class='sectionheader'>"._LOCKMEM."</div>";
+		if($confirm == "yes") {
+			if(check_prefs($_GET['lock'])) dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET level = '-1' WHERE uid = '".$_GET['lock']."'");
+			else dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_authorprefs(`uid`, `level`) VALUES('".$_GET['lock']."', '-1')");
+			$output .= write_message(_ACTIONSUCCESSFUL);
+		}
+		else if ($confirm == "no") {
+			$output .= write_message(_ACTIONCANCELLED);
+		}
+		else {
+			$output .= write_message(_LOCKCONFIRM."<br /><br />
+						[ <a href=\"admin.php?action=members&confirm=yes&lock=".$_GET['lock']."\">"._YES."</a> | <a href=\"admin.php?action=members&confirm=no&lock=".$_GET['lock']."\">"._NO."</a> ]");
+		}
+	}
+	else if(isset($_GET["unlock"]) && isNumber($_GET["unlock"])) {
+		$output .= "<div class='sectionheader'>"._UNLOCK."</div>";
+		if($confirm == "yes")
+		{
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET level = '0' WHERE uid = '".$_GET['unlock']."'");
+			$output .= write_message(_ACTIONSUCCESSFUL);
+		}
+		else if ($confirm == "no")
+		{
+			$output .= write_message(_ACTIONCANCELLED);
+		}
+		else
+		{
+			$output .= write_message(_CONFIRMUNLOCK."<br /><br />
+						[ <a href=\"admin.php?action=members&confirm=yes&unlock=".$_GET['unlock']."\">"._YES."</a> | <a href=\"admin.php?action=members&confirm=no&unlock=".$_GET['unlock']."\">"._NO."</a> ]");
+		}
+	
+	}
+	else if(isset($_GET["release"]) && isNumber($_GET['release'])) {
+		$output .= "<div class='sectionheader'>"._RELEASED."</div>";
+		if(_AUTHORTABLE != TABLEPREFIX."fanfiction_authors as author") $output .= write_message("<br />"._FOREIGNAUTHORTABLE);
+		if($confirm == "yes")
+		{
+			include("includes/emailer.php");
+			dbquery("UPDATE "._AUTHORTABLE." SET admincreated = '0' WHERE "._UIDFIELD." = '".$_GET['release']."'");
+			$emailquery = dbquery("SELECT "._EMAILFIELD." as email, "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." WHERE uid = '".$_GET['release']."'");
+			$email = dbassoc($emailquery);
+			mt_srand((double)microtime() * 1000000);
+			$charset = '23456789' . 'abcdefghijkmnpqrstuvwxyz' . 'ABCDEFGHJKLMNPQRSTUVWXYZ';
+			$pass = random_string($charset, 10);
+			$encryppass = md5($pass);
+			//$headers = "From: $sitename\n";
+			dbquery("UPDATE "._AUTHORTABLE." SET "._PASSWORDFIELD." = '$encryppass' WHERE uid = '".$_GET['release']."'");
+			
+			$subject = _SIGNUPSUBJECT;
+			
+			$letter = sprintf(_RELEASEMESSAGE, $email['penname'], $pass);
+
+			$mailresult = sendemail($email['penname'], $email['email'], $sitename, $siteemail, $subject, $letter);
+			if($mailresult) $output .= write_message(_AUTHORRELEASED);
+			else $output .= write_error(_EMAILFAILED);
+		}
+		else if ($confirm == "no")
+		{
+			$output .= write_message(_ACTIONCANCELLED);
+		}
+		else {
+			$output .= write_message(_CONFIRMAUTHORRELEASE."<br /><br />
+						[ <a href=\"admin.php?action=members&confirm=yes&release=$_GET[release]\">"._YES."</a> | <a href=\"admin.php?action=members&confirm=no&release=$_GET[release]\">"._NO."</a> ]");
+		}
+	}	
+	else if(isset($_GET["revoke"]) && isNumber($_GET["revoke"])) {
+		$output .= "<div class='sectionheader'>"._REVOKEVAL."</div>";
+		if($confirm == "yes")
+		{
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET validated = '0' WHERE uid = '$_GET[revoke]'");
+			$output .= write_message(_ACTIONSUCCESSFUL);
+		}
+		else if ($confirm == "no")
+		{
+			$output .= write_message(_ACTIONCANCELLED);
+		}
+		else
+		{
+			$output .= write_message(_CONFIRMVALREVOKE."<br /><br />
+						[ <a href=\"admin.php?action=members&amp;confirm=yes&amp;revoke=$_GET[revoke]\">"._YES."</a> | <a href=\"admin.php?action=members&amp;confirm=no&amp;revoke=$_GET[revoke]\">"._NO."</a> ]");
+		}
+	}
+	else if(isset($_GET["delete"]) && isNumber($_GET["delete"])) {
+		$output .= "<div class='sectionheader'>"._DELETEUSER."</div>";
+		if(_AUTHORTABLE != TABLEPREFIX."fanfiction_authors as author") $output .= write_message("<br />"._FOREIGNAUTHORTABLE);
+		else if($confirm == "yes") {
+			include("includes/deletefunctions.php");
+			$output .= deleteUser($_GET['delete']);
+		}
+		else if ($confirm == "no") {
+			$output .= write_message(_ACTIONCANCELLED);
+		}
+		else {
+			$output .= write_message(_CONFIRMDELETE."<br /><br />
+						[ <a href=\"admin.php?action=members&confirm=yes&delete=$_GET[delete]\">"._YES."</a> | <a href=\"admin.php?action=members&confirm=no&delete=$_GET[delete]\">"._NO."</a> ]");
+		}
+	}
+	else if(isset($_GET["validate"]) && isNumber($_GET["validate"])) {
+		$output .= "<div class='sectionheader'>"._NONVALMEMBERS."</div>";
+		if($confirm == "yes") {
+			if(check_prefs($_GET['validate'])) dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET validated = '1' WHERE uid = '".$_GET['validate']."'");
+			else dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_authorprefs(`uid`, `validated`) VALUES('".$_GET['validate']."', '1')");
+			$output .= write_message(_ACTIONSUCCESSFUL);
+		}
+		else if ($confirm == "no") {
+			$output .= write_message(_ACTIONCANCELLED);
+		}
+		else {
+			$output .= write_message(_CONFIRMVALIDATE."<br /><br />
+						[ <a href=\"admin.php?action=members&amp;confirm=yes&amp;validate=".$_GET['validate']."\">"._YES."</a> | <a href=\"admin.php?action=members&confirm=no&amp;validate=".$_GET['validate']."\">"._NO."</a> ]");
+		}
+	}
+	else if(isset($_GET["do"]) && $_GET['do'] == "add") {
+		if(_AUTHORTABLE != TABLEPREFIX."fanfiction_authors as author") $output .= write_message("<br />"._FOREIGNAUTHORTABLE);
+		$output .= "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=members\"><table align=\"center\"><tr><td colspan=\"2\">
+			<div style='text-align: center; font-weight: bold;'>"._ADDAUTHOR." <A HREF=\"javascript:n_window('docs/adminhints.htm#addauthor');\">[?]</A></div></td></tr>
+			<tr><td><label for=\"penname\">"._PENNAME.":</label></td><td><INPUT  type=\"text\" class=\"textbox=\" name=\"penname\"></td></tr>
+			<tr><td><label for=\"realname\">"._REALNAME.":</label></td><td><INPUT  type=\"text\" class=\"textbox=\" name=\"realname\"></td></tr>
+			<tr><td><label for=\"email\">"._EMAIL.":</label></td><td><INPUT  type=\"text\" class=\"textbox=\" name=\"email\"></td></tr>
+			<tr><td colspan=\"2\"><INPUT type=\"submit\" class=\"button\" value=\""._SUBMIT."\" name=\"submit\"></form></td></tr></table>";
+		}
+		else if (isset($_POST['submit'])) {
+			if(preg_match("!^[a-z0-9_ ]{3,30}$!i", $_POST['penname'])) {
+				dbquery("INSERT INTO ".substr(_AUTHORTABLE, 0, strpos(_AUTHORTABLE, "as author"))."(penname, realname, email, admincreated, date) VALUES ('".escapestring(descript($_POST['penname']))."', '".escapestring(descript($_POST['realname']))."', '".escapestring(descript($_POST['email']))."', '1', now())");
+				$newuid = dbinsertid( );
+				if($logging) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_ADMIN_REG, descript($_POST['penname']), $newuid, USERPENNAME, USERUID, $_SERVER['REMOTE_ADDR']))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'RG', " . time() . ")");
+				if(!$skin) {
+					$skinquery = dbquery("SELECT skin FROM ".$settingsprefix."fanfiction_settings WHERE sitekey ='".SITEKEY."'");
+					list($skin) = dbrow($skinquery);
+				}
+				dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_authorprefs(uid, userskin, storyindex, sortby) VALUES('$newuid', '$skin', '$displayindex', '$defaultsort')");
+				
+				$output .= write_message(_ACTIONSUCCESSFUL);
+			}
+		else $output .= write_error(_BADUSERNAME);
+	}
+	else {
+		$output .= "<div class='sectionheader'>";
+		if(isset($_GET['list'])) $list = $_GET['list'];
+		else $list = false;
+		$where = "";
+
+		if($list  == "admincreated") {
+			if(_AUTHORTABLE != TABLEPREFIX."fanfiction_authors as author") {
+				$fieldtest = dbquery("SHOW COLUMNS FROM ".substr(_AUTHORTABLE, 0, strlen(_AUTHORTABLE) - 9)." LIKE 'admincreated'");
+			}
+			if(isset($fieldtest) && !dbnumrows($fieldtest)) {
+				$where = "";
+				$output .= write_message(_FUNCTIONDISABLED);
+				$tpl->assign("output", $output);
+				$tpl->printToScreen( );
+				dbclose( );
+				exit();
+			}
+			else {
+				$where = " WHERE author.admincreated = '1'";
+				$do = "release";
+				$output .= _INPUTBYADMIN;
+				$message = write_message(_RELEASEAUTHORS);
+			}
+		}
+		else if($list == "admins") {
+			$where = " WHERE ap.level > 0";
+			$do = false;
+			$authorlink = "<a href=\"admin.php?action=admins&amp;do=edit&amp;uid=";
+			$output .= _ADMINS;
+		}
+		else if($list == "noval") {
+			$where = " WHERE  ap.validated IS NULL OR ap.validated = '0'";
+			$do = "validate";
+			$output .= _NONVALMEMBERS;
+		}
+		else if($list == "validated") {
+			$where = " WHERE ap.validated = '1'";
+			$do = "revoke";
+			$output .= _VALMEMBERS;
+		}
+		else if($list == "locked") {
+			$where = " WHERE ap.level = -1";
+			$do = "unlock";
+			$output .= _LOCKMEM;
+		}
+		else if($list == "unlocked") {
+			$where = " WHERE (ap.level IS NULL OR ap.level > -1) ";
+			$do = "lock";
+			$output .= _UNLOCKMEMBERS;
+			$message = write_message(_LOCKMEMBERS);
+		}
+		else if($list == "authors") {
+			$where = " WHERE ap.stories > 0";
+			$authorlink = "<a href=\"user.php?action=editbio&amp;uid=";
+			$output .= _AUTHORS;
+		}
+		else {
+			$where = "";
+			$do = "members";
+			$authorlink = "<a href=\"user.php?action=editbio&amp;uid=";
+			$output .= _MEMBERS;
+		}
+		if($let == _OTHER) {
+			$where .= (empty($where) ? " WHERE " : " AND ")._PENNAMEFIELD." REGEXP '^[^a-z]'";
+			$output .= " - "._OTHER;
+		}
+		else if($let){
+			$where .= (empty($where) ? " WHERE " : " AND ")._PENNAMEFIELD." LIKE '$let%'";
+			$output .= " - $let";
+		}
+		$list = $list;
+		if(!$list) $list = "members";
+		$output .= "</div>";
+		if(!isset($authorlink)) $authorlink = "<a href=\"admin.php?action=members&amp;do=list&amp;$do=";
+		if(!isset($countquery)) $countquery = _MEMBERCOUNT." $where";
+		if(!isset($authorquery)) $authorquery = _MEMBERLIST." $where GROUP BY "._UIDFIELD;
+		$output .= "<p align=\"center\">
+			<a href=\"admin.php?action=members\">"._ALLMEMBERS."</a> | <a href=\"admin.php?action=members&amp;do=list&amp;list=admins\">"._ADMINS."</a> |  <a href=\"admin.php?action=members&amp;do=list&amp;list=authors\">"._AUTHORS."</a> | <a href=\"admin.php?action=members&amp;do=list&amp;list=admincreated\">"._INPUTBYADMIN."</a> <br />
+			<a href=\"admin.php?action=members&amp;do=list&amp;list=noval\">"._NONVALMEMBERS."</a> | <a href=\"admin.php?action=members&amp;do=list&amp;list=validated\">"._VALMEMBERS."</a> | <a href=\"admin.php?action=members&amp;do=list&amp;list=locked\">"._LOCKMEMLIST."</a> | <a href=\"admin.php?action=members&amp;do=list&amp;list=unlocked\">"._UNLOCKMEMBERS."</a></p>";
+		$pagelink = "admin.php?action=members&amp;do=list&amp;list=$list&amp;".($let ? "let=$let&amp;" :"");
+
+		include("includes/members_list.php");
+		if(_AUTHORTABLE != TABLEPREFIX."fanfiction_authors as author") {
+			$fieldtest = dbquery("SHOW COLUMNS FROM ".substr(_AUTHORTABLE, 0, strlen(_AUTHORTABLE) - 9)." LIKE 'admincreated'");
+			if(dbnumrows($fieldtest)) $output .= write_message("<a href=\"admin.php?action=members&do=add\">"._ADDAUTHOR."</a>");
+		}
+		else $output .= write_message("<a href=\"admin.php?action=members&do=add\">"._ADDAUTHOR."</a>");
+		if(isset($message)) $output .= $message;
+	}
+?>

--- /dev/null
+++ b/admin/messages.php
@@ -1,1 +1,45 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+	$output .= "<div id=\"pagetitle\">"._MESSAGESETTINGS."</div>";
+
+if(isset($_POST['submit'])) {
+	$result = dbquery("UPDATE ".TABLEPREFIX."fanfiction_messages SET message_text = '".escapestring(descript($_POST['text']))."' WHERE message_name = '".$_GET['message']."' LIMIT 1");
+	if($result) $output .= write_message(_ACTIONSUCCESSFUL);
+	else $output .= write_error(_ERROR);
+}
+else {
+	$pagequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_messages WHERE message_name = '".$_GET['message']."' LIMIT 1");
+	$message =  dbassoc($pagequery);
+	$text = $message['message_text'];
+	if(!$message) dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_messages` (`message_name` , `message_title` , `message_text` ) VALUES ('".$_GET['message']."', '', '')");
+	$output .= "<div class='sectionheader'>".preg_replace("@\{sitename\}@", $sitename, $message['message_title'])."</div>
+		<div style='width: 100%;'><div  id=\"settingsform\"><form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=messages&message=".$_GET['message']."\">
+		<textarea rows=\"10\" cols=\"60\" style=\"width: 100%;\" ".($_GET['message'] == "tinyMCE" ? "class='mceNoEditor'" :"")." name=\"text\">$text</textarea>";
+	if($tinyMCE && $_GET['message'] != "tinyMCE") 
+		$output .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('text');\" checked><label for='toggle'>"._TINYMCETOGGLE."</label></div>";
+	$output .= "<div style='clear: both;'>&nbsp;</div><INPUT type='submit' class='button' id='submit' value='"._SUBMIT."' name='submit'>
+				</form></div><div style='clear: both;'>&nbsp;</div></div>";
+}
+?>

file:b/admin/modules.php (new)
--- /dev/null
+++ b/admin/modules.php
@@ -1,1 +1,79 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+$dir = opendir("modules");
+$admin = isset($_GET['admin']) && $_GET['admin'] == true ? true : false;
+$module = isset($_GET['module']) ? $_GET['module'] : false;
+if(!$module) {
+	$output .= "<table class=\"tblborder\" cellpadding=\"0\" cellspacing=\"0\" style=\"margin: 0 auto;\">
+	<tr><th class=\"tblborder\">"._NAME."</th><th class=\"tblborder\">"._VERSION."</th><th class=\"tblborder\">"._OPTIONS."</th></tr>";
+	$modquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_modules ORDER BY name");
+	while($m = dbassoc($modquery)) {
+		$modules[$m['name']] = $m;
+	}
+}
+while($folder = readdir($dir)) {
+	if($folder == "." || $folder == ".." || !is_dir("modules/$folder")) continue;
+	$moduleVersion = ""; $moduleName = ""; $moduleDescription = ""; $moduleAuthor = ""; $moduleOpts = array( ); 
+	$moduleAuthorEmail = ""; $moduleWebsite = "";
+	if($module && $module == $folder) {
+		if($admin) {
+			if(file_exists("modules/$folder/admin.php")) include("modules/$folder/admin.php");
+			else accessDenied( );
+		}
+		else if(file_exists("modules/$folder/version.php")) {
+			include("modules/$folder/version.php");
+			$output .= "<div class='sectionheader'>$moduleName - $moduleVersion</div>";
+			if($moduleDescription) $output .= "<p><span class='label'>"._DESC.":</span> $moduleDescription</p>";
+			if($moduleAuthor || $moduleAuthorEmail) $output .= "<p><span class='label'>"._AUTHOR.":</span> ".($moduleAuthorEmail ? "<a href='mailto:$moduleAuthorEmail'>".($moduleAuthor ? $moduleAuthor : $moduleAuthorEmail)."</a>" : $moduleAuthor)."</p>";
+			if($moduleWebsite) $output .= "<p><span class='label'>"._WEBSITE.":</span> <a href='$moduleWebsite'>$moduleWebsite</a></p>";
+			if(file_exists("modules/$folder/changelog.txt")) {
+				$output .= "<p><span class='label'>"._CHANGELOG."</span>:<br /><br />";
+				$file = "modules/$folder/changelog.txt";
+				$log_file = @fopen($file, "r");
+				$file_contents = @fread($log_file, filesize($file));
+				$output .= format_story($file_contents);
+				@fclose($log_file);
+			}
+		}
+		else $output .= write_message(_NORESULTS);
+	}
+	else if(!$module) {
+		if(!file_exists("modules/".$folder."/version.php")) continue;
+		else include("modules/".$folder."/version.php");
+		if(empty($moduleName)) continue;
+		$output .= "<tr><td class=\"tblborder\"><a href='admin.php?action=modules&amp;module=$folder'>$moduleName</a></td><td class=\"tblborder\" style=\"text-align: center;\">".(isset($modules[$moduleName]['version']) ? $modules[$moduleName]['version'] : $moduleVersion)."</td><td class=\"tblborder\">";
+		if(file_exists("modules/$folder/install.php") && !isset($modules[$moduleName])) $moduleOpts[] = "<a href='modules/$folder/install.php'>"._INSTALLMODULE."</a>";
+		if(isset($modules[$moduleName]['version']) && $modules[$moduleName]['version'] < $moduleVersion && file_exists("modules/$folder/update.php")) $moduleOpts[] = "<a href='modules/$folder/update.php'>"._UPDATE."</a> ";
+		if(file_exists("modules/$folder/admin.php") && isset($modules[$moduleName])) $moduleOpts[] = "<a href='admin.php?action=modules&amp;module=$folder&admin=true'>"._OPTIONS."</a>";
+		if(file_exists("modules/$folder/uninstall.php") && isset($modules[$moduleName])) $moduleOpts[] = "<a href='modules/$folder/uninstall.php'>"._UNINSTALLMODULE."</a>";
+		$output .= implode(" | ", $moduleOpts);
+		$output .= "</td></tr>";
+	}
+}
+
+closedir($dir);
+if(!$module) $output .= "</table>";
+?>

file:b/admin/news.php (new)
--- /dev/null
+++ b/admin/news.php
@@ -1,1 +1,111 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if (!defined("_CHARSET")) exit();
+if (uLEVEL > 3) accessDenied();
+$output .= "<div id=\"pagetitle\">" . _NEWS . "</div>";
+if (isset($_POST['submit']))
+{
+	$title = addslashes(strip_tags(descript($_POST['title']), $allowed_tags));
+	$author = addslashes(strip_tags(descript($_POST['author']), $allowed_tags));
+	$story = addslashes(strip_tags(descript($_POST['story']), $allowed_tags));
+	$time = time();
+	if ($_GET['form'] == "new") $result = dbquery("INSERT INTO " . TABLEPREFIX . "fanfiction_news (title, author, story, time) VALUES ('$title', '$author', '$story', '$time')");
+	else $result = dbquery("UPDATE " . TABLEPREFIX . "fanfiction_news 
+	SET title = '$title', author = '$author', story = '$story' WHERE nid = '$_POST[nid]'");
+	if ($result)
+	{
+		$output .= write_message(_ACTIONSUCCESSFUL);
+		unset($_GET['form']);
+	}
+	else $output .= write_error(_ERROR . " " . TRYAGAIN);
+}
+if (isset($_GET['delete']) && isNumber($_GET['delete']))
+{
+	if (isset($_GET['confirm']))
+	{
+		if ($_GET['confirm'] == "yes")
+		{
+			dbquery("DELETE FROM " . TABLEPREFIX . "fanfiction_news where nid = '" . $_GET['delete'] . "'");
+			$output .= write_message(_ACTIONSUCCESSFUL);
+		}
+		else if ($_GET['confirm'] == "no") $output .= write_message(_ACTIONCANCELLED);
+	}
+	else
+	{
+		$output .= write_message(_CONFIRMDELETE . "<br /><br />
+	[ <a href=\"admin.php?action=news&confirm=yes&delete=$_GET[delete]\">" . _YES . "</a> | <a href=\"admin.php?action=news&confirm=no&delete=$_GET[delete]\">" . _NO . "</a> ]");
+	}
+}
+else if (isset($_GET["form"]))
+{
+	if ($_GET["form"] != "new" && isNumber($_GET["form"]))
+	{
+		$result = dbquery("SELECT * FROM " . TABLEPREFIX . "fanfiction_news WHERE nid = '" . $_GET['form'] . "' LIMIT 1");
+		$newsitem = dbassoc($result);
+	}
+	else $newsitem = array("title" => "", "author" => "", "story" => "");
+	$output .= "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=news&form=$_GET[form]\">
+				<table align=\"center\"><tr><td colspan=\"2\" align=\"center\"><b>" . ($_GET["form"] == "new" ? _ADDNEWS : _EDITNEWS) . "</b></td></tr>
+			<tr><td>" . _AUTHOR . ": </td><td><INPUT  type=\"text\" class=\"textbox=\" name=\"author\" value=\"" . stripslashes($newsitem['author']) . "\"></td></tr>
+			<tr><td>" . _TITLE . ": </td><td><INPUT  type=\"text\" class=\"textbox=\" name=\"title\" value=\"" . stripslashes($newsitem['title']) . "\"></td></tr>
+			<tr><td>" . _TEXT . ": </td><td><textarea class=\"textbox\" name=\"story\" id=\"story\" COLS=\"45\" ROWS=\"6\">" . stripslashes($newsitem['story']) . "</TEXTAREA>";
+	if ($tinyMCE)
+		$output .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('story');\" checked><label for='toggle'>" . _TINYMCETOGGLE . "</label></div>";
+
+	$output .= "</td></tr><tr><td colspan=\"2\" align=\"center\">" . ($_GET["form"] != "new" ? "<INPUT type=\"hidden\" name=\"nid\" value=\"" . $_GET['form'] . "\">" : "") . "<INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\"" . _SUBMIT . "\"></td></tr></table></form>";
+}
+else
+{
+	$output .= "<p align=\"center\"><a href=\"admin.php?action=news&form=new\">" . _ADDNEWS . "</a></p>";
+	$count = dbquery("SELECT COUNT(nid) FROM " . TABLEPREFIX . "fanfiction_news");
+	list($numrows) = dbrow($count);
+
+	$result = dbquery("SELECT n.*, n.time as date, count(c.cid) as comments FROM " . TABLEPREFIX . "fanfiction_news as n LEFT JOIN " . TABLEPREFIX . "fanfiction_comments as c ON  n.nid = c.nid GROUP BY n.nid ORDER BY time DESC LIMIT $offset, $itemsperpage");
+	if (file_exists("$skindir/newsbox.tpl")) $news = new TemplatePower("$skindir/newsbox.tpl");
+	else $news = new TemplatePower("default_tpls/newsbox.tpl");
+	$news->prepare();
+	$count = 0;
+	while ($stories = dbassoc($result))
+	{
+		$news->newBlock("newsbox");
+
+		//assign values
+		$news->assign("newstitle", $stories['title']);
+		$news->assign("newsstory", $stories['story']);
+		$news->assign("newsauthor", $stories['author']);
+		$news->assign("newsdate", date("$dateformat $timeformat", $stories['date']));
+		$news->assign("oddeven", ($count % 2 ? "even" : "odd"));
+		if ($newscomments == "1")
+			$news->assign("newscomments", "<a href=\"news.php?action=newsstory&amp;nid=" . $stories['nid'] . "\">" . $stories['comments'] . " " . _COMMENTS . "</a>");
+		if (isADMIN)
+			$news->assign("adminoptions", "<a href=\"admin.php?action=news&amp;form=" . $stories['nid'] . "\">" . _EDIT . "</a> | <a href=\"admin.php?action=news&amp;delete=" . $stories['nid'] . "\">" . _DELETE . "</a>");
+		$count++;
+	}
+	$news->gotoBlock("_ROOT");
+	$output .= $news->getOutputContent();
+	if ($numrows > $itemsperpage) $output .= build_pagelinks("admin.php?action=news&amp;", $numrows, $offset);
+}
+

--- /dev/null
+++ b/admin/noletter.php
@@ -1,1 +1,67 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+$chapid = isset($_GET['chapid']) && isNumber($_GET['chapid']) ? $_GET['chapid'] : 0;
+
+		$adminquery = dbquery("SELECT "._EMAILFIELD." as email, "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '".USERUID."' LIMIT 1");
+		list($adminemail, $adminname) = dbrow($adminquery);
+		if($adminemail)
+			$ademail = $adminemail;
+		else 
+			$ademail = $siteemail;
+	if(isset($_POST['submit'])) {
+		$subject = strip_tags(descript($_POST['subject']));
+		$letter = descript($_POST['letter']);
+		include("includes/emailer.php");
+		$result = sendemail($_POST['authorname'], $_POST['authoremail'], $adminname, $ademail, $subject, $letter, "html");
+		if($result) echo write_message(_EMAILSENT);
+		else echo write_error(_NOMAILSENT);
+		if($logging) {
+			$storyquery = dbquery("SELECT story.title, chapter.title as chapter, author.email, author.penname, chapter.uid, chapter.inorder FROM ".TABLEPREFIX."fanfiction_stories as story, ".TABLEPREFIX."fanfiction_chapters as chapter, ".TABLEPREFIX."fanfiction_authors as author WHERE chapter.uid = author.uid AND chapter.chapid = '$chapid' AND chapter.sid = story.sid LIMIT 1");
+			$story = dbassoc($storyquery);
+			dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_REJECTION, USERPENNAME, USERUID, $title, $sid, $uid, $penname, $inorder, $letter))."', '".USERUID."', INET_ATON('".$_ENV['REMOTE_ADDR']."'), 'RJ', ". time() . ")");
+		}
+
+	}
+	else {
+			$storyquery = dbquery("SELECT story.title, chapter.title as chapter, "._EMAILFIELD." as email, "._PENNAMEFIELD." as penname, chapter.uid FROM ".TABLEPREFIX."fanfiction_stories as story, ".TABLEPREFIX."fanfiction_chapters as chapter, "._AUTHORTABLE." WHERE chapter.uid = "._UIDFIELD." AND chapter.chapid = '$chapid' AND chapter.sid = story.sid LIMIT 1");
+			$story = dbassoc($storyquery);
+			$letterquery = dbquery("SELECT message_text, message_title FROM ".TABLEPREFIX."fanfiction_messages WHERE message_name = 'nothankyou' LIMIT 1");
+			list($letter, $subject) = dbrow($letterquery);
+			$search = array("@\{sitename\}@", "@\{adminname\}@",  "@\{author\}@", "@\{storytitle\}@",  "@\{chaptertitle\}@", "@\{rules\}@");
+			$replace = array( $sitename, $adminname, $story['penname'], $story['title'], $story['chapter'], "<a href=\"".$url."/viewpage.php?page=rules\">"._RULES."</a>");
+			$letter = preg_replace($search, $replace, $letter);
+			$subject = preg_replace($search, $replace, $subject);
+			echo "<body>
+			<div id=\"pagetitle\"> ".$story['title'].": ".$story['chapter']." "._BY." ".$story['penname']."</div>
+			<div style=\"line-height: 4ex; margin: 0 auto; width: 90%;\">
+				<form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=noletter&amp;uid=".$story['uid']."&amp;chapid=".$_GET['chapid']."\">
+				<input type=\"hidden\" name=\"authoremail\" value=\"$story[email]\"><input type=\"hidden\" name=\"authorname\" value=\"story[penname]\">
+				<label for=\"subject\">"._SUBJECT.":</label> <INPUT type=\"text\" class=\"textbox=\" size=\"40\"  name=\"subject\" value=\"$subject\"><br />
+				<textarea class=\"textbox\" name=\"letter\" cols=\"40\" rows=\"7\">$letter</TEXTAREA><br /><INPUT type=\"submit\" style=\"margin: 10px;\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></form></div></body></html>";
+		exit( );
+	}
+?>

file:b/admin/panels.php (new)
--- /dev/null
+++ b/admin/panels.php
@@ -1,1 +1,137 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+$paneltypes = array("A" => _ADMIN, "U" => _USERACCOUNT, "P" => _PROFILE, "F" => _FAVOR, "S" => _SUBMISSIONS, "B" => _BROWSE, "L" => _10LISTS);
+
+if(isset($_GET['type'])) $type = $_GET['type'];
+else $type = false;
+if(!empty($_GET['go'])) {
+	$go = $_GET['go'];
+	$order = $_GET['order'];
+	if($go == "up") $oneabove = $order - 1;
+	else $oneabove = $order + 1;
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_panels SET panel_order = '$order' WHERE panel_type = '$type' and panel_order = '$oneabove'");
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_panels SET panel_order = '$oneabove' WHERE panel_id = '".$_GET['panel']."'");	
+}
+if(!empty($_GET['edit'])) {
+	if(!empty($_POST['submit'])) {
+		$panel_name = addslashes(strip_tags(descript($_POST['panel_name'])));
+		$panel_title = addslashes(strip_tags(descript($_POST['panel_title'])));
+		$panel_url = addslashes(strip_tags(descript($_POST['panel_url'])));
+		$panel_level = (!empty($_POST['panel_level']) && isNumber($_POST['panel_level']) ? $_POST['panel_level'] : 0);
+		$panel_hidden = (!empty($_POST['panel_hidden']) ? 1 : 0);
+		$panel_type = strip_tags(descript($_POST['panel_type']));
+		if(!$panel_hidden) {
+			$oldinfo = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_id = '".$_GET['edit']."'");
+			$panelinfo = dbassoc($oldinfo);
+			$nextorder = 0;
+			if($panelinfo['panel_hidden'] || $_GET['edit'] == "new") {
+				$order = dbquery("SELECT COUNT(panel_id) FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_type = '$panel_type' AND panel_hidden = 0".($panel_type == "A" ? " AND panel_level = '$panel_level'" : ""));
+				list($nextorder) = dbrow($order);
+				$nextorder++;
+			}
+			else {
+				$nextorder = 0;
+			}
+		}
+		else if($panel_hidden) $nextorder = 0;
+		if($_GET['edit'] != "new") $result = dbquery("UPDATE ".TABLEPREFIX."fanfiction_panels SET panel_name = '$panel_name', panel_title = '$panel_title', panel_url = '$panel_url', panel_level = '$panel_level', panel_hidden = '$panel_hidden', panel_type = '$panel_type'".(!empty($panel_hidden) ? ", panel_order = '$nextorder'" : "")." WHERE panel_id = '".$_GET['edit']."'");
+		else $result = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_panels(`panel_name`, `panel_title`, `panel_url`, `panel_level`, `panel_hidden`, `panel_type`, `panel_order`) VALUES( '$panel_name', '$panel_title', '$panel_url', '$panel_level', '$panel_hidden', '$panel_type', '$nextorder')");
+		if($result) $output .= write_message(_ACTIONSUCCESSFUL);
+		else $output .= write_error(_ERROR);
+	}
+	else {
+		$panelquery= dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_id = '".$_GET['edit']."' LIMIT 1");
+		$panelinfo = dbassoc($panelquery);
+		$output .= "<div class='sectionheader'>".($_GET['edit'] == "new" ? _ADDPANEL : _EDITPANEL)."</div>
+			<div id='settingsform'><form method=\"POST\" enctype=\"multipart/form-data\" style='width: 450px; margin: 0 auto;' action=\"admin.php?action=panels&amp;edit=".$_GET['edit']."\">
+			<label for='panel_name'>"._NAME.":</label> <input type='text' class='textbox' name='panel_name' id='panel_name' value='".$panelinfo['panel_name']."'><br />
+			<label for='panel_title'>"._TITLE.":</label> <input type='text' class='textbox' name='panel_title' id='panel_title' value='".$panelinfo['panel_title']."'><br />
+			<label for='panel_url'>"._PANELURL.":</label> <input type='text' class='textbox' name='panel_url' id='panel_url' value='".$panelinfo['panel_url']."'><br />
+			<label for='panel_level'>"._LEVEL.":</label> <select name='panel_level' id='panel_level'>";
+		for($x = 0; $x < 5; $x++) { $output .= "<option".($panelinfo['panel_level'] == $x ? " selected" : "").">$x</option>"; }
+		$output .= "</select><br />
+			<label for='panel_hidden'>"._HIDDEN.":</label> <input type='checkbox' class='checkbox' name='panel_hidden' id='panel_hidden' ".($panelinfo['panel_hidden'] ? " checked" : "")."><br />
+			<label for='panel_type'>"._TYPE.":</label> <input type='text' class='textbox' name='panel_type' id='panel_type' value='".$panelinfo['panel_type']."' size='2'><br />
+			<div style='margin: 1em; text-align: center;'><INPUT type=\"submit\" class=\"button\" value=\""._SUBMIT."\" name=\"submit\"></div></form></div>";
+	}
+}
+else if(!empty($_GET['delete'])) {
+	$panel_id = $_GET['delete'];
+	$confirm = isset($_GET['confirm']) ? $_GET['confirm'] : false;
+	if($confirm == "yes" && isNumber($panel_id)) {
+		$result = dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_id = '$panel_id' LIMIT 1");
+		if($result) $output .= write_message(_ACTIONSUCCESSFUL);
+		else $output .= write_error(_ERROR);
+	}
+	else if ($confirm == "no") 	{
+		$output .= write_message(_ACTIONCANCELLED);
+	}
+	else {
+		$output .= write_message(_CONFIRMDELETE."<br /><br />
+			[ <a href=\"admin.php?action=panels&amp;delete=$panel_id&amp;confirm=yes\">"._YES."</a> | <a href=\"admin.php?action=panels&amp;delete=$panel_id&amp;confirm=no\">"._NO."</a> ]");
+	}
+}
+else {
+	$output .= "<form name=\"list\" action=\"\"><div class='sectionheader'>"._PANELS." <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_PANELS."</span></A><br /> <select name=\"list\" onchange=\"if(this.selectedIndex.value != 'false') document.location = document.list.list.options[document.list.list.selectedIndex].value\">";
+	$output .= "<option value=\"admin.php?action=panels\">"._ALL."</option>";
+	$paneltypelist = dbquery("SELECT DISTINCT panel_type FROM ".TABLEPREFIX."fanfiction_panels ORDER BY panel_type");
+	while($t = dbrow($paneltypelist)) {
+		$output .= "<option value='admin.php?action=panels&amp;type=$t[0]'".($type == $t[0] ? " selected" : "").">$t[0] - ".$paneltypes[$t[0]]."</option>";
+	}
+	$output .= "</select>";
+	if($type == "A") {
+		$output .= " "._LEVEL." <select name=\"list2\" onchange=\"if(this.selectedIndex.value != 'false') document.location = document.list.list2.options[document.list.list2.selectedIndex].value\">
+			<option value=\"admin.php?action=panels&amp;type=A\">"._ALL."</option>";
+		for($x = 1; $x < 4; $x++) {
+			$output .= "<option value='admin.php?action=panels&amp;type=A&amp;level=$x'".(isset($_GET['level']) && $_GET['level'] == $x ? " selected" : "")."> $x </option>";
+		}
+		$output .= "</select>";
+	}
+	$output .= "</div></form>";
+	$list = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_panels".($type ? " WHERE panel_type = '$type'".($type == "A" && !empty($_GET['level']) ? " AND panel_level = '".$_GET['level']."'" : "") : "")." ORDER BY panel_type, panel_hidden DESC, ".($type == "A" ? "panel_level DESC,  " : "")."panel_order ASC");
+	$num = dbnumrows($list);
+	if($num > 0) $output .= "<table class='tblborder' style='margin: 0 auto;'><tr><th class='tblborder'>"._NAME."</th>".(!$type || ($type == "A" && empty($_GET['level'])) ? "<th class='tblborder'>"._TYPE."</th>" : "<th class='tblborder'>"._ORDER."</th>")."<th class='tblborder'>"._OPTIONS."</th></tr><tr><td class='tblborder' colspan='3' align='center'><a href='admin.php?action=panels&amp;edit=new'>"._ADDNEWPANEL."</a></td></tr>";
+	$count = 0;
+	while($panel = dbassoc($list)) {
+		if(!$panel['panel_hidden']) $count++;
+		else $num--;
+		$output .= "<tr><td class='tblborder'>".$panel['panel_title']."</td><td class='tblborder'>";
+		if(!$type) $output .= $panel['panel_type']." - ".$paneltypes[$panel['panel_type']];
+		else if($type == "A" && empty($_GET['level'])) $output .= $panel['panel_hidden'] ? _HIDDEN :  _LEVEL." ".$panel['panel_level'];
+		else {
+			if($panel['panel_hidden']) $output .= _HIDDEN;
+			else {
+				$output .= $count > 1 ? "<a href='admin.php?action=panels&amp;type=$type&amp;go=up&amp;panel=".$panel['panel_id'].(!empty($_GET['level']) ? "&amp;level=".$_GET['level'] : "")."&amp;order=".$panel['panel_order']."'>$up</a>" : "";
+				$output .= $count < $num ? "<a href='admin.php?action=panels&amp;type=$type&amp;go=down&amp;panel=".$panel['panel_id'].(!empty($_GET['level']) ? "&amp;level=".$_GET['level'] : "")."&amp;order=".$panel['panel_order']."'>$down</a>" : "";
+			}
+		}
+		$output .= "</td><td class='tblborder'><a href='admin.php?action=panels&amp;edit=".$panel['panel_id']."'>"._EDIT."</a> | <a href='admin.php?action=panels&amp;delete=".$panel['panel_id']."'>"._DELETE."</a></td></tr>";
+	}
+	$output .= "</table>";
+}
+?>
+

file:b/admin/phpinfo.php (new)
--- /dev/null
+++ b/admin/phpinfo.php
@@ -1,1 +1,34 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+
+phpinfo( );
+foreach($settings as $var => $val) {
+	echo "$var : $val <br />";
+}
+exit( );
+
+?>

file:b/admin/ratings.php (new)
--- /dev/null
+++ b/admin/ratings.php
@@ -1,1 +1,106 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+$output .= "<div id=\"pagetitle\">"._RATINGS."</div>";
+	$showlist = 1;
+	if(isset($_GET["delete"]) && isNumber($_GET["delete"])) {
+		$rid = $_GET["delete"];
+		$confirm = isset($_GET["confirm"]) ? $_GET["confirm"] : false;
+		if($confirm == "yes")
+		{
+			$result5 = dbquery("SELECT rating FROM ".TABLEPREFIX."fanfiction_ratings WHERE rid = '$rid'");
+			$ratings = dbassoc($result5);
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET rid = '"._NONE."' WHERE sid = '$ratingresult[sid]'");
+			dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_ratings WHERE rid = '$rid'");
+			$output .= write_message(_ACTIONSUCCESSFUL);
+		}
+		else if ($confirm == "no")
+		{
+			$output .= write_message(_ACTIONCANCELLED);
+		}
+		else
+		{
+			$showlist = 0;
+			$output .= write_message(_CONFIRMDELETE."<br /><br />
+[ <a href=\"admin.php?action=ratings&delete=$rid&confirm=yes\">"._YES."</a> | <a href=\"admin.php?action=ratings&delete=$rid&confirm=no\">"._NO."</a> ]");
+		}
+	}
+	if (isset($_POST["submit"]) && ((isset($_GET['rid']) && isNumber($_GET['rid'])) || $_GET['rid'] == "new")) {
+		$newrate = escapestring(strip_tags(descript($_POST['rating'])));
+		$newtext = escapestring(strip_tags(descript($_POST['warningtext'])));
+		$ratingwarning = isset($_POST['ratingwarning']) ? 1 : 0;
+		if(isset($_POST['rusersonly'])) $ratingwarning = $ratingwarning + 4;
+		if(isset($_POST['ageconsent'])) $ratingwarning = $ratingwarning + 2;
+		if($_GET["rid"] == "new") $ratingquery = "INSERT INTO ".TABLEPREFIX."fanfiction_ratings (rating, ratingwarning, warningtext) VALUES ('$newrate', '$ratingwarning', '$newtext')";
+		else $ratingquery = "UPDATE ".TABLEPREFIX."fanfiction_ratings SET rating = '$newrate', ratingwarning = '$ratingwarning', warningtext = '$newtext' WHERE rid = '".$_GET['rid']."'";
+		dbquery($ratingquery);
+		if($_GET["rid"] != "new" && $newrate != $_POST['oldrating']) dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET rid = '$newrate' WHERE rid = '".$_POST['oldrating']."'");
+		$output .= write_message(_ACTIONSUCCESSFUL);
+	}
+	else if(isset($_GET["rid"])) {
+		$showlist = 0;
+		$new = $_GET['rid'] == "new" ? true : false;
+		if(!$new && isNumber($_GET["rid"])) {
+			$ratingquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_ratings WHERE rid = '".$_GET['rid']."' LIMIT 1");
+			$rating = dbassoc($ratingquery);
+		}
+		$output .= "<form method=\"POST\" id='settingsform' enctype=\"multipart/form-data\" action=\"admin.php?action=ratings&rid=".$_GET['rid']."\">
+			<div class='sectionheader'>".($new ? _NEWRAT : _EDITRAT)."</div>
+			<div><label for='rating'>"._RATING.": </label> 
+			<INPUT  type=\"text\" class=\"textbox=\" name=\"rating\"".($new ? "" : "value=\"".$rating['rating']."\"")."><A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_RATING."</span></A>";
+		if(isset($rating)) 
+			$output .= "<input type=\"hidden\" name=\"oldrating\" value=\"".$rating['rating']."\">";
+		$warninglevel = isset($rating) ? sprintf("%03b", $rating['ratingwarning']) : array(0,0,0);
+		$output .= "</div><div><label for='ratingwarning'>"._WARNINGPOP.": </label>
+		<INPUT type=\"checkbox\" class=\"checkbox\" name=\"ratingwarning\"".(!$new && $warninglevel[2] ? " checked" : "")."><A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_RATINGWARNING."</span></A></div>
+		<div><label for='ageconsent'>"._AGECHECK.": </label>
+		<INPUT type=\"checkbox\" class=\"checkbox\" name=\"ageconsent\"".(!$new && $warninglevel[1] ? " checked" : "")."><A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_RATINGCONSENT."</span></A></div>
+		<div><label for='rusersonly'>"._RUSERSONLY.": </label>
+		<INPUT type=\"checkbox\" class=\"checkbox\" name=\"rusersonly\"".(!$new && $warninglevel[0] ? " checked" : "")."><A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_RATINGUSERS."</span></A></div>
+		<div><label for='warningtext'>"._WARNINGTEXT.": </label>
+		<textarea class=\"textarea\" name=\"warningtext\" cols=\"35\" rows=\"4\">".($new ? "" : $rating['warningtext'])."</TEXTAREA>";
+		if($tinyMCE) 
+			$output .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('warningtext');\" checked><label for='toggle'>"._TINYMCETOGGLE."</label></div>";	
+		$output .= "</div><div style='text-align: center;'><A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_RATINGWARNTEXT."</span></A></div><INPUT type=\"submit\" class=\"button\" id='submit' value=\""._SUBMIT."\" name=\"submit\">";
+	}
+	if($showlist) {
+		$result = dbquery("SELECT * from ".TABLEPREFIX."fanfiction_ratings");
+
+		//List of current ratings
+		$output .= "<table class=\"tblborder\" cellspacing=\"0\" cellpadding=\"o\" align=\"center\" style='margin: 0 auto;'>
+		<tr><th colspan=\"3\" align=\"center\" class=\"tblborder\">"._RATINGS."</th></tr>";
+		$output .= "<tr><td class=\"tblborder\"><b>"._RATING."</b></td><td class=\"tblborder\"><b>"._WARNING."</b></td><td class=\"tblborder\"><b>"._OPTIONS."</b></td></tr>";
+		while ($ratingresults = dbassoc($result))
+		{
+		$output .= "<tr><td class=\"tblborder\">".$ratingresults['rating'];
+			if($ratingresults['ratingwarning'] >= 1)
+				$output .= "</td><td class=\"tblborder\">"._YES."";
+			else
+				$output .= "</td><td class=\"tblborder\">"._NO."";
+			$output .= "</td><td class=\"tblborder\"><a href=\"admin.php?action=ratings&rid=".$ratingresults['rid']."\">"._EDIT."</a> | <a href=\"admin.php?action=ratings&delete=".$ratingresults['rid']."\">"._DELETE."</td></tr>";
+		}
+		$output .= "<tr><td colspan=\"3\" align=\"center\" class=\"tblborder\"><a href=\"admin.php?action=ratings&rid=new\">"._ADDRAT."</a></td></tr></table>";
+	}
+?>

--- /dev/null
+++ b/admin/settings.php
@@ -1,1 +1,487 @@
-
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+function updatePanelOrder( ) {
+	
+	$ptypes = dbquery("SELECT panel_type FROM ".TABLEPREFIX."fanfiction_panels GROUP BY panel_type");
+	while($ptype = dbassoc($ptypes)) {
+		if($ptype['panel_type'] == "A") {
+			for($x = 1; $x < 5; $x++) {
+				$count = 1;
+				$plist = dbquery("SELECT panel_name, panel_id FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_hidden = '0' AND panel_type = '".$ptype['panel_type']."' AND panel_level = '$x' ORDER BY panel_level, panel_order");
+				while($p = dbassoc($plist)) {
+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_panels SET panel_order = '$count' WHERE panel_id = '".$p['panel_id']."' LIMIT 1");
+					$count++;
+				}
+			}
+		}
+		else {
+			$count = 1;
+			$plist = dbquery("SELECT panel_name, panel_id FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_hidden = '0' AND panel_type = '".$ptype['panel_type']."' ORDER BY ".($ptype['panel_type'] == "A" ? "panel_level," : "")."panel_order");
+			while($p = dbassoc($plist)) {
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_panels SET panel_order = '$count' WHERE panel_id = '".$p['panel_id']."' LIMIT 1");
+				$count++;
+			}
+		}
+	}
+}
+
+if($action == "settings") {
+$output .= "<h1>"._SETTINGS."</h1><div style='text-align: center;'>
+	<a href='admin.php?action=settings&amp;sect=main'>"._MAINSETTINGS."</a> |
+	<a href='admin.php?action=settings&amp;sect=submissions'>"._SUBMISSIONSETTINGS."</a> |
+	<a href='admin.php?action=settings&amp;sect=sitesettings'>"._SITESETTINGS."</a> |
+	<a href='admin.php?action=settings&amp;sect=display'>"._DISPLAYSETTINGS."</a> |
+	<a href='admin.php?action=settings&amp;sect=reviews'>"._REVIEWSETTINGS."</a> |
+	<a href='admin.php?action=settings&amp;sect=useropts'>"._USERSETTINGS."</a> |
+	<a href='admin.php?action=settings&amp;sect=email'>"._EMAILSETTINGS."</a> |
+	<a href='admin.php?action=censor'>"._CENSOR."</a> <br />
+	<a href='admin.php?action=messages&message=welcome'>"._WELCOME."</a> | 
+	<a href='admin.php?action=messages&message=copyright'>"._COPYRIGHT."</a> | 
+	<a href='admin.php?action=messages&message=printercopyright'>"._PRINTERCOPYRIGHT."</a> | 
+	<a href='admin.php?action=messages&message=tinyMCE'>"._TINYMCE."</a> | 
+	<a href='admin.php?action=messages&message=nothankyou'>"._NOTHANKYOU."</a> | 
+	<a href='admin.php?action=messages&message=thankyou'>"._THANKYOU."</a><br />";
+	$settingsquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_type = 'AS' ORDER BY panel_title");
+	while($os = dbassoc($settingsquery)) {
+		if($os['panel_url']) $othersettings[] = "<a href='".$os['panel_url']."'>".$os['panel_title']."</a>";
+	}
+	if(isset($othersettings)) $output .= implode(" | ", $othersettings);
+$output .= "</div> ";
+}	
+
+$sects = array("main", "submissions", "sitesettings", "display", "reviews", "useropts", "email");
+//if(!isset($_GET['sect'])) $sect = "main";
+//else $sect = $_GET['sect'];
+$sect = isset($_GET['sect']) ? $_GET['sect'] : "main";
+if(isset($_POST['submit'])) {
+	if($sect == "main") {
+		if(!preg_match("!^[a-z0-9_]{3,30}$!i", $_POST['newsitekey'])) $output .= write_error(_BADSITEKEY);
+		else {
+			$oldsitekey = $sitekey;
+			$sitekey = descript($_POST['newsitekey']);
+			$sitename = escapestring(descript(strip_tags($_POST['newsitename'])));
+			$slogan = escapestring(descript(strip_tags($_POST['newslogan'])));
+			$url = escapestring(descript(strip_tags($_POST['newsiteurl'])));
+			// if the http:// is missing add it.
+			if(substr($url, 0, 7) != "http://") $url = "http://".$url;
+			// we also want to check for a trailing slash.
+			if(substr($url, -1, 1) == "/") $url = substr($url, 0, strlen($url) - 1);
+			$tableprefix = escapestring(descript(strip_tags($_POST['newtableprefix'])));
+			$siteemail = escapestring(descript(strip_tags($_POST['newsiteemail'])));
+			$skin = escapestring(descript(strip_tags($_POST['newskin'])));
+			$language = escapestring(descript(strip_tags($_POST['newlanguage'])));
+			if(empty($sitekey)) $output .= write_message(_SITEKEYREQUIRED);
+			else {
+				if($sitekey != $oldsitekey) $output .= write_message(_SITEKEYCHANGED);
+				$result = dbquery("UPDATE ".$settingsprefix."fanfiction_settings SET sitekey = '$sitekey', sitename = '$sitename', slogan = '$slogan', url = '$url', tableprefix = '$tableprefix', siteemail = '$siteemail', skin = '$skin', language = '$language' WHERE sitekey = '$oldsitekey'");
+			}
+		}
+	}
+	else if($sect == "submissions") {
+		$submissionsoff = $_POST['newsubmissionsoff'] == 1 ? 1 : 0;
+		$autovalidate = $_POST['newautovalidate'] == 1 ? 1 : 0;
+		$coauthallowed = $_POST['newcoauthallowed'] == 1 ? 1 : 0;
+		$store = !empty($_POST['newstore']) ? ($_POST['newstore'] == "files" ? "files" : "mysql" ) : $store;
+		$storiespath = descript($_POST['newstoriespath']);
+		$minwords = isNumber($_POST['newminwords']) ? $_POST['newminwords'] : 0;
+		$maxwords = isNumber($_POST['newmaxwords']) ? $_POST['newmaxwords'] : 0;
+		$roundrobins = $_POST['newroundrobins'] == 1 ? 1 : 0;
+		$allowseries = $_POST['newallowseries'] && isNumber($_POST['newallowseries']) ? $_POST['newallowseries'] : 0;
+		$imageupload = $_POST['newimageupload'] == 1 ? 1 : 0;
+		$imageheight = isNumber($_POST['newimageheight']) ? $_POST['newimageheight'] : 0;
+		$imagewidth = isNumber($_POST['newimagewidth']) ? $_POST['newimagewidth'] : 0;
+		$result = dbquery("UPDATE ".$settingsprefix."fanfiction_settings SET submissionsoff = '$submissionsoff', autovalidate = '$autovalidate', coauthallowed = '$coauthallowed', store = '$store', storiespath = '$storiespath', minwords = '$minwords', maxwords = '$maxwords', imageupload = '$imageupload', imageheight = '$imageheight', imagewidth = '$imagewidth', roundrobins = '$roundrobins', allowseries = '$allowseries' WHERE sitekey ='".SITEKEY."'");
+		if($action == "settings") {
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_panels SET panel_hidden = '".($imageupload ? "0" : "1")."' WHERE panel_name LIKE 'manageimages'");
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_panels SET panel_hidden = '".($allowseries ? "0" : "1")."' WHERE (panel_name LIKE '%series%' OR panel_title LIKE '%series%') AND panel_type != 'A' AND panel_type != 'B'");
+			updatePanelOrder( );
+		}
+
+	}
+	else if($sect == "sitesettings") {
+		$tinyMCE = ($_POST['newtinyMCE'] == 1  OR $_POST['newtinyMCE'] == 2) ? $_POST['newtinyMCE'] : 0;
+		$allowed_tags = $_POST['newallowed_tags'];
+		$favorites = $_POST['newfavorites'] == 1 ? 1 : 0;
+		$multiplecats = $_POST['newmultiplecats'] == 1 ? 1 : 0;
+		$newscomments = $_POST['newnewscomments'] == 1 ? 1 : 0;
+		$logging = $_POST['newlogging'] == 1 ? 1 : 0;
+		$maintenance = $_POST['newmaint'] == 1 ? 1 : 0;
+		$debug = $_POST['newdebug'] == 1 ? 1 : 0;
+		$captcha = $_POST['newcaptcha'] == 1 ? 1 : 0;
+		$result = dbquery("UPDATE ".$settingsprefix."fanfiction_settings SET tinyMCE = '$tinyMCE', favorites = '$favorites', multiplecats = '$multiplecats', allowed_tags = '$allowed_tags', newscomments = '$newscomments', logging = '$logging', maintenance = '$maintenance', debug = '$debug', captcha = '$captcha' WHERE sitekey ='".SITEKEY."'");
+	}
+	else if($sect == "display") {
+		$dateformat = $_POST['newdateformat'] ? descript(strip_tags($_POST['newdateformat'])) : descript(strip_tags($_POST['customdateformat']));
+		$timeformat = $_POST['newtimeformat'] ? descript(strip_tags($_POST['newtimeformat'])) : descript(strip_tags($_POST['customtimeformat']));
+		$extendcats = $_POST['newextendcats'] == 1 ? 1 : 0;
+		if(isset($_POST['newdisplaycolumns']) && isNumber($_POST['newdisplaycolumns'])) $displaycolumns = $_POST['newdisplaycolumns'];
+		if(isset($_POST['newitemsperpage']) && isNumber($_POST['newitemsperpage'])) $itemsperpage = $_POST['newitemsperpage'];
+		if(isset($_POST['newlinkstyle']) && isNumber($_POST['newlinkstyle'])) $linkstyle = $_POST['newlinkstyle'];
+		if(isset($_POST['newlinkrange']) && isNumber($_POST['newlinkrange'])) $linkrange = $_POST['newlinkrange'];
+		$displayindex = $_POST['newstoryindex'] == 1 ? 1 : 0;
+		$displayprofile = $_POST['newdisplayprofile'] == 1 ? 1 : 0;
+		$defaultsort = $_POST['newdefaultsort'] == 1 ? 1 : 0;
+		if(isNumber($_POST['newrecentdays'])) $recentdays = $_POST['newrecentdays'];
+		$result = dbquery("UPDATE ".$settingsprefix."fanfiction_settings SET dateformat = '$dateformat', timeformat = '$timeformat', extendcats = '$extendcats', displaycolumns = '$displaycolumns', itemsperpage = '$itemsperpage', displayindex = '$displayindex', defaultsort = '$defaultsort', recentdays = '$recentdays', displayprofile = '$displayprofile', linkstyle = '$linkstyle', linkrange = '$linkrange' WHERE sitekey ='".SITEKEY."'");
+	}
+	else if($sect == "reviews") {
+		$reviewsallowed = $_POST['newreviewsallowed'] == 1 ? 1 : 0;
+		$anonreviews = $_POST['newanonreviews'] == 1 ? 1 : 0;
+		$rateonly = $_POST['newrateonly'] == 1 ? 1 : 0;
+		$ratings = isset($_POST['newratings']) && isNumber($_POST['newratings']) ? $_POST['newratings'] : 0;
+		$revdelete = isset($_POST['newrevdelete']) && isNumber($_POST['newrevdelete']) ? $_POST['newrevdelete'] : 0;
+		$result = dbquery("UPDATE ".$settingsprefix."fanfiction_settings SET reviewsallowed = '$reviewsallowed', anonreviews = '$anonreviews', rateonly = '$rateonly', ratings = '$ratings', revdelete = '$revdelete' WHERE sitekey ='".SITEKEY."'");
+	}
+	else if($sect == "useropts") {
+		$alertson = $_POST['newalertson'] == 1 ? 1 : 0;
+		$disablepopups = $_POST['newdisablepops'] == 1 ? 1 : 0;
+		$agestatement  = $_POST['newagestatement'] == 1 ? 1 : 0;
+		$pwdsetting = $_POST['newpwdsetting'] == 1 ? 1 : 0;
+		$result = dbquery("UPDATE ".$settingsprefix."fanfiction_settings SET alertson = '$alertson', disablepopups = '$disablepopups', agestatement = '$agestatement', pwdsetting = '$pwdsetting' WHERE sitekey ='".SITEKEY."'");
+	}
+	else if($sect == "email") {
+		$smtp_host = $_POST['newsmtp_host'];
+		$smtp_username = $_POST['newsmtp_username'];
+		$smtp_password = $_POST['newsmtp_password'];
+		$result = dbquery("UPDATE ".$settingsprefix."fanfiction_settings SET smtp_host = '$smtp_host', smtp_username = '$smtp_username', smtp_password = '$smtp_password' WHERE sitekey ='".SITEKEY."'");
+	}
+	if($result) {
+		$output .= write_message(_ACTIONSUCCESSFUL);
+		$sect = $sects[(array_search($sect, $sects) + 1)];
+		if(!$sect) $sect = $sects[0];
+	}
+	else $output .= write_error(_ERROR);
+}
+	$settingsresults = dbquery("SELECT * FROM ".$settingsprefix."fanfiction_settings WHERE sitekey ='".SITEKEY."'");
+	$settings = dbassoc($settingsresults);
+ 
+	foreach($settings as $var => $val) {
+		if(is_NULL($val)) $val = '';
+		$$var = stripslashes($val );
+	}
+
+	$output .= "<form method='POST' class='tblborder' style='' enctype='multipart/form-data' action='".($action == "settings" ? "admin.php?action=settings" : $_SERVER['PHP_SELF']."?step=".$_GET['step'])."&amp;sect=$sect'>";
+	if($sect == "main") {
+		$output .= "<h2>"._SITEINFO."</h2>
+		<table class='acp'>
+			<tr>
+				<td><label for='newsitekey'>"._SITEKEY.":</label></td><td><input type='text' class='textbox' name='newsitekey' value='".SITEKEY."'> <a href='#' class='pophelp'>[?]<span>"._HELP_SITEKEY."</span></a></td>
+			</tr>
+			<tr>
+				<td><label for='newsitename'>"._SITENAME.":</label></td><td><input type='text' class='textbox' name='newsitename' value='".htmlspecialchars($sitename, ENT_QUOTES)."'> <a href='#' class='pophelp'>[?]<span>"._HELP_SITENAME."</span></a></td>
+			</tr>
+			<tr>
+				<td><label for='newslogan'>"._SITESLOGAN.":</label></td><td><input type='text' class='textbox' name='newslogan' value='".htmlspecialchars($slogan, ENT_QUOTES)."'> <a href='#' class='pophelp'>[?]<span>"._HELP_SLOGAN."</span></a></td>
+			</tr>
+			<tr>
+				<td><label for='newurl'>"._SITEURL.":</label></td><td><input type='text' class='textbox' name='newsiteurl' value='$url'> <a href='#' class='pophelp'>[?]<span>"._HELP_URL."</span></a></td>
+			</tr>
+			<tr>				
+				<td><label for='newtableprefix'>"._TABLEPREFIX.":</label></td><td><input type='text' class='textbox' name='newtableprefix' value='".TABLEPREFIX."'> <a href='#' class='pophelp'>[?]<span>"._HELP_TABLEPREFIX."</span></a></td>
+			</tr>
+			<tr>				
+				<td><label for='newsiteemail'>"._ADMINEMAIL.":</label></td><td><input type='text' class='textbox' name='newsiteemail' value='$siteemail'> <a href='#' class='pophelp'>[?]<span>"._HELP_SITEEMAIL."</span></a></td>
+			</tr>
+			<tr>				
+				<td><label for='newsiteskin'>"._DEFAULTSKIN.":</label></td><td><select name='newskin'>";
+		$directory = opendir(_BASEDIR."skins");
+		while($filename = readdir($directory)) {
+			if($filename=="." || $filename==".." || !is_dir(_BASEDIR."skins/".$filename)) continue;
+			$output .= "<option value='$filename'".($skin == $filename ? " selected" : "").">$filename</option>";
+		}
+		closedir($directory);
+		$output .= "</select> <a href='#' class='pophelp'>[?]<span>"._HELP_SITESKIN."</span></a></td>
+			</tr>
+			<tr>
+				<td><label for='newlanguage'>"._LANGUAGE.":</label></td><td><select name='newlanguage'>";
+		$directory = opendir(_BASEDIR."languages");
+			while($filename = readdir($directory)) {
+				if($filename=="." || $filename==".." || substr($filename, 2) == "_admin.php") continue;
+				$output .= "<option value='".substr($filename, 0, 2)."'".
+					($language == substr($filename, 0, strpos($filename, ".php")) ? " selected" : "").">
+				".substr($filename, 0, strpos($filename, ".php"))."</option>";
+			}
+		closedir($directory);
+		$output .= "</select> <a href='#' class='pophelp'>[?]<span>"._HELP_LANGUAGE."</span></a></td></tr>";
+	}
+	else if($sect == "submissions") {
+		$output .= "<h2>"._SUBMISSIONSETTINGS."</h2>
+		<table class='acp'>
+			<tr>
+				<td><label for='newsubmissionsoff'>"._NOSUBS.":</label></td><td><select name='newsubmissionsoff'>
+				<option value='1'".($submissionsoff == "1" ? " selected" : "").">"._YES."</option>
+				<option value='0'".($submissionsoff == "0" ? " selected" : "").">"._NO."</option>
+			</select> <a href='#' class='pophelp'>[?]<span>"._HELP_SUBSOFF."</span></a></td>
+			</tr>
+			<tr>
+				<td><label for='newautovalidate'>"._AUTOVALIDATE.":</label></td><td><select name='newautovalidate'>
+				<option value='1'".($autovalidate == "1" ? "selected" : "").">"._YES."</option>
+				<option value='0'".($autovalidate == "0" ? "selected" : "").">"._NO."</option>
+			</select> <a href='#' class='pophelp'>[?]<span>"._HELP_AUTOVALIDATE."</span></a></td>
+			</tr>		
+			<tr>
+				<td><label for='newcoauthallowed'>"._COAUTHALLOW.":</label></td><td><select name='newcoauthallowed'>
+				<option value='1'".($coauthallowed == "1" ? "selected" : "").">"._YES."</option>
+				<option value='0'".($coauthallowed == "0" ? "selected" : "").">"._NO."</option>
+			</select> <a href='#' class='pophelp'>[?]<span>"._HELP_COAUTHORS."</span></a></td>
+			</tr>			
+			<tr>
+				<td><label for='newroundrobins'>"._ALLOWRR.":</label></td><td><select name='newroundrobins'>
+				<option value='1'".($roundrobins == "1" ? " selected" : "").">"._YES."</option>
+				<option value='0'".($roundrobins == "0" ? " selected" : "").">"._NO."</option>
+			</select> <a href='#' class='pophelp'>[?]<span>"._HELP_ROUNDROBINS."</span></a></td>
+			</tr>			
+			<tr>
+				<td><label for='newallowseries'>"._ALLOWSERIES.":</label></td><td><select name='newallowseries'>
+				<option value='2'".($allowseries == "2" ? " selected" : "").">"._ALLMEMBERS."</option>
+				<option value='1'".($allowseries == "1" ? " selected" : "").">"._AUTHORSONLY."</option>
+				<option value='0'".($allowseries == "0" ? " selected" : "").">"._ADMINS."</option>
+			</select> <a href='#' class='pophelp'>[?]<span>"._HELP_ALLOWSERIES."</span></a></td>
+			</tr>
+			<tr>
+				<td><label for='newimageupload'>"._IMAGEUPLOAD.":</label></td><td><select name='newimageupload'>
+				<option value='1'".($imageupload == "1" ? " selected" : "").">"._YES."</option>
+				<option value='0'".($imageupload == "0" ? " selected" : "").">"._NO."</option>
+			</select> <a href='#' class='pophelp'>[?]<span>"._HELP_IMAGEUPLOAD."</span></a></td>
+			</tr>
+			<tr>
+				<td colspan='2'><fieldset style='margin: 0 auto;'><legend>"._IMAGESIZE." <a href='#' class='pophelp'>[?]<span>"._HELP_IMAGESIZE."</span></a></legend>
+				<label for='newimageheight'>"._MAXHEIGHT.":</label> <input  type='text' class='textbox=' name='newimageheight' value='$imageheight' size='5'> <br />
+				<label for='newimagewidth'>"._MAXWIDTH.":</label> <input  type='text' class='textbox=' name='newimagewidth' value='$imagewidth' size='5'></fieldset></td>
+			</tr>
+			<tr>
+				<td><label for='newstore'>"._HOWSTORE.":</label></td><td><select name='newstore' onChange='if (this.disabled) this.selectedIndex=0' disabled>
+					<option value='files'".($store == "files" || !$store ? " selected" : "").">"._FILES."</option>
+					<option value='mysql'".($store == "mysql" ? " selected" : "").">"._MYSQL."</option>
+					</select> <input class='textbox=' type='checkbox' class='checkbox' name='r1' onClick='this.form.newstore.disabled=false' checked> <a href='#' class='pophelp'>[?]<span>"._HELP_STORE."</span></a></td>
+			</tr>
+			<tr>
+				<td><label for='newstoriespath'>"._STORIESPATH.":</label></td><td><input type='text' class='textbox=' name='newstoriespath' value='$storiespath'> <a href='#' class='pophelp'>[?]<span>"._HELP_STORIESPATH."</span></a></td>
+			</tr>
+			<tr>
+				<td colspan='2'><fieldset style='margin: 0 auto;'><legend>"._MAXMINWORDS."<a href='#' class='pophelp'>[?]<span>"._HELP_MINMAXWORDS."</span></a></legend>
+				<label for='newminwords'>"._MIN.":</label> <input  type='text' class='textbox=' name='newminwords' value='$minwords' size='5'> <br />
+				<label for='newmaxwords'>"._MAX.":</label> <input  type='text' class='textbox=' name='newmaxwords' value='$maxwords' size='7'></fieldset></td></tr>";
+	}
+	else if($sect == "sitesettings") {
+		$output .= "<h2>"._SITESETTINGS."</h2>
+		<table class='acp'>
+			<tr>
+				<td><label for='newtinyMCE'>"._USETINYMCE. ": </label></td><td><select name='newtinyMCE'>
+				<option value=\"2\"" . ($tinyMCE == 2 ? " selected" : "") . ">TinyMce4</option>
+				<option value=\"1\"" . ($tinyMCE == 1 ? " selected" : "") . ">TinyMce3</option>
+				<option value=\"0\"" . (!$tinyMCE ? " selected" : "") . ">" . _NO . "</option>
+				</select> <a href='#' class='pophelp'>[?]<span>"._HELP_TINYMCE." "._TINYMCENOTE."</span></a></td>
+			</tr>
+			<tr>
+				<td><label for='newallowed_tags'>"._TAGS.": </label></td><td><input type='text' class='textbox'  name='newallowed_tags' value='".($allowed_tags ? $allowed_tags : "<strong><em><br /><br><blockquote><strike><font><b><i><u><center><img><a><hr><p><ul><li><ol>")."' size='40'> <a href='#' class='pophelp'>[?]<span>"._HELP_ALLOWEDTAGS." "._TINYMCENOTE."</span></a></td>
+			</tr>
+			<tr>
+				<td><label for='newfavorites'>"._FAVORITES.": </label></td><td><select name='newfavorites'>
+				<option value='1'".($favorites == "1" ? " selected" : "").">"._YES."</option>
+				<option value='0'".($favorites == "0" ? " selected" : "").">"._NO."</option>
+				</select><a href='#' class='pophelp'>[?]<span>"._HELP_FAVORITES."</span></a></td>
+			</tr>
+			<tr>
+				<td><label for='newmultplecats'>"._NUMCATS.": </label></td><td><select name='newmultiplecats'>
+				<option value='1'".($multiplecats == "1" ? "selected" : "").">"._MORETHANONE."</option>
+				<option value='0'".($multiplecats == "0" ? "selected" : "").">"._ONLYONE."</option>
+				</select> <a href='#' class='pophelp'>[?]<span>"._HELP_NUMCATS."</span></a></td>
+			</tr>
+			<tr>
+				<td><label for='newnewscomments'>"._NEWSCOMMENTS.": </label></td><td><select name='newnewscomments'>
+				<option value='1'".($newscomments == "1" ? " selected" : "").">"._YES."</option>
+				<option value='0'".($newscomments == "0" ? " selected" : "").">"._NO."</option>
+				</select> <a href='#' class='pophelp'>[?]<span>"._HELP_NEWSCOMMENTS."</span></a></td>
+			</tr>
+			<tr>
+				<td><label for='newlogging'>"._LOGGING.": </label></td><td><select name='newlogging'>
+				<option value='1'".($logging == "1" ? " selected" : "").">"._YES."</option>
+				<option value='0'".($logging == "0" ? " selected" : "").">"._NO."</option>
+				</select> <a href='#' class='pophelp'>[?]<span>"._HELP_LOGGING."</span></a></td>
+			</tr>
+			<tr>
+				<td><label for='newmaint'>"._MAINTENANCE.": </label></td><td><select name='newmaint'>
+				<option value='1'".($maintenance == "1" ? " selected" : "").">"._YES."</option>
+				<option value='0'".($maintenance == "0" ? " selected" : "").">"._NO."</option>
+				</select> <a href='#' class='pophelp'>[?]<span>"._HELP_MAINTENANCE."</span></a></td>
+			</tr>
+			<tr>
+				<td><label for='newdebug'>"._DEBUG.": </label></td><td><select name='newdebug'>
+				<option value='1'".($debug == "1" ? " selected" : "").">"._YES."</option>
+				<option value='0'".(!isset($debug) || $debug == "0" ? " selected" : "").">"._NO."</option>
+				</select> <a href='#' class='pophelp'>[?]<span>"._HELP_DEBUG."</span></a></td>
+			</tr>
+			<tr>
+				<td><label for='newcaptcha'>"._CAPTCHA.": </label></td><td><select name='newcaptcha'>
+				<option value='1'".($captcha == "1" ? " selected" : "").">"._YES."</option>
+				<option value='0'".(!isset($captcha) || $captcha == "0" ? " selected" : "").">"._NO."</option>
+				</select><a href='#' class='pophelp'>[?]<span>"._HELP_CAPTCHA."</span></a></td></tr>";
+	}
+	else if($sect == "display") {
+		$settings = dbquery("SELECT defaultsort, displayindex FROM ".$settingsprefix."fanfiction_settings WHERE sitekey ='".SITEKEY."'");
+		list($sitedefaultsort, $sitedisplayindex) = dbrow($settings);
+		$defaultdates = array("m/d/y", "m/d/Y", "m/d/Y", "d/m/Y", "d/m/y", "d M Y", 
+				"d.m.y", "Y.m.d", "m.d.Y", "d-m-y", "m-d-y", "M d Y", "M d, Y", "F d Y", "F d, Y");
+		$defaulttimes = array("h:i a", "h:i A", "H:i", "g:i a", "g:i A", "G:i", "h:i:s a", "H:i:s", "g:i:s a", "g:i:s A", "G:i:s");
+		$output .= "<h2>"._DISPLAYSETTINGS."</h2>
+		<table class='acp'>
+			<tr>
+				<td><label for='newdateformat'>"._DATEFORMAT.":</label></td><td><select name='newdateformat'><option value=''>"._SELECTONE."</option>";
+		foreach($defaultdates as $date) {
+			$output .= "<option value='$date'>".date("$date")."</option>";
+		}
+		$output .= "</select> "._OR." <input type='text' name='customdateformat' class='textbox' value='$dateformat'> <a href='#' class='pophelp'>[?]<span>"._HELP_DATEFORMAT."</span></a></td>
+		</tr>
+		<tr>
+			<td><label for='newtimeformat'>"._TIMEFORMAT.":</label></td><td><select name='newtimeformat'><option value=''>"._SELECTONE."</option>";
+		foreach($defaulttimes as $time) {
+			$output .= "<option value='$time'>".date("$time")."</option>";
+		}
+		$output .= "
+			</select> "._OR." <input type='text' name='customtimeformat' class='textbox' value='$timeformat'> <a href='#' class='pophelp'>[?]<span>"._HELP_TIMEFORMAT."</span></a></td>
+		</tr>
+		<tr>
+			<td><label for='newextendcats'>"._EXTENDCATS.":</label></td><td><select name='newextendcats'>
+				<option value='1'".($extendcats == "1" ? " selected" : "").">"._YES."</option>
+				<option value='0'".($extendcats == "0" ? " selected" : "").">"._NO."</option>
+			</select> <a href='#' class='pophelp'>[?]<span>"._HELP_EXTENDCATS."</span></a></td>
+		</tr>
+		<tr>
+			<td><label for='newdisplaycolumns'>"._COLUMNS.":</label></td><td><input  type='text' class='textbox=' name='newdisplaycolumns' size='3' value='$displaycolumns'> <a href='#' class='pophelp'>[?]<span>"._HELP_COLUMNS."</span></a></td>
+		</tr>
+		<tr>
+			<td><label for='newitemsperpage'>"._NUMITEMS.":</label></td><td><input  type='text' class='textbox' name='newitemsperpage' size='3' value='$itemsperpage'> <a href='#' class='pophelp'>[?]<span>"._HELP_ITEMSPERPAGE."</span></a></td>
+		</tr>
+		<tr>
+			<td><label for='newrecentdays'>"._RECENTDAYS.":</label></td><td><input  type='text' class='textbox' name='newrecentdays' size='3' value='$recentdays'> <a href='#' class='pophelp'>[?]<span>"._HELP_RECENTDAYS."</span></a></td>
+		</tr>
+		<tr>
+			<td><label for='newdefaultsort'>"._DEFAULTSORT.":</label></td><td><select name='newdefaultsort'>
+				<option value='1'".($sitedefaultsort ? " selected" : "").">"._MOSTRECENT."</option>
+				<option value='0'".(!$sitedefaultsort ? " selected" : "").">"._ALPHA."</option>
+			</select> <a href='#' class='pophelp'>[?]<span>"._HELP_DEFAULTSORT."</span></a></td>
+		</tr>
+		<tr>
+			<td><label for='newdisplayindex'>"._STORYINDEX.":</label></td><td><select name='newstoryindex'>
+				<option value='1'".($sitedisplayindex ? " selected" : "").">"._YES."</option>
+				<option value='0'".(!$sitedisplayindex ? " selected" : "").">"._NO."</option>
+			</select> <a href='#' class='pophelp'>[?]<span>"._HELP_DISPLAYINDEX."</span></a></td>
+		</tr>
+		<tr>
+			<td><label for='newdisplayprofile'>"._DISPLAYPROFILE.":</label></td><td><select name='newdisplayprofile'>
+				<option value='1'".($displayprofile ? " selected" : "").">"._YES."</option>
+				<option value='0'".(!$displayprofile ? " selected" : "").">"._NO."</option>
+			</select> <a href='#' class='pophelp'>[?]<span>"._HELP_DISPLAYPROFILE."</span></a></td>
+		</tr>
+		<tr>
+			<td><label for='newdisplayprofile'>"._LINKSTYLE.":</label></td><td><select name='newlinkstyle'>
+				<option value='2'".($linkstyle == 2 ? " selected" : "").">"._BOTHLINKSTYLE."</option>
+				<option value='1'".($linkstyle == 1 ? " selected" : "").">"._FIRSTLAST."</option>
+				<option value='0'".(!$linkstyle ? " selected" : "").">"._NEXTPREV."</option>
+			</select> <a href='#' class='pophelp'>[?]<span>"._HELP_LINKSTYLE."</span></a></td>
+		</tr>
+		<tr>
+			<td><label for='newlinkrange'>"._LINKRANGE.":</label></td><td><input  type='text' class='textbox=' name='newlinkrange' size='3' value='$linkrange'> <a href='#' class='pophelp'>[?]<span>"._HELP_LINKRANGE."</span></a></td></tr>";
+	}
+	else if($sect == "reviews") {
+		$output .= "<h2>"._REVIEWSETTINGS."</h2>
+		<table class='acp'>
+			<tr>
+				<td><label for='newreviewsallowed'>"._ONREVIEWS.":</label></td><td><select name='newreviewsallowed'>
+				<option value='1'".($reviewsallowed == "1" ? " selected" : "").">"._YES."</option>
+				<option value='0'".($reviewsallowed == "0" ? " selected" : "").">"._NO."</option>
+			</select> <a href='#' class='pophelp'>[?]<span>"._HELP_REVIEWSON."</span></a></td>
+		</tr>
+		<tr>
+				<td><label for='newanonreviews'>"._ANONREVIEWS.":</label></td><td><select name='newanonreviews'>
+				<option value='1'".($anonreviews == "1" ? " selected" : "").">"._YES."</option>
+				<option value='0'".($anonreviews == "0" ? " selected" : "").">"._NO."</option>
+				</select> <a href='#' class='pophelp'>[?]<span>"._HELP_ANONREVIEWS."</span></a></td>
+		</tr>
+		<tr>
+				<td><label for='newrevdelete'>"._REVDELETE.":</label></td><td><select name='newrevdelete'>
+				<option value='2'".($revdelete == 2 ? " selected" : "").">"._ALLREV."</option>
+				<option value='1'".($revdelete == 1 ? " selected" : "").">"._ANONREV."</option>
+				<option value='0'".(empty($revdelete) ? " selected" : "").">"._NONE."</option>
+				</select> <a href='#' class='pophelp'>[?]<span>"._HELP_REVDELETE."</span></a></td>
+		</tr>
+		<tr>
+				<td><label for='newratings'>"._WHATRATINGS.":</label></td><td><select name='newratings'>
+				<option value='2'".($ratings == "2" ? " selected" : "").">"._LIKESYS."</option>
+				<option value='1'".($ratings == "1" ? " selected" : "").">"._STARS."</option>
+				<option value='0'".($ratings == "0" ? " selected" : "").">"._NONE."</option>
+				</select> <a href='#' class='pophelp'>[?]<span>"._HELP_RATINGS."</span></a></td>
+		</tr>
+		<tr>
+				<td><label for='newrateonly'>"._ALLOWRATEONLY.":</label></td><td><select name='newrateonly'>
+				<option value='1'".($rateonly == "1" ? " selected" : "").">"._YES."</option>
+				<option value='0'".($rateonly == "0" ? " selected" : "").">"._NO."</option>
+				</select> <a href='#' class='pophelp'>[?]<span>"._HELP_RATEONLY."</span></a></td></tr>";
+	}
+	else if($sect == "useropts") {
+		$output .= "<h2>"._USERSETTINGS."</h2>
+		<table class='acp'>
+			<tr>
+				<td><label for='newalertson'>"._ALERTSON.":</label></td><td><select name='newalertson'>
+				<option value='1'".($alertson == "1" ? " selected" : "").">"._YES."</option>
+				<option value='0'".($alertson == "0" ? " selected" : "").">"._NO."</option>
+			</select> <a href='#' class='pophelp'>[?]<span>"._HELP_ALERTSON."</span></a></td>
+		</tr>
+		<tr>
+				<td><label for='newdisablepops'>"._USERPOPS.":</label></td><td><select name='newdisablepops'>
+				<option value='1'".($disablepopups ? " selected" : "").">"._YES."</option>
+				<option value='0'".(!$disablepopups ? " selected" : "").">"._NO."</option>
+			</select> <a href='#' class='pophelp'>[?]<span>"._HELP_POPUPS."</span></a></td>
+		</tr>
+		<tr>
+				<td><label for='newagestatement'>"._AGESTATEMENT.":</label></td><td><select name='newagestatement'>
+				<option value='1'".($agestatement ? " selected" : "").">"._YES."</option>
+				<option value='0'".(!$agestatement ? " selected" : "").">"._NO."</option>
+			</select> <a href='#' class='pophelp'>[?]<span>"._HELP_AGECONSENT."</span></a></td>
+		</tr>
+		<tr>
+				<td><label for='newpwdsetting'>"._PWDSETTING.":</label></td><td><select name='newpwdsetting'>
+				<option value='1'".($pwdsetting ? " selected" : "").">"._SELF."</option>
+				<option value='0'".(!$pwdsetting ? " selected" : "").">"._RANDOM."</option>
+			</select> <a href='#' class='pophelp'>[?]<span>"._HELP_PWD."</span></a></td></tr>";
+	}
+	else if($sect == "email") {
+		$output .= "<h2>"._EMAILSETTINGS."</h2>
+		<table class='acp'>
+			<tr>
+				<td><label for='newsmtp_host'>"._SMTPHOST.":</label></td><td><input name='newsmtp_host' type='text' value='$smtp_host'> <a href='#' class='pophelp'>[?]<span>"._HELP_SMTPHOST."</span></a></td>
+		</tr>
+		<tr>
+				<td><label for='newsmtp_username'>"._SMTPUSER.":</label></td><td><input name='newsmtp_username' type='text' value='$smtp_username'> <a href='#' class='pophelp'>[?]<span>"._HELP_SMTPUSER."</span></a></td>
+		</tr>
+		<tr>
+				<td><label for='newsmtp_password'>"._SMTPPASS.":</label></td><td><input name='newsmtp_password' type='password' value='$smtp_password'> <a href='#' class='pophelp'>[?]<span>"._HELP_SMTPPWD."</span></a></td></tr>";		
+		$output .= 	write_message(_SMTPOFF);
+	}
+	$output .= "<tr><td colspan='2'><div align='center'><input type='submit' id='submit' class='button' name='submit' value='"._SUBMIT."'></div></form></td></tr></table>";
+?>

file:b/admin/skins.php (new)
--- /dev/null
+++ b/admin/skins.php
@@ -1,1 +1,51 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+$output .= "<div class='sectionheader'>"._HIDDENSKINS."</div>";
+
+if(isset($_POST['submit'])) {
+	$hiddenskins = isset($_POST['hiddenskins']) ? implode(",", $_POST['hiddenskins']) : "";
+	$result = dbquery("UPDATE ".$settingsprefix."fanfiction_settings SET hiddenskins = '$hiddenskins' WHERE sitekey ='".SITEKEY."' LIMIT 1");
+	if($result) $output .= write_message(_ACTIONSUCCESSFUL);
+	else $output .= write_error(_ERROR);
+}
+else {
+	$directory = opendir(_BASEDIR."skins");
+	if(!isset($hiddenskins)) $hiddenskins = array( );
+	if(is_string($hiddenskins)) $hiddenskins = explode(",", $hiddenskins);
+	while($filename = readdir($directory)) {
+		if($filename== "." || $filename== ".." || !is_dir(_BASEDIR."skins/".$filename)) continue;
+		$skinlist[strtolower($filename)] = "<input type='checkbox' value='$filename' name='hiddenskins[]' id='hiddenskins'".(is_array($hiddenskins) && in_array($filename, $hiddenskins) ? " checked" : "")."> $filename<br />\n";
+	}
+	ksort($skinlist);
+	$output .= "<div><form method=\"POST\" style='width: 250px; margin: 1em auto;' class='tblborder' name=\"form\" enctype=\"multipart/form-data\" action=\"admin.php?action=skins\">";
+	foreach($skinlist as $s) { $output .= $s; }
+	unset($skinlist, $s);
+	closedir($directory);
+	$output .= "<INPUT type=\"submit\" class=\"button\" style='display: block; margin: 1ex auto;' id=\"submit\" value=\""._SUBMIT."\" name=\"submit\"></form></div>";
+	$output .= write_message(_HIDDENNOTE);
+}
+?>

file:b/admin/stories.php (new)
--- /dev/null
+++ b/admin/stories.php
@@ -1,1 +1,241 @@
-
+<?php
+
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+function featured( ) {
+	global $tableprefix, $dbconnect;
+
+	if($_GET['retire'])
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET featured = 2 WHERE sid = ".$_GET['retire']);
+	if($_GET['feature'])
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET featured = 1 WHERE sid = ".$_GET['feature']);
+	$fquery = "SELECT stories.*, stories.title as title, author.penname, DATE_FORMAT(FROM_UNIXTIME(stories.updated), '%Y.%m.%d') as updatesort, DATE_FORMAT(stories.date, '$datim') as date, DATE_FORMAT(FROM_UNIXTIME(stories.updated), '$datim') as updated FROM ".TABLEPREFIX."fanfiction_authors as author, ".TABLEPREFIX."fanfiction_stories as stories WHERE stories.featured > 0 AND stories.uid = author.uid ORDER BY stories.featured";
+	$fresult = dbquery($fquery) or die(_FATALERROR."Query: ".$fquery."<br />Error: (". $dbconnect->errno.") ". $dbconnect->error);
+	$output = "<center><table class=\"tblborder\" cellpadding=\"5\"><tr><th colspan=\"2\" align=\"center\">"._FEATUREDSTORIES."</th></tr>";
+	if(!dbnumrows($fresult)) $output .= "<tr><td colspan=\"2\" align=\"center\">"._NOSTORIES."</td><tr>";
+	while($story = dbassoc($fresult)) {
+		$output .= "<tr><td class=\"tblborder\"><a href=\"viewstory.php?sid=".$story['sid']."\">$story[title]</a> "._BY." <a href=\"viewuser.php?uid=".$story['uid']."\">".$story['penname']."</a></td><td class=\"tblborder\" align=\"center\">".($story['featured'] == 1 ? "<a href=\"admin.php?action=featured&retire=".$story['sid']."\">"._CURRENT."</a>" : "<b>"._RETIRED."</b>")."</td></tr>";
+	}
+	$output .= "</table>"._FEATUREDNOTE;
+	return $output;
+}
+// end featured
+
+function submitted()
+{
+	global $tableprefix, $admincats, $allowed_tags, $dbconnect;
+		$output = "<center><h4>"._SUBMITTED."</h4></center>";
+		$query = "SELECT story.title as storytitle, chapter.uid, chapter.sid, story.catid, chapter.chapid, chapter.inorder, chapter.title, author.penname FROM (".TABLEPREFIX."fanfiction_chapters as chapter, ".TABLEPREFIX."fanfiction_authors as author) LEFT JOIN ".TABLEPREFIX."fanfiction_stories as story ON story.sid = chapter.sid WHERE chapter.validated = '0' AND chapter.uid = author.uid ORDER BY story.title ASC, chapter.inorder ASC";
+		$result = dbquery($query) or die(_FATALERROR."Query: ".$query."<br />Error: (". $dbconnect->errno.") ". $dbconnect->error);
+		$output .= "<table class=\"tblborder\" cellspacing=\"0\" cellpadding=\"3\" align=\"center\"><tr class=\"tblborder\"><th>"._TITLE."</th><th>"._AUTHOR."</th><th>"._CATEGORY."</th><th>"._OPTIONS."</th></tr>";
+		$array = explode(",", $admincats);
+		while ($story = dbassoc($result))
+		{
+			unset($catstring);
+			$result3 = dbquery("SELECT catid, category FROM ".TABLEPREFIX."fanfiction_categories WHERE FIND_IN_SET(catid, '".$story['catid']."')");
+			while($cats = dbassoc($result3)) {
+				$catstring[] = "<a href=\"categories.php?catid=".$cats['catid']."\">".$cats['category']."</a>";
+			}
+			if(!$admincats || sizeof(array_intersect(explode(",", $story['catid']), explode(",", $admincats)))) {
+				$output .= "<tr class=\"tblborder\">";
+				$output .= "<td class=\"tblborder\"><a href=\"viewstory.php?sid=".$story['sid']."\">".$story['storytitle']."</a>";
+				if($story['title']) $output .= " <b>:</b> <a href=\"viewstory.php?sid=".$story['sid']."&amp;chapter=".$story['inorder']."\">".$story['title']."</a>";
+				$output .= "<td class=\"tblborder\"><a href=\"viewuser.php?uid=".$story['uid']."\">".$story['penname']."</a></td>";
+				$output .= "<td class=\"tblborder\">".(is_array($catstring) ? implode(", ", $catstring) : "")."</td>";
+			$output .= "<td class=\"tblborder\"><a href=\"admin.php?action=validate&amp;chapid=".$story['chapid']."\">"._VALIDATE."</a> | "._DELETE.": <a href=\"stories.php?action=delete&amp;chapid=".$story['chapid']."&amp;sid=".$story['sid']."&amp;admin=1&amp;uid=".$story['uid']."\">"._CHAPTER."</a> "._OR." <a href=\"stories.php?action=delete&amp;sid=".$story['sid']."&amp;admin=1\">"._STORY."</a> | <a href=\"javascript:pop('admin.php?action=yesletter&uid=".$story['uid']."&chapid=".$story['chapid']."', 500, 400, 'yes')\">"._YESLETTER."</a> | <a href=\"javascript:pop('admin.php?action=noletter&uid=".$story['uid']."&chapid=".$story['chapid']."', 500, 400, 'yes')\">"._NOLETTER."</a></td></tr>";
+			}
+		}
+		$output .= "</table>";
+
+	return $output;
+}
+// end submitted function
+
+function validate( ) {
+	global $tableprefix, $level, $store, $storiespath, $allowed_tags, $admincats, $sitename, $siteemail, $url, $alertson;
+
+	$output  = "<center><h4>"._VIEWSUBMITTED."</h4></center>";
+	if($_GET['validate'] == "yes") {
+		$storyquery = dbquery("SELECT story.validated, story.catid, story.sid, story.title, story.summary, story.uid, author.penname, chapter.inorder FROM ".TABLEPREFIX."fanfiction_stories as story, ".TABLEPREFIX."fanfiction_chapters  as chapter, ".TABLEPREFIX."fanfiction_authors as author WHERE author.uid = story.uid AND chapter.sid = story.sid AND chapter.chapid ='".$_GET['chapid']."' LIMIT 1");
+		list($validated, $catid, $sid, $title, $summary, $authoruid, $author, $inorder) = dbassoc($storyquery);
+		if($admincats == "0" || sizeof(array_intersect(explode(",", $catid), explode(",", $admincats)))) {
+			include("includes/emailer.php");
+			if($validated != "1") {
+				dbquery("UPDATE ".TABLEPREFIX. "fanfiction_stories SET validated = '1', updated = '".time()."' WHERE sid = '".$_GET['sid']."'");
+				$categories = explode(",", $catid);
+				include("functions.php");
+				foreach($categories as $cat) {
+					categoryitems($cat, 1);
+				}
+				if($alertson) {
+					$subject = _NEWSTORYAT;
+					$mailtext = sprintf(_AUTHORALERTNOTE, $title, $author, $summary, $sid);
+					$favorites = dbquery("SELECT author.uid, email, penname FROM ".TABLEPREFIX."fanfiction_favauth as fav, ".TABLEPREFIX."fanfiction_authors as author WHERE fav.favuid = $authoruid AND fav.uid = author.uid");
+					while($favuser = dbassoc($favorites)) { 
+						sendemail($favuser['penname'], $favuser['email'], $sitename, $siteemail, $subject, $mailtext, "html");
+					}				
+				}
+			}
+			else if($alertson) {
+				$subject = _STORYALERT;
+				$mailtext = sprintf(_STORYALERTNOTE, $title, $author, $sid, $inorder);
+				$favorites = dbquery("SELECT author.uid, penname, email FROM ".TABLEPREFIX."fanfiction_favstor as fav, ".TABLEPREFIX."fanfiction_authors as author WHERE sid = '$sid' AND fav.uid = author.uid");
+				while($favuser = dbassoc($favorites)) { 
+					sendemail($favuser['penname'], $favuser['email'], $sitename, $siteemail, $subject, $mailtext, "html");
+				}
+			}
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET validated = '1' WHERE chapid = '".$_GET['chapid']."'");
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET updated = '" . time() . "' WHERE sid = '$sid'");
+			$output .= "<center><b>"._STORYVALIDATED."</b></center>";
+		}
+		else
+			$output .= "<br /><br /><center>"._NOTAUTHORIZEDADMIN."  "._TRYAGAIN."</center><br /><br />";
+	}
+	else {
+			$result = dbquery("SELECT story.title as storytitle, story.sid, story.catid, story.rid, story.gid, story.charid, story.wid, story.summary as storysummary, chapter.chapid, chapter.title, chapter.storytext, author.penname, chapter.uid as uid FROM ".TABLEPREFIX."fanfiction_authors as author, ".TABLEPREFIX."fanfiction_stories as story, ".TABLEPREFIX."fanfiction_chapters as chapter WHERE chapter.chapid = '".$_GET['chapid']."' AND chapter.sid = story.sid AND chapter.uid = author.uid");
+			$story = dbassoc($result);
+			$output .= "<b>"._AUTHOR.":</b> ".$story['penname']."<br />";
+			$output .= "<b>"._TITLE.":</b> ".$story['storytitle'].": ".$story['title'];
+			$output .= "<br />";
+			$result3 = dbquery("SELECT catid, category FROM ".TABLEPREFIX."fanfiction_categories WHERE FIND_IN_SET(catid, '".$story['catid']."')");
+			$catstring = "";
+			$count = 0;
+			while($cats = dbassoc($result3)) {
+				if($count > 0) $catstring .= ", ";
+				$catstring .= "<a href=\"categories.php?catid=".$cats['catid']."\">".$cats['category']."</a>";
+				$categories[] = $cats['catid'];
+				$count++;
+			}
+			$output .= "<b>"._CATEGORY.":</b> $catstring<br />";
+
+			$output .= "<b>"._GENRES.":</b> ".(isset($story['gid']) ? preg_replace("/,/", ", ", $story['gid']) : _NONE);
+			$output .= "<br />";
+			$output .= "<b>"._RATING.":</b> ".$story['rid']."<br />";
+			if($story['wid'] != "")
+			{
+				$output .= "<b>"._WARNINGS.":</b> ".(isset($story['wid']) ? preg_replace("/,/", ", ", $story['wid']) : _NONE);
+				$output .= "<br />";
+			}
+			$output .= "<b>"._CHARACTERS.":</b> ".$story['charid'];
+			$output .= "<br />";
+			$output .= "<b>"._SUMMARY.":</b> ".$story['storysummary']."<br />";
+			$output .= "<a href=\"admin.php?action=validate&amp;sid=".$story['sid']."&amp;chapid=".$story['chapid']."&amp;validate=yes\">"._VALIDATE."</a> | <a href=\"stories.php?action=editstory&amp;sid=$story[sid]&amp;admin=1\">"._EDIT." - "._STORY."</a> | <a href=\"stories.php?action=delete&amp;sid=$story[sid]\">"._DELETE." - "._STORY."</a> | <a href=\"javascript:pop('admin.php?action=yesletter&amp;uid=$story[uid]&amp;chapid=$story[chapid]', 400, 300, 'yes')\">"._YESLETTER."</a> | <a href=\"javascript:pop('admin.php?action=noletter&amp;uid=$story[uid]&amp;chapid=$story[chapid]',400, 300, 'yes')\">"._NOLETTER."</a><br />";
+			if($store == "files")
+			{
+				$file = "$storiespath/".$story['uid']."/".$story['chapid'].".txt";
+				$log_file = fopen($file, "r");
+				$file_contents = fread($log_file, filesize($file));
+				$storytext .= $file_contents;
+				fclose($log_file);
+			}
+			else if($store == "mysql")
+			{
+				$storytext .= $story['storytext'];
+			}
+			if(strpos($story, "<br>") === false && strpos($story, "<p>") === false && strpos($story, "<br />") === false) $storytext = nl2br($storytext);
+			$storytext = format_story($storytext, $allowed_tags);
+			$output .= $storytext;
+			$output .= "<br /><br />";
+			$output .= "<a href=\"admin.php?action=validate&amp;sid=".$story['sid']."&amp;chapid=".$story['chapid']."&amp;validate=yes\">"._VALIDATE."</a> | <a href=\"stories.php?action=editchapter&amp;chapid=".$story['chapid']."&amp;admin=1\">"._EDIT." - "._CHAPTER."</a> | <a href=\"stories.php?action=delete&amp;chapid=".$story['chapid']."&amp;sid=".$story['sid']."&amp;admin=1&amp;uid=".$story['uid']."\">"._DELETE." - "._CHAPTER."</a> | <a href=\"javascript:pop('admin.php?action=yesletter&amp;uid=".$story['uid']."&amp;chapid=".$story['chapid']."', 400, 300, 'yes')\">"._YESLETTER."</a> | <a href=\"javascript:pop('admin.php?action=noletter&amp;uid=".$story['uid']."&amp;chapid=".$story['chapid']."',400, 300, 'yes')\">"._NOLETTER."</a><br />";
+		}
+	return $output;
+}
+// end validate
+
+function yesletter( ) {
+	global $tableprefix, $level, $adminemail, $sitename, $siteemail, $allowed_tags;
+	
+	if($_POST['submit']) {
+
+		if($adminemail)
+			$ademail = $adminemail;
+		else 
+			$ademail = $siteemail;
+		$subject = stripinput($_POST['subject']);
+		$letter = nl2br(stripinput($_POST['letter']));
+			
+		include("includes/emailer.php");
+		$result = sendemail($_POST['email'], $_POST['email'], $adminname, $ademail, $subject, $letter, "html");
+
+		if($result) echo "<div style='text-align: center;'>"._EMAILSENT."</div>";
+		else echo "<div style='text-align: center;'>"._ERROR."</div>";
+	}
+	else {
+			$authorquery = dbquery("SELECT email,penname FROM ".TABLEPREFIX."fanfiction_authors WHERE uid = '".$_GET['uid']."' LIMIT 1");
+			$author = dbassoc($authorquery);
+			$storyquery = dbquery("SELECT story.title, chapter.title as chapter FROM ".TABLEPREFIX."fanfiction_stories as story, ".TABLEPREFIX."fanfiction_chapters as chapter WHERE chapter.chapid = '".$_GET['chapid']."' AND chapter.sid = story.sid LIMIT 1");
+			$story = dbassoc($storyquery);
+			$letter = file_get_contents("messages/thankyou.txt");
+			echo "<body>";
+			echo "<table><tr><td>Story:</td><td>".$story['title'].": ".$story['chapter']."</td></tr>";
+			echo "<tr><td>"._BY.":</td><td>".$author['penname']."</td></tr>";
+			echo "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=yesletter\">
+				<tr><td>To:</td><td><INPUT  type=\"text\" class=\"textbox=\" name=\"email\" value=\"".$author['email']."\"></td></tr>
+				<tr><td>From:</td><td><INPUT  type=\"text\" class=\"textbox=\" name=\"ademail\" value=\"$adminemail\"></td></tr>
+				<tr><td>Subject:</td><td><INPUT  type=\"text\" class=\"textbox=\" name=\"subject\" value=\"Your Submission to $sitename\"></td></tr>
+				<tr><td colspan=\"2\"><textarea class=\"textbox\" name=\"letter\" cols=\"50\" rows=\"8\">$letter</TEXTAREA></td></tr><tr><td colspan=\"2\"><INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></form></td></tr></table></body></html>";
+	}
+	exit( );
+}
+// end yesletter
+
+function noletter( ) {
+	global $tableprefix, $level, $adminemail, $sitename, $siteemail, $allowed_tags, $adminloggedin;
+	if($_POST['submit'])
+		{
+		if($adminemail)
+			$ademail = $adminemail;
+		else 
+			$ademail = $siteemail;
+		$subject = stripinput($_POST['subject']);
+		$letter = nl2br(stripinput($_POST['letter']));
+			
+		include("includes/emailer.php");
+		$result = sendemail($_POST['email'], $_POST['email'], $adminname, $ademail, $subject, $letter, "html");
+
+		if($result) echo "<div style='text-align: center;'>"._EMAILSENT."</div>";
+		else echo "<div style='text-align: center;'>"._ERROR."</div>";
+	}
+	else
+	{
+		$authorquery = dbquery("SELECT email,penname FROM ".TABLEPREFIX."fanfiction_authors WHERE uid = '".$_GET['uid']."' LIMIT 1");
+		$author = dbassoc($authorquery);
+		$storyquery = dbquery("SELECT story.title, chapter.title as chapter FROM ".TABLEPREFIX."fanfiction_stories as story, ".TABLEPREFIX."fanfiction_chapters as chapter WHERE chapter.chapid = '".$_GET['chapid']."' AND chapter.sid = story.sid LIMIT 1");
+		$story = dbassoc($storyquery);
+		$letter = file_get_contents("messages/nothankyou.txt");
+		echo "<body>";
+		echo "<table><tr><td>Story:</td><td>".$story['title'].": ".$story['chapter']."</td></tr>";
+		echo "<tr><td>"._BY.":</td><td>".$author['penname']."</td></tr>";
+		echo "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=noletter\">
+			<tr><td>To:</td><td><INPUT  type=\"text\" class=\"textbox=\" name=\"email\" value=\"".$author[email]."\"></td></tr>
+			<tr><td>From:</td><td><INPUT  type=\"text\" class=\"textbox=\" name=\"ademail\" value=\"$adminemail\"></td></tr>
+			<tr><td>Subject:</td><td><INPUT type=\"text\" class=\"textbox=\"  name=\"subject\" value=\"Your Submission to $sitename\"></td></tr>
+			<tr><td colspan=\"2\"><textarea class=\"textbox\" name=\"letter\" cols=\"50\" rows=\"8\">$letter</TEXTAREA></td></tr><tr><td colspan=\"2\"><INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></form></td></tr></table></body></html>";
+	}
+	exit( );
+}
+// end noletter
+
+?>

--- /dev/null
+++ b/admin/submitted.php
@@ -1,1 +1,50 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+$output .= "<div id=\"pagetitle\">"._SUBMITTED."</div>";
+$view = isset($_GET['view']) ? $_GET['view'] : false;
+$output .= 	"<p style=\"text-align: right; margin: 1em;\"><a href=\"admin.php?action=submitted&amp;view=".($view == "all" ? "cats\">"._VIEWMYCATS : "all\">"._VIEWALL)."</a></p>";
+$result = dbquery("SELECT story.title as storytitle, chapter.uid, chapter.sid, story.catid, chapter.chapid, chapter.inorder, chapter.title, "._PENNAMEFIELD." as penname FROM (".TABLEPREFIX."fanfiction_chapters as chapter, "._AUTHORTABLE.") LEFT JOIN ".TABLEPREFIX."fanfiction_stories as story ON story.sid = chapter.sid WHERE chapter.validated = '0' AND chapter.uid = "._UIDFIELD." ORDER BY story.title");
+
+if(dbnumrows($result)) {
+	$output .= "<table class=\"tblborder\" cellspacing=\"0\" cellpadding=\"0\" style=\"margin: 0 auto; width: 90%;\"><tr class=\"tblborder\"><th>"._TITLE."</th><th>"._AUTHOR."</th><th>"._CATEGORY."</th><th>"._OPTIONS."</th></tr>";
+	$array = explode(",", $admincats);
+	while ($story = dbassoc($result)) {
+		if(!$admincats || $_GET['view'] == "all" || sizeof(array_intersect(explode(",", $story['catid']), explode(",", $admincats)))) {
+			$output .= "<tr class=\"tblborder\">";
+			$output .= "<td class=\"tblborder\"><a href=\"viewstory.php?sid=$story[sid]\">".stripslashes($story['storytitle'])."</a>";
+			if(isset($story['title'])) $output .= " <b>:</b> <a href=\"viewstory.php?sid=$story[sid]&amp;chapter=$story[inorder]\">".stripslashes($story['title'])."</a>";
+			$output .= "<td class=\"tblborder\"><a href=\"viewuser.php?uid=$story[uid]\">$story[penname]</a></td>";
+			$output .= "<td class=\"tblborder\">".catlist($story['catid'])."</td>";
+			$output .= "<td class=\"tblborder\"><a href=\"admin.php?action=validate&amp;chapid=$story[chapid]\">"._VALIDATE."</a><br />"._DELETE.": <a href=\"stories.php?action=delete&amp;chapid=$story[chapid]&amp;sid=$story[sid]&amp;admin=1&amp;uid=$story[uid]\">"._CHAPTER."</a> "._OR." <a href=\"stories.php?action=delete&amp;sid=$story[sid]&amp;admin=1\">"._STORY."</a><br /><a href=\"javascript:pop('admin.php?action=yesletter&uid=$story[uid]&chapid=$story[chapid]', 500, 400, 'yes')\">"._YESLETTER."</a> | <a href=\"javascript:pop('admin.php?action=noletter&uid=$story[uid]&chapid=$story[chapid]', 500, 400, 'yes')\">"._NOLETTER."</a></td></tr>";
+		}
+	}
+	$output .= "</table>";
+}
+else $output .= write_message(_NORESULTS);
+?>

file:b/admin/update.php (new)
--- /dev/null
+++ b/admin/update.php
@@ -1,1 +1,137 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+$version = explode(".", $version);
+$confirm = isset($_GET['confirm']) ? $_GET['confirm'] : false;
+
+if($version[0] == 3 && $version[1] < 2) {
+if($confirm == "yes") {
+	// For the slow-pokes who haven't updated to 3.1
+	if($version[0] == 3 && $version[1] == 0 ) {
+		list($field) = dbrow(dbquery("SELECT field_id FROM ".TABLEPREFIX."fanfiction_authorfields WHERE field_name = 'betareader'"));
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorinfo SET info = '"._YES."' WHERE field = '$field' AND info = '1'");
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorinfo SET info = '"._NO."' WHERE field = '$field' AND info != '"._YES."'");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_authorinfo add primary key(uid,field);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_blocks drop index block_name;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_blocks add unique index block_name (block_name);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_categories drop index category;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_categories drop index parentcatid;");
+		dbquery("create index byparent on ".TABLEPREFIX."fanfiction_categories (parentcatid,displayorder);");
+		dbquery("create index forstoryblock on ".TABLEPREFIX."fanfiction_chapters (sid,validated);");
+		dbquery("create index byname on ".TABLEPREFIX."fanfiction_classes (class_type,class_name,class_id);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_classtypes drop index classtype_title;");
+		dbquery("create unique index classtype_name on ".TABLEPREFIX."fanfiction_classtypes(classtype_name);");
+		dbquery("create index code_type on ".TABLEPREFIX."fanfiction_codeblocks(code_type);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_comments drop index nid;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_comments add index commentlist (nid,time);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_favorites drop index uid;");
+		dbquery("create unique index byitem on ".TABLEPREFIX."fanfiction_favorites (item,type,uid);");
+		dbquery("create unique index byuid on ".TABLEPREFIX."fanfiction_favorites (uid,type,item);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_inseries drop index seriesid;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_inseries drop index inorder;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_inseries add index (seriesid,inorder);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_inseries drop index sid;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_inseries add primary key (sid,seriesid);");
+		dbquery("create index message_name on ".TABLEPREFIX."fanfiction_messages (message_name);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_pagelinks drop index link_text;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_panels drop index panel_hidden;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_panels drop index panel_type;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_panels add index panel_type (panel_type,panel_name);");
+		dbquery("create index avgrating on ".TABLEPREFIX."fanfiction_reviews(type,item,rating);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_reviews drop index sid;");
+		dbquery("create index bychapter on ".TABLEPREFIX."fanfiction_reviews (chapid,rating);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_reviews add index byuid (uid,item,type);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_series drop index owner;");
+		dbquery("create index owner on ".TABLEPREFIX."fanfiction_series (uid,title);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_stories drop index validated;");
+		dbquery("create index validateduid on ".TABLEPREFIX."fanfiction_stories (validated,uid);");
+		dbquery("create index recent on ".TABLEPREFIX."fanfiction_stories (updated,validated);");
+		$alltables = dbquery("SHOW TABLES");
+	}
+	dbquery("CREATE TABLE `".TABLEPREFIX."fanfiction_stats` (
+  `sitekey` varchar(50) collate latin1_general_ci NOT NULL default '0',
+  `stories` int(11) NOT NULL default '0',
+  `chapters` int(11) NOT NULL default '0',
+  `series` int(11) NOT NULL default '0',
+  `reviews` int(11) NOT NULL default '0',
+  `wordcount` int(11) NOT NULL default '0',
+  `authors` int(11) NOT NULL default '0',
+  `members` int(11) NOT NULL default '0',
+  `reviewers` int(11) NOT NULL default '0',
+  `newestmember` int(11) NOT NULL default '0'
+) ENGINE=MyISAM");
+	dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_stats(`sitekey`) VALUES('".SITEKEY."')");
+	dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_inseries` DROP `updated`");
+	dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_news` ADD `comments` INT NOT NULL DEFAULT '0'");
+	dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_series` ADD `numstories` INT NOT NULL DEFAULT '0'");
+	dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_pagelinks` ADD `link_key` CHAR( 1 ) NULL AFTER `link_text`");
+	dbquery("ALTER TABLE `".$settingsprefix."fanfiction_settings` ADD `allowseries` TINYINT NOT NULL DEFAULT '2' AFTER `roundrobins`");
+	$serieslist = dbquery("SELECT seriesid FROM ".TABLEPREFIX."fanfiction_series");
+	while($s = dbassoc($serieslist)) {
+		$numstories = count(storiesInSeries($s['seriesid']));
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_series SET numstories = '$numstories' WHERE seriesid = ".$s['seriesid']." LIMIT 1");
+	}
+	$newslist = dbquery("SELECT count(cid) as count, nid FROM ".TABLEPREFIX."fanfiction_comments GROUP BY nid");
+	while($n = dbassoc($newslist)) {
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_news SET comments = '".$n['count']." WHERE nid = ".$n['nid']);
+	}
+
+	$storiesquery =dbquery("SELECT COUNT(sid) as totals, COUNT(DISTINCT uid) as totala, SUM(wordcount) as totalwords FROM ".TABLEPREFIX."fanfiction_stories WHERE validated > 0 ");
+	list($stories, $authors, $words) = dbrow($storiesquery);
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET stories = '$stories', authors = '$authors', wordcount = '$words' WHERE sitekey ='".SITEKEY."'"); 
+
+	$chapterquery = dbquery("SELECT COUNT(chapid) as chapters FROM ".TABLEPREFIX."fanfiction_chapters where validated > 0");
+	list($chapters) = dbrow($chapterquery);
+
+	$authorquery = dbquery("SELECT COUNT("._UIDFIELD.") as totalm FROM "._AUTHORTABLE);
+	list($members) = dbrow($authorquery);
+
+	$newest = dbrow(dbquery("SELECT "._UIDFIELD." as uid FROM "._AUTHORTABLE." ORDER BY "._UIDFIELD." DESC LIMIT 1"));
+	$reviewquery = dbquery("SELECT COUNT(reviewid) as totalr FROM ".TABLEPREFIX."fanfiction_reviews WHERE review != 'No Review'");
+	list($reviews) = dbrow($reviewquery);
+	$reviewquery = dbquery("SELECT COUNT(uid) FROM ".TABLEPREFIX."fanfiction_reviews WHERE review != 'No Review' AND uid != 0");
+	list($reviewers) = dbrow($reviewquery);
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET chapters = '$chapters', members = '$members', newestmember = '$newest', reviews = '$reviews', reviewers = '$reviewers' WHERE sitekey ='".SITEKEY."'"); 
+	
+	$update = dbquery("UPDATE ".$settingsprefix."fanfiction_settings SET version = '3.2' WHERE sitekey ='".SITEKEY."'");
+	$alltables = dbquery("SHOW TABLES");
+	while ($table = dbassoc($alltables)) {
+		foreach ($table as $db => $tablename) {
+			dbquery("OPTIMIZE TABLE `".$tablename."`");
+		}
+	}
+	if($update) $output .= write_message(_ACTIONSUCCESSFUL);
+	else $output .= write_error(_ERROR);
+}
+else if($confirm == "no") {
+	$output .= write_message(_ACTIONCANCELLED);
+}
+else {
+  	$output .= write_message("This update will perform some tasks on the database to better your site's performance.  You are advised to back up your database before starting! <br />
+Are you ready to update? <a href='admin.php?action=maintenance&maint=update&amp;confirm=yes'>"._YES."</a> "._OR." <a href='admin.php?action=maintenance&maint=update&amp;confirm=no'>"._NO."</a>");
+}
+}
+else $output .= write_message(_ALREADYUPDATED);
+?>

--- /dev/null
+++ b/admin/validate.php
@@ -1,1 +1,151 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+function preview_story($stories) {
+	global $extendcats, $skindir, $catlist, $charlist, $store, $storiespath, $classlist, $featured, $retired, $rr, $reviewsallowed, $star, $halfstar, $ratingslist, $classtypelist, $dateformat, $recentdays, $current;
+		$count = 0;
+
+		if(isset($_GET['textsize'])) $textsize = $_GET['textsize'];
+		else $textsize = 0;
+		
+		if(file_exists("./$skindir/viewstory.tpl")) $tpl = new TemplatePower("./$skindir/viewstory.tpl");
+		else $tpl = new TemplatePower(_BASEDIR."default_tpls/viewstory.tpl");
+		$tpl->prepare( );			
+		include("includes/storyblock.php");
+		$adminlinks = "<div class=\"adminoptions\"><span class='label'>"._ADMINOPTIONS.":</span> <a href=\"admin.php?action=validate&amp;sid=$stories[sid]&amp;chapid=$stories[chapid]&amp;validate=yes\">"._VALIDATE."</a> | "._EDIT." - <a href=\"stories.php?action=editstory&amp;sid=$stories[sid]&amp;admin=1\">"._STORY."</a> "._OR." <a href=\"stories.php?action=editchapter&amp;chapid=$stories[chapid]&amp;admin=1\">"._CHAPTER."</a> | "._DELETE." - <a href=\"stories.php?action=delete&amp;sid=$stories[sid]\">"._STORY."</a> "._OR." <a href=\"stories.php?action=delete&amp;chapid=$stories[chapid]&amp;sid=$stories[sid]&amp;admin=1&amp;uid=$stories[uid]\">"._CHAPTER."</a> | <a href=\"javascript:pop('admin.php?action=yesletter&amp;uid=$stories[uid]&amp;chapid=$stories[chapid]', 400, 350, 'yes')\">"._YESLETTER."</a> | <a href=\"javascript:pop('admin.php?action=noletter&amp;uid=$stories[uid]&amp;chapid=$stories[chapid]',400, 350, 'yes')\">"._NOLETTER."</a></div>";
+		$tpl->assign("adminlinks", $adminlinks);
+		if($stories['inorder'] == 1 && !empty($stories['storynotes'])) {
+			$tpl->gotoBlock("_ROOT");
+			$tpl->newBlock("storynotes");
+			$tpl->assign( "storynotes", stripslashes($stories['storynotes']));
+			$tpl->gotoBlock("_ROOT");
+		}
+		if(!empty($stories['notes'])) {
+			$tpl->newBlock("notes");
+			$tpl->assign( "notes", $stories['notes']);
+			$tpl->gotoBlock("_ROOT");
+		}
+		if(!empty($stories['endnotes'])) {
+			$tpl->newBlock("endnotes");
+			$tpl->assign( "endnotes", $stories['endnotes']);
+			$tpl->gotoBlock("_ROOT");
+		}
+		if($store == "files")
+		{
+			$file = STORIESPATH."/$stories[uid]/$stories[chapid].txt";
+			$log_file = fopen($file, "r");
+			$file_contents = fread($log_file, filesize($file));
+			$storytext = $file_contents;
+			fclose($log_file);
+		}
+		else if($store == "mysql")
+		{
+			$storytext = $stories['storytext'];
+		}
+		$storytext = format_story($storytext);
+		$tpl->gotoBlock("_ROOT");
+		$tpl->assign("chaptertitle", $stories['chaptertitle']);
+		$tpl->assign("chapternumber", $stories['inorder']);
+		$tpl->assign( "story", "<span style=\"font-size: ".(100 + ($textsize * 20))."%;\">$storytext</span>" );
+		return $tpl->getOutputContent( );
+}
+
+	$output .= "<div id='pagetitle'>"._VIEWSUBMITTED."</div>";
+	if(isset($_GET['validate']) && $_GET['validate'] == "yes") {
+		$storyquery = dbquery("SELECT story.validated, story.catid, story.sid, story.title, story.summary, story.uid, "._PENNAMEFIELD." as penname, chapter.inorder, story.coauthors FROM ".TABLEPREFIX."fanfiction_stories as story, ".TABLEPREFIX."fanfiction_chapters  as chapter, "._AUTHORTABLE." WHERE "._UIDFIELD." = story.uid AND chapter.sid = story.sid AND chapter.chapid ='$_GET[chapid]' LIMIT 1");
+		list($storyvalid, $catid, $sid, $title, $summary, $authoruid, $author, $inorder, $coauthors) = dbrow($storyquery);
+		if(uLEVEL == 1 || (empty($admincats) || sizeof(array_intersect(explode(",", $catid), explode(",", $admincats))))) {
+			include("includes/emailer.php");
+			if(!$storyvalid) {
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET validated = '1', updated = '" . time() . "' WHERE sid = '$_GET[sid]'");
+				foreach(explode(",", $catid) as $cat) {
+					categoryitems($cat, 1);
+				}
+				$au[] = $authoruid;
+				if($coauthors == 1) {
+					$au = array();
+					$coauth = dbquery("SELECT "._PENNAMEFIELD." as penname, co.uid FROM ".TABLEPREFIX."fanfiction_coauthors AS co LEFT JOIN "._AUTHORTABLE." ON co.uid = "._UIDFIELD." WHERE co.sid = '".$_GET['sid']."'");
+					while($c = dbassoc($coauth)) {
+						$au[] = $c['uid'];
+					}
+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET stories = stories + 1 WHERE FIND_IN_SET(uid, '".implode(",", $au)."') > 0");
+				}
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET stories = stories + 1 WHERE uid = '$authoruid'");	
+				$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'addstory'");
+				while($code = dbassoc($codequery)) {
+					eval($code['code_text']);
+				}
+				if($alertson) {
+					if($au) $cond = " FIND_IN_SET(fav.item, '".implode(",", $au).",$authoruid') > 0";
+					else $cond = "fav.item = $authoruid";
+					$subject = _NEWSTORYAT." $sitename";
+					$mailtext = sprintf(_AUTHORALERTNOTE, $title, $author, $summary, $sid);
+					$favorites = dbquery("SELECT "._UIDFIELD." as uid, "._EMAILFIELD." as email, "._PENNAMEFIELD." as penname, alertson FROM ".TABLEPREFIX."fanfiction_favorites as fav, ".TABLEPREFIX."fanfiction_authorprefs as ap, "._AUTHORTABLE." WHERE $cond AND fav.type = 'AU' AND fav.uid = "._UIDFIELD." AND ap.uid = "._UIDFIELD." AND ap.alertson = '1'");
+					while($favuser = dbassoc($favorites)) { 
+						sendemail($favuser['penname'], $favuser['email'], $sitename, $siteemail, $subject, $mailtext, "html");
+					}				
+				}
+				if($logging) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_VALIDATE_STORY, USERPENNAME, USERUID, $title, $sid, $author, $authoruid))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'VS', " . time() . ")");
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET stories = stories + 1");
+			}
+			else if($alertson) {
+				$subject = _STORYALERT;
+				$mailtext = sprintf(_STORYALERTNOTE, $title, $author, $sid, $inorder);
+				$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'addchapter'");
+				while($code = dbassoc($codequery)) {
+					eval($code['code_text']);
+				}
+				$favorites = dbquery("SELECT "._UIDFIELD." as uid, "._EMAILFIELD." as email, "._PENNAMEFIELD." as penname, alertson FROM ".TABLEPREFIX."fanfiction_favorites as fav, ".TABLEPREFIX."fanfiction_authorprefs as ap, "._AUTHORTABLE." WHERE fav.item = '$sid' AND fav.type = 'ST' AND fav.uid = "._UIDFIELD." AND ap.uid = "._UIDFIELD." AND ap.alertson = '1'");
+				while($favuser = dbassoc($favorites)) { 
+					sendemail($favuser['penname'], $favuser['email'], $sitename, $siteemail, $subject, $mailtext, "html");
+				}
+				if($logging) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_VALIDATE_CHAPTER, USERPENNAME, USERUID, $title, $sid, $author, $authoruid, $inorder))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'VS', " . time() . ")");
+			}
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET validated = '1' WHERE chapid = '$_GET[chapid]'");
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET updated = '" . time() . "' WHERE sid = '$sid'");
+			$count =  dbquery("SELECT SUM(wordcount) as totalcount FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '$sid' and validated = 1");
+			list($totalcount) = dbrow($count);
+			if($totalcount) {
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET wordcount = '$totalcount' WHERE sid = '$sid'");
+			}
+			list($chapters, $words) = dbrow(dbquery("SELECT COUNT(chapid), SUM(wordcount) FROM ".TABLEPREFIX."fanfiction_chapters WHERE validated = 1"));
+//			list($authors) = dbrow(dbquery("SELECT COUNT(DISTINCT uid) FROM ".TABLEPREFIX."fanfiction_chapters WHERE validated > 0"));
+			list($authors) = dbrow(dbquery("SELECT COUNT(uid) FROM ".TABLEPREFIX."fanfiction_authorprefs WHERE stories > 0"));
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats set wordcount = '$words', chapters = '$chapters', authors = '$authors'");
+			$output .= write_message(_STORYVALIDATED);
+		}
+		else
+			$output .= write_error(_NOTAUTHORIZEDADMIN."  "._TRYAGAIN);
+	}
+	else {
+		if(isNumber($_GET['chapid'])) {
+			$result = dbquery("SELECT stories.*, stories.title as title, "._PENNAMEFIELD." as penname, stories.updated as updated, stories.date as date, chapter.uid as uid, chapter.inorder, chapter.title as chaptertitle, chapter.storytext, chapter.chapid, chapter.notes, chapter.endnotes FROM "._AUTHORTABLE.", ".TABLEPREFIX."fanfiction_stories as stories, ".TABLEPREFIX."fanfiction_chapters as chapter WHERE chapter.chapid = '$_GET[chapid]' AND chapter.sid = stories.sid AND chapter.uid = "._UIDFIELD);
+			$stories = dbassoc($result);
+			$output .= preview_story($stories);
+
+		}
+	}
+?>

--- /dev/null
+++ b/admin/versioncheck.php
@@ -1,1 +1,42 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+	$currentversion = "3.5.6";
+
+	$output .= "<div id=\"pagetitle\">"._VERSIONCHECK."</div>";
+
+ 
+	 $output .= write_message(_CURRENTVERSION. "$currentversion");
+
+	if ($currentversion != $version) {
+	$output .= write_message (_UPDATEVERSION);
+	}
+	else $output .= write_message (_UPTODATE);
+ 
+
+?>

file:b/admin/viewlog.php (new)
--- /dev/null
+++ b/admin/viewlog.php
@@ -1,1 +1,64 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+$logtypes = array("RG" => _NEWREG, "ED" => _ADMINEDIT, "DL" => _ADMINDELETE, "VS" => _VALIDATESTORY, "LP"=> _LOSTPASSWORD, "BL" => _BADLOGIN, "RE" => "Reviews", "AM" => "Admin Maintenance", "EB" => "Edit Bio");
+$typequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'logtype'");
+while($code = dbassoc($typequery)) {
+	eval($code['code_text']);
+}
+
+$type = isset($_GET['type']) ? $_GET['type'] : false;
+if(isset($_GET['purge'])) {
+	$result = dbquery("TRUNCATE ".TABLEPREFIX."fanfiction_log");
+	if($result) $output .= write_message(_ACTIONSUCCESSFUL);
+}
+$output .= "<div id=\"pagetitle\">"._VIEWLOG."</div>";
+$output .= "<div style='text-align: center; margin: 1ex;'><form name=\"list\" action=\"\"><select name=\"list\" onchange=\"if(this.selectedIndex.value != 'false') document.location = document.list.list.options[document.list.list.selectedIndex].value\">";
+$logtypelist = dbquery("SELECT DISTINCT log_type FROM ".TABLEPREFIX."fanfiction_log ORDER BY log_type");
+$output .= "<option value=\"admin.php?action=viewlog\">"._ALL."</option>";
+while($t = dbrow($logtypelist)) {
+	$output .= "<option value='admin.php?action=viewlog&amp;type=$t[0]'".($type == $t[0] ? " selected" : "").">$t[0] - ".(isset($logtypes[$t[0]]) ? $logtypes[$t[0]] : "???")."</option>";
+}
+$output .= "</select></form></div>";
+$countquery = dbquery("SELECT COUNT(log_id) FROM ".TABLEPREFIX."fanfiction_log".($type ? " WHERE log_type = '$type'" : ""));
+list($count) = dbrow($countquery);
+if($count > 0) {
+	$result = dbquery("SELECT log_action, INET_NTOA(log_ip) as log_ip,  log_timestamp as log_timestamp FROM ".TABLEPREFIX."fanfiction_log".($type ? " WHERE log_type = '$type'" : "")." ORDER BY log_timestamp DESC LIMIT $offset, $itemsperpage");
+	$output .= "<table class=\"tblborder\" cellspacing=\"0\" cellpadding=\"3\" style=\"width: 90%; margin: 0 auto;\"><tr class=\"tblborder\"><th>"._ACTION."</th><th>"._IP."</th><th>"._DATE."</th></tr>";
+	while ($item = dbassoc($result)) {
+			$output .= "<tr class=\"tblborder\">
+					<td class=\"tblborder\">".stripslashes($item['log_action'])."</td>
+					<td class=\"tblborder\">".$item['log_ip']."</td>
+					<td class=\"tblborder\">".date("$dateformat", $item['log_timestamp'])."</td>
+
+				    </tr>";
+	}
+	$output .= "</table>";
+	if($count > $itemsperpage) $output .= build_pagelinks("admin.php?action=viewlog".($type ? "&amp;type=$type&amp;" : "&amp;"), $count, $offset);
+}
+else $output .= write_message(_NORESULTS);
+$output .= write_message("<a href='admin.php?action=viewlog&amp;purge=1'>"._PURGELOG."</a>");
+?>

--- /dev/null
+++ b/admin/warnings.php
@@ -1,1 +1,109 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+function warnings( ) {
+	global $allowed_tags, $dbconnect;
+
+	$output = "<center><h4>"._WARNINGS."</h4></center>";
+	if($_GET["delete"]) {
+		$wid = $_GET["delete"];
+		if($_GET["confirm"] == "yes")
+		{
+			$result5 = dbquery("SELECT warning FROM ".TABLEPREFIX."fanfiction_warnings WHERE wid = '$wid'");
+			$warnings = dbassoc($result5);
+			$newquery5 = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_stories WHERE FIND_IN_SET($wid, wid) > 1");
+				while($warningresult = dbassoc($newquery5))
+				{
+					$tok = strtok($warningresult['wid'], ", ");// tokenize the old list of names
+					$newString = "";// the new list of good names
+					while($tok)
+					{
+						if( $tok != $warnings['warning'] )// oldname is the thing that is going away
+						{
+							// It's a keeper, so decide if it is first or not for comma-age, then add it in
+							if( $newString != "" )
+								$newString .= ", ";
+							$newString .= $tok;
+						}
+						$tok = strtok(", "); //advance to the next token
+					}
+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET wid = '$newString' WHERE sid = '".$warningresult['sid']."'");
+				}
+			dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_warnings where wid = '$wid'");
+			$output .= "<center>"._ACTIONSUCCESSFUL."</center>";
+		}
+		else if ($_GET["confirm"] == "no")
+		{
+			$output .= "<center>"._ACTIONCANCELLED."</center>";
+		}
+		else
+		{
+			$output .= "<center>"._CONFIRMDELETE."<br /><br />";
+			$output .= "[ <a href=\"admin.php?action=warnings&delete=$wid&confirm=yes\">"._YES."</a> | <a href=\"admin.php?action=warnings&delete=$wid&confirm=no\">"._NO."</a> ]</center>";
+			return $output;
+		}
+	}
+	if ($_POST['submit']) {
+		if($_GET['warning'] == "new") dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_warnings (warning) VALUES ('".addslashes(stripinput(strip_tags($_POST['warning'])))."')") or die(_FATALERROR."Query: INSERT INTO ".TABLEPREFIX."fanfiction_warnings (warning) VALUES ('".addslashes(strip_tags($_POST['warning']))."')<br />Error: (". $dbconnect->errno.") ".$dbconnect->error);
+		else dbquery("UPDATE ".TABLEPREFIX."fanfiction_warnings set warning = '".addslashes(stripinput(strip_tags($_POST['warning'])))."' WHERE wid = '".$_GET['warning']."'") or die(_FATALERROR."Query: UPDATE ".TABLEPREFIX."fanfiction_warnings set warning = '".addslashes(strip_tags($_POST['warnings']))."' WHERE wid = '".$_GET['warning']."'<br />Error: (". $dbconnect->errno.") ". $dbconnect->error);
+			$output .= "<center>"._ACTIONSUCCESSFUL."</center>";
+	}
+	else {
+		if(isset($_GET['warning'])) {
+			if($_GET['warning'] != "new") {
+				$warnquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_warnings WHERE wid = '".$_GET['warning']."' LIMIT 1") or die(_FATALERROR."Query: SELECT * FROM ".TABLEPREFIX."fanfiction_warnings WHERE wid = '".$_GET['warning']."' LIMIT 1<br />Error: (". $dbconnect->errno.") ". $dbconnect->error);
+				$warning = dbassoc($warnquery);
+			}
+			$output .=  "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=warnings&warning=".$_GET['warning']."\">
+			<table align=\"center\">	<tr><td colspan=\"2\">	<b>".($_GET['warning'] == "new" ? _NEWWARNING : _EDITWARNING)."</b></td></tr>
+			<tr><td>"._WARNING.": <A HREF=\"javascript:pop('docs/adminhints.htm#warnings');\">[?]</A>
+			</td><td><INPUT  type=\"text\" class=\"textbox=\"  name=\"warning\" value=\"".$warning['warning']."\"></td></tr>
+			<tr><td colspan=\"2\"><INPUT type=\"submit\" class=\"button\" value=\""._SUBMIT."\" name=\"submit\"></td></tr></table></form>";
+		}
+		else {
+
+			$result = dbquery("SELECT * from ".TABLEPREFIX."fanfiction_warnings");
+
+			//List of current warnings
+
+			$output .= "<table class=\"tblborder\" cellpadding=\"3\" cellspacing=\"0\" align=\"center\">
+			<tr><th colspan=\"2\" align=\"center\">"._WARNINGS."</th></tr>
+			<tr><td colspan=\"2\" align=\"center\" class=\"tblborder\"><a href=\"admin.php?action=warnings&warning=new\">"._ADDWARNING."</a></td></tr>";
+			while ($warningresults = dbassoc($result))
+			{
+				$output .=  "<tr><td class=\"tblborder\">".$warningresults['warning'];
+				$output .=  "</td><td class=\"tblborder\"><a href=\"admin.php?action=warnings&warning=".$warningresults['wid']."\">"._EDIT."</a> | <a href=\"admin.php?action=warnings&delete=".$warningresults['wid']."\">"._DELETE."</td></tr>";
+			}
+			$output .= "</table>";
+
+		}
+	}
+	return $output;
+}
+// end warnings function
+
+?>

--- /dev/null
+++ b/admin/yesletter.php
@@ -1,1 +1,62 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+$chapid = isset($_GET['chapid']) && isNumber($_GET['chapid']) ? $_GET['chapid'] : 0;
+
+		$adminquery = dbquery("SELECT "._EMAILFIELD." as email, "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '".USERUID."' LIMIT 1");
+		list($adminemail, $adminname) = dbrow($adminquery);
+		if($adminemail)
+			$ademail = $adminemail;
+		else 
+			$ademail = $siteemail;
+	if(isset($_POST['submit'])) {
+		$subject = strip_tags(descript($_POST['subject']));
+		$letter = stripslashes(descript($_POST['letter']));
+		include("includes/emailer.php");
+		$result = sendemail($_POST['authorname'], $_POST['authoremail'], $adminname, $ademail, $subject, $letter, "html");
+		if($result) echo write_message(_EMAILSENT);
+		else echo write_error(_ERROR);
+	}
+	else {
+			$storyquery = dbquery("SELECT story.title, chapter.title as chapter, "._EMAILFIELD." as email, "._PENNAMEFIELD." as penname, chapter.uid FROM ".TABLEPREFIX."fanfiction_stories as story, ".TABLEPREFIX."fanfiction_chapters as chapter, "._AUTHORTABLE." WHERE chapter.uid = "._UIDFIELD." AND chapter.chapid = '$chapid' AND chapter.sid = story.sid LIMIT 1");
+			$story = dbassoc($storyquery);
+			$letterquery = dbquery("SELECT message_text, message_title FROM ".TABLEPREFIX."fanfiction_messages WHERE message_name = 'thankyou' LIMIT 1");
+			list($letter, $subject) = dbrow($letterquery);
+			$letter = stripslashes($letter);
+			$search = array("@\{sitename\}@", "@\{adminname\}@",  "@\{author\}@", "@\{storytitle\}@",  "@\{chaptertitle\}@", "@\{rules\}@");
+			$replace = array( $sitename, $adminname, $story['penname'], $story['title'], $story['chapter'], "<a href=\"$url/viewpage.php?id=rules\">"._RULES."</a>");
+			$letter = preg_replace($search, $replace, $letter);
+			$subject = preg_replace($search, $replace, $subject);
+			echo "<body>
+			<div id=\"pagetitle\"> $story[title]: $story[chapter] "._BY." $story[penname]</div>
+			<div style=\"line-height: 4ex; margin: 0 auto; width: 90%;\">
+				<form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=yesletter&amp;uid=$story[uid]\">
+				<input type=\"hidden\" name=\"authoremail\" value=\"$story[email]\"><input type=\"hidden\" name=\"authorname\" value=\"story[penname]\">
+				<label for=\"subject\">"._SUBJECT.":</label> <INPUT type=\"text\" class=\"textbox=\" size=\"40\"  name=\"subject\" value=\"$subject\"><br />
+				<textarea  name=\"letter\" cols=\"40\" rows=\"7\">$letter</TEXTAREA><br /><INPUT type=\"submit\" style=\"margin: 10px;\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></form></div></body></html>";
+	}
+	exit( );
+?>

file:b/authors.php (new)
--- /dev/null
+++ b/authors.php
@@ -1,1 +1,90 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(isset($_GET['action']) && $_GET['action'] == "list") {
+	$current = "members";
+	$list = "members";
+}
+else if(isset($_GET['list']) && $_GET["list"] == "authors") $current = "authors";
+else $current = "members";
+
+include ("header.php");
+
+//make a new TemplatePower object
+if(file_exists("$skindir/default.tpl")) $tpl = new TemplatePower( "$skindir/default.tpl" );
+else $tpl = new TemplatePower("default_tpls/default.tpl");
+include("includes/pagesetup.php");
+
+// end basic page setup
+
+$pagetitle = "<div id=\"pagetitle\">";
+if(isset($_GET['list'])) $list = $_GET['list'];
+else $list = "members";
+if(!$let) {
+	$let = false;
+	$ptitle = "</div>";
+}
+else {
+	$ptitle = " -- $let</div>";
+	if($let == _OTHER) {
+		$letter = _PENNAMEFIELD." REGEXP '^[^a-z]'";
+	}
+	else{
+		$letter = _PENNAMEFIELD." LIKE '$let%'";
+	}
+}
+
+$listOpts = ""; $countquery = "";
+	if($list == "authors") {
+		$pagetitle .= _AUTHORS;
+		$authorquery = "SELECT "._PENNAMEFIELD." as penname, "._UIDFIELD." as uid, ap.stories FROM "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs as ap ON ap.uid = "._UIDFIELD." WHERE ap.stories > 0 ".(isset($letter) ? " AND $letter" : "")." GROUP BY "._UIDFIELD;
+		$countquery = "SELECT count("._UIDFIELD.") FROM "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs as ap ON "._UIDFIELD." = ap.uid WHERE ap.stories > 0 ".(isset($letter) ? " AND $letter" : "");
+	}
+	else if($list == "admins") {
+		$pagetitle .= _SITEADMINS;
+		$countquery = _MEMBERCOUNT." WHERE ap.level > 0 AND ap.level < 4".(isset($letter) ? " AND $letter" : "");
+		$authorquery = _MEMBERLIST." WHERE ap.level > 0 AND ap.level < 4".(isset($letter) ? " AND $letter" : "")." GROUP BY "._UIDFIELD;
+	}
+	$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'membersList'");
+	while($code = dbassoc($codequery)) {
+		eval($code['code_text']);
+	}
+	if(empty($countquery)) {
+		$pagetitle .= _MEMBERS;
+		$countquery = _MEMBERCOUNT.(isset($letter) ? " WHERE $letter" : "");
+		$authorquery = _MEMBERLIST.(isset($letter) ? " WHERE $letter" : "")." GROUP BY "._UIDFIELD;
+	}
+
+	$output .= $pagetitle.$ptitle;
+	$output .= "<div style=\"text-align: center;\"><form name=\"list\" action=\"\"><select name=\"list\" onchange=\"if(this.selectedIndex.value != 'false') document.location = document.list.list.options[document.list.list.selectedIndex].value\">";
+	$output .= "<option value=\"authors.php?".($let ? "let=$let&amp;" : "")."list=members\"".(empty($list) || $list == "members" ? " selected" : "").">"._ALLMEMBERS."</option>
+		<option value=\"authors.php?".($let ? "let=$let&amp;" : "")."list=authors\"".($list == "authors" ? " selected" : "").">"._AUTHORS."</option>
+		<option value=\"authors.php?".($let ? "let=$let&amp;" : "")."list=admins\"".($list == "admins" ? " selected" : "").">"._SITEADMINS."</option>$listOpts
+		</select></form></div>";
+	$pagelink="authors.php?list=".($list ? $list : "members")."&amp;".($let ? "let=$let&amp;" : "");
+	include("includes/members_list.php");
+
+	$tpl->assign( "output", $output );
+	$tpl->printToScreen();
+	dbclose( );
+?>

--- /dev/null
+++ b/blocks/categories/admin.php
@@ -1,1 +1,67 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+
+global $language;
+$content = "";
+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'categories'");
+while($block = dbassoc($blockquery)) {
+	if ($block['block_variables'])
+	{
+		$blocks[$block['block_name']] = unserialize($block['block_variables']);
+	}
+	$blocks[$block['block_name']]['title'] = $block['block_title'];
+	 $blocks[$block['block_name']]['file'] = $block['block_file'];
+	$blocks[$block['block_name']]['status'] = $block['block_status'];
+}
+if(empty($blocks['categories']['tpl'])) {
+	include("blocks/".$blocks['categories']['file']);
+	$tpl->gotoBlock("_ROOT");
+}
+if(file_exists("blocks/categories/{$language}.php")) include("blocks/categories/{$language}.php");
+else include("blocks/categories/en.php");
+	if(isset($_POST['submit'])) {
+		$blocks['categories']['columns'] = $_POST['columns'];
+		$blocks['categories']['template'] = $_POST['template'];
+		$output .= "<center>"._ACTIONSUCCESSFUL."</center>";
+		save_blocks( $blocks );
+	}
+	else  {
+		$template = (!empty($blocks['categories']['template']) ? $blocks['categories']['template'] : "{image} {link} [{count}] {description}"); 
+		if(empty($blocks['categories']['tpl'])) $output .= "<div style='text-align: center;'><b>"._CURRENT.":</b><br /><div class=\"tblborder\" style=\"width: 80%; margin: 0 auto; text-align: left;\">$content</div><br /></div>";
+		$output .= "<div><form method=\"POST\" id=\"settingsform\" enctype=\"multipart/form-data\" action=\"admin.php?action=blocks&admin=categories\">
+			<textarea name=\"template\" id=\"template\" rows=\"5\" cols=\"40\">$template</textarea><br />";
+		if($tinyMCE) 
+			$output .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('template');\"><label for='toggle'>"._TINYMCETOGGLE."</label></div>";	
+		$output .= "<select name=\"columns\" class=\"textbox\" style='margin: 3px;'><option value=\"0\"".(empty($blocks['categories']['columns']) ? " selected" : "").">"._ONECOLUMN."</option>
+					<option value=\"1\"".(!empty($blocks['categories']['columns']) ? " selected" : "").">"._MULTICOLUMN."</option></select> 
+			<select name=\"tpl\" class=\"textbox\" style='margin: 3px;'><option value=\"0\"".(empty($blocks['categories']['tpl']) ? " selected" : "").">"._DEFAULT."</option>
+					<option value=\"1\"".(!empty($blocks['categories']['tpl']) ? " selected" : "").">"._USETPL."</option></select><br />
+			<INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></form><div style='clear: both;'>&nbsp;</div>".write_message(_CATBLOCKNOTE)."</div>";
+	}
+?>

--- /dev/null
+++ b/blocks/categories/categories.php
@@ -1,1 +1,98 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+
+	if($multiplecats) {
+		$displaycolumns = $displaycolumns ? $displaycolumns : 1;
+		$query = "SELECT * FROM ".TABLEPREFIX."fanfiction_categories WHERE parentcatid = '-1' ORDER BY displayorder";
+		$result4 = dbquery($query) or die(_FATALERROR."Query: ".$query."<br />Error: (". $dbconnect->errno.") ". $dbconnect->error);
+		$total = dbnumrows($result4);
+		$count = 0;
+		$collist = array( );
+		if($total) {
+			if(!empty($blocks['categories']['tpl'])) {
+				while($categories = dbassoc($result4)) {
+					$list = floor($total / $displaycolumns);
+					if($total % $displaycolumns != 0) $list++;
+					$tpl->newBlock("categoriesblock");
+					if($categories['image'] && file_exists("$skindir/images/".$categories['image'])) $tpl->assign("categoryimage", "$skindir/images/".$categories['image']);
+					$tpl->assign("categorytitle", "<a href=\"browse.php?type=categories&amp;catid=".$categories['catid']."\">".$categories['category']."</a>");
+					$tpl->assign("numstories", "(".$categories['numitems'].")");
+					$tpl->assign("categorydescription", stripslashes($categories['description']));
+					$list--;
+					if($count % $displaycolumns == 0) {
+						$tpl->assign("categorycolumn", "</tr> ".($count < $list ? "<tr>" : ""));
+					}
+				}
+			}
+			else {
+				if(isset($blocks['categories']['columns']) && empty($blocks['categories']['columns'])) $catcolumns = 1;
+				else $catcolumns = $displaycolumns;
+				$colcount = floor(($total / $catcolumns) + ($total % $catcolumns ? 1 : 0));
+				$mod = $total % $catcolumns;
+				$col = 0;
+				$count = 0;
+				$template = (!empty($blocks['categories']['template']) ? stripslashes($blocks['categories']['template']) : "{image} {link} [{count}] {description}"); 
+				$search = array("@\{image\}@", "@\{link\}@", "@\{count\}@", "@\{description\}@");
+				while($categories = dbassoc($result4)) {
+					unset($catinfo);
+					$count++;
+					$replace = array(
+						(!empty($categories['image']) && file_exists("$skindir/images/".$categories['image']) ? "<img src=\"$skindir/images/".$categories['image']."\" alt=\"".$categories['category']."\" title=\"".$categories['category']."\">" : ""),
+						"<a href=\"browse.php?type=categories&amp;catid=".$categories['catid']."\">".$categories['category']."</a>", $categories['numitems'], stripslashes($categories['description']));
+					$catinfo = preg_replace($search, $replace, $template);
+					if($catcolumns == 1) $collist[] = $catinfo;
+					else $collist[$col][] = $catinfo;
+					if(($mod && $col < $mod && $count == $colcount) || ($mod && $col >= $mod && $count >= ($colcount - 1)) || (!$mod && $count == $colcount)) {
+						$col++;
+						$count = 0;
+					}
+				}
+				if($catcolumns > 1) {
+					$content .= "<div id=\"categoryblock\"><div><div id=\"browseblock\">";
+					$col = 0;
+					for($a = 0; $a < $colcount; $a++) {
+						$content .= "<div class=\"row\">";
+						foreach($collist as $c) {
+							if(isset($c[$a])) $content .= "<div class=\"column\">".$c[$a]."</div>";
+						}
+						$content .= "<div class=\"cleaner\">&nbsp;</div></div>";
+					}
+					$content .= "</div><div>&nbsp;</div></div></div>";
+				}
+				else {
+					$content .= "<div id=\"categoryblock\">";
+					foreach($collist as $c) {
+						$content .= "<div class=\"row\">".$c."</div>";
+					}
+					$content .= "</div>";
+				}
+			}
+		}
+	}
+?>

--- /dev/null
+++ b/blocks/categories/en.php
@@ -1,1 +1,32 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+define("_ONECOLUMN", "One Column List");
+define("_MULTICOLUMN", "Multiple Columns");
+define("_CATBLOCKNOTE", "Note: Selecting 'Use .tpl' will output the categories blocks in the 1.1 table format.");
+?>

--- /dev/null
+++ b/blocks/categories/index.php

--- /dev/null
+++ b/blocks/categories/init.php
@@ -1,1 +1,30 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+$blocks["categories"] = array("title" => "Main Categories", "status" => "0", "file" => "categories/categories.php");
+?>

--- /dev/null
+++ b/blocks/countdown/README.txt
@@ -1,1 +1,38 @@
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Countdown Block developed for eFiction 3.x
+// http://efiction.hugosnebula.com/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+
+To install this block:
+
+1. Upload the countdown folder to the blocks folder of your eFiction site.
+
+2. Goto Admin->Blocks.
+
+3. Select "Initialize Block" next to the countdown block in te list.
+
+
+To Administer this block:
+
+1. Goto Admin->Blocks.
+
+2. Select "Options" for the countdown block in the list.
+
+3. Enter the requested information in the admin panel and click "Submit."
+

--- /dev/null
+++ b/blocks/countdown/admin.php
@@ -1,1 +1,34 @@
+<?php
+if(!defined("_CHARSET")) exit( );
 
+global $language, $numupdated;
+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'countdown'");
+while($block = dbassoc($blockquery)) {
+	if ($block['block_variables'])
+	{
+		$blocks[$block['block_name']] = unserialize($block['block_variables']);
+	}
+	$blocks[$block['block_name']]['title'] = $block['block_title'];
+	 $blocks[$block['block_name']]['file'] = $block['block_file'];
+	$blocks[$block['block_name']]['status'] = $block['block_status'];
+}
+include("blocks/countdown/block.php");
+	if(isset($_POST['submit'])) {
+		if(!empty($_POST['target'])) $blocks['countdown']['target'] = escapestring($_POST['target']);
+		else unset($blocks['countdown']['target']);
+		if(!empty($_POST['CDformat'])) $blocks['countdown']['CDformat'] = escapestring($_POST['CDformat']);
+		else unset($blocks['countdown']['CDformat']);
+		if(!empty($_POST['finish'])) $blocks['countdown']['CDfinal'] = escapestring($_POST['finish']);
+		else unset($blocks['countdown']['CDfinal']);
+		$output .= "<div style='text-align: center;'>"._ACTIONSUCCESSFUL."</div>";
+		save_blocks( $blocks );
+	}
+	else  {
+		$output .= "<div style='text-align: center;'><b>"._CURRENT.":</b><br /><div class=\"tblborder\" style=\"width: 80%; margin: 0 auto; text-align: left;\">".$content."</div><br /></div>";
+		$output .= "<div id='settingsform'><form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=blocks&amp;admin=countdown\">
+			<div><label for=\"target\">"._TARGETDATE.":</label><input type=\"text\" class=\"textbox\" name=\"target\" id=\"target\" value=\"".(!empty($blocks['countdown']['target']) ? $blocks['countdown']['target'] : date("m/d/Y G:H"))."\"></div>
+			<div><label for=\"CDformat\">"._FORMATCOUNT.":</label><input type=\"text\" class=\"textbox\" name=\"CDformat\" id=\"CDformat\" size=\"40\" value=\"".(empty($blocks['countdown']['CDformat']) ? _COUNTDOWNFORMAT : $blocks['countdown']['CDformat'])."\"></div>
+			<div><label for=\"finish\">"._FINISHMESSAGE.":</label><input type=\"text\" class=\"textbox\" name=\"finish\" id=\"finish\" size=\"40\" value=\"".(empty($blocks['countdown']['finish']) ? _COUNTDOWNOVER : $blocks['countdown']['finish'])."\"></div>
+			<INPUT type=\"submit\" name=\"submit\" class=\"button\" id=\"submit\" value=\""._SUBMIT."\"></form></div><div style='text-align: center;'>"._DATENOTE."</div>";
+	}
+?>

--- /dev/null
+++ b/blocks/countdown/block.php
@@ -1,1 +1,55 @@
+<?php
+if(!defined("_CHARSET")) exit( );
+if(file_exists(_BASEDIR."blocks/countdown/".$language.".php")) include(_BASEDIR."blocks/countdown/".$language.".php");
+else include(_BASEDIR."blocks/countdown/en.php");
 
+if(empty($blocks['countdown']['target'])) {
+	$content = _NOCOUNTDOWN;
+}
+else { 
+$target = $blocks['countdown']['target'];
+if(empty($blocks['countdown']['CDformat'])) $CDformat = _COUNTDOWNFORMAT;
+else $CDformat = $blocks['countdown']['CDformat'];
+if(empty($blocks['countdown']['CDfinal'])) $CDfinal = _COUNTDOWNOVER;
+else $CDfinal = $blocks['countdown']['CDfinal'];
+
+	$content = '<span id="countdown"></span>
+<script language="JavaScript" type="text/javascript">
+
+TargetDate = "'.$target.'";
+DisplayFormat = "'.$CDformat.'";
+FinishMessage = "'.$CDfinal.'";
+
+function CountBack(secs) {
+  if (secs < 0) {
+    document.getElementById("countdown").innerHTML = FinishMessage;
+    return;
+  }
+  origSecs = secs;
+  days = Math.floor(secs / (60 * 60 * 24));
+  secs %= (60 * 60 * 24);
+  hours = Math.floor(secs / (60 * 60));
+  secs %= (60 * 60);
+  minutes = Math.floor(secs / 60);
+  secs %= 60;
+  seconds = secs;
+
+  DisplayStr = DisplayFormat.replace(/{days}/g, days);
+  DisplayStr = DisplayStr.replace(/{hours}/g, hours);
+  DisplayStr = DisplayStr.replace(/{minutes}/g, minutes);
+  DisplayStr = DisplayStr.replace(/{seconds}/g, seconds);
+
+  document.getElementById("countdown").innerHTML = DisplayStr;
+  setTimeout("CountBack(" + (origSecs - 1) + ")", SetTimeOutPeriod);
+}
+var SetTimeOutPeriod = 1000;
+
+var dateTarget = new Date(TargetDate);
+var dateNow = new Date();
+  dateDiff = new Date(dateTarget - dateNow);
+gsecs = Math.floor(dateDiff.valueOf()/1000);
+CountBack(gsecs);
+</script>
+';
+}
+?>

--- /dev/null
+++ b/blocks/countdown/en.php
@@ -1,1 +1,37 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+define ("_NOCOUNTDOWN", "There is no countdown active.");
+define ("_TARGETDATE", "Target Date");
+define ("_FINISHMESSAGE", "Finish Message");
+define ("_COUNTDOWNFORMAT", "{days} days, {hours} hours, {minutes} minutes, {seconds} seconds.");
+define ("_FORMATCOUNT", "Countdown Format");
+define ("_COUNTDOWNOVER", "The countdown is over.");
+define ("_COUNTDOWNACTIVE", "Countdown Active");
+define ("_DATENOTE", "Target date should be in the format: MM/DD/YYYY HH:MM.  Use 24 hour clock for the time. Use the following variables in your countdown format string: {days}, {hours}, {minutes}, {seconds}.  To stop the countdown leave the target date blank.");
+?>

--- /dev/null
+++ b/blocks/countdown/index.php

--- /dev/null
+++ b/blocks/countdown/init.php
@@ -1,1 +1,30 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_blocks(`block_name`, `block_title`, `block_status`, `block_file`, `block_variables`) VALUES('countdown', 'Countdown', '0', 'countdown/block.php', '');");
+?>

--- /dev/null
+++ b/blocks/featured/admin.php
@@ -1,1 +1,36 @@
-
+<?php
+if(!defined("_CHARSET")) exit( );
+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'featured'");
+while($block = dbassoc($blockquery)) {
+	if ($block['block_variables'])
+	{
+		$blocks[$block['block_name']] = unserialize($block['block_variables']);
+	}
+	$blocks[$block['block_name']]['title'] = $block['block_title'];
+	 $blocks[$block['block_name']]['file'] = $block['block_file'];
+	$blocks[$block['block_name']]['status'] = $block['block_status'];
+}
+include("blocks/".$blocks['featured']['file']);
+if($use_tpl) $tpl->gotoBlock("_ROOT");
+	if(isset($_POST['submit'])) {
+		if($_POST['tpl']) $blocks['featured']['tpl'] = 1;
+		else unset($blocks['featured']['tpl']);
+		if($_POST['allowtags']) $blocks['featured']['allowtags'] = 1;
+		else unset($blocks['featured']['allowtags']);
+		if($_POST['sumlength'] && isNumber($_POST['sumlength'])) $blocks['featured']['sumlength'] = $_POST['sumlength'];
+		else unset($blocks['featured']['sumlength']);
+		$output .= "<div style='text-align: center;'>"._ACTIONSUCCESSFUL."</div>";
+		save_blocks( $blocks );
+		unset($admin);
+	}
+	else  {
+		$output .= "<div style='text-align: center;'><span class='label'>"._CURRENT.":</span><br /><div class=\"tblborder\" style=\"width: 80%; text-align: left; margin: 1ex auto;\">".($use_tpl ? _NATPL : $content)."</div><br /></div>";
+		$output .= "<div id='settingsform'><form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=blocks&admin=featured\">
+			<label for=\"tpl\">"._FORMAT.":</label><select name=\"tpl\" class=\"textbox\" id=\"tpl\"><option value=\"0\"".(!isset($blocks['featured']['tpl']) || !$blocks['featured']['tpl'] ? " selected" : "").">"._DEFAULT."</option>
+					<option value=\"1\"".(isset($blocks['featured']['tpl']) && $blocks['featured']['tpl'] ? " selected" : "").">"._USETPL."</option></select><br />
+			<label for=\"allowtags\">"._TAGS.":</label><select class=\"textbox\" name=\"allowtags\" id=\"allowtags\"><option value=\"0\"".(!isset($blocks['featured']['allowtags']) || !$blocks['featured']['allowtags'] ? " selected" : "").">"._STRIPTAGS."</option>
+					<option value=\"1\"".(isset($blocks['featured']['allowtags']) && $blocks['featured']['allowtags'] ? " selected" : "").">"._ALLOWTAGS."</option></select><br />
+			<label for=\"sumlength\">"._SUMLENGTH.":</label><input type=\"text\" class=\"textbox\" name=\"sumlength\" id=\"sumlength\" size=\"4\" value=\"".(isset($blocks['featured']['sumlength']) ? $blocks['featured']['sumlength'] : "")."\"><br />
+			<INPUT type=\"submit\" class=\"button\" name=\"submit\" id=\"submit\" value=\""._SUBMIT."\"></form></div><div style='text-align: center;'>"._SUMNOTE."</div>";
+	}
+?>

--- /dev/null
+++ b/blocks/featured/en.php
@@ -1,1 +1,30 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+define("_FEATUREDSUMNOTE", "Default is 75 characters.");
+?>

--- /dev/null
+++ b/blocks/featured/featured.php
@@ -1,1 +1,47 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+if(!defined("_CHARSET")) exit( );
+	$content = "";
+	$count = 0;
+	$limit = isset($blocks['featured']['limit']) ? $blocks['featured']['limit'] : false;
+	$use_tpl = isset($blocks['featured']['tpl']) && $blocks['featured']['tpl'] ? true : false;
+	$query = dbquery(_STORYQUERY." AND stories.featured = '1'".($limit ? " LIMIT $limit" : ""));
+	while($stories = dbassoc($query))
+	{
+		if(!isset($blocks['featured']['allowtags'])) $stories['summary'] = strip_tags($stories['summary']);
+		$stories['summary'] = truncate_text(stripslashes($stories['summary']), (isset($blocks['featured']['sumlength']) ? $blocks['featured']['sumlength'] : 75));
+		if(!$use_tpl) $content .= "<div class='featuredstory'>".title_link($stories)." "._BY." ".author_link($stories)." ".$ratingslist[$stories['rid']]['name']."<br />".$stories['summary']."</div>";
+		else {
+			$tpl->newBlock("featuredblock");
+			include(_BASEDIR."includes/storyblock.php");
+		}
+	}
+	if($use_tpl && dbnumrows($query) > 0) $tpl->gotoBlock("_ROOT");	
+
+?>

--- /dev/null
+++ b/blocks/featured/index.php

--- /dev/null
+++ b/blocks/featured/init.php
@@ -1,1 +1,30 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_blocks(`block_name`, `block_title`, `block_status`, `block_file`, `block_variables`) VALUES('featured', 'Featured Stories', '0', 'featured/featured.php', '');");
+?>

file:b/blocks/index.php (new)
--- /dev/null
+++ b/blocks/index.php

--- /dev/null
+++ b/blocks/info/admin.php
@@ -1,1 +1,38 @@
+<?php
+if(!defined("_CHARSET")) exit( );
 
+global $language;
+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'info'");
+while($block = dbassoc($blockquery)) {
+	if ($block['block_variables'])
+	{
+		$blocks[$block['block_name']] = unserialize($block['block_variables']);
+	}
+	$blocks[$block['block_name']]['title'] = $block['block_title'];
+	 $blocks[$block['block_name']]['file'] = $block['block_file'];
+	$blocks[$block['block_name']]['status'] = $block['block_status'];
+}
+include("blocks/info/info.php");
+if(file_exists("blocks/info/{$language}.php")) include_once("blocks/info/{$language}.php");
+else include_once("blocks/info/en.php");
+	if(isset($_POST['submit'])) {
+		$blocks['info']['style'] = !empty($_POST['style']) && isNumber($_POST['style']) ? $_POST['style'] : 0;
+		if($_POST['template'] != _NARTEXT) $blocks['info']['template'] = $_POST['template'];
+		$output .= "<center>"._ACTIONSUCCESSFUL."</center>";
+		save_blocks( $blocks );
+	}
+	else {
+		$style = isset($blocks['info']['style']) ? $blocks['info']['style'] : 0;
+		if(empty($blocks['info']['template']) && $style == 1) $template = _NARTEXT;
+		else if($style == 1) $template = $blocks['info']['template'];
+		else $template = "";
+		$output .= "<div style='margin: 1em auto; width: 80%;'><b>"._CURRENT.":</b><br /><div class=\"tblborder\" style=\"text-align: left; padding: 4px; margin: 0 auto;\">$content</div><br />";
+		$output .= "<form method='POST' enctype='multipart/form-data' name='blockadmin' action='admin.php?action=blocks&admin=info'>
+			<label for='template'>"._TEMPLATE.":</label><br /><textarea name='template' rows='5' cols='50' style='width: 100%;'>$template</textarea>";
+		if($tinyMCE) $output .= "<div style='display: block; margin: 0; padding: 0;'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('template');\" checked><label for='toggle'>"._TINYMCETOGGLE."</label></div>";
+		$output .= "<label for='style'>"._DISPLAY.": </label><select name='style'class='textbox' ><option value='0'".(!$style ? " selected" : "").">"._CHART."</option>
+				<option value='1'".($style == 1 ? " selected" : "").">"._NARRATIVE."</option>
+				<option value='2'".($style == 2 ? " selected" : "").">"._VARIABLES."</option></select><br />
+			<INPUT type='submit' class='button' name='submit' value='"._SUBMIT."'></form></div>";
+	}
+?>

--- /dev/null
+++ b/blocks/info/en.php
@@ -1,1 +1,37 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+define("_CHART", "Chart");
+define("_NARRATIVE", "Narrative");
+define("_LOGGEDINAS", "You are currently logged in as");
+define("_VARIABLES", "Variables");
+define("_DISPLAY",  "Style of Display");
+define("_NARTEXT", "We are the home of  {authors} authors from among our {members} members.  There have been {reviews} reviews written about our {stories} stories consisting of {chapters} chapters and {totalwords} words.  A special welcome to our newest member, {newest}. {loggedinas} {submissions}");
+define("_NEWESTMEMBER", "Newest Member");
+define("_REVIEWERS", "Reviewers");
+?>

--- /dev/null
+++ b/blocks/info/index.php

--- /dev/null
+++ b/blocks/info/info.php
@@ -1,1 +1,66 @@
+<?php
+if(!defined("_CHARSET")) exit( );
 
+if(file_exists(_BASEDIR."blocks/info/{$language}.php")) include_once(_BASEDIR."blocks/info/{$language}.php");
+else include_once(_BASEDIR."blocks/info/en.php");
+	global $noskin, $tpl;
+
+	if(_AUTHORTABLE != TABLEPREFIX."fanfiction_authors") {
+		list($members) = dbrow(dbquery("SELECT COUNT("._UIDFIELD.") as members FROM "._AUTHORTABLE));
+		list($newest) = dbrow(dbquery("SELECT "._UIDFIELD." as uid FROM "._AUTHORTABLE." ORDER BY "._UIDFIELD." DESC LIMIT 1"));
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET members = $members, newestmember = '$newest' WHERE sitekey = '".SITEKEY."' LIMIT 1");
+	}
+	$stats = dbassoc(dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_stats WHERE sitekey = '".SITEKEY."' LIMIT 1"));
+	list($newmember) = dbrow(dbquery("SELECT "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '".$stats['newestmember']."' LIMIT 1"));
+	$adminnotices = "";
+	if(isADMIN) {
+		if(file_exists(_BASEDIR."languages/".$language."_admin.php")) include_once(_BASEDIR."languages/".$language."_admin.php");
+		else include_once(_BASEDIR."languages/en_admin.php");
+		$countquery = dbquery("SELECT COUNT(DISTINCT chapid) FROM ".TABLEPREFIX."fanfiction_chapters WHERE validated = '0'");
+		list($count) = dbrow($countquery);
+		if($count) $adminnotices = sprintf(_QUEUECOUNT, $count);
+		$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'adminnotices'");
+		while($code = dbassoc($codequery)) {
+				eval($code['code_text']);
+		}
+	}
+	if(!empty($blocks['info']['style']) && $blocks['info']['style'] == 2) {
+		$tpl->assignGlobal("totalstories", $stats['stories']);
+		$tpl->assignGlobal("totalauthors", $stats['authors']);
+		$tpl->assignGlobal("totalmembers", $stats['members']);
+		$tpl->assignGlobal("totalreviews", $stats['reviews']);
+		$tpl->assignGlobal("totalreviewers", $stats['reviewers']);	
+		$tpl->assignGlobal("totalwords", $stats['wordcount']);
+		$tpl->assignGlobal("totalchapters", $stats['chapters']);
+		$tpl->assignGlobal("totalseries", $stats['series']);
+		$tpl->assignGlobal("newestmember", "<a href=\""._BASEDIR."viewuser.php?uid=".$stats['newestmember']."\">$newmember</a>");
+		if(isMEMBER) $tpl->assignGlobal("loggedinas", _LOGGEDINAS." ".USERPENNAME.". ".($noskin ? " "._NOSKIN : ""));
+		$tpl->assignGlobal("submissions", $adminnotices);
+	}
+	else {
+		if(isMEMBER) $loggedinas = _LOGGEDINAS." ".USERPENNAME.". ".($noskin ? " "._NOSKIN : "");
+		else $loggedinas = "";
+		if(empty($blocks['info']['style'])) {
+			$content = "<div id='infoblock'>
+<div><span class='label'>"._MEMBERS.": </span>".$stats['members']."</div>
+<div><span class='label'>"._SERIES.": </span>".$stats['series']."</div>
+<div><span class='label'>"._STORIES.": </span>".$stats['stories']."</div>
+<div><span class='label'>"._CHAPTERS.": </span>".$stats['chapters']."</div>
+<div><span class='label'>"._WORDCOUNT.": </span>".$stats['wordcount']."</div>
+<div><span class='label'>"._AUTHORS.": </span>".$stats['authors']."</div>
+<div><span class='label'>"._REVIEWS.": </span>".$stats['reviews']."</div>
+<div><span class='label'>"._REVIEWERS.": </span>".$stats['reviewers']."</div>
+<div><span class='label'>"._NEWESTMEMBER.": </span><a href=\""._BASEDIR."viewuser.php?uid=".$stats['newestmember']."\">$newmember</a></div>";
+		}
+		else if($blocks["info"]["style"] == 1) {
+			$replace = array($stats['authors'], $stats['members'], $stats['reviews'], $stats['reviewers'], $stats['wordcount'], $stats['chapters'], $stats['stories'], $stats['series'],"<a href=\""._BASEDIR."viewuser.php?uid=".$stats['newestmember']."\">$newmember</a>", $loggedinas, $adminnotices);
+			$search = array("@\{authors\}@", "@\{members\}@", "@\{reviews\}@", "@{reviewers\}@", "@\{totalwords\}@","@\{chapters\}@", "@\{stories\}@", "@\{series\}@", "@\{newest\}@", "@\{loggedinas\}@", "@\{submissions\}@");
+			$content = preg_replace($search, $replace, (!empty($blocks['info']['template']) ? stripslashes($blocks['info']['template']) : _NARTEXT));
+		}
+	}
+	$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'sitestats'");
+	while($code = dbassoc($codequery)) {
+			eval($code['code_text']);
+	}
+	if(empty($blocks['info']['style'])) $content .= "<div>$adminnotices</div><div class='cleaner'>&nbsp;</div></div>";
+?>

--- /dev/null
+++ b/blocks/info/init.php
@@ -1,1 +1,30 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_blocks(`block_name`, `block_title`, `block_status`, `block_file`, `block_variables`) VALUES('info', 'Site Information', '0', 'info/info.php', '');");
+?>

--- /dev/null
+++ b/blocks/linktous/README.txt
@@ -1,1 +1,23 @@
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+Copyright 2008 by Tammy Keefer.
+
+This block for eFiction 3.x adds a "Link to Us" block to the script that
+displays a random banner for your site inviting visitors to link to you.
+
+This block requires some customization.  You'll need to open the linktous.php
+file and edit the section marked for configuration.

--- /dev/null
+++ b/blocks/linktous/index.php

--- /dev/null
+++ b/blocks/linktous/init.php
@@ -1,1 +1,30 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_blocks(`block_name`, `block_title`, `block_status`, `block_file`, `block_variables`) VALUES('linktous', 'Link to Us', '0', 'linktous/linktous.php', '');");
+?>

--- /dev/null
+++ b/blocks/linktous/linktous.php
@@ -1,1 +1,46 @@
+<?php
+if(!defined("_CHARSET")) exit( );
 
+/* Start block configuration */
+
+// The text that will appear under your image.  
+$link2us = "Link to Us!";
+
+// The folder or URL to the folder where your images are stored.
+// Include the trailing slash!
+$imgfolder = _BASEDIR."buttons/";
+
+// The page you're sending them to for the code
+$codepage = _BASEDIR."promote.php";
+
+// The list of your images.  One per line.
+$images[] = "88x31-A.jpg";
+$images[] = "88x31-B.jpg";
+$images[] = "88x31-C.jpg";
+$images[] = "88x31-D.jpg";
+$images[] = "88x31-E.jpg";
+$images[] = "88x31-F.jpg";
+$images[] = "88x31-G.jpg";
+$images[] = "88x31-H.jpg";
+$images[] = "88x31-I.jpg";
+$images[] = "88x31-J.jpg";
+$images[] = "88x31-K.jpg";
+$images[] = "88x31-L.jpg";
+$images[] = "88x31-M.jpg";
+$images[] = "88x31-N.jpg";
+$images[] = "88x31-O.jpg";
+$images[] = "100x35-A.jpg";
+$images[] = "100x35-B.jpg";
+$images[] = "100x35-C.jpg";
+$images[] = "100x35-D.jpg";
+$images[] = "100x35-E.jpg";
+$images[] = "100x35-F.jpg";
+$images[] = "100x35-G.jpg";
+
+/* End block configuration */
+
+$img = $images[mt_rand(0, count($images) - 1)];
+
+$content = "<div style='text-align: center;'><a href='$codepage' alt='$link2us'><img src='$imgfolder$img' alt='$sitename' /></a><br /><a href='$codepage'>$link2us</a></div>";
+unset($images, $img);
+?>

--- /dev/null
+++ b/blocks/login/README.txt
@@ -1,1 +1,20 @@
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+Copyright 2007 by Tammy Keefer.
+
+This block for eFiction 3.0 bridged to SMF displays a login block on your
+eFiction site that will log you in via your SMF site. 

--- /dev/null
+++ b/blocks/login/admin.php
@@ -1,1 +1,46 @@
-
+<?php
+if(!defined("_CHARSET")) exit( );
+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'login'");
+while($block = dbassoc($blockquery)) {
+	if ($block['block_variables'])
+	{
+		$blocks[$block['block_name']] = unserialize($block['block_variables']);
+	}
+	$blocks[$block['block_name']]['title'] = $block['block_title'];
+	 $blocks[$block['block_name']]['file'] = $block['block_file'];
+	$blocks[$block['block_name']]['status'] = $block['block_status'];
+}
+global $language;
+// Set $loggedin to 0 to see the block
+include("blocks/login/login.php");
+// Then set it back to 1. 
+if(file_exists("blocks/login/$language.php")) include("blocks/login/$language.php");
+else include("blocks/login/en.php");
+	if(isset($_POST['submit'])) {
+		$blocks['login']['acctlink'] = $_POST['acctlink'];
+		if(empty($_POST['form'])) unset($blocks['login']['form']);
+		else $blocks['login']['form'] = $_POST['form'];
+		$blocks['login']['template'] = addslashes(descript($_POST['template']));
+		save_blocks( $blocks );
+		unset($_GET['admin']);
+		$output .= write_message(_ACTIONSUCCESSFUL);
+	}
+	else {
+		if(empty($blocks['login']['template'])) $template = "";
+		else $template = $blocks['login']['template'];
+		$output .= "<div style='text-align: center;'><span class='label'>"._CURRENT.":</span><br /><div class=\"tblborder\" style=\"width: 80%; text-align: left; margin: 1ex auto;\">$content</div></div><br />";
+		$output .= _LOGINNOTE."<div id='settingsform'><form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=blocks&admin=login\">
+			<div><label for=\"template\">"._TEMPLATE.":</label><span style='clear: left;'>&nbsp;</span></div>
+			<div class=\"shorttextarea\"><textarea name=\"template\" rows=\"5\" style=\"width: 100%;\" cols=\"40\">".stripslashes($template)."</textarea>";
+		if($tinyMCE) 
+			$output .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('template');\" checked><label for='toggle'>"._TINYMCETOGGLE."</label></div>";
+		$output .= "</div>
+			<label for=\"form\">"._DEFAULTOPTS.":</label> <select name=\"form\" id=\"form\" class=\"textbox\" ><option value=\"0\"".(empty($blocks['login']['form']) ? " selected" : "").">"._SHORT."</option>
+					<option value=\"1\"".(!empty($blocks['login']['form']) ? " selected" : "").">"._LONG."</option>
+			</select><br />
+			<label for=\"acctlink\">"._ACCTLINK."</label> <select name=\"acctlink\" id=\"acctlink\" class=\"textbox\" ><option value=\"0\"".(empty($blocks['login']['acctlink']) ? " selected" : "").">"._NO."</option>
+					<option value=\"1\"".(!empty($blocks['login']['acctlink']) ? " selected" : "").">"._YES."</option>
+			</select><br />
+			<INPUT type=\"submit\" class=\"button\" id=\"submit\" name=\"submit\" value=\""._SUBMIT."\"></form></div>";
+	}
+?>

--- /dev/null
+++ b/blocks/login/en.php
@@ -1,1 +1,34 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+define ("_SHORT", "Short Form");
+define ("_LONG", "Long Form");
+define ("_ACCTLINK", "Display '".$pagelinks['login']['text']."' link:");
+define ("_DEFAULTOPTS", "Default Display Options");
+define ("_LOGINNOTE", "The 'short form' will not include the register and lost password links while the 'long form' will.  You may also use the textbox to customize the display."); 
+?>

--- /dev/null
+++ b/blocks/login/index.php

--- /dev/null
+++ b/blocks/login/init.php
@@ -1,1 +1,30 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_blocks(`block_name`, `block_title`, `block_status`, `block_file`, `block_variables`) VALUES('login', 'Login', '0', 'login/login.php', '');");
+?>

--- /dev/null
+++ b/blocks/login/login.php
@@ -1,1 +1,21 @@
+<?php
+if(!defined("_CHARSET")) exit( );
 
+	$longform = "{penname} {password} {rememberme} {go} <div id='loginlinks'>{register} | {lostpwd}</div>";
+	$shortform = "{penname} {password} {rememberme} {go}";
+if(!isMEMBER) {
+	$content = "<form method=\"POST\" id=\"loginblock\" enctype=\"multipart/form-data\" action=\""._BASEDIR."user.php?action=login\">";
+	$replace = array("<label for=\"penname=\">"._PENNAME.":</label><INPUT type=\"text\" class=\"textbox\" name=\"penname\" id=\"penname\" size=\"15\">", 
+			"<label for=\"password\">"._PASSWORD.":</label><INPUT type=\"password\" class=\"textbox\" name=\"password\" id=\"password\" size=\"15\">",
+			"<span id='rememberme'><INPUT type=\"checkbox\" class=\"checkbox\" name=\"cookiecheck\" id=\"cookiecheck\" value=\"1\"><label for=\"cookiecheck=\">"._REMEMBERME."</label></span>",
+			(!empty($pagelinks['register']['link']) ? $pagelinks['register']['link'] : ""), $pagelinks['lostpassword']['link'],
+			"<INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._GO."\">");
+	$search = array("@\{penname\}@", "@\{password\}@", "@\{rememberme\}@", "@\{register\}@", "@\{lostpwd\}@", "@\{go\}@");
+	if(!empty($blocks['login']['template'])) $content .= preg_replace($search, $replace, stripslashes($blocks['login']['template']));
+	else $content .= preg_replace( $search, $replace , (!empty($blocks['login']['form']) ? $longform : $shortform));		
+	$content .= "</form>";
+}
+else if(!empty($blocks['login']['acctlink'])) $content = $pagelinks['login']['link'];
+else $content = "";
+
+?>

--- /dev/null
+++ b/blocks/menu/admin.php
@@ -1,1 +1,87 @@
+<?php
+if(!defined("_CHARSET")) exit( );
 
+global $language, $pagelinks;
+$linkquery = dbquery("SELECT * from ".TABLEPREFIX."fanfiction_pagelinks ORDER BY link_access ASC");
+if(!isset($current)) $current = "";
+
+		$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = '$admin'");
+		while($block = dbassoc($blockquery)) {
+			if ($block['block_variables'])
+			{
+				$blocks[$block['block_name']] = unserialize($block['block_variables']);
+			}
+			$blocks[$block['block_name']]['title'] = $block['block_title'];
+			$blocks[$block['block_name']]['file'] = $block['block_file'];
+			$blocks[$block['block_name']]['status'] = $block['block_status'];
+		}
+		$content = isset($blocks[$admin]['content']) ? $blocks[$admin]['content'] : array();
+
+while($link = dbassoc($linkquery)) {
+	$tpl->assignGlobal($link['link_name'], "<a href=\""._BASEDIR.$link['link_url']."\" title=\"".$link['link_text']."\"".($link['link_target'] ? " target=\"_blank\"" : "").($current == $link['link_name'] ? " id=\"current\"" : "").">".$link['link_text']."</a>");
+	$pagelinks[$link['link_name']] = array("id" => $link['link_id'], "text" => $link['link_text'], "url" => _BASEDIR.$link['link_url'], "link" => "<a href=\""._BASEDIR.$link['link_url']."\" title=\"".$link['link_text']."\"".($link['link_target'] ? " target=\"_blank\"" : "").($current == $link['link_name'] ? " id=\"current\"" : "").">".$link['link_text']."</a>");
+}
+include("blocks/".$blocks[$admin]['file']);
+if(file_exists("blocks/menu/{$language}.php")) include("blocks/menu/{$language}.php");
+else include("blocks/menu/en.php");
+	if(isset($_GET['up'])) {
+		$pos = array_search($_GET['up'], $blocks[$admin]['content']);
+		if($pos >= 1) {
+			$blocks[$admin]['content'][$pos] = $blocks[$admin]['content'][$pos - 1];
+			$blocks[$admin]['content'][$pos - 1] = $_GET['up'];
+			$blocks[$admin]['content'] = $blocks[$admin]['content'];
+			save_blocks( $blocks );
+		}
+	}
+	if(isset($_GET['down'])) {
+		$pos = array_search($_GET['down'], $blocks[$admin]['content']);
+		if($pos <= count($blocks[$admin]['content'])) {
+			$blocks[$admin]['content'][$pos] = $blocks[$admin]['content'][$pos + 1];
+			$blocks[$admin]['content'][$pos + 1] = $_GET['down'];
+			$blocks[$admin]['content'] = $blocks[$admin]['content'];
+			save_blocks( $blocks );
+		}
+	}		
+	if(isset($_POST['submit'])) {
+		$newcontent = array( );
+		for($x = 0; $x <= count($pagelinks); $x++) {
+			if(isset($_POST["content_$x"])) $newcontent[] = $_POST["content_$x"];
+		}
+		$blocks[$admin]['content'] = $newcontent;
+		$blocks[$admin]['style'] = isset($_POST['style']) && !empty($_POST['style']) ? 1 : 0;
+		save_blocks( $blocks );
+	}
+	if($admin){
+		$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = '$admin'");
+		while($block = dbassoc($blockquery)) {
+			$blocks[$block['block_name']] = unserialize($block['block_variables']);
+			$blocks[$block['block_name']]['title'] = $block['block_title'];
+			$blocks[$block['block_name']]['file'] = $block['block_file'];
+			$blocks[$block['block_name']]['status'] = $block['block_status'];
+		}
+		$content = isset($blocks[$admin]['content']) ? $blocks[$admin]['content'] : array();
+		$output .= "<div style=\"width: 300px; margin: 0 auto;\"><form method=\"POST\" enctype=\"multipart/form-data\"action=\"admin.php?action=blocks&admin=$admin\">
+			<table class=\"tblborder\" width=\"100%\"><tr><th>"._TITLE."</th><th colspan=\"2\">"._MOVE."</th></tr>";
+		$count = 1;
+		if(is_array($content)) {
+			foreach($content as $link) {
+				$output .= "<tr><td class='tblborder'><input type=\"checkbox\" class=\"checkbox\" checked name=\"content_$count\" value=\"$link\">".$pagelinks["$link"]['link']."</td>
+					<td class='tblborder' width=\"15\">".($count > 1 ? "<a href=\"admin.php?action=blocks&admin=$admin&up=$link\"><img src=\"images/arrowup.gif\" width=\"13\" height=\"18\" alt=\""._UP."\" title=\""._UP."\" border=\"0\"></a>" : "")."</td>
+					<td class='tblborder' width=\"15\">".($count < sizeof($blocks[$admin]['content']) ? "<a href=\"admin.php?action=blocks&admin=$admin&down=$link\"><img src=\"images/arrowdown.gif\" width=\"13\" height=\"18\" alt=\""._DOWN."\" title=\""._DOWN."\" border=\"0\"></a>" : "")."</td></tr>";
+				$count++;
+			}
+		}
+		foreach($pagelinks as $page => $link) {
+			if(!is_array($content) || !in_array($page, $content)) {
+				$output .= "<tr><td class='tblborder'><input type=\"checkbox\" class=\"checkbox\" name=\"content_$count\" value=\"$page\">".$link['link']."</td>
+					<td class='tblborder' colspan=\"2\">&nbsp;</td></tr>";
+				$count++;
+			}
+		}
+		$output .= "</table><br /><div style=\"text-align: center;\">
+			<label for=\"style\">"._STYLE.":</label> <SELECT name=\"style\" id=\"style\">
+			<option value=\"1\"".(!empty($blocks["menu"]['style']) ? " selected" : "").">"._NOLIST."</option>
+			<option value=\"0\"".(empty($blocks['menu']['style']) ? " selected" : "").">"._LISTFORMAT."</option>
+			</select><br /><br /><INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></div></form></div>";
+	}
+?>

--- /dev/null
+++ b/blocks/menu/en.php
@@ -1,1 +1,32 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+define("_STYLE", "Style");
+define("_LISTFORMAT", "Unordered List");
+define("_NOLIST", "Links Only");
+?>

--- /dev/null
+++ b/blocks/menu/index.php

--- /dev/null
+++ b/blocks/menu/init.php
@@ -1,1 +1,31 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_blocks(`block_name`, `block_title`, `block_status`, `block_file`, `block_variables`) VALUES('menu', 'Main Menu', '0', 'menu/menu.php', '');");
+$blocks["menu"] = array("title" => "Main Menu", "status" => "0", "file" => "menu/menu.php");
+?>

--- /dev/null
+++ b/blocks/menu/menu.php
@@ -1,1 +1,22 @@
+<?php
+if(!defined("_CHARSET")) exit( );
 
+	if(isset($blocks[$block]['content'])) {
+		foreach($blocks[$block]['content'] as $page) {
+			if(isset($pagelinks[$page]['link'])) {
+				if(empty($blocks[$block]['style'])) $content .= "<li ".($current == $page ? "id=\"menu_current\"" : "").">".$pagelinks[$page]['link']."</li>";
+				else $content .= $pagelinks[$page]['link'];
+			}
+		}
+	}
+	else {
+		$pages = array('home', 'recent', 'titles', 'catslink', 'series', 'members', 'authors', 'challenges', 'search', 'tens', 'featured', 'help', 'contactus', 'login', 'logout', 'adminarea');
+		foreach($pages as $page) {
+			if(empty($pagelinks[$page])) continue;
+			if(empty($blocks[$block]['style'])) $content .= "<li ".($current == $page ? "id=\"menu_current\"" : "").">".$pagelinks[$page]['link']."</li>";
+			else $content .= $pagelinks[$page]['link'];
+		}
+	}
+	if(empty($blocks[$block]['style'])) $content = "<ul>$content</ul>";
+	$content = "<div id=\"$block\">$content</div>";
+?>

--- /dev/null
+++ b/blocks/news/admin.php
@@ -1,1 +1,36 @@
+<?php
+if(!defined("_CHARSET")) exit( );
+ 
+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'news'");
+while($block = dbassoc($blockquery)) {
+	if ($block['block_variables'])
+	{
+		$blocks[$block['block_name']] = unserialize($block['block_variables']);
+	}
+	$blocks[$block['block_name']]['title'] = $block['block_title'];
+	 $blocks[$block['block_name']]['file'] = $block['block_file'];
+	$blocks[$block['block_name']]['status'] = $block['block_status'];
+}
+global $language, $numupdated;
 
+if (file_exists(_BASEDIR . "blocks/news/" . $language . ".php")) include(_BASEDIR . "blocks/news/" . $language . ".php");
+else include(_BASEDIR . "blocks/news/en.php");
+
+include("blocks/".$blocks['news']['file']);
+	if(isset($_POST['submit'])) {
+		if(isset($_POST['num']) && isNumber($_POST['num'])) $blocks['news']['num'] = $_POST['num'];
+		else $blocks['news']['num'] = 1;
+		if(isset($_POST['sumlength']) && isNumber($_POST['sumlength'])) $blocks['news']['sumlength'] = $_POST['sumlength'];
+		else unset($blocks['news']['sumlength']);
+		$output .= "<div style='text-align: center;'>"._ACTIONSUCCESSFUL."</div>";
+		save_blocks( $blocks );
+	}
+	else  {
+		if(!isset($blocks['news']['sumlength'])) $blocks['news']['sumlength'] = "";
+		$output .= "<div style='text-align: center;'><b>"._CURRENT.":</b><br /><div class=\"tblborder\" style=\"width: 80%; margin: 0 auto; text-align: left;\">$content</div><br /></div>";
+		$output .= "<div><div id='settingsform'><form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=blocks&admin=news\">
+			<div><label for=\"num\">"._NUMNEWS.":</label><input type=\"text\" class=\"textbox\" name=\"num\" id=\"num\" size=\"4\" value=\"".$blocks['news']['num']."\"></div>
+		<div><label for=\"num\">"._SUMLENGTH.":</label><input type=\"text\" class=\"textbox\" name=\"sumlength\" id=\"sumlength\" size=\"6\" value=\"".$blocks['news']['sumlength']."\"></div>
+			<INPUT type=\"submit\" name=\"submit\" class=\"button\" id=\"submit\" value=\""._SUBMIT."\"></form></div><div style='clear: both;'></div></div>";
+	}
+?>

--- /dev/null
+++ b/blocks/news/en.php
@@ -1,1 +1,31 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+define ("_NUMNEWS", "Number of items");
+define ("_READMORE", "Read more...");
+?>

--- /dev/null
+++ b/blocks/news/index.php

--- /dev/null
+++ b/blocks/news/init.php
@@ -1,1 +1,31 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_blocks(`block_name`, `block_title`, `block_status`, `block_file`, `block_variables`) VALUES('news', 'Site News', '0', 'news/news.php', '');");
+$blocks["news"] = array("title" => "Site News", "status" => "1", "file" => "news/news.php", "num" => "3");
+?>

--- /dev/null
+++ b/blocks/news/news.php
@@ -1,1 +1,61 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+	if(isset($blocks['news']['num'])) $numupdated = $blocks['news']['num'];
+	else $numupdated = 1;
+	if(file_exists("$skindir/newsbox.tpl")) $news = new TemplatePower( "$skindir/newsbox.tpl" );
+	else $news = new TemplatePower( _BASEDIR."default_tpls/newsbox.tpl" );
+	if(file_exists(_BASEDIR."blocks/news/".$language.".php")) include_once(_BASEDIR."blocks/news/".$language.".php");
+	else include_once(_BASEDIR."blocks/news/en.php");
+
+	$news->prepare();
+	$newsquery = dbquery("SELECT nid, author, title, story, time as date, comments FROM ".TABLEPREFIX."fanfiction_news ORDER BY time DESC LIMIT $numupdated");
+	$count = 0;
+	while($stories = dbassoc($newsquery)) {
+
+		//create a new number_row block
+		$news->newBlock("newsbox");
+		
+		//assign values
+		if(!empty($blocks['news']['sumlength']) && isNumber($blocks['news']['sumlength'])) $newsStory = truncate_text($stories['story'], $blocks['news']['sumlength'])."<div class='newsReadMore'><a href='news.php?action=newsstory&amp;nid=".$stories['nid']."'>"._READMORE."</a></div>";
+		else $newsStory = format_story($stories['story']);
+		$news->assign("newstitle" , $stories['title'] );
+		$news->assign("newsstory" , $newsStory);
+		$news->assign("newsauthor", $stories['author'] );
+		$news->assign("newsdate", date("$dateformat $timeformat", $stories['date']) );
+		$news->assign("oddeven", ($count % 2 ? "even" : "odd"));
+		$news->assign("newsid", $stories['nid']);
+		$news->assign("skindir", $skindir);
+		if($newscomments)
+			$news->assign("newscomments", "<a href=\"news.php?action=newsstory&amp;nid=".$stories['nid']."\">".$stories['comments']." "._COMMENTS."</a>");
+		if(isADMIN) 
+			$news->assign("adminoptions", "<a href=\"admin.php?action=news&amp;form=".$stories['nid']."\">"._EDIT."</a> | <a href=\"admin.php?action=news&amp;delete=".$stories['nid']."\">"._DELETE."</a>");
+		$count++;
+	}
+	$news->gotoBlock("_ROOT");
+	$content = $news->getOutputContent( );
+?>

--- /dev/null
+++ b/blocks/online/README.txt
@@ -1,1 +1,34 @@
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+Copyright 2006 by Tammy Keefer.
+
+This block for eFiction 3.0 displays which of your members is currently online 
+and how many guests are visiting the site as well. In addition to the standard 
+{blockname_title} and {blockname_content}, this block also adds {guests} as 
+the number of guests and {onlinemembers} as the hyperlinked list of members online.
+
+VERY IMPORTANT NOTE:  For this block to work correctly it must be set to Active 
+even if it is only displayed on the index page because the block not only displays 
+who is online it also tracks that information.  If it is set to "Index Only" you 
+will only get the information for people on your index page.  And it must be set
+this way on EVERY skin.  Again, even if it doesn't display, it must still be
+set to Active for the visitor information to be recorded.
+
+There is no admin panel for this block.  As is, it displays the people who have 
+been on the site(loaded a page) in the last minute.  If you want to increase 
+that time, open online.php and go to line 13 and replace 60 with the number of 
+seconds you wish.

--- /dev/null
+++ b/blocks/online/en.php
@@ -1,1 +1,30 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+define("_GUESTS", "Guests");
+?>

--- /dev/null
+++ b/blocks/online/index.php

--- /dev/null
+++ b/blocks/online/init.php
@@ -1,1 +1,35 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_blocks(`block_name`, `block_title`, `block_status`, `block_file`, `block_variables`) VALUES('online', 'Who\'s Online', '0', 'online/online.php', '');");
+dbquery("CREATE TABLE IF NOT EXISTS `".TABLEPREFIX."fanfiction_online` (
+  `online_uid` int(11) NOT NULL default '0',
+  `online_ip` int(11) NOT NULL default '0',
+  `online_timestamp` int(11) NOT NULL default '0'
+) ENGINE=MyISAM;");
+?>

--- /dev/null
+++ b/blocks/online/online.php
@@ -1,1 +1,43 @@
+<?php
+if(!defined("_CHARSET")) exit( );
 
+	global $dateformat, $tpl;
+	if(file_exists(_BASEDIR."blocks/online/{$language}.php")) include(_BASEDIR."blocks/online/{$language}.php");
+	else include(_BASEDIR."blocks/online/en.php");
+
+	$where = "online_uid=" . (USERUID ? USERUID : "0 AND online_ip = INET_ATON('" . $_SERVER['REMOTE_ADDR'] . "')");
+ 
+	$result = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_online WHERE $where");
+ 
+	if(dbnumrows($result) > 0) {
+		
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_online SET online_timestamp = '".time( )."' WHERE $where");
+	}
+	else {
+		$ip = $_SERVER['REMOTE_ADDR'];
+		if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))
+		{
+
+		} 
+		else {
+			$ip = 0;	
+		}
+		
+		dbquery("INSERT INTO " . TABLEPREFIX . "fanfiction_online(online_uid, online_ip, online_timestamp)
+		 VALUES('" . (USERUID ? USERUID : 0) . "', INET_ATON('" . $ip . "'), '" . time() . "')");
+	} 
+ 
+	$result = dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_online WHERE online_timestamp < ".(time()-60));
+	$q1 = dbquery("SELECT COUNT(online_ip) FROM ".TABLEPREFIX."fanfiction_online WHERE online_uid = 0");
+ 
+	list($guests) = dbrow($q1);
+	$tpl->assignGlobal("guests", empty($guests) ? 0 : $guests);
+	$q2 = dbquery("SELECT o.online_uid, "._PENNAMEFIELD." as penname FROM ".TABLEPREFIX."fanfiction_online as o, "._AUTHORTABLE." WHERE o.online_uid = "._UIDFIELD." AND o.online_uid != 0");
+	$omlist = array( );
+	while($om = dbassoc($q2)) {
+		$omlist[] = "<a href='"._BASEDIR."viewuser.php?uid=".$om['online_uid']."'>".$om['penname']."</a>";
+	}
+	$tpl->assignGlobal("onlinemembers", count($omlist) ? implode(", ", $omlist) : "");
+	$content = "<div id='who_online'><span class='label'>"._GUESTS.":</span> ".($guests ? $guests : 0)."<br />\n
+		<span class='label'>"._MEMBERS.":</span> ".(count($omlist) ? implode(", ", $omlist) : "")."</div>";
+?>

--- /dev/null
+++ b/blocks/poll/README.txt
@@ -1,1 +1,43 @@
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+Copyright 2006 by Tammy Keefer.
+
+This block for eFiction 3.0 displays a one question poll.  It is set up so that only members 
+can vote and they can only vote once.  Visitors and members will see the current tally of 
+votes while members who haven't voted will see the question with a form to cast their vote.  
+The only thing to set in the admin panel is the question and the options.  Enter the options 
+one per line in the text box.  Because of tinyMCE, <p> tags will get stripped from the options.  
+All other allowable tags from your site's config settings will be honored.  You'll have to 
+use <br> tags instead if you want a multi-line option.  Sorry. :( 
+
+The bar graphic is 12 pixels high by 1 pixel wide.  There's a folder with a few alternatives 
+included.  If you want to change the color of the bar for a single skin include the following 
+in the skin's variables.php file.
+
+$blocks['poll']['bar'] = $skindir."/images/BARIMAGE.JPG";
+
+Replacing BARIMAGE.JPG with the name of your image.  If you want to style the bar images (adding
+a 1px solid border looks nice) use the .poll class.  The poll question is inside a <div> with the 
+id of poll_question. So you can style that with #poll_question.  There are a number of alternative 
+bars in the bars folder.
+
+You can only have one poll active at a time.  When you close a poll the votes for that poll are 
+deleted and the total results stored with the poll question. I did it this way to keep the 
+database from growing.  The votes table will then be emptied for use in the next poll.  If 
+no poll is going on the block will display "There is no poll currently active."  
+
+

--- /dev/null
+++ b/blocks/poll/admin.php
@@ -1,1 +1,64 @@
+<?php
+if(!defined("_CHARSET")) exit( );
 
+global $language, $tinyMCE, $allowed_tags;
+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'poll'");
+while($block = dbassoc($blockquery)) {
+	if ($block['block_variables'])
+	{
+		$blocks[$block['block_name']] = unserialize($block['block_variables']);
+	}
+	$blocks[$block['block_name']]['title'] = $block['block_title'];
+	 $blocks[$block['block_name']]['file'] = $block['block_file'];
+	$blocks[$block['block_name']]['status'] = $block['block_status'];
+}
+include("blocks/".$blocks['poll']['file']);
+	if(isset($_GET['delete']) && isNumber($_GET['delete'])) {
+		$delete = dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_poll WHERE poll_id = '$_GET[delete]' LIMIT 1");
+		if($delete) $output .= write_message(_ACTIONSUCCESSFUL);
+	}	
+	if(isset($_POST['close_current'])) {
+		$final = "";
+		foreach($pollopts as $num => $opt) {
+			if(strlen($final) > 0) $final .= "#";
+			$n = $num + 1;
+			$final .= (isset($results[$n]) ? $results[$n] : "0");
+		}
+		$closepoll =dbquery("UPDATE ".TABLEPREFIX."fanfiction_poll SET poll_results = '$final', poll_end = '" . time() . "' WHERE poll_id = '".$currentpoll['poll_id']."'");
+		if($closepoll) $emptyvotes = dbquery("TRUNCATE TABLE `".TABLEPREFIX."fanfiction_poll_votes`");
+		$output .= write_message(_ACTIONSUCCESSFUL);
+	}
+	if(isset($_POST['submit'])) {
+		$poll_question = escapestring(descript(stripslashes($_POST['poll_question'])));
+		$opts = explode("\r\n", ltrim(strip_tags(preg_replace( '!<p>!iU', "\r\n",  stripslashes(trim($_POST['poll_opts']))), preg_replace("!<p>!iu", "", $allowed_tags))));
+		$new_opts = array( );
+		foreach($opts as $opt) { 
+			if(strlen(trim(preg_replace("!&nbsp;!", " ", $opt))) > 0) $new_opts[] = $opt;
+		}
+		$new_opts = escapestring(implode("|#|", $new_opts));
+		$newpoll = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_poll(`poll_question`, `poll_opts`, `poll_start`) VALUES('$poll_question', '$new_opts', '" . time() . "')");
+		include("blocks/".$blocks['poll']['file']);
+		$output .= "<div style='text-align: center;'><b>"._CURRENT.":</b><br /><div class=\"tblborder\" style=\"width: 200px; margin: 0 auto; text-align: left;\">$content</div><br /></div>";
+	}
+	if($currentpoll && !isset($_POST['close_current'])) {
+		include("blocks/".$blocks['poll']['file']);
+		$output .= "<div style='text-align: center;'><b>"._CURRENT.":</b><br /><div class=\"tblborder\" style=\"width: 200px; margin: 0 auto; text-align: left;\">$content</div><br /></div>";
+		$output .= "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=blocks&amp;admin=poll\" style='text-align: center;'><INPUT type=\"submit\" class=\"button\" name=\"close_current\" value=\""._CLOSEPOLL."\"></form>";
+	}
+	else  {
+		$output .= "<div style='width: 400px; margin: 1em auto; text-align: center;'><form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=blocks&admin=poll\">
+			<label for=\"poll_question\">"._POLLQUESTION."</label><textarea name='poll_question' cols='40' id='poll_question' rows='5'></textarea><br />";
+		if($tinyMCE) 
+			$output .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('poll_question');\" checked><label for='toggle'>"._TINYMCETOGGLE."</label></div>";
+		$output .= "<label for=\"poll_opts\">"._POLLOPTS."</label><textarea name='poll_opts' id='poll_opts' class='mceNoEditor' cols='40' rows='5'></textarea><br />";
+		$output .= "<INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></form></div>";
+	}
+	$oldpolls = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_poll WHERE poll_end != 0 ORDER BY poll_id DESC");
+	if(dbnumrows($oldpolls)) {
+		$output .= "<table class='tblborder' style='width: 400px; margin: 1em auto; text-align: center;'><tr><th>"._POLLQUESTION."</th><th>"._OPTIONS."</th></tr>";
+		while($poll = dbassoc($oldpolls)) {
+			$output .= "<tr><td class='tblborder'>".stripslashes($poll['poll_question'])."</td><td class='tblborder'><a href='admin.php?action=blocks&amp;admin=poll&amp;delete=".$poll['poll_id']."'>"._DELETE."</a></td></tr>";
+		}
+		$output .= "</table><br />";
+	}
+?>

 Binary files /dev/null and b/blocks/poll/bar.jpg differ
 Binary files /dev/null and b/blocks/poll/bars/000_bar.jpg differ
 Binary files /dev/null and b/blocks/poll/bars/009_bar.jpg differ
 Binary files /dev/null and b/blocks/poll/bars/06F_bar.jpg differ
 Binary files /dev/null and b/blocks/poll/bars/369_bar.jpg differ
 Binary files /dev/null and b/blocks/poll/bars/909_bar.jpg differ
 Binary files /dev/null and b/blocks/poll/bars/960_bar.jpg differ
 Binary files /dev/null and b/blocks/poll/bars/999_bar.jpg differ
 Binary files /dev/null and b/blocks/poll/bars/C69_bar.jpg differ
 Binary files /dev/null and b/blocks/poll/bars/F90_bar.jpg differ
 Binary files /dev/null and b/blocks/poll/bars/FF0_bar.jpg differ
 Binary files /dev/null and b/blocks/poll/bars/Thumbs.db differ
 Binary files /dev/null and b/blocks/poll/bars/bar.png differ
 Binary files /dev/null and b/blocks/poll/bars/dk_brown.gif differ
 Binary files /dev/null and b/blocks/poll/bars/dk_green.gif differ
 Binary files /dev/null and b/blocks/poll/bars/dk_red.gif differ
 Binary files /dev/null and b/blocks/poll/bars/lt_green.gif differ
 Binary files /dev/null and b/blocks/poll/bars/orange.gif differ
--- /dev/null
+++ b/blocks/poll/en.php
@@ -1,1 +1,14 @@
-
+<?php
+define("_ALREADYVOTED", "You have already voted!");
+define("_VOTE", "Vote!");
+define("_VOTECAST", "Your vote has been cast.");
+define("_NOPOLL", "There is no poll currently active.");
+define("_POLLQUESTION", "Poll Question: (limit 250 characters)");
+define("_POLLARCHQUESTION", "Poll Question");
+define("_POLLOPTS", "Poll Options: (Enter one per line. Note: tags will be stripped.)");
+define("_CLOSEPOLL", "Close the current poll.");
+define("_POLLARCHIVE", "Poll Archive");
+define("_START", "Start");
+define("_END", "End");
+define("_POLLRESULTS", "Poll Results");
+?>

--- /dev/null
+++ b/blocks/poll/index.php

--- /dev/null
+++ b/blocks/poll/init.php
@@ -1,1 +1,46 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_blocks(`block_name`, `block_title`, `block_status`, `block_file`, `block_variables`) VALUES('poll', 'Poll', '0', 'poll/poll.php', '');");
+dbquery("CREATE TABLE IF NOT EXISTS `".TABLEPREFIX."fanfiction_poll_votes` (
+  `vote_id` int(11) NOT NULL auto_increment,
+  `vote_user` int(11) NOT NULL default '0',
+  `vote_opt` int(11) NOT NULL default '0',
+  `vote_poll` int(11) NOT NULL default '0',
+  PRIMARY KEY  (`vote_id`),
+  KEY `vote_user` (`vote_user`,`vote_poll`)
+) ENGINE=MyISAM;") ;
+dbquery("CREATE TABLE IF NOT EXISTS `".TABLEPREFIX. "fanfiction_poll` (
+`poll_id` INT NOT NULL AUTO_INCREMENT ,
+`poll_question` VARCHAR( 250 ) NOT NULL ,
+`poll_opts` TEXT NOT NULL ,
+`poll_start` int(10) unsigned NOT NULL default '0',
+`poll_end` int(10) unsigned NOT NULL default '0',
+`poll_results` VARCHAR( 250 ) NULL ,
+PRIMARY KEY ( `poll_id` ))");
+?>

--- /dev/null
+++ b/blocks/poll/poll.php
@@ -1,1 +1,81 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// http://efiction.hugosnebula.com
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+if(!defined("_CHARSET")) exit( );
 
+global $language;
+
+if(file_exists(_BASEDIR."blocks/poll/{$language}.php")) include_once(_BASEDIR."blocks/poll/{$language}.php");
+else include_once(_BASEDIR."blocks/poll/en.php");
+$content = "";
+$pollopts = array();
+$pollquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_poll WHERE poll_end IS NULL OR poll_end = 0 ORDER BY poll_id DESC LIMIT 1");
+if($pollquery) $currentpoll = dbassoc($pollquery);
+ 
+if(isset($_POST['cast_vote'])) {
+	$poll = isset($_POST['poll_id']) && isNumber($_POST['poll_id']) ? $_POST['poll_id'] : false;
+	$opt = isset($_POST['opt']) && isNumber($_POST['opt']) ? $_POST['opt'] : false;
+	if(!$poll || !$opt) accessDenied( ); // could only be a hack attempt.
+	$voted = dbquery("SELECT vote_id FROM ".TABLEPREFIX."fanfiction_poll_votes WHERE vote_poll = '".$currentpoll['poll_id']."' AND vote_user = '".USERUID."'");
+	list($voter) = dbrow($voted);
+        if(!$voter) $cast = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_poll_votes(`vote_user`, `vote_opt`, `vote_poll`) VALUES('".USERUID."', '$opt', '$poll')");
+	if(!empty($cast)) $content .= write_message(_VOTECAST);
+	else $content .= write_message(_ALREADYVOTED);
+}
+
+if(!$currentpoll) $content = "<div style='text-align: center;'>"._NOPOLL."</div>";
+else  {
+	   $pollopts = explode("|#|", $currentpoll['poll_opts']);
+	   $content .= "<div id='poll_question'>".$currentpoll['poll_question']."</div><br />";
+	   if(isMEMBER) {
+		$voted = dbquery("SELECT vote_id FROM ".TABLEPREFIX."fanfiction_poll_votes WHERE vote_poll = '".$currentpoll['poll_id']."' AND vote_user = '".USERUID."'");
+		list($voter) = dbrow($voted);
+           }
+	   if(empty($voter) && isMEMBER) {
+		$content .= "<form name='poll' id='poll' method='POST' action='".$_SERVER['PHP_SELF'].($_SERVER['QUERY_STRING'] ? "?".$_SERVER['QUERY_STRING']  : "")."'>
+			<input type='hidden' name='poll_id' value='".$currentpoll['poll_id']."'>";
+		   $x = 1;
+		   foreach($pollopts as $opt) {
+		       $content .= "<input type='radio' name='opt' value='$x'> $opt<br />";
+		       $x++;
+		   }
+		   $content .= "<div style='text-align: center;'><input type='submit' id='cast_vote' name='cast_vote' value='"._VOTE."' class='button' style='font-size: 11px;'></div></form>";
+		$content .= write_message("<br /><a href='"._BASEDIR."blocks/poll/pollarchive.php?poll=".$currentpoll['poll_id']."'>"._POLLRESULTS."</a><br /><br />");
+
+	  }
+	  else { 
+		$votes = dbquery("SELECT COUNT(vote_opt) as count, vote_opt FROM ".TABLEPREFIX."fanfiction_poll_votes WHERE vote_poll = '".$currentpoll['poll_id']."' GROUP BY vote_opt  ORDER BY vote_opt");
+
+		if(isset($blocks['poll']['bar']) && file_exists($blocks['poll']['bar'])) $bar = $blocks['poll']['bar'];
+		else $bar = "blocks/poll/bar.jpg";
+		$totalvotes = 0;
+		while($optvotes = dbassoc($votes)) {
+			$results[$optvotes['vote_opt']] = $optvotes['count'];
+			 $totalvotes = $optvotes['count'] ? $optvotes['count'] + $totalvotes : $totalvotes;
+		}
+		foreach($pollopts as $num => $opt) {
+			unset($percent);
+			if(!empty($results[($num + 1)])) $percent = floor(($results[($num + 1)] / $totalvotes) * 100);
+			else $percent = 0;
+			$content .= "<div>$opt <br /> <img src='$bar' alt='".strip_tags($opt)."' height='12' width='".$percent."' class='poll'> $percent%</div>";	
+		}
+	  }
+}
+	$content .= "<div style='text-align: center;'><a href='"._BASEDIR."blocks/poll/pollarchive.php'>"._POLLARCHIVE."</a></div>";
+?>

--- /dev/null
+++ b/blocks/poll/pollarchive.php
@@ -1,1 +1,78 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+$current = "pollarchive";
+
+include ("../../header.php");
+
+if(file_exists(_BASEDIR."blocks/poll/{$language}.php")) include(_BASEDIR."blocks/poll/{$language}.php");
+else include(_BASEDIR."blocks/poll/en.php");
+if(file_exists("$skindir/default.tpl")) $tpl = new TemplatePower( "$skindir/default.tpl" );
+else $tpl = new TemplatePower(_BASEDIR."default_tpls/default.tpl");
+$tpl->assignInclude( "header", "./$skindir/header.tpl" );
+$tpl->assignInclude( "footer", "./$skindir/footer.tpl" );
+//let TemplatePower do its thing, parsing etc.
+$tpl->prepare();
+
+include("../../includes/pagesetup.php");
+
+$poll = !empty($_GET['poll']) && isNumber($_GET['poll']) ? $_GET['poll'] : false;
+
+if($poll) {
+	$pollquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_poll WHERE poll_id = '$poll' ORDER BY poll_id DESC LIMIT 1");
+	$currentpoll = dbassoc($pollquery);
+	$opts = explode("|#|", $currentpoll['poll_opts']);
+	$votes = explode("#", $currentpoll['poll_results']);
+	$output .= "<div id='pagetitle'>"._POLLARCHIVE.": ".$currentpoll['poll_question']."</div><br />";
+	if(isset($blocks['poll']['bar']) && file_exists($blocks['poll']['bar'])) $bar = $blocks['poll']['bar'];
+	else $bar = _BASEDIR."blocks/poll/bar.jpg";
+	$totalvotes = 0;
+	$results = array( );
+	foreach($votes as $opt => $count) {
+		$results[$opt] = $count;
+		 $totalvotes = $count ? $count + $totalvotes : $totalvotes;
+	}
+	$output .= "<div id='story'>";
+	foreach($opts as $num => $opt) {
+		unset($percent);
+		if(!empty($results[$num]) && $results[$num] > 0) $percent = floor(($results[$num] / $totalvotes) * 100);
+		else $percent = 0;
+		$output .= "<div>$opt <br /> <img src='$bar' alt='".strip_tags($opt)."' height='12' class='poll' width='".$percent."'> $percent%</div>";	
+	}
+	$output .= "</diV>";
+}
+else {
+	$output .= "<div id='pagetitle'>"._POLLARCHIVE."</div>";
+	$listquery = dbquery("SELECT poll_id, poll_question, poll_start as start, poll_end as end FROM ".TABLEPREFIX."fanfiction_poll WHERE poll_end IS NOT NULL OR poll_end != 0 ORDER BY poll_id DESC");
+	if(dbnumrows($listquery) > 0) {
+		$output .= "<table class='tblborder' style='margin: 1em auto;'><tr><th class='tblborder'>"._POLLARCHQUESTION."</th><th class='tblborder'>"._START."</th><th class='tblborder'>"._END."</th></tr>";
+		while($poll = dbassoc($listquery)) {
+			$output .= "<tr><td class='tblborder'><a href='pollarchive.php?poll=".$poll['poll_id']."'>".$poll['poll_question']."</a></td><td class='tblborder'>".date("$dateformat", $poll['start'])."</td><td class='tblborder'>".date("$dateformat", $poll['end'])."</td></tr>";
+		}
+		$output .= "</table>";
+	}
+}
+$tpl->assign("output", $output);
+$tpl->printToScreen();
+
+?>

--- /dev/null
+++ b/blocks/random/admin.php
@@ -1,1 +1,37 @@
+<?php
+if(!defined("_CHARSET")) exit( );
 
+global $language;
+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'random'");
+while($block = dbassoc($blockquery)) {
+	if ($block['block_variables'])
+	{
+		$blocks[$block['block_name']] = unserialize($block['block_variables']);
+	}
+	$blocks[$block['block_name']]['title'] = $block['block_title'];
+	 $blocks[$block['block_name']]['file'] = $block['block_file'];
+	$blocks[$block['block_name']]['status'] = $block['block_status'];
+}
+include("blocks/".$blocks['random']['file']);
+if(!empty($blocks['random']['tpl'])) $tpl->gotoBlock("_ROOT");
+	if(isset($_POST['submit'])) {
+		if($_POST['tpl']) $blocks['random']['tpl'] = 1;
+		else unset($blocks['random']['tpl']);
+		if($_POST['allowtags']) $blocks['random']['allowtags'] = 1;
+		else unset($blocks['random']['allowtags']);
+		if(isset($_POST['sumlength']) && isNumber($_POST['sumlength'])) $blocks['random']['sumlength'] = $_POST['sumlength'];
+		else unset($blocks['random']['sumlength']);
+		$output .= "<div style='text-align: center;'>"._ACTIONSUCCESSFUL."</div>";
+		save_blocks( $blocks );
+	}
+	else  {
+		$output .= "<div style='text-align: center;'><b>"._CURRENT.":</b><br /><div class=\"tblborder\" style=\"width: 80%; margin: 1ex auto; text-align: left;\">".(!empty($blocks['random']['tpl']) ? _NATPL : $content)."</div><br /></div>";
+		$output .= "<div id='settingsform'><form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=blocks&admin=random\">
+			<label for=\"tpl\">"._BLOCKTYPE.":</label><select class=\"textbox\" name=\"tpl\" id=\"tpl\"><option value=\"0\"".(empty($blocks['random']['tpl']) ? " selected" : "").">"._DEFAULT."</option>
+					<option value=\"1\"".(!empty($blocks['random']['tpl']) ? " selected" : "").">"._USETPL."</option></select><br />
+			<label for=\"allowtags\">"._TAGS.":</label><select class=\"textbox\" name=\"allowtags\" id=\"allowtags\"><option value=\"0\"".(empty($blocks['random']['allowtags']) ? " selected" : "").">"._STRIPTAGS."</option>
+					<option value=\"1\"".(!empty($blocks['random']['allowtags']) ? " selected" : "").">"._ALLOWTAGS."</option></select><br />
+			<label for=\"sumlength\">"._SUMLENGTH.":</label><input type=\"text\" class=\"textbox\" name=\"sumlength\" id=\"sumlength\" size=\"4\" value=\"".(!empty($blocks['random']['sumlength']) ? $blocks['random']['sumlength'] : "")."\"><br />
+			<INPUT type=\"submit\" name=\"submit\" id=\"submit\" class=\"button\" value=\""._SUBMIT."\"></form></div><div style='text-align: center;'>"._SUMNOTE."</div>";
+	}
+?>

--- /dev/null
+++ b/blocks/random/en.php
@@ -1,1 +1,30 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+define("_NATPL", "Not Available. Layout defined in .tpl file.");
+?>

--- /dev/null
+++ b/blocks/random/index.php

--- /dev/null
+++ b/blocks/random/init.php
@@ -1,1 +1,30 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_blocks(`block_name`, `block_title`, `block_status`, `block_file`, `block_variables`) VALUES('random', 'Random Story', '0', 'random/random.php', '');");
+?>

--- /dev/null
+++ b/blocks/random/random.php
@@ -1,1 +1,20 @@
+<?php
 
+if(!defined("_CHARSET")) exit( );
+	$count = 0;
+	$content = "";
+	$use_tpl = isset($blocks['random']['tpl']) && $blocks['random']['tpl'] ? true : false;
+	$limit = isset($blocks['random']['limit']) && $blocks['random']['limit'] > 0 ? $blocks['random']['limit'] : 1;
+	$randomquery = dbquery(_STORYQUERY." ORDER BY rand( ) DESC LIMIT $limit");
+	if($use_tpl && dbnumrows($randomquery) >0) $tpl->newBlock("randomblock");
+	while($stories = dbassoc($randomquery))
+	{
+		if(!isset($blocks['random']['allowtags'])) $stories['summary'] = strip_tags($stories['summary']);
+		$stories['summary'] = truncate_text(stripslashes($stories['summary']), (isset($blocks['random']['sumlength']) ? $blocks['random']['sumlength'] : 75));
+		if(!$use_tpl) $content .= "<div class='randomstory'>".title_link($stories)." "._BY." ".author_link($stories)." ".$ratingslist[$stories['rid']]['name']."<br />".$stories['summary']."</div>";
+		else {
+			include(_BASEDIR."includes/storyblock.php");
+		}
+	}
+	if($use_tpl && dbnumrows($randomquery) >0) $tpl->gotoBlock("_ROOT");	
+?>

--- /dev/null
+++ b/blocks/recent/admin.php
@@ -1,1 +1,41 @@
+<?php
+if(!defined("_CHARSET")) exit( );
 
+global $language, $numupdated;
+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'recent'");
+while($block = dbassoc($blockquery)) {
+	if ($block['block_variables'])
+	{
+		$blocks[$block['block_name']] = unserialize($block['block_variables']);
+	}
+	$blocks[$block['block_name']]['title'] = $block['block_title'];
+	 $blocks[$block['block_name']]['file'] = $block['block_file'];
+	$blocks[$block['block_name']]['status'] = $block['block_status'];
+}
+if(empty($blocks['recent']['tpl'])) include("blocks/".$blocks['recent']['file']);
+if(file_exists("blocks/recent/".$language.".php")) include("blocks/recent/".$language.".php");
+else include("blocks/recent/en.php");
+	if(isset($_POST['submit'])) {
+		if(!empty($_POST['tpl'])) $blocks['recent']['tpl'] = 1;
+		else unset($blocks['recent']['tpl']);
+		if(!empty($_POST['allowtags'])) $blocks['recent']['allowtags'] = 1;
+		else unset($blocks['recent']['allowtags']);
+		if(!empty($_POST['sumlength']) && isNumber($_POST['sumlength'])) $blocks['recent']['sumlength'] = $_POST['sumlength'];
+		else unset($blocks['recent']['sumlength']);
+		if(!empty($_POST['num']) && isNumber($_POST['num'])) $blocks['recent']['num'] = $_POST['num'];
+		else $blocks['recent']['num'] = 1;
+		$output .= "<div style='text-align: center;'>"._ACTIONSUCCESSFUL."</div>";
+		save_blocks( $blocks );
+	}
+	else  {
+		$output .= "<div style='text-align: center;'><b>"._CURRENT.":</b><br /><div class=\"tblborder\" style=\"width: 80%; margin: 0 auto; text-align: left;\">".(!empty($blocks['recent']['tpl']) ? _NATPL : $content)."</div><br /></div>";
+		$output .= "<div id='settingsform'><form method=\"POST\" enctype=\"multipart/form-data\" action=\"admin.php?action=blocks&amp;admin=recent\">
+			<div><label for=\"tpl\">"._BLOCKTYPE.":</label><select name=\"tpl\" class=\"textbox\" id=\"tpl\"><option value=\"0\"".(empty($blocks['recent']['tpl']) ? " selected" : "").">"._DEFAULT."</option>
+					<option value=\"1\"".(!empty($blocks['recent']['tpl']) ? " selected" : "").">"._USETPL."</option></select></div>
+			<div><label for=\"allowtags\">"._TAGS.":</label><select name=\"allowtags\" class=\"textbox\" id=\"allowtags\"><option value=\"0\"".(empty($blocks['recent']['allowtags']) ? " selected" : "").">"._STRIPTAGS."</option>
+					<option value=\"1\"".(!empty($blocks['recent']['allowtags']) ? " selected" : "").">"._ALLOWTAGS."</option></select></div>
+			<div><label for=\"sumlength\">"._SUMLENGTH.":</label><input type=\"text\" class=\"textbox\" name=\"sumlength\" id=\"sumlength\" size=\"4\" value=\"".(!empty($blocks['recent']['sumlength']) ? $blocks['recent']['sumlength'] : "")."\"></div>
+			<div><label for=\"num\">"._NUMUPDATED.":</label><input type=\"text\" class=\"textbox\" name=\"num\" id=\"num\" size=\"4\" value=\"".$blocks['recent']['num']."\"></div>
+			<INPUT type=\"submit\" name=\"submit\" class=\"button\" id=\"submit\" value=\""._SUBMIT."\"></form></div><div style='text-align: center;'>"._SUMNOTE."</div>";
+	}
+?>

--- /dev/null
+++ b/blocks/recent/en.php
@@ -1,1 +1,30 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+define ("_NUMUPDATED", "Number of stories");
+?>

--- /dev/null
+++ b/blocks/recent/index.php

--- /dev/null
+++ b/blocks/recent/init.php
@@ -1,1 +1,30 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_blocks(`block_name`, `block_title`, `block_status`, `block_file`, `block_variables`) VALUES('recent', 'Most Recent', '0', 'recent/recent.php', '');");
+?>

--- /dev/null
+++ b/blocks/recent/recent.php
@@ -1,1 +1,22 @@
+<?php
+if(!defined("_CHARSET")) exit( );
+	$count = 0;
+	$content = "";
+	$use_tpl = isset($blocks['recent']['tpl']) && $blocks['recent']['tpl'] ? true : false;
+	if(isset($blocks['recent']['num'])) $numupdated = $blocks['recent']['num'];
+	else $numupdated = 1;
+	$result5 = dbquery(_STORYQUERY." ORDER BY stories.updated DESC LIMIT $numupdated");
+	while($stories = dbassoc($result5))
+	{
+		if(!isset($blocks['recent']['allowtags'])) $stories['summary'] = strip_tags($stories['summary']);
+		$stories['summary'] = truncate_text(stripslashes($stories['summary']), (!empty($blocks['recent']['sumlength']) ? $blocks['recent']['sumlength'] : 75));
+		if(!$use_tpl) $content .= "<div class='recentstory'>".title_link($stories)." "._BY." ".author_link($stories)." ".$ratingslist[$stories['rid']]['name']."<br />".stripslashes($stories['summary'])."</div>";
+		else {
+			$tpl->newBlock("recentblock");
+			include(_BASEDIR."includes/storyblock.php");
+		}
 
+	}	
+	if($use_tpl && dbnumrows($result5) >0) $tpl->gotoBlock("_ROOT");	
+	unset($updated, $result5);
+?>

--- /dev/null
+++ b/blocks/search/index.php

--- /dev/null
+++ b/blocks/search/init.php
@@ -1,1 +1,30 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_blocks(`block_name`, `block_title`, `block_status`, `block_file`, `block_variables`) VALUES('search', 'Search', '0', 'search/search.php', '');");
+?>

--- /dev/null
+++ b/blocks/search/search.php
@@ -1,1 +1,8 @@
+<?php
+if(!defined("_CHARSET")) exit( );
+	$content = "<form method=\"POST\" id=\"searchblock\" enctype=\"multipart/form-data\" action=\""._BASEDIR."search.php?action=advanced\">
+			<INPUT type=\"text\" class=\"textbox\" name=\"searchterm\" id=\"searchterm\" size=\"15\"> 
+			<INPUT type=\"hidden\" name=\"searchtype\" value=\"advanced\">
+			<INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SEARCH."\"></form>";
 
+?>

--- /dev/null
+++ b/blocks/shoutbox/README.txt
@@ -1,1 +1,32 @@
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+Copyright 2006 by Tammy Keefer.
+
+CSS in the shoutbox block:
+
+#shoutbox_container  - div surrounding the shoutbox content.
+#shoutlist - div surrounding the list of shouts.  Default styling is included 
+in this div to limit the height and force it to scroll.  Default styles are:
+	height: 200px;
+	overflow: auto;
+.sbname - span surrounding the name of the shouter
+.sbdatetime - span surrounding the date/time and admin options
+.sbshout - the shout itself
+#shoutarchive - the link to the shout archive.
+
+
+

--- /dev/null
+++ b/blocks/shoutbox/admin.php
@@ -1,1 +1,95 @@
+<?php
+if(!defined("_CHARSET")) exit( );
+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'shoutbox'");
+while($block = dbassoc($blockquery)) {
+	$blocks[$block['block_name']] = unserialize($block['block_variables']);
+	$blocks[$block['block_name']]['title'] = $block['block_title'];
+	$blocks[$block['block_name']]['file'] = $block['block_file'];
+	$blocks[$block['block_name']]['status'] = $block['block_status'];
+}
+if(file_exists("blocks/shoutbox/{$language}.php")) include_once("blocks/shoutbox/{$language}.php");
+else include_once("blocks/shoutbox/en.php");
+	if(isset($_POST['deleteshouts'])) {
+		$range = time( ) - ($_POST['del_range'] * 86400);
+		$result = dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_shoutbox WHERE shout_datestamp < $range");
+		if($result) $output .= write_message(_ACTIONSUCCESSFUL);
+	}
+	if(isset($_GET['delete']) && isNumber($_GET['delete'])) {
+		$delete = dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_shoutbox WHERE shout_id = '$_GET[delete]' LIMIT 1");
+		if($delete) $output .= write_message(_ACTIONSUCCESSFUL);
+	}	
+	if(isset($_GET['shout_id'])) {
+		$output .= "<div class='sectionheader'>"._EDITSHOUT."</div>";
+		if(isset($_POST['submit'])) {
+			$shout_message = trim($_POST['shout_message']);
+			$shout_message = preg_replace("/^(.{200}).*$/", "$1", $shout_message);
+			$shout_message = preg_replace("/[^\s]{25}/", "$1\n", $shout_message);
+			$search = array("\"", "'", "\\", '\"', "\'", "<", ">", "&nbsp;", "\n");
+			$replace = array("&quot;", "&#39;", "&#92;", "&quot;", "&#39;", "&lt;", "&gt;", " ", " ");
+			$shout_message = str_replace($search, $replace, replace_naughty(trim($shout_message)));
+			$shout_message = str_replace("\n", "<br />", $shout_message);
+			$result = dbquery("UPDATE ".TABLEPREFIX."fanfiction_shoutbox SET shout_message = '$shout_message' WHERE shout_id = '".$_GET['shout_id']."' LIMIT 1");
+			if($result) $output .= write_message(_ACTIONSUCCESSFUL);
+		}
+		$shoutquery = dbquery("SELECT shout_message FROM ".TABLEPREFIX."fanfiction_shoutbox WHERE shout_id = '".$_GET['shout_id']."' LIMIT 1");
+		$shout = dbassoc($shoutquery);
+		if($shout) {
+			$output .= "<div style='text-align: center;'>
+<form method=\"POST\"  enctype=\"multipart/form-data\" action=\"admin.php?action=blocks&admin=shoutbox&amp;shout_id=".$_GET['shout_id']."\">
+<div style='text=align: center; margin: 0 auto;'><textarea name='shout_message' id='shout_message' rows='4' class='mceNoEditor' cols='30'>".$shout['shout_message']."</textarea></div>
+<input type='submit' class='button' name='submit' id='submit' value='"._SUBMIT."'>
+</form></div>";
+		}
+		else {
+			$output .= write_error(_NORESULTS);
+		}
+	}
+	if(isset($_POST['submitopts'])) {
+		$blocks['shoutbox']['shoutdate'] = !empty($_POST['customshoutdate']) ? descript(strip_tags($_POST['customshoutdate'])) : descript(strip_tags($_POST['shoutdate']));
+		$blocks['shoutbox']['shoutlimit'] = isset($_POST['shoutlimit']) && isNumber($_POST['shoutlimit']) ? $_POST['shoutlimit'] : 10;
+		$blocks['shoutbox']['guestshouts'] = isset($_POST['guestshouts']) && $_POST['guestshouts'] == _YES ? 1 : 0;
+		save_blocks($blocks);
+	}
+	$defaults = array("m/d/y h:i a", "d/m/y G:i:s", "m-d-y h:i a", "d-m-y G:i:s", "m.d.y h:i a", "d.m.y G:i:s", "M j, Y h:i a", "M j, Y G:i:s", "d M, Y h:i a", "d M, Y G:i:s");
+	$output .= "<form name='shoutopts' method='POST' id='settingsform' action='admin.php?action=blocks&amp;admin=shoutbox'>\n
+<div><label for='shoutdate'>"._SHOUTDATE.":</label><select name='shoutdate' id='shoutdate'><option value=\"\">"._SELECTONE."</option>";
+		foreach($defaults as $d) {
+			$output .= "<option value='$d'".($blocks['shoutbox']['shoutdate'] == $d ? " selected" : "").">".date("$d")."</option>";
+		}
+		$output .= "</select> "._OR." <input type='text' name='customshoutdate' class='textbox' value='".(isset($blocks['shoutbox']['shoutdate']) && !in_array($blocks['shoutbox']['shoutdate'], $defaults) ? $blocks['shoutbox']['shoutdate'] : "")."'> <A HREF='#' class='pophelp'>[?]<span>"._HELP_SHOUTDATEFORMAT."</span></A></div>
+<div><label for='shoutlimit'>"._SHOUTLIMIT.":</label><input type='text' name='shoutlimit' size='1' value='".(isset($blocks['shoutbox']['shoutlimit']) ? $blocks['shoutbox']['shoutlimit'] : "")."'></div>
+<div class='fieldset'><span class='label'>"._GUESTSHOUTS.":</span>\n
+<input type='radio' name='guestshouts' id='guestshouts"._YES."' value='"._YES."'".(!empty($blocks['shoutbox']['guestshouts'])  ? " checked='checked'" : "")."> <label for='guestshouts"._YES."'>"._YES."</label>\n
+<input type='radio' name='guestshouts' id='guestshouts"._YES."' value='"._NO."'".(empty($blocks['shoutbox']['guestshouts'])  ? " checked='checked'" : "")."> <label for='guestshouts"._NO."'>"._NO."</label>\n</div>\n
+<input type='submit' class='button' name='submitopts' id='submit' value='"._SUBMIT."'></form>";
+$shouts = dbquery("SELECT shouts.*, "._PENNAMEFIELD." as penname FROM ".TABLEPREFIX."fanfiction_shoutbox as shouts LEFT JOIN "._AUTHORTABLE." ON "._UIDFIELD." = shouts.shout_name ORDER BY shout_datestamp DESC");
+$totalshouts = dbnumrows($shouts);
+$shouts = dbquery("SELECT shouts.*, "._PENNAMEFIELD." as penname FROM ".TABLEPREFIX."fanfiction_shoutbox as shouts LEFT JOIN "._AUTHORTABLE." ON "._UIDFIELD." = shouts.shout_name ORDER BY shout_datestamp DESC LIMIT $offset, $itemsperpage");
+if($totalshouts > 0) {
+	$output .= "<form name='deleteform' method='POST'action='admin.php?action=blocks&amp;admin=shoutbox'>\n
+<div style='text-align: center;'>"._DELETESHOUTS."<select name='del_range' class='textbox'>\n
+<option value='90'>90</option>\n
+<option value='60'>60</option>\n
+<option value='30'>30</option>\n
+<option value='20'>20</option>\n
+<option value='10'>10</option>\n
+</select>"._DAYS."<br />
+<input type='submit' name='deleteshouts' class='button' value='"._DELETE."'></div></form>";
+	$output .= "<div class='sectionheader'>"._SHOUTARCHIVE."</div><div style='width: 80%;margin: 0 auto;'>";
+	if(!empty($blocks['shoutbox']['shoutdate'])) $shoutdate = $blocks['shoutbox']['shoutdate'];
+	else $shoutdate = $dateformat." ".$timeformat;
+	while($shout = dbassoc($shouts)) {
+		if(isNumber($shout['shout_name']) && isset($shout['penname'])) $shoutname = "<a href='viewuser.php?uid=".$shout['shout_name']."'>".$shout['penname']."</a>";
+		else if(isset($shout['shout_name'])) $shoutname = $shout['shout_name'];
+		else $shout = _GUEST; // Just in case.
+		$output .= "
+<div class='tblborder'><span class='sbname'>$shoutname</span><br />\n
+<span class='sbshout'>".stripslashes($shout['shout_message'])."</span><br />\n
+<span class='sbdatetime'>".date("$shoutdate", $shout['shout_datestamp'])." [<a href='admin.php?action=blocks&amp;admin=shoutbox&amp;delete=".$shout['shout_id']."' class='sbadmin'>"._DELETE."</a>] [<a href='admin.php?action=blocks&amp;admin=shoutbox&amp;shout_id=".$shout['shout_id']."' class='sbadmin'>"._EDIT."</a>]</span></div>\n<br />";
+	}
+	$output .= "</div>";
+	if($totalshouts > $itemsperpage) $output .= build_pagelinks("admin.php?action=blocks&amp;admin=shoutbox&amp;", $totalshouts, $offset);
+}
+else $output .= write_message(_NOSHOUTS);
 
+?>

--- /dev/null
+++ b/blocks/shoutbox/archive.php
@@ -1,1 +1,61 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+
+include ("../../header.php");
+
+if(file_exists("$skindir/default.tpl")) $tpl = new TemplatePower( "$skindir/default.tpl" );
+else $tpl = new TemplatePower("../../default_tpls/default.tpl");
+//let TemplatePower do its thing, parsing etc.
+
+include("../../includes/pagesetup.php");
+
+if(file_exists("{$language}.php")) include_once("{$language}.php");
+else include_once("en.php");
+
+$shouts = dbquery("SELECT shouts.*, "._PENNAMEFIELD." as penname FROM ".TABLEPREFIX."fanfiction_shoutbox as shouts LEFT JOIN "._AUTHORTABLE." ON "._UIDFIELD." = shouts.shout_name ORDER BY shout_datestamp DESC");
+$totalshouts = dbnumrows($shouts);
+$shouts = dbquery("SELECT shouts.*, "._PENNAMEFIELD." as penname FROM ".TABLEPREFIX."fanfiction_shoutbox as shouts LEFT JOIN "._AUTHORTABLE." ON "._UIDFIELD." = shouts.shout_name ORDER BY shout_datestamp DESC LIMIT $offset, $itemsperpage");
+if(dbnumrows($shouts) > 0) {
+	if(!empty($blocks['shoutbox']['shoutdate'])) $shoutdate = $blocks['shoutbox']['shoutdate'];
+	else $shoutdate = $dateformat." ".$timeformat;
+	$output .= "<div class='sectionheader'>"._SHOUTARCHIVE."</div><div style='width: 80%;margin: 0 auto;'>";
+	while($shout = dbassoc($shouts)) {
+		if(isNumber($shout['shout_name']) && isset($shout['penname'])) $shoutname = "<a href='"._BASEDIR."viewuser.php?uid=".$shout['shout_name']."'>".$shout['penname']."</a>";
+		else if(isset($shout['shout_name'])) $shoutname = $shout['shout_name'];
+		else $shout = _GUEST; // Just in case.
+		$output .= "
+<div class='tblborder'><span class='sbname'>$shoutname</span><br />\n
+<span class='sbshout'>".stripslashes($shout['shout_message'])."</span><br />\n
+<span class='sbdatetime'>".date("$shoutdate", $shout['shout_datestamp'])." [<a href='../../admin.php?action=blocks&amp;admin=shoutbox&amp;delete=".$shout['shout_id']."' class='sbadmin'>"._DELETE."</a>] [<a href='../../admin.php?action=blocks&amp;admin=shoutbox&amp;shout_id=".$shout['shout_id']."' class='sbadmin'>"._EDIT."</a>]</span></div>\n<br />";
+	}
+	$output .= "</div>";
+	if($totalshouts > $itemsperpage) $output .= build_pagelinks("archive.php?", $totalshouts, $offset);
+}
+else $output .= write_message(_NOSHOUTS);
+$tpl->assign("output", "<div id='pagetitle'>"._SHOUTARCHIVE."</div>\n\n$output");
+$tpl->printToScreen();
+
+?>

--- /dev/null
+++ b/blocks/shoutbox/en.php
@@ -1,1 +1,42 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+define("_SHOUT", "Shout");
+define("_NOSHOUTS", "No messages have been posted.");
+if(!defined("_GUEST")) define("_GUEST", "Guest");
+define("_EDITSHOUT", "Edit Shout");
+define("_SHOUTARCHIVE", "Shout Archive");
+define("_DELETESHOUTS", "Delete shouts older than ");
+define("_DAYS", " days.");
+define("_SHOUTDATE", "Shout Date Format");
+define("_SHOUTLIMIT", "Shout Limit");
+define("_GUESTSHOUTS", "Allow guests to shout");
+define("_SHOUTEND", "End of shout.  Shouts are limited to 200 characters!");
+
+define("_HELP_SHOUTDATEFORMAT", "The format for date (and optionally time) to be displayed in the shout box.  For custom fomats, use PHP's date format.");
+?>

--- /dev/null
+++ b/blocks/shoutbox/index.php

--- /dev/null
+++ b/blocks/shoutbox/init.php
@@ -1,1 +1,37 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_blocks(`block_name`, `block_title`, `block_status`, `block_file`, `block_variables`) VALUES('shoutbox', 'Shoutbox', '0', 'shoutbox/shoutbox.php', 'a:3:{s:9:\"shoutdate\";s:11:\"m/d/y h:i a\";s:10:\"shoutlimit\";s:2:\"10\";s:11:\"guestshouts\";i:1;}');");
+dbquery("CREATE TABLE IF NOT EXISTS `".TABLEPREFIX."fanfiction_shoutbox` (
+  `shout_id` smallint(5) unsigned NOT NULL auto_increment,
+  `shout_name` varchar(50) NOT NULL default '',
+  `shout_message` varchar(200) NOT NULL default '',
+  `shout_datestamp` int(10) unsigned NOT NULL default '0',
+  PRIMARY KEY  (`shout_id`)
+) ENGINE=MyISAM;");
+?>

--- /dev/null
+++ b/blocks/shoutbox/shoutbox.php
@@ -1,1 +1,85 @@
+<?php
+if(!defined("_CHARSET")) exit( );
 
+if(file_exists(_BASEDIR."blocks/shoutbox/{$language}.php")) include_once(_BASEDIR."blocks/shoutbox/{$language}.php");
+else include_once(_BASEDIR."blocks/shoutbox/en.php");
+$content = "";
+if(isset($_POST['shouthidden']) && (isMEMBER || !empty($blocks['shoutbox']['guestshouts']))) {
+	http_response_code(202);
+	if(isMEMBER) $shout_name = USERUID;
+	else {
+		$shout_name = trim(descript($_POST['shoutname']));
+		if(isNumber($shout_name)) $shout_name = _GUEST;
+		if($captcha && !captcha_confirm()) $shout_name = false;
+	}
+	$shout_message = trim($_POST['shout_message']);
+	$shout_message = preg_replace("/^(.{200}).*$/", "$1", $shout_message);
+	$shout_message = preg_replace("/[^\s]{25}/", "$1\n", $shout_message);
+	$search = array("\"", "'", "\\", '\"', "\'", "<", ">", "&nbsp;", "\n");
+	$replace = array("&quot;", "&#39;", "&#92;", "&quot;", "&#39;", "&lt;", "&gt;", " ", " ");
+	$shout_message = str_replace($search, $replace, replace_naughty(trim($shout_message)));
+	$shout_message = str_replace("\n", "<br />", $shout_message);
+	if(!empty($shout_name) && !empty($shout_message)) {
+		dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_shoutbox(`shout_name`, `shout_message`, `shout_datestamp`) VALUES('$shout_name', '$shout_message', '".time()."')");
+	}
+
+}
+if(isMEMBER || !empty($blocks['shoutbox']['guestshouts'])) {
+	$content = "<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js\"></script>
+	<script language=\"javascript\" type=\"text/javascript\">
+	$(document).ready(function() {
+		$(function () {
+		  $('#shout').click( function () {
+			$.ajax({
+			  type: 'post',
+			  url: $('#shoutbox').attr('action'),
+			  data: $('#shoutbox').serialize(),
+			  success: function () {
+				location.reload();
+				$('#shout_message').val(\"\");
+			  }
+			});
+		  });
+		});
+	});
+var shoutend = '"._SHOUTEND."';
+function ismaxlength(obj){
+var mlength = 200
+shout_messagelength = document.shoutbox.shout_message.value.length;
+document.shoutbox.counter.value = 200 - shout_messagelength;
+if (document.shoutbox.shout_message.value.length >= mlength) {
+   alert(shoutend);
+   document.shoutbox.shout_message.value = document.shoutbox.shout_message.value.substr(0, mlength)
+}
+}
+
+</script><div id='shoutbox_container' style='width: 100%;'>\n<form name='shoutbox' id='shoutbox' method='POST' action='".$_SERVER['SCRIPT_NAME'].($_SERVER['QUERY_STRING'] ? "?".$_SERVER['QUERY_STRING']  : "")."'>\n";
+	if(!isMEMBER) $content .= "<div><label for='shoutname'>"._NAME.":</label> <input type='text' name='shoutname' value='' style='display: block; width: 90%; margin: 0 auto;' maxlength='30'></div>";
+	else $content .= "<div><span class='label'>"._NAME.":</span> ".USERPENNAME."</div>";
+	if(!isMEMBER && $captcha) $content .= "<div><label for='userdigit'>"._CAPTCHANOTE."</label><input MAXLENGTH=5 SIZE=5 name=\"userdigit\" type=\"text\" value=\"\"><div style='text-align: center;'><img width=120 height=40 src=\""._BASEDIR."includes/button.php\" style=\"border: 1px solid #111;\"></div></div>";
+	$content .= "<div><label for='shout_MESSAGE'>"._SHOUT.":</label> <textarea name='shout_message' class='mceNoEditor' id='shout_message' rows='4' cols='15' maxlength='200' style='display: block; width: 90%; margin: 0 auto;' onkeyDown='return ismaxlength(this)'></textarea></div> <input type='button' name='shout' id='shout' value='"._SHOUT."'> <input size='1' class='small' type='text' id='counter' value='200'> <input type='hidden' name='shouthidden' id='shouthidden' value='"._SHOUT."'>
+	</form></div>";
+}
+if(isset($blocks['shoutbox']['shoutlimit'])) $shoutlimit = $blocks['shoutbox']['shoutlimit'];
+else $shoutlimit = 10;
+if(!empty($blocks['shoutbox']['shoutdate'])) $shoutdate = $blocks['shoutbox']['shoutdate'];
+else $shoutdate = $dateformat." ".$timeformat;
+$shouts = dbquery("SELECT shouts.*, "._PENNAMEFIELD." as penname FROM ".TABLEPREFIX."fanfiction_shoutbox as shouts LEFT JOIN "._AUTHORTABLE." ON "._UIDFIELD." = shouts.shout_name ORDER BY shout_datestamp DESC");
+$totalshouts = dbnumrows($shouts);
+$shouts = dbquery("SELECT shouts.*, "._PENNAMEFIELD." as penname FROM ".TABLEPREFIX."fanfiction_shoutbox as shouts LEFT JOIN "._AUTHORTABLE." ON "._UIDFIELD." = shouts.shout_name ORDER BY shout_datestamp DESC LIMIT 0, ".$shoutlimit);
+$content .= "<div id='shoutlist' style='height: 200px; overflow: auto;'>";
+if(dbnumrows($shouts) != 0) {
+	while($shout = dbassoc($shouts)) {
+		if(isNumber($shout['shout_name']) && isset($shout['penname'])) $shoutname = "<a href='"._BASEDIR."viewuser.php?uid=".$shout['shout_name']."'>".$shout['penname']."</a>";
+		else if(isset($shout['shout_name'])) $shoutname = $shout['shout_name'];
+		else $shout = _GUEST; // Just in case.
+		$content .= "<span class='sbname'>$shoutname</span><br /><span class='sbdatetime'>".date("$shoutdate", $shout['shout_datestamp']);
+		if(isADMIN) $content .= " [<a href='"._BASEDIR."admin.php?action=blocks&amp;admin=shoutbox&amp;shout_id=".$shout['shout_id']."' class='sbadmin'>"._EDIT."</a>]";
+		$content .= "</span><br />\n<span class='sbshout'>".stripslashes($shout['shout_message'])."</span><br />";
+	}
+}
+else $content .= write_message(_NOSHOUTS);
+$content .= "</div>";
+if($totalshouts > $shoutlimit) $content .= write_message("<a href='"._BASEDIR."blocks/shoutbox/archive.php'>"._SHOUTARCHIVE."</a>");
+?>
+

--- /dev/null
+++ b/blocks/skinchange/index.php

--- /dev/null
+++ b/blocks/skinchange/init.php
@@ -1,1 +1,31 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_blocks(`block_name`, `block_title`, `block_status`, `block_file`, `block_variables`) VALUES('skinchange', 'Skin Selection', '0', 'skinchange/skinchange.php', '');");
+$blocks["skinchange"] = array("title" => "", "status" => "0", "file" => "skinchange/skinchange.php");
+?>

--- /dev/null
+++ b/blocks/skinchange/skinchange.php
@@ -1,1 +1,47 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+$querystring = "";
+foreach($_GET as $key=>$value) {
+	if($key != "skin") $querystring .= "&amp;$key=$value";
+}
+if(!isset($hiddenskins)) $hiddenskins = array( );
+if(is_string($hiddenskins)) $hiddenskins = explode(",", $hiddenskins);
+
+$content = "<select name=\"skin\" onChange=\"document.location = '".$_SERVER['PHP_SELF']."?skin=' + this.options[this.selectedIndex].value + '$querystring';\">";
+$directory = opendir(_BASEDIR."skins");
+while($filename = readdir($directory)) {
+	if($filename== "." || $filename== ".." || !is_dir(_BASEDIR."skins/".$filename) || (in_array($filename, $hiddenskins) && !isADMIN)) continue;
+	$skinlist[strtolower($filename)] = "<option value=\"$filename\"".($siteskin == $filename ? " selected" : "").">$filename</option>";
+}
+ksort($skinlist);
+foreach($skinlist as $s) { $content .= $s; }
+unset($skinlist, $s);
+closedir($directory);
+$content .= "</select>";
+?>

file:b/browse.php (new)
--- /dev/null
+++ b/browse.php
@@ -1,1 +1,348 @@
-
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ---------------------------------------------------------------------
+
+$current = "browse";
+$displayform = 1;
+
+include ("header.php");
+
+if(file_exists("$skindir/browse.tpl")) $tpl = new TemplatePower( "$skindir/browse.tpl" );
+else $tpl = new TemplatePower("default_tpls/browse.tpl");
+if(file_exists("$skindir/listings.tpl")) $tpl->assignInclude("listings", "./$skindir/listings.tpl");
+else $tpl->assignInclude( "listings", "./default_tpls/listings.tpl" );
+$tpl->assignInclude( "header", "./$skindir/header.tpl" );
+$tpl->assignInclude( "footer", "./$skindir/footer.tpl" );
+
+include("includes/pagesetup.php");
+if(isset($_GET['type'])) $type = descript($_GET['type']);
+else $type = false;
+
+if($type) {
+	$query = array();
+	$countquery = array();
+	$scountquery = array();
+	$searchtype = (isset($_REQUEST['searchtype']) ? $_REQUEST['searchtype'] : "simple");
+	$searchterm =  (isset($_REQUEST['searchterm']) ? descript($_REQUEST['searchterm']) : false);
+	$disablesorts = array( );
+	if($searchterm) {
+		if($searchtype == "title") {
+			$query[] = "stories.title LIKE '%$searchterm%'";
+			$countquery[] = "stories.title LIKE '%$searchterm%'";
+			$scountquery[] = "series.title LIKE '%$searchterm%'";
+		}
+		if($searchtype == "summary") {
+			$query[] = "stories.summary LIKE '%$searchterm%'";
+			$countquery[] = "stories.summary LIKE '%$searchterm%'";
+			$scountquery[] = "series.summary LIKE '%$searchterm%'";
+		}
+		if($searchtype == "penname") {
+			$authorquery = dbquery(_MEMBERLIST." WHERE "._PENNAMEFIELD." LIKE '%$searchterm%' GROUP BY "._UIDFIELD);
+			$authorlist = array();
+			while($auth = dbassoc($authorquery)) {
+				$authorlist[] = $auth['uid'];
+			}
+			if(count($authorlist) > 0) {
+				$query[] = "FIND_IN_SET(stories.uid, '".implode(",",$authorlist)."') > 0";
+				$countquery[] = "FIND_IN_SET(stories.uid, '".implode(",",$authorlist)."') > 0";
+				$scountquery[] = "FIND_IN_SET(series.uid, '".implode(",",$authorlist)."') > 0";
+			}
+		}
+		if($searchtype == "advanced" || !$searchtype) {
+			$query[] = "(stories.summary LIKE '%$searchterm%' OR stories.title LIKE '%$searchterm%') ";
+			$countquery[] = "(stories.summary LIKE '%$searchterm%' OR stories.title LIKE '%$searchterm%') ";
+			$scountquery[] = "(summary LIKE '%$searchterm%' OR title LIKE '%$searchterm%') ";
+		}
+	}
+	if(isset($_REQUEST['authors'])) {
+		$query[] = "FIND_IN_SET(stories.uid, '".implode(",",$searchVars['authors'])."') > 0";
+		$countquery[] = "FIND_IN_SET(stories.uid, '".implode(",",$searchVars['authors'])."') > 0";
+		$scountquery[] = "FIND_IN_SET(series.uid, '".implode(",",$searchVars['authors'])."') > 0";
+	}
+	if(isset($_REQUEST['catid'])) {
+		$catid = is_array($_REQUEST['catid']) ? $_REQUEST['catid'] : explode(",", $_REQUEST['catid']);
+		$catid = array_filter($catid, "isNumber");
+	}
+	if(!isset($catid)) $catid = array();
+	if($type == "categories" && isset($_GET['id']) && isNumber($_GET['id'])) {
+		$catid[] =  $_GET['id'];
+	}
+	$categories = array( );
+	// Get the recursive list.
+	if($type == "categories") $categories = $catid;
+	else {
+		foreach($catid as $cat) {
+			if($cat == "false" || empty($cat)) continue;
+			$categories = array_merge($categories, recurseCategories($cat));
+		}
+	}
+	// Now format the SQL
+	foreach($categories as $cat) {
+		$catstories[] = "FIND_IN_SET($cat, stories.catid) > 0 ";
+		$catseries[] = "FIND_IN_SET($cat, series.catid) > 0 ";
+	}
+	// Now implode the SQL list
+	if(!empty($catstories)) {
+		$query[] = "(".implode(" OR ", $catstories).")";
+		$countquery[] = "(".implode(" OR ", $catstories).")";
+		$scountquery[] = "(".implode(" OR ", $catseries).")";
+	}
+	if(empty($charid)) $charid = array( );
+	if(isset($_REQUEST['charid'])) {
+		$charid = is_array($_REQUEST['charid']) ? $_REQUEST['charid'] : explode(",", $_REQUEST['charid']);
+		$charid = array_filter($charid, "isNumber");
+	}
+	if(!empty($_REQUEST['charlist1']) && !in_array($_REQUEST['charlist1'], $charid)) $charid[] = $_REQUEST['charlist1'];
+	if(!empty($_REQUEST['charlist2']) && !in_array($_REQUEST['charlist2'], $charid)) $charid[] = $_REQUEST['charlist2'];
+	if($charid) {
+		foreach($charid as $c) {
+			if(!empty($c)) {
+				$charstories[] = "FIND_IN_SET($c, stories.charid) > 0 ";
+				$charseries[] = "FIND_IN_SET($c, series.characters) > 0 ";
+			}
+		}
+		if(count($charstories) > 0) {
+			$query[] = "(".implode(" AND ", $charstories).")";
+			$countquery[] = "(".implode(" AND ", $charstories).")";
+		}
+		if(count($charseries) > 0) $scountquery[] = "(".implode(" AND ", $charseries).")";
+	}
+	$rid = array( ); $rating = array( );
+	if(!empty($_REQUEST['rid'])) $rid = is_array($_REQUEST['rid']) ? implode(",", $_REQUEST['rid']) : array($_REQUEST['rid']);
+	if(!empty($_REQUEST['rating'])) $rating = is_array($_REQUEST['rating']) ? implode(",", $_REQUEST['rating']) : array($_REQUEST['rating']);
+	$rid = array_merge($rid, $rating);
+	if(!empty($rid)) {
+		$query[] = "FIND_IN_SET(stories.rid, '".(implode(",", $rid))."') > 0";
+		$countquery[]  = "FIND_IN_SET(stories.rid, '".(implode(",", $rid))."') > 0";
+	}
+	$complete = "all";
+	if(isset($_REQUEST['complete'])) {
+		if($_REQUEST['complete'] == 1) {
+			$query[] = "stories.completed = '1'";
+			$countquery[] = "stories.completed = '1'";
+			$complete = 1;
+		} 
+		else if(empty($_REQUEST['complete'])) {
+			$query[] = "stories.completed = '0'";
+			$countquery[] = "stories.completed = '0'";
+			$complete = 0;
+		} 
+	}
+	if(isset($_REQUEST['classin'])) $classin = is_array($_REQUEST['classin']) ? $_REQUEST['classin'] : array($_REQUEST['classin']);
+	else $classin = array( );
+	if(isset($_REQUEST['classex'])) $classex = is_array($_REQUEST['classex']) ? $_REQUEST['classex'] : array($_REQUEST['classex']);
+	else $classex = array( );
+	$opts = array();
+	$exopts = array( );
+	foreach($classtypelist as $id => $vars) {
+		if(!empty($_POST[$vars['name']])) $opts[] = $_POST[$vars['name']];
+		else if(isset($_GET["class_".$id])) {
+			$opts = !empty($opts) ? array_merge($opts, explode(",", $_GET["class_".$id])) : array($_GET["class_".$id]);
+		}
+		else if(!empty($_REQUEST[$vars["name"]])) $opts = is_array($_REQUEST[$vars["name"]]) ? $_REQUEST[$vars["name"]] : array($_REQUEST[$vars["name"]]);
+		if(!empty($opts)) $classin = array_merge($classin, $opts);
+		if(isset($_POST["exclass_".$id])) $exopts = $_POST["exclass_".$id];
+		else if(isset($_GET["exclass_".$id])) {
+			$exopts = !empty($exopts) ? array_merge($exopts, explode(",", $_GET["exclass_".$id])) : array($_GET["exclass_".$id]);
+		}
+		if(!empty($exopts)) $classex = array_merge($classex, $exopts);
+		unset($opts, $exopts);
+	}
+	$classin = array_filter($classin, "isNumber");
+	$classex = array_filter($classex, "isNumber");
+	if($classin) {
+		foreach($classin as $class) {
+			if(empty($class)) continue;
+			$query[] = "FIND_IN_SET($class, stories.classes) > 0";
+			$countquery[] = "FIND_IN_SET($class, stories.classes) > 0";
+			$scountquery[] = "FIND_IN_SET($class, series.classes) > 0";
+		}
+	}
+	if($classex) {
+		foreach($classex as $class) {
+			$query[] = "FIND_IN_SET($class, stories.classes) = 0";
+			$countquery[] = "FIND_IN_SET($class, stories.classes) = 0";
+			$scountquery[] = "FIND_IN_SET($class, series.classes) = 0";
+		}
+	}
+	// Begin story length
+	unset($wordcount);
+	$wordlow = isset($_REQUEST['wordlow']) ? $_REQUEST['wordlow'] : "-500";
+	$wordhigh = isset($_REQUEST['wordhigh']) ? $_REQUEST['wordhigh'] : "1000000";
+	if($wordlow != "-500") $wordcount = "stories.wordcount > ".$wordlow;
+	if($wordhigh != "1000000") 
+	{
+		if($wordcount) $wordcount .= " AND stories.wordcount < ".$wordhigh;
+		else $wordcount = "stories.wordcount < ".$wordhigh;
+	}
+	if($wordhigh < $wordlow) $wordcount = "stories.wordcount < ".$wordlow;
+	if($wordlow != "-500" && $wordhigh != "1000000" && isset($_POST['submit'])) {
+		$query[] = "($wordcount)";
+		$countquery[] = "($wordcount)";
+	}
+	// End wordcount
+	$codeblocks = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'browseterms'");
+	while($code = dbassoc($codeblocks)) {
+		eval($code['code_text']);
+	}
+	$storyquery = count($query) > 0 ? " AND ".implode(" AND ", $query) : "";
+	$countquery = count($countquery) > 0 ? " AND ".implode(" AND ", $countquery) : "";
+	$seriesquery = count($scountquery) > 0 ? implode(" AND ", $scountquery) : false;
+	$termArray = array_merge($_GET, $_POST);
+	$termsList = array();
+	foreach($termArray as $term => $value) {
+		if($term == "submit" || $term == "go" || $term == "offset" || $term == "type" || ($term != "complete" && empty($value))) continue;
+		$termsList[$term] = "$term=".(is_array($value) ? implode(",", $value) : $value);
+	}
+	$terms = "type=$type".(count($termsList) ? "&amp;" : "").implode("&amp;", $termsList);
+// End query strings
+	$panelquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_name = '$type' AND panel_type = 'B' LIMIT 1");
+	if(dbnumrows($panelquery)) {
+		$numrows = 0;
+		$panel = dbassoc($panelquery);
+		if($panel['panel_url'] && file_exists(_BASEDIR.$panel['panel_url'])) include($panel['panel_url']);
+		else if(file_exists("browse/{$type}.php")) include("browse/{$type}.php");
+		else $output .= write_error(_ERROR);
+	}
+	else $output .= write_error(_ERROR);
+	$terms = implode("&amp;", $termsList);
+// Other results
+	$otherresults = array( );
+	$codeblocks = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'otherresults'");
+	while($code = dbassoc($codeblocks)) {
+		eval($code['code_text']);
+	}
+	if($type != "series" && !empty($seriesquery)) {
+		$seriesresults = dbquery(_SERIESCOUNT." WHERE ".$seriesquery);
+		list($scount) = dbrow($seriesresults);
+		if($scount > 0) $otherresults[] = "<a href='browse.php?type=series&amp;$terms'>$scount "._SERIES."</a>";
+	}
+	if(count($otherresults) > 0 && $type != "titles") $tpl->assign("otherresults", "<div id='otherresults'><span class='label'>"._OTHERRESULTS.":</span> ".implode(", ", $otherresults)."</div>");
+// build our sort menus. if there aren't any stories don't bother with these since they won't be used
+	if(!empty($numrows) || isset($_POST['go'])) {
+		$tpl->newBlock("sortform");
+		$tpl->assign("sortbegin", "<form style=\"margin:0\" method=\"POST\" id=\"form\" enctype=\"multipart/form-data\" action=\"browse.php?type=$type&amp;$terms\">");
+		if($catlist && !in_array("categories", $disablesorts)) {
+			if(count($catid) > 0) $thiscat = $catid[0];
+			else $thiscat = -1;
+			$catmenu = "<select class=\"textbox\" name=\"catid\" id=\"catid\" onChange=\"browseCategories('catid')\"><option value=\"-1\">".($thiscat > 0 ? _BACK2CATS : _CATEGORIES)."</option>\n";
+			foreach($catlist as $cat => $info) {
+				if($info['pid'] == $thiscat || $cat == $thiscat) $catmenu .= "<option value=\"$cat\"".($thiscat == $cat ? " selected" : "").">".$info['name']."</option>\n";
+			}
+			$catmenu .= "</select>\n";
+			$tpl->assign("categorymenu", $catmenu);
+		}
+		if(count($charlist) > 0 && !in_array("characters", $disablesorts)) {
+			$charactermenu1 = "<select class=\"textbox\" name=\"charlist1\" id=\"charlist1\">\n";
+			$charactermenu1 .= "<option value=\"0\">"._CHARACTERS."</option>\n";
+			$charactermenu2 = "<select class=\"textbox\" name=\"charlist2\" id=\"charlist2\">\n";
+			$charactermenu2 .= "<option value=\"0\">"._CHARACTERS."</option>\n";
+			$categories[] = -1;
+			$categories = array_merge($categories, $catid);
+			foreach($charlist as $char => $info) {
+				if(is_array($categories) && in_array($info['catid'], $categories)) {
+					$charactermenu1 .= "<option value=\"$char\"";
+					if(isset($charid[0]) && $charid[0] == $char)
+						$charactermenu1 .= " selected";
+					$charactermenu1 .= ">".$info['name']."</option>\n";
+					$charactermenu2 .= "<option value=\"$char\"";
+					if(isset($charid[1]) && $charid[1] == $char)
+						$charactermenu2 .= " selected";
+					$charactermenu2 .= ">".$info['name']."</option>\n";
+				}
+			}
+			$charactermenu1 .= "</select>";
+			$charactermenu2 .= "</select>";
+			if($type != "characters") $tpl->assign("charactermenu1"   , $charactermenu1 );
+			$tpl->assign("charactermenu2"   , $charactermenu2 );
+		}
+		// To avoid throwing warnings we need to define $classopts and tell it how many elements it should have.
+		if(!in_array("classes", $disablesorts)) {
+			$classopts = array();
+			foreach($classlist as $id => $vars) {
+				if(empty($classopts[$vars['type']])) $classopts[$vars['type']] = "";
+				$classopts[$vars['type']] = $classopts[$vars['type']]."<option value=\"$id\"".(isset($classin) && is_array($classin) && in_array($id, $classin) ? " selected" : "").">".$vars['name']."</option>\n";
+			}
+			$allclasses = "";
+			foreach($classopts as $type => $opts) {
+				if(empty($type) || in_array($classtypelist[$type]['name'], $disablesorts)) continue; // Because of the way we defined $classopts we need to skip the empty first element.
+				$opts = "<option value=\"\">".$classtypelist[$type]['title']."</option>$opts";
+				$tpl->assign($classtypelist[$type]['name']."menu", "<select name=\"".$classtypelist["$type"]['name']."\">\n$opts</select>\n");
+				$allclasses .= "<select class=\"textbox\" name=\"".$classtypelist["$type"]['name']."\">\n$opts</select>\n ";
+			}
+			$tpl->assign("classmenu", $allclasses);
+		}
+		if(!in_array("ratings", $disablesorts)) {
+			$ratingmenu = "<select class=\"textbox\" name=\"rating\">\n";
+			$ratingmenu .= "<option value=\"0\">"._RATINGS."</option>\n";
+			if(!isset($ratingslist)) $ratingslist = array( );
+			foreach($ratingslist as $r => $rinfo) {
+				$ratingmenu .= "<option value=\"".$r."\"";
+				if(isset($rid) && in_array($r, $rid))
+					$ratingmenu .= " selected";
+				$ratingmenu .= ">".$rinfo['name']."</option>\n";
+			}
+			$ratingmenu .= "</select>\n";
+			$tpl->assign("ratingmenu"   , $ratingmenu );
+		}
+		if(!in_array("sorts", $disablesorts)) $tpl->assign("sortmenu", "<select class=\"textbox\" name=\"sort\">\n<option value=''>"._SORT."</option><option value=\"alpha\"".(!$defaultsort ? " selected" : "").">"._ALPHA."</option>\n<option value=\"update\"".($defaultsort == 1 ? " selected" : "").">"._MOSTRECENT."</option>\n</select>\n");
+		if(!in_array("complete", $disablesorts)) $tpl->assign("completemenu", "<select class=\"textbox\" name=\"complete\">\n<option value=\"all\"".($complete == "all" ? " selected" : "").">"._ALLSTORIES."</option>\n<option value=\"1\"".($complete == 1 ? " selected" : "").">"._COMPLETEONLY."</option>\n<option value=\"0\"".($complete && $complete != "all" && $complete != 1 ? " selected" : "").">"._WIP."</option>\n</select>\n");
+		$codeblocks = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'browsesorts'");
+		while($code = dbassoc($codeblocks)) {
+			eval($code['code_text']);
+		}
+		$tpl->assign("sortend"   , "<INPUT type=\"submit\" class=\"button\" name=\"go\" value=\""._GO."\"></form>");
+		$tpl->gotoBlock("_ROOT");
+	}
+}
+else  {
+	$output = "<div id='pagetitle'>"._BROWSE."</div>";
+	$panelquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_hidden != '1' AND panel_level ".(isMEMBER ? " < 2" : "= '0'")." AND panel_type = 'B' ORDER BY panel_type DESC, panel_order ASC, panel_title ASC");
+	while($panel = dbassoc($panelquery)) {
+		$browsetypes[$panel['panel_title']] =  "<a href=\"browse.php?type=".$panel['panel_name']."\">".$panel['panel_title']."</a><br />\n";
+	}
+	
+	foreach($classtypelist as $type => $info) {
+		$browsetypes[$info['title']] = "<a href='browse.php?type=class&amp;type_id=$type'>".$info['title']."</a><br />\n";
+	}
+	ksort($browsetypes);
+	$total = count($browsetypes);
+	$count = 0;
+	$column = 1;
+	$list = floor($total / $displaycolumns);
+	if($total % $displaycolumns != 0) $list++;
+	$output .= "<div id=\"columncontainer\"><div id=\"browseblock\">".($displaycolumns ? "<div class=\"column\">" : "");
+	foreach($browsetypes as $link) {
+		$count++;
+		$output .= $link;
+		if( $count >= $list && $column != $displaycolumns) {
+			$output .= "</div><div class=\"column\">";
+			if($total % $displaycolumns == $column) $list--;
+			$column++;
+			$count = 0;
+		}
+	}
+	$output .= "</div>".($displaycolumns ? "</div>" : "")."<div class='cleaner'>&nbsp;</div></div>";
+}
+$tpl->assign("output", $output);
+$tpl->printToScreen( );
+?>
+

--- /dev/null
+++ b/browse/authors.php
@@ -1,1 +1,76 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+if(!defined("_CHARSET")) exit( );
 
+$current = "authors";
+
+$uid = isset($_GET['uid']) && isNumber($_GET['uid']) ? $_GET['uid'] : 0;
+
+if($uid > 0) {
+	$query = dbquery("SELECT "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '$uid' LIMIT 1");
+	list($penname) = dbrow($query);
+	$output = "<div id='pagetitle'>".stripslashes($penname)."</div>\n";
+	$squery = "SELECT stories.*, "._PENNAMEFIELD." as penname, stories.date as date, stories.updated as updated FROM ("._AUTHORTABLE.", ".TABLEPREFIX."fanfiction_stories as stories) LEFT JOIN ".TABLEPREFIX."fanfiction_coauthors as coauth ON coauth.sid = stories.sid WHERE "._UIDFIELD." = stories.uid AND stories.validated > 0 $squery AND (stories.uid = '$uid' OR coauth.uid = '$uid') "._ORDERBY;
+	$cquery = "SELECT count(stories.sid) FROM ".TABLEPREFIX."fanfiction_stories as stories LEFT JOIN ".TABLEPREFIX."fanfiction_coauthors as coauth ON stories.sid = coauth.sid WHERE validated > 0 $countquery AND (stories.uid = '$uid' OR coauth.uid = '$uid')";
+	$numrows = search($squery, $cquery, "browse.php?");
+}
+else {
+	$output .= "<div id=\"pagetitle\">"._AUTHORS.($let ? " - $let" : "")."</div>".build_alphalinks("browse.php?$terms&amp;", $let);
+
+	if($let == _OTHER) $query = " "._PENNAMEFIELD." REGEXP '^[^a-z]'";
+	else if($let) $query = " "._PENNAMEFIELD." LIKE '$let%'";
+	else $query = "";
+
+	$authorquery = "SELECT "._PENNAMEFIELD." as penname, "._UIDFIELD." as uid, ap.stories FROM "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs AS ap ON "._UIDFIELD." = ap.uid WHERE ap.stories > 0 ".($query ? " AND $query" : "");
+	$countquery = "SELECT count(ap.uid) FROM ".TABLEPREFIX."fanfiction_authorprefs AS ap LEFT JOIN "._AUTHORTABLE." ON "._UIDFIELD." = ap.uid ".($query ? " AND $query" : "");
+	$uid = 0;
+	$count = dbquery($countquery);
+	list($numrows)= dbrow($count);
+	$limit = $itemsperpage *  $displaycolumns;
+	$total = ($numrows > $limit ? $limit : $numrows);
+	$list = floor($total /  $displaycolumns);
+	if($total % $displaycolumns != 0) $list++;
+	$colwidth = (100/ $displaycolumns) -1;
+	$count = 0;
+	$column = 1;
+	$result2 = dbquery($authorquery." ORDER BY "._PENNAMEFIELD." LIMIT $offset,$limit");
+	$output .= "<div id=\"columncontainer\"><div id=\"browseblock\">".($displaycolumns ? "<div class=\"column\">" : "");
+	while($auth = dbassoc($result2)) {
+		$count++;
+		 $output .= "<a href=\"browse.php?type=authors&amp;uid=".$auth['uid']."\">".stripslashes($auth['penname'])."</a> [".$auth['stories']."]<br />";
+		if( $count >= $list && $column != $displaycolumns) {
+			$output .= "</div><div class=\"column\">";
+			if($total % $displaycolumns == $column) $list--;
+			$column++;
+			$count = 0;
+		}
+	}
+	$output .= "</div>".($displaycolumns ? "</div>" : "")."<div class='cleaner'>&nbsp;</div></div>";
+	if ($numrows > $limit) {
+		$output .= build_pagelinks("browse.php?type=authors".($let ? "&amp;let=$let" : "")."&amp;", $numrows, $offset, $displaycolumns);
+	}
+	else if(!$numrows) $output .= write_message(_NORESULTS);
+	$numrows = 0;
+}	
+	$seriesquery .= (!empty($seriesquery) ? " AND " : "")."uid = '$uid'";
+?>

--- /dev/null
+++ b/browse/categories.php
@@ -1,1 +1,90 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+if(!defined("_CHARSET")) exit( );
 
+
+$disablesorts = array("categories");
+
+// Get variables
+	$catid = isset($_GET['catid']) && isNumber($_GET['catid']) ? $_GET['catid'] : -1;
+
+// End variables
+	if($catid == -1) $output .= "<div id=\"pagetitle\">"._CATEGORIES."</div>";
+	else $output .= "<div id=\"pagetitle\">".catlist($catid)."</div>";
+	$subs = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_categories WHERE parentcatid = '$catid' ORDER BY displayorder ASC");
+	$total = dbnumrows($subs);
+	$list = floor($total / $displaycolumns);
+	if($total % $displaycolumns != 0) $list++;
+	$colwidth = (100/$displaycolumns) -1;
+	$count = 0;
+	$column = 1;
+	$content = "";
+	if($total) {
+		$collist = array();
+		$colcount = floor(($total / $displaycolumns) + ($total % $displaycolumns ? 1 : 0));
+		if(!$colcount) $colcount = 1;
+		$mod = $total % $displaycolumns;
+		$col = 0;
+		$count = 0;
+		while($cats = dbassoc($subs)) {
+			unset($catinfo);
+			$count++;
+			if(file_exists("$skindir/categories.tpl")) $cat = new TemplatePower( "$skindir/categories.tpl" );
+			else $cat = new TemplatePower("default_tpls/categories.tpl");
+			$cat->prepare( );
+			$cat->newBlock("categoryblock");
+			$cat->assign("image", ($cats['image'] && file_exists("$skindir/images/".$cats['image']) ? "<img src=\"$skindir/images/".$cats['image']."\" alt=\"".$cats['category']."\" title=\"".$cats['category']."\">" : ""));
+			$cat->assign("link", "<a href=\"browse.php?type=categories&amp;catid=".$cats['catid']."\">".$cats['category']."</a>");
+			$cat->assign("count", "[".$cats['numitems']."]");
+			$cat->assign("description", stripslashes($cats['description']));
+			if($displaycolumns == 1) $content .= "<div>".$cat->getOutputContent( )."</div>";
+			else $collist[$col][] = "<div>".$cat->getOutputContent( )."</div>";
+			if(($mod && $col < $mod && $count == $colcount) || ($mod && $col >= $mod && $count >= ($colcount - 1)) || (!$mod && $count == $colcount)) {
+				$col++;
+				$count = 0;
+			}
+		}
+		if($displaycolumns > 1) {
+			$output .= "<div id=\"columncontainer\"><div><div id=\"browseblock\">";
+			$col = 0;
+			for($a = 0; $a < $colcount; $a++) {
+				$output .= "<div class=\"row\">";
+				foreach($collist as $c) {
+					if(isset($c[$a])) $output .= "<div class=\"column\">".$c[$a]."</div>";
+				}
+				$output .= "<div class=\"cleaner\">&nbsp;</div></div>";
+			}
+			$output .= "</div><div>&nbsp;</div></div></div>";
+		}
+		else {
+			$output .= "<div id=\"columncontainer\">";
+			$output .= $content;
+			$output .= "</div>";
+		}
+	}
+	if($catid > 0) {
+		$storyquery .= _ORDERBY;
+		$numrows = search(_STORYQUERY.$storyquery, _STORYCOUNT.$countquery, "browse.php?");
+	}
+	$catid = array($catid);
+?>

--- /dev/null
+++ b/browse/characters.php
@@ -1,1 +1,73 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+if(!defined("_CHARSET")) exit( );
 
+$current = "characters";
+$charid = isset($_GET['charid']) && isNumber($_GET['charid']) ? $_GET['charid'] : 0;
+
+if($charid > 0) {
+	$charquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_characters WHERE charid = '$charid' LIMIT 1");
+	$char = dbassoc($charquery);
+	$output = "<div id='pagetitle'>".stripslashes($char['charname'])."</div>\n<div id='story'>".format_story($char['bio'])."</div>";
+	$numrows = search(_STORYQUERY.$storyquery._ORDERBY, _STORYCOUNT.$countquery, "browse.php?");
+}
+else {
+	$output .= "<div id=\"pagetitle\">"._CHARACTERS.($let ? " - $let" : "")."</div>".build_alphalinks("browse.php?$terms&amp;", $let);
+
+	if($let == _OTHER) $query = " charname REGEXP '^[^a-z]'";
+	else if($let) $query = " charname LIKE '$let%'";
+	else $query = "";
+
+	$charquery = "SELECT * FROM ".TABLEPREFIX."fanfiction_characters".($query ? " WHERE $query" : "");
+	$countquery = "SELECT count(charid) FROM ".TABLEPREFIX."fanfiction_characters".($query ? " WHERE $query" : "");
+	$charid = 0;
+	$count = dbquery($countquery);
+	list($numrows)= dbrow($count);
+	$limit = $itemsperpage *  $displaycolumns;
+	$total = ($numrows > $limit ? $limit : $numrows);
+	$list = floor($total /  $displaycolumns);
+	if($total % $displaycolumns != 0) $list++;
+	$colwidth = (100/ $displaycolumns) -1;
+	$count = 0;
+	$column = 1;
+	$result2 = dbquery($charquery." ORDER BY charname LIMIT $offset,$limit");
+	$output .= "<div id=\"columncontainer\"><div id=\"browseblock\">".($displaycolumns ? "<div class=\"column\">" : "");
+	while($char = dbassoc($result2)) {
+		$count++;
+		 $output .= "<a href=\"browse.php?type=characters&amp;charid=$char[charid]\">".stripslashes($char['charname'])."</a><br />";
+		if( $count >= $list && $column != $displaycolumns) {
+			$output .= "</div><div class=\"column\">";
+			if($total % $displaycolumns == $column) $list--;
+			$column++;
+			$count = 0;
+		}
+	}
+	$output .= "</div>".($displaycolumns ? "</div>" : "")."<div class='cleaner'>&nbsp;</div></div>";
+	if ($numrows > $limit) {
+		$output .= build_pagelinks("browse.php?type=characters".($let ? "&amp;let=$let" : "")."&amp;", $numrows, $offset, $displaycolumns);
+	}
+	else if(!$numrows) $output .= write_message(_NORESULTS);
+	$numrows = 0;
+}	
+	if($charid > 0) $charlist1 = $charid;
+?>

file:b/browse/class.php (new)
--- /dev/null
+++ b/browse/class.php
@@ -1,1 +1,63 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+if(!defined("_CHARSET")) exit( );
 
+$current = "";
+
+if(isset($_GET['type_id']) && isNumber($_GET['type_id'])) $type_id = $_GET['type_id'];
+if(isset($_GET['classid']) && isNumber($_GET['classid'])) $classid = $_GET['classid'];
+
+if(!empty($classid)) { 
+	$output .= "<div id='pagetitle'>".$classtypelist[$type_id]['title'].": ".$classlist[$classid]['name']."</div>";
+	$disablesorts = array($classtypelist[$type_id]['name']);
+	$storyquery .= " AND FIND_IN_SET('$classid', stories.classes) > 0".$storyquery._ORDERBY;
+	$countquery .= " AND FIND_IN_SET('$classid', stories.classes) > 0";
+	$seriesquery = " FIND_IN_SET('$classid', series.classes) > 0".(empty($seriesquery) ? "" : " AND ".$seriesquery);
+	$numrows = search(_STORYQUERY.$storyquery, _STORYCOUNT.$countquery, "browse.php?");
+	$classin[] = $classid;
+	$searchVars['classin'] = array($classid);
+}
+else if(isset($type_id)) {
+	$output .= "<div id='pagetitle'>".$classtypelist[$type_id]['title']."</div>";
+	foreach($classlist as $c => $i) {
+		if($i['type'] == $type_id) $clist[] = "<a href='browse.php?type=class&amp;type_id=$type_id&amp;classid=$c'>".$i['name']."</a><br />";
+	}
+	$total = count($clist);
+	$count = 0;
+	$column = 1;
+	$list = floor($total / $displaycolumns);
+	if($total % $displaycolumns != 0) $list++;
+	$output .= "<div id=\"columncontainer\"><div id=\"browseblock\">".($displaycolumns ? "<div class=\"column\">" : "");
+	foreach($clist as $c) {
+		$count++;
+		$output .= $c;
+		if( $count >= $list && $column != $displaycolumns) {
+			$output .= "</div><div class=\"column\">";
+			if($total % $displaycolumns == $column) $list--;
+			$column++;
+			$count = 0;
+		}
+	}
+	$output .= "</div>".($displaycolumns ? "</div>" : "")."<div class='cleaner'>&nbsp;</div></div>";
+}
+else $output .= _ERROR;

--- /dev/null
+++ b/browse/featured.php
@@ -1,1 +1,30 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+if(!defined("_CHARSET")) exit( );
+	$output .= "<div id=\"pagetitle\">".$panel['panel_title']."</div>";
+		
+	$storyquery .= " AND stories.featured > 0".$storyquery;
+	$countquery .= " AND featured > 0";
 
+	$numrows = search(_STORYQUERY.$storyquery._ORDERBY, _STORYCOUNT.$countquery, "browse.php?");
+?>

file:b/browse/index.php (new)
--- /dev/null
+++ b/browse/index.php

--- /dev/null
+++ b/browse/ratings.php
@@ -1,1 +1,59 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+if(!defined("_CHARSET")) exit( );
 
+
+$disablesorts = array("ratings");
+$rating = isset($_REQUEST['rating']) ? $_GET['rating'] : false;
+if($rating) {
+	$output .= "<div id='pagetitle'>"._RATING.": ".$ratingslist[$rating]['name']."</div>";
+	$storyquery .= " AND rid = '$rating'";
+	$storyquery .= _ORDERBY;
+	$countquery .= " AND rid = '$rating'";
+	$numrows = search(_STORYQUERY.$storyquery, _STORYCOUNT.$countquery, $pagelink = "browse.php?");
+}
+else {
+	$output .= "<div id='pagetitle'>"._RATINGS."</div>";
+	$total = count($ratingslist);
+	$count = 0;
+	$column = 1;
+	$list = floor($total / $displaycolumns);
+	if($total % $displaycolumns != 0) $list++;
+	if(!empty($ratingslist) && count($ratingslist) > 0) {
+		$output .= "<div id=\"columncontainer\"><div id=\"browseblock\">".($displaycolumns ? "<div class=\"column\">" : "");
+		foreach($ratingslist as $rating => $info) {
+			$count++;
+			$output .= "<a href='browse.php?type=ratings&amp;rating=$rating'>".$info['name']."</a><br />";
+			if( $count >= $list && $column != $displaycolumns) {
+				$output .= "</div><div class=\"column\">";
+				if($total % $displaycolumns == $column) $list--;
+				$column++;
+				$count = 0;
+			}
+		}
+		$output .= "</div>".($displaycolumns ? "</div>" : "")."<div class='cleaner'>&nbsp;</div></div>";
+	}
+}
+
+?>
+

file:b/browse/recent.php (new)
--- /dev/null
+++ b/browse/recent.php
@@ -1,1 +1,32 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+if(!defined("_CHARSET")) exit( );
 
+$output .= "<div id=\"pagetitle\">".($recentdays ? _RECENTSTORIES : _MOSTRECENT)." ".$pagelinks['rss']['link']."</div>";
+
+$update_date = time() - $recentdays * 24 * 60 * 60;
+$countquery .= ($recentdays ? " AND updated > '" . $update_date . "'" : "");
+$query = $storyquery . ($recentdays ? " AND updated > '" . $update_date . "'" : "");
+$query .= " ORDER BY ".(isset($_REQUEST['sort']) && $_REQUEST['sort'] == "alpha" ? "stories.title" : "updated DESC");
+$numrows = search(_STORYQUERY.$query, _STORYCOUNT.$countquery, "browse.php?");
+

file:b/browse/series.php (new)
--- /dev/null
+++ b/browse/series.php
@@ -1,1 +1,83 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+if(!defined("_CHARSET")) exit( );
 
+// Page Setup
+$current = "series";
+
+$output .= "<div id=\"pagetitle\">"._SERIES.($let ? " - $let" : "")."</div>".build_alphalinks("browse.php?$terms&amp;", $let);
+
+if($let) {
+	$seriesquery .= (empty($seriesquery) ? "" : " AND ").($let == _OTHER ? " series.title REGEXP '^[^a-z]'" : "series.title LIKE '$let%'");
+}
+	if($searchterm) {
+		if($searchtype == "title") $scountquery[] = "series.title LIKE '%$searchterm%'";
+		if($searchtype == "summary") $scountquery[] = "series.summary LIKE '%$searchterm%'";
+		if(!empty($authorlist)) $scountquery[] = "FIND_IN_SET(series.uid, '".implode(",",$authorlist)."') > 0";
+		if($searchtype == "advanced" || !$searchtype) $scountquery[] = "(summary LIKE '%$searchterm%' OR title LIKE '%$searchterm%') ";
+	}
+	if(isset($_REQUEST['authors'])) $scountquery[] = "FIND_IN_SET(series.uid, '".implode(",",$searchVars['authors'])."') > 0";
+	foreach($categories as $cat) {
+		$catseries[] = "FIND_IN_SET($cat, series.catid) > 0 ";
+	}
+	// Now implode the SQL list
+	if(!empty($catstories)) {
+		$scountquery[] = "(".implode(" OR ", $catseries).")";
+	}
+	if($charid) {
+		foreach($charid as $c) {
+			if(empty($c)) continue;
+			$charseries[] = "FIND_IN_SET($c, series.characters) > 0 ";
+		}
+		if(!empty($charseries)) {
+			$scountquery[] = "(".implode(" OR ", $charseries).")";
+		}
+	}
+	if($classin) {
+		foreach($classin as $class) {
+			if(empty($class)) continue;
+			$scountquery[] = "FIND_IN_SET($class, series.classes) > 0";
+		}
+	}
+	if($classex) {
+		foreach($classex as $class) {
+			$scountquery[] = "FIND_IN_SET($class, series.classes) = 0";
+		}
+	}
+
+$count = dbquery(_SERIESCOUNT.(!empty($seriesquery) ? " WHERE ".$seriesquery : ""));
+$query = _SERIESQUERY.(!empty($seriesquery) ? " AND ".$seriesquery : "")." ORDER BY series.title LIMIT $offset, $itemsperpage";
+list($numrows)= dbrow($count);
+$sresult = dbquery($query);
+$count = 0;
+$tpl->newBlock("listings");
+while($stories = dbassoc($sresult)) { include("includes/seriesblock.php"); }	
+$tpl->gotoBlock("listings");
+if($numrows > $itemsperpage) $tpl->assign("pagelinks", build_pagelinks("browse.php?$terms&amp;", $numrows, $offset));
+$tpl->gotoBlock("_ROOT");
+if(!$numrows) {
+	$tpl->gotoBlock("_ROOT");
+	$output .= write_message(_NORESULTS);
+}
+$disablesorts = array("ratings", "sorts", "complete");
+?>

file:b/browse/titles.php (new)
--- /dev/null
+++ b/browse/titles.php
@@ -1,1 +1,33 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+if(!defined("_CHARSET")) exit( );
 
+// Page Setup
+$current = "titles";
+	$output .= "<div id=\"pagetitle\">"._TITLES.($let ? " - $let" : "")."</div>".build_alphalinks("browse.php?$terms&amp;", $let);
+
+	if($let == _OTHER) $storyquery .= " AND stories.title REGEXP '^[^a-z]'";
+	else if(!empty($let)) $storyquery .= " AND stories.title LIKE '$let%'";
+	$storyquery  .= _ORDERBY;
+	$numrows = search(_STORYQUERY.$storyquery, _STORYCOUNT.$storyquery, "browse.php?");
+?>

--- /dev/null
+++ b/browse/toplists.php
@@ -1,1 +1,49 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+if(!defined("_CHARSET")) exit( );
 
+$current = "toplists";
+
+	$output = "<div id='pagetitle'>"._10LISTS."</div>";
+	$lists = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_type = 'L' AND panel_hidden != '1' AND panel_level = '0' ORDER BY panel_order");
+	while($l = dbassoc($lists)) {
+		$clist[] = "<a href='toplists.php?list=".$l['panel_name']."'>".$l['panel_title']."</a><br />";
+	}
+	$total = count($clist);
+	$count = 0;
+	$column = 1;
+	$list = floor($total / $displaycolumns);
+	if($total % $displaycolumns != 0) $list++;
+	$output .= "<div id=\"columncontainer\"><div id=\"browseblock\">".($displaycolumns ? "<div class=\"column\">" : "");
+	foreach($clist as $c) {
+		$count++;
+		$output .= $c;
+		if( $count >= $list && $column != $displaycolumns) {
+			$output .= "</div><div class=\"column\">";
+			if($total % $displaycolumns == $column) $list--;
+			$column++;
+			$count = 0;
+		}
+	}
+	$output .= "</div>".($displaycolumns ? "</div>" : "")."<div class='cleaner'>&nbsp;</div></div>";
+

file:b/contact.php (new)
--- /dev/null
+++ b/contact.php
@@ -1,1 +1,65 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+$current = "contactus";
+
+include ("header.php");
+
+	//make a new TemplatePower object
+if(file_exists("$skindir/default.tpl")) $tpl = new TemplatePower( "$skindir/default.tpl" );
+else $tpl = new TemplatePower("default_tpls/default.tpl");
+$tpl->assignInclude( "header", "./$skindir/header.tpl" );
+$tpl->assignInclude( "footer", "./$skindir/footer.tpl" );
+include("includes/pagesetup.php");
+
+	$output .= "<h1>"._CONTACTUS."</h1>";
+
+	if(isset($_POST['submit'])) {
+		if($captcha && !isMEMBER && !captcha_confirm()) $output .= write_error(_CAPTCHAFAIL);
+		else {
+			include("includes/emailer.php");
+			$result = sendemail($sitename, $siteemail, $_POST['email'], $_POST['email'], (!empty($_POST['reportpage']) ? _REPORT.": " : "").descript(strip_tags($_POST['subject'])), format_story(descript($_POST['comments'])).(!empty($_POST['reportpage']) ? "<br /><br /><a href='$url/".$_POST['reportpage']."'>$url/".$_POST['reportpage']."</a>" : "").(isMEMBER ? sprintf(_SITESIG2, "<a href='".$url."/viewuser.php?uid=".USERUID."'>".USERPENNAME."</a>") : _SITESIG), "html");
+			if($result) $output .= write_message(_EMAILSENT);
+			else $output .= write_error(_EMAILFAILED);
+		}
+	}
+	else
+	{
+		$output .= "<form method='POST' enctype='multipart/form-data' action='contact.php'>
+		<table class='acp'><tr><td><label for='email'>"._YOUREMAIL.":</label></td><td><INPUT type='text' class='textbox' name='email'></td></tr>";
+		if(!$action) $output .= "<tr><td><label for='subject'>"._SUBJECT.":</label></td><td><INPUT  type='text' class='textbox' name='subject'></td></tr>";
+		else if($action == "report") $output .= "<tr><td><label for='subject'>"._REPORT.":</label></td><td><select class='textbox' name='subject'>
+			<option>"._RULESVIOLATION."</option>
+			<option>"._BUGREPORT."</option>
+			<option>"._MISSING."</option>
+		</select>
+		<input type='hidden' name='reportpage' value='".descript($_GET['url'])."'></td></tr>";
+		$output .= "<tr><td><label for='comments'>"._COMMENTS.":</label></td><td> <TEXTAREA  class='textbox' name='comments' cols='50' rows='6'></TEXTAREA></td></tr>";
+		if(!USERUID && !empty($captcha)) $output .= "<tr><td><span class='label'>"._CAPTCHANOTE."</span></td><td><img width=120 height=30 src='"._BASEDIR."includes/button.php' alt='CAPTCHA image'><br /><br /><input MAXLENGTH=5 SIZE=5 name='userdigit' type='text' value=''></td></tr>";
+		$output .= "<tr><td colspan='2'><div style='text-align: center;'><INPUT name='submit' class='button' type='submit' value='"._SUBMIT."'></div></td></tr></table></form>";
+	}
+
+	$tpl->assign( "output", $output );	
+	$tpl->printToScreen();
+	dbclose( );
+	?>

--- /dev/null
+++ b/default_tpls/README.txt
@@ -1,1 +1,6 @@
+This is a very generic skin for your site.  Please DO NOT edit these files. (At least not until you're VERY sure you know what you're doing when 
+creating skins)  If your default skin goes missing or pieces of any of your skin are left out, the script will automatically use the files in this folder to
+fill in the blanks.  This also allows you to cheat when creating skins.  You can basically "inherit" these .tpls in any of your skins simply by omitting 
+that .tpl from that skin's folder.  The only exceptions are header.tpl, footer.tpl, and style.css.  Those three files are REQUIRED for all skins.
 
+PLEASE, if you want to make changes to this skin, copy the files into a folder inside the skins folder and make your changes there first.

--- /dev/null
+++ b/default_tpls/browse.tpl
@@ -1,1 +1,8 @@
+<!-- INCLUDE BLOCK : header -->
+{output}{otherresults}
+<!-- START BLOCK : sortform -->
+<div id="sortform">{sortbegin}{categorymenu} {charactermenu1} {charactermenu2} {pairingsmenu} {ratingmenu} {classmenu} {sortmenu} {completemenu} {sortend}</div>
+<!-- END BLOCK : sortform -->
+<!-- INCLUDE BLOCK : listings -->
+<!-- INCLUDE BLOCK : footer -->
 

--- /dev/null
+++ b/default_tpls/categories.tpl
@@ -1,1 +1,4 @@
+<!-- START BLOCK : categoryblock -->
+{image} {link} {count} {description}
+<!-- END BLOCK : categoryblock -->
 

--- /dev/null
+++ b/default_tpls/comments.tpl
@@ -1,1 +1,7 @@
-
+<!-- START BLOCK : commentbox -->
+<div class="comment{oddeven}">
+{comment}
+<div class="commentsig">- {uname} on {date}</div>
+{adminoptions}
+</div>
+<!-- END BLOCK : commentbox -->

--- /dev/null
+++ b/default_tpls/default.tpl
@@ -1,1 +1,4 @@
-
+<!-- INCLUDE BLOCK : header -->
+{output}
+<!-- INCLUDE BLOCK : listings -->
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/default_tpls/favcomment.tpl
@@ -1,1 +1,7 @@
+<!-- START BLOCK : comment -->
+<div class="comment{oddeven}">
+{comment}
+{commentoptions}
+</div>
+<!-- END BLOCK : comment -->
 

--- /dev/null
+++ b/default_tpls/footer.tpl
@@ -1,1 +1,5 @@
-
+<!-- START BLOCK : footer -->
+</div>
+<div id="footer">{footer}</div></div>
+</body></html>
+<!-- END BLOCK : footer -->

--- /dev/null
+++ b/default_tpls/header.tpl
@@ -1,1 +1,8 @@
-
+<!-- START BLOCK : header -->
+<body>
+<div id="{page_id}">
+	<div id="banner"><div id="sitename">{sitename}</div><div id="slogan">{slogan}</div><div id="skin">{skinchange_content}</div><div id="rss">{rss}</div>
+</div>
+{menu_content}
+<div id="mainpage">
+<!-- END BLOCK : header -->

--- /dev/null
+++ b/default_tpls/index.php

--- /dev/null
+++ b/default_tpls/index.tpl
@@ -1,1 +1,26 @@
-
+<!-- INCLUDE BLOCK : header -->
+<div id="leftindex">
+      <div class="block">
+       <div class="title">{info_title}</div>
+       <div class="content">{welcome}{info_content}<br>{login_content}</div>
+     </div>
+     <div class="block">
+       <div class="title">{random_title}</div>
+       <div class="content">{random_content}</div>
+     </div>
+</div>
+<div id="rightindex">
+     <div class="block">
+       <div class="title">{categories_title}</div>
+       <div class="content">{categories_content}</div>
+     </div>
+     <div class="block">
+       <div class="title">{recent_title}</div>
+       <div class="content">{recent_content}</div>
+     </div>
+     <div class="block">
+       <div class="title">{news_title}</div>
+       <div class="content">{news_content}</div>
+    </div>
+</div>
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/default_tpls/listings.tpl
@@ -1,1 +1,35 @@
-
+<!-- START BLOCK : listings -->
+{seriesheader}
+<!-- START BLOCK : seriesblock -->
+<div class="listbox {oddeven}">
+<div class="title">{title} by {author}{score} [{reviews} - {numreviews}]</div>
+<div class="content"><span class="label">Summary: </span>{summary}<br />
+<span class="label">Parent Series:</span> {parentseries}<br />
+<span class="label">Categories:</span> {category}<br />
+ <span class="label">Characters: </span>{characters}<br />
+{classifications}
+<span class="label">Stories:</span> {numstories}<br />
+<span class="label">Open:</span> {open} {addtofaves} {reportthis}
+{adminoptions}</div>
+</div>
+{comment}
+<!-- END BLOCK : seriesblock -->
+{stories}
+<!-- START BLOCK : storyblock -->
+<div class="listbox {oddeven}">
+<div class="title">{title} by {author} <span class="label">Rated:</span> {rating} {roundrobin} {score} [{reviews} - {numreviews}] {new} </div>
+<div class="content"><span class="label">Summary: </span>{featuredstory}{summary}<br />
+<span class="label">Categories:</span> {category} <br />
+<span class="label">Characters: </span> {characters}<br />
+{classifications}
+<span class="label">Series:</span> {serieslinks}<br />
+<span class="label">Chapters: </span> {numchapters} {toc}<br />
+<span class="label">Completed:</span> {completed}  
+<span class="label">Word count:</span> {wordcount} <span class="label">Read Count:</span> {count}
+{adminlinks}</div>
+<div class="tail"><span class="label">{addtofaves} {reportthis} Published: </span>{published} <span class="label">Updated:</span> {updated}</div>
+</div>
+{comment}
+<!-- END BLOCK : storyblock -->
+{pagelinks}
+<!-- END BLOCK : listings -->

--- /dev/null
+++ b/default_tpls/newsbox.tpl
@@ -1,1 +1,7 @@
-
+<!-- START BLOCK : newsbox -->
+<div class="newsbox {oddeven}">
+<div class="newstitle">{newstitle} {adminoptions}</div>
+{newsstory}<br /><br />
+   --{newsauthor} on {newsdate} {newscomments}
+</div>
+<!-- END BLOCK : newsbox -->

--- /dev/null
+++ b/default_tpls/printable.css
@@ -1,1 +1,15 @@
-
+BODY { font: 12pt "Times New Roman", "Times NR", Times, serif; color: black; background: white; }
+// Gives the page a 1 inch margin when printed.
+@page { margin: 1in; }
+hr { width: 70%; color: #000; background: #000;  margin: 1em auto;}
+.infobox { border: 1px solid #336; margin: 1em 10%; padding: 1em;}
+#pagetitle { font-size: 140%; text-align: center; }
+.label { font-weight: bold; }
+A { font-weight: bold; color: #336; text-decoration: none; }
+.chaptertitle { page-break-before: always; page-break-after: avoid; font-size: 125%; text-align: center; text-decoration: underline; margin-bottom: 1em;}
+.notes { border: 1px solid #336;  margin: 1em 10%;}
+.notes .title { padding: 5px; border-bottom: 1px solid #336; }
+.notes .noteinfo { padding: 5px; }
+#copyright { margin: 1em 10%; border: 1px solid #336; padding: 1ex;}
+#archivedat { text-align: center; }
+.toplink { text-align: right; }

--- /dev/null
+++ b/default_tpls/printstory.tpl
@@ -1,1 +1,29 @@
-
+<div id="pagetitle">{title} by {author}</div>
+<div class="infobox">
+<div class="content">{featuredstory}<span class="label">Summary: </span>{summary}<br />
+<span class="label">Categories:</span> {category} <span class="label">Characters: </span> {characters}<br />
+{classifications}
+<span class="label">Challenges:</span> {challengelinks}<br /> <span class="label">Series:</span> {serieslinks}<br />
+<span class="label">Chapters: </span> {numchapters} <span class="label">Completed:</span> {completed}  
+<span class="label">Word count:</span> {wordcount} <span class="label">Read:</span> {count}
+<span class="label"> Published: </span>{published} <span class="label">Updated:</span> {updated} </div>
+</div>
+<!-- START BLOCK : storynotes -->
+<div class='notes'><div class='title'><span class='label'>Story Notes:</span></div><div class='noteinfo'>{storynotes}</div></div>
+<!-- END BLOCK : storynotes -->
+<!-- START BLOCK : storyindexblock -->
+      <p><b>{chapternumber}.</b> {title} by {author}</p>
+<!-- END BLOCK : storyindexblock -->
+<!-- START BLOCK : chapterblock -->
+<div class='chaptertitle'>{chaptertitle} by {chapterauthor}</div>
+<!-- START BLOCK : notes -->
+<div class='notes'><div class='title'><span class='label'>Author's Notes:</div><div class='noteinfo'>{notes}</div></div>
+<!-- END BLOCK : notes -->
+<div class='chapter'>{chaptertext}</div>
+<!-- START BLOCK : endnotes -->
+<div class='notes'><div class='title'><span class='label'>End Notes:</div><div class='noteinfo'>{endnotes}</div></div>
+<!-- END BLOCK : endnotes -->
+<div class='toplink'>{back2top}</div>
+<!-- END BLOCK : chapterblock -->
+<div id="copyright">{copyright}</div>
+<div id="archivedat">{archivedat}</div>

--- /dev/null
+++ b/default_tpls/profile.tpl
@@ -1,1 +1,14 @@
-
+<!-- START BLOCK : profile -->
+<div id="profile">
+<div id="bio">
+	<div id="biotitle"><span class="label">Penname: </span>{userpenname} <span class="label">Real name: </span>{realname}</div>
+	<div id="biocontent">
+	<span class="label">Member Since: </span>{membersince}<br />
+	<span class="label">Membership status:</span> {userlevel}<br />
+	<span class="label">Bio:</span><br>{image}{bio}<br />
+	{authorfields} 
+	</div>
+</div>
+{adminoptions} {reportthis}
+</div>
+<!-- END BLOCK : profile -->

--- /dev/null
+++ b/default_tpls/reviewblock.tpl
@@ -1,1 +1,11 @@
-
+<!-- START BLOCK : reviewsblock -->
+<div class="listbox">
+<div class="content{oddeven}">
+<span class="label">Reviewer: </span>{reviewer} <span class="label">{member}</span> {rating} {reportthis}<br />
+<span class="label">Date: </span>{reviewdate}
+<span class="label">Title: </span>{chapter}
+<p>{review}</p>
+{adminoptions}
+</div>
+</div>
+<!-- END BLOCK : reviewsblock -->

--- /dev/null
+++ b/default_tpls/reviews.tpl
@@ -1,1 +1,9 @@
-
+<!-- INCLUDE BLOCK : header -->
+{pagetitle}
+<div class="respond">{reviewslink}</div>
+<div class="jumpmenu">{jumpmenu}</div>
+{output}
+<!-- INCLUDE BLOCK : reviewsblock -->
+{reviewpagelinks}
+{reviewform}
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/default_tpls/series_title.tpl
@@ -1,1 +1,15 @@
-
+<!-- START BLOCK : series -->
+<div id="pagetitle">{pagetitle} {rating}</div>
+<div id="titleinfo"> [{reviews} - {numreviews}]</div>
+<div id="titleblock">
+<span class="label">Summary:</span> {summary}<br />
+<span class="label">Categories:</span> {category}<br />
+<span class="label">Characters:</span> {characters}<br />
+{classifications}
+<span class="label">Parent Series:</span> {parentseries}<br />
+<span class="label">Stories:</span> {numstories}<br />
+<span class="label">Series Type:</span> {open}<br />
+<span class="label">{adminoptions}{addtofaves}{addtoseries}<br />
+</div>
+<div class="jumpmenu">{jumpmenu}</div>
+<!-- END BLOCK : series -->

--- /dev/null
+++ b/default_tpls/storyindex.tpl
@@ -1,1 +1,30 @@
-
+<!-- INCLUDE BLOCK : header -->
+<div id="pagetitle">{title} by {author}</div>
+<div id="sort"> [{reviews} - {numreviews}] {score}{printicon}</div>
+<div id="output">
+<div class="jumpmenu">{jumpmenu}</div>
+<div class="listbox">
+<div class="content">{featuredstory}<span class="label">Summary: </span>{summary}<br />
+<span class="label">Rated:</span> {rating}<br />
+<span class="label">Categories:</span> {category} <span class="label">Characters: </span> {characters}<br />
+{classifications}
+<span class="label">Challenges:</span> {challengelinks}<br /> <span class="label">Series:</span> {serieslinks}<br />
+<span class="label">Chapters: </span> {numchapters} <span class="label">Completed:</span> {completed} <br /> 
+<span class="label">Word count:</span> {wordcount} <span class="label">Read:</span> {count}<br />
+<span class="label"> Published: </span>{published} <span class="label">Updated:</span> {updated} </div>
+{adminlinks}
+</div>
+<div style='text-align: center;'>{addtofaves}</div>
+<!-- START BLOCK : storynotes -->
+<div class='notes'><div class='title'><span class='label'>Story Notes:</span></div><div class='noteinfo'>{storynotes}</div></div>
+<!-- END BLOCK : storynotes -->
+<!-- START BLOCK : storyindexblock -->
+      <p><b>{chapternumber}. {title} </b>by {author} [{reviews} - {numreviews}] {ratingpics} ({wordcount} words)<br />
+	{chapternotes}{adminoptions}</p>
+<!-- END BLOCK : storyindexblock -->
+{storyend}{last_read}
+<div id="pagelinks"><div class="jumpmenu">{jumpmenu2}</div></div>
+<div class="respond">{roundrobin}</div>
+{reviewform}
+</div>
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/default_tpls/style.css
@@ -1,1 +1,328 @@
-
+/* Some definitions used everywhere */
+BODY { 
+	background: #000;
+	color: #FFF;
+	margin: 0;
+	padding: 0;
+}
+
+IMG { 
+	border: 0;
+	padding: 0;
+	margin: 0;
+}
+/* Header cells in tables throughout the site */
+TH { 
+	background: #000;
+	color: #FFF;
+	font-weight: bold;
+}
+/* links */
+A { 
+	color: #333;
+	font-weight: bold;
+	text-decoration: underline;
+}
+/* hovering links */
+A:hover {
+	text-decoration: underline overline;
+}
+/* the box at the top of the page */
+#banner {
+	text-align: center;
+	background: #000;
+}
+/* The appearance of your site's name in the banner area*/
+#sitename {
+	font-size: 44px;
+	font-weight: bold;
+	color: #CCC;
+}
+/* The appearance of your site's slogan in the banner area */
+#slogan {
+	font-size: 26px;
+	font-weight: bold;
+	color: #AAA;
+}
+/* The location of the div containing the skin change drop menu  in the banner area */
+#skin {
+	position: absolute;
+	right: 30px;
+	top: 25px;
+}
+/* The location of the div containing the RSS link in the banner area */
+#rss {
+	position: absolute;
+	right: 50px;
+	top: 55px; 
+}
+
+/* the following defines your menu below the banner div */
+/* the box around the menu and aligning the text to center */
+#menu { 
+ border-top: 3px double #000;
+ border-bottom: 3px double #000;
+ background: #CCC;
+ text-align: center; 
+}
+/* links in the menu */
+#menu a {
+ color: #333;
+ font-weight: bold;
+ text-decoration: none;
+ padding-left: 4px;
+ padding-right: 4px; 
+}
+/* Hovered links in the menu */
+#menu a:hover { 
+ background: #000; 
+ padding-left: 2px;
+ padding-right: 2px;
+ border-left: 2px solid #FFF;
+ border-right: 2px solid #FFF;
+ color: #FFF; 
+}
+/* The link for the currently displayed page in the menu */
+#menu #current {
+	text-decoration: underline;
+}
+/* end menu setup */
+
+/* the footer box at the bottom of the page */
+#footer {
+	border-top: 3px double #CCC;
+	background: #000;
+	color: #FFF;
+	padding: 10px;
+	clear: both;
+}
+
+/* End universal page setup */
+
+/* this is a carryover from 1.1.  Generally it is used around tables and table cells. */
+.tblborder { 
+	border: 1px solid #000;
+	padding: 6px;
+	border-collapse: collapse;
+	color: #000;
+}
+
+/* Main page surrounds the text between the header and the footer.  
+For IE, height is set to 650 to force the footer down to the bottom of the page where the content is short.  
+And the second declaration is for everyone else so that it will scroll if longer but be a minimum of 650px
+*/
+#mainpage {
+	height: 550px;
+	padding-bottom: 1em;
+	background: #FFF;
+	color: #000;
+}
+html>body #mainpage { 
+	height: auto;
+	min-height: 550px;
+}
+
+/* Most pages use pagetitle to format the page's title */
+#pagetitle { 
+	text-align: center;
+	font-size: 25px;
+	color: #333;
+	margin-top: 1em;
+}
+
+/* 
+Where there's a list of alphabet links #alphabet controls their look. 
+Just to make things simpler #pagelinks controls the look of the links at the bottom of multi-page results
+and will be set here too. Generally, they look alike.
+*/
+/* the box around the links */
+#alphabet, #pagelinks {
+	text-align: center;
+	word-spacing: -.3em;
+	margin: 1em;
+}
+/* each link */
+#alphabet A, #pagelinks A {
+	color: #FFF;
+	text-decoration: none;
+	font-weight: bold;
+	background: #000;
+	border: 1px solid #CCC;
+	border-collapse: collapse;
+	padding: 0 2px;
+}
+/* each link when hovered over */
+#alphabet A:hover, #pagelinks A:hover {
+	background: #CCC;
+	color: #333;
+}
+/* the currently selected letter and currently selected page */
+#alphabet #current_letter, #pagelinks #currentpage {
+	background: #FFF;
+	color: #333;
+	font-weight: bold;
+	border: 1px solid #CCC;
+	padding: 0 2px;
+}
+/* End alphabet and page link declarations */
+
+/* labels throughout the site in forms and in other places */
+LABEL, .classification {
+	color: #666;
+	font-weight: bold;
+}
+/* Admin options in various places.  */
+.adminoptions { 
+	color: #666;
+	font-weight: bold;
+}
+
+/* The listings of stories etc. */
+/* .sectionheader styles the headings "Stories" and "Series" */
+.sectionheader {
+	text-align: center;
+	font-size: 22px;
+	font-weight: bold;
+	color: #333;
+}
+
+/* The box around each individual story */
+.listbox {
+	margin: 1em 5%;
+	border: 1px solid #000;
+}
+
+/* The title bar for each story box. */
+.listbox .title {
+	background: #000;
+	padding: 6px;
+	color: #FFF;
+	font-weight: bold;
+}
+/* Because the background is black, the link colors need to be changed. */
+.listbox .title A {
+	color: #CCC;
+}
+/* The content of the box...summary, categories, etc. */
+.listbox .content {
+	padding: 6px;
+}
+
+/* The tail info published date etc. on the last line */
+.listbox .tail {
+	background: #000;
+	padding: 6px;
+	color: #FFF;
+}
+/* And again because of the black background change the color of the links. */
+.listbox .tail A {
+	color: #CCC;
+}
+
+/*End story/series listings */
+
+/* titleblock is used for the title information in series and challenges */
+#titleblock {
+	margin: 0 10%;
+}
+
+/* The pulldown jump menus on several pages. */
+.jumpmenu {
+	text-align: right;
+	margin-right: 1em;
+}
+
+/* On the story page, there's a jumpmenu at the bottom. It looks better centered, so this will replace the declaration above for that 
+drop down list ONLY */
+#pagelinks .jumpmenu {
+	text-align: center;
+}
+
+/* This is used on series and challenges and other places where a response is solicited */
+.respond { 
+	text-align: center;
+	padding: 6px;
+}
+
+/* The sort menu on the categories page */
+#sort { text-align: center; }
+
+
+/* On pages that don't use listings, the content is surrounded by a div labeled output to */
+#output { 
+	padding: 10px;
+}
+
+/* User Profile stuff */
+/* The top list of information */
+#profile {
+	margin: 1em 10%;
+}
+/* The sort menu in the profile */
+#profile #sort {
+	text-align: right;
+	font-weight: bold;
+	color: #666;
+ }
+/* The following declarations control the tabs */
+/* The outer tab box */
+#tabs {
+	background: #000;
+	border-top: 1px solid #000;
+	border-bottom: 1px solid #000;
+	text-align: center;
+	margin: 0;
+	padding: 0;
+}
+/* The individual tabs. */
+#tabs span {
+	font-size: 12px;
+	background: #CCC;
+	border: 1px solid #000;
+	padding: 3px;
+}
+/* Links in the tabs */
+
+#tabs #active {
+	background: #FFF;
+	color: #666;
+}
+
+/* This controls the look of the blocks on the index page.   */
+
+/* The box around the block */
+.block { 
+	margin: 1em;
+	border: 1px solid #000;
+}
+
+/* The block's title */
+.block .title {
+	background: #000;
+	color: #FFF;
+	font-weight: bold;
+	padding: 6px;
+}
+
+/* The block's content */
+.block .content {
+	padding: 6px;
+}
+
+#leftindex { 
+	width: 200px;
+	float: left;
+}
+html>body #leftindex {
+	margin-top: -1em;
+}
+
+#rightindex {
+	margin-left: 220px;
+}
+/* The next link at the bottom of a multi-chapter story */
+#next { float: right; }
+/* The previous link at the bottom of a multi-chapter story */
+#prev { float: left; }
+
+#browse #category_content { width: 95% !important; margin: 1em auto; }

--- /dev/null
+++ b/default_tpls/user.tpl
@@ -1,1 +1,15 @@
-
+<!-- INCLUDE BLOCK : header -->
+<div id="profile">
+<!-- INCLUDE BLOCK : profile -->
+{adminoptions}
+<div id="sort">{sort}</div>
+</div>
+	<div id="tabs">
+<!-- START BLOCK : paneltabs -->
+<span {class}>{link} {count}</span>
+<!-- END BLOCK : paneltabs -->
+<div class='cleaner' style='clear: both;'>&nbsp;</div>
+	</div>
+{output}
+<!-- INCLUDE BLOCK : listings -->
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/default_tpls/variables.php
@@ -1,1 +1,28 @@
-
+<?php
+$blocks["categories"]["status"] = 2;
+$blocks["featured"]["status"] =  '0';
+$blocks["info"]["status"] = 2;
+$blocks["menu"]["status"] = '1';
+$blocks["menu"]["content"] = array (
+  0 => 'home',
+  1 => 'recent',
+  2 => 'authors',
+  3 => 'catslink',
+  4 => 'titles',
+  5 => 'series',
+  6 => 'search',
+  7 => 'tens',
+  8 => 'challenges',
+  9 => 'help',
+  10 => 'contactus',
+  11 => 'login',
+  12 => 'logout',
+  13 => 'adminarea');
+$blocks["menu"]["style"] = 1;
+$blocks["login"]["status"] = 2;
+$blocks["random"]["status"] = 2;
+$blocks["recent"]["status"] = 2;
+$blocks['recent']['tpl'] = 0;
+$blocks["skinchange"]["status"] = '1';
+$blocks["news"]["status"] = 2;
+?>

--- /dev/null
+++ b/default_tpls/viewstory.tpl
@@ -1,1 +1,25 @@
-
+<!-- INCLUDE BLOCK : header -->
+<div id="pagetitle">{title} by {author}</div>
+<div class="storyinfo"> [{reviews} - {numreviews}]<br />
+{toc} {reportthis}<br />
+{printicon} <br />
+{adminlinks} </div>
+<div class="jumpmenu">{textsizer}{jumpmenu}</div>
+<!-- START BLOCK : storynotes -->
+<div class='notes'>
+	<div class='title'><span class='label'>Story Notes:</span></div>
+	<div class='noteinfo'>{storynotes}</div>
+</div>
+<!-- END BLOCK : storynotes -->
+<!-- START BLOCK : notes -->
+<div class='notes'><div class='title'><span class='label'>Author's Chapter Notes:</span></div><div class='noteinfo'>{notes}</div></div>
+<!-- END BLOCK : notes -->
+<div id="story">{story}</div>
+<!-- START BLOCK : endnotes -->
+<div class='notes'><div class='title'><span class='label'>Chapter End Notes:</span></div><div class='noteinfo'>{endnotes}</div></div>
+<!-- END BLOCK : endnotes -->
+<div id="prev">{prev}</div><div id="next">{next}</div>
+<div class="jumpmenu2">{jumpmenu2}</div>
+<div class="respond">{addtofaves} {roundrobin}</div>
+{reviewform}
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/docs/NewFeatures.txt
@@ -1,1 +1,47 @@
+- Ability to remove Featured Story status from Admin panel as well as retire a Featured Story.  You can also now 
+do this when editing a story.
+- Ability to edit and delete news comments from news archive page.
+- Time format in settings.  Removed separate news date format.
+- Added pagination in news.php
+- Ability to set your own classifications in addition to warnings and genres (i.e. Spoilers, Episode Related, 
+Pairings, Language, Story Length, Story Type)
+- Ability to add custom pages from the admin panel.
+- You can now customize the up and down arrows used throughout the script in the same way the other graphics 
+(stars, etc) can be customized.  The variables are $up and $down
+- Added pagination to individual series page.
+- Story counts are back. :)
+- Moved the javascript into header.php so no more problems with the formselect.js not regenerating.  The info will 
+get pulled each time the page loads.
+- Added Table of Contents link to the storyblock and viewstory page for stories.
+- Changed admin links for featured stories in story block to let you either remove or retire the feature.
+- Co-authors :)  Yes. plural.
+- Chapter end notes.
+- Story notes.
+- The validation function in the admin panel now uses storyblock.php for a more consistent look of story information 
+across the site.
+- When previewing a story in the the add/edit story functions, the script now uses storyblock.php for a more consistent 
+look for story information across the site.
+- The default yes and no letters (subject and text) when validating stories can now be customized using {variables} for:
+	{sitename}- the name of the site;
+	{adminname} - the penname of the admin sending the letter (text of letter only)
+	{rules} - a link to the submission rules (text of letter only)
+	{storytitle} - the title of the story
+	{chaptertitle} - the title of the chapter within the story
+- You can now add custom admin panels.
+- The main admin page will now tell you how many stories are in the validation queue. So does the info block.
+- Session and cookie variables will now use a sitekey so that multiple sites on the same domain won't have problems with crossed login info.
+- News comments are now saved under uid instead of penname so that changes in penname will carry over to comment info.
+- TinyMCE can now be toggled on/off on the page.
+- Members can now turn tinyMCE and story indexes on/off for themselves
+- Members can choose the default story sort for themselves.
+- Challenges have been made into an optional module you can install and uninstall as you choose
+- Admins can now decide whether or not to allow anonymous challenges
+- The number of responses to a challenge is now listed in the information for the challenge.
+- Maintenance mode.
+- Action log.
+- Stories updated within the time frame of your "recent days" setting will now also be marked as "New!" (you can also define your own text or assign a graphic using $new in variables.php)
+- You can now define what "Top 10's" lists to include and add your own through the admin panel.
+- You can now "hide" skins from regular members through the admin panel.
+- Customized fields in the author profile page.
 
+

--- /dev/null
+++ b/docs/adminmanual.htm
@@ -1,1 +1,837 @@
-
+<ul>
+  <li>Installation 
+    <ul>
+      <li><a href="#newInstall">New Installation</a></li>
+      <li><a href="#upgrade20">Upgrade from 2.0.X</a></li>
+      <li><a href="../../../../../Documents%20and%20Settings/HP_Administrator/Desktop/upgrade11">Upgrade 
+        from 1.1</a></li>
+      <li><a href="#translate">Translating eFiction</a></li>
+    </ul>
+  </li>
+  <li>Administration 
+    <ul>
+      <li><a href="#initConfig">Initial Configuration</a></li>
+      <li><a href="#addNewSeries">Add New Series</a></li>
+      <li><a href="#addNewStory">Add New Story</a></li>
+      <li><a href="#featuredStories">Featured Stories</a></li>
+      <li><a href="#news">News</a></li>
+      <li><a href="#submissionQueue">Submissions</a></li>
+      <li><a href="#skins">Skins</a></li>
+      <li><a href="#categories">Categories</a></li>
+      <li><a href="#characters">Characters</a></li>
+      <li><a href="#ratings">Ratings</a></li>
+      <li><a href="#addClass">Classifications</a></li>
+      <li><a href="#members">Members</a></li>
+      <li><a href="#mailUsers">Mail Users</a></li>
+      <li><a href="#panels">Panels</a></li>
+      <li><a href="#settings">Settings</a></li>
+      <li><a href="#blocks">Blocks</a></li>
+      <li><a href="#customPages">Custom Pages</a></li>
+      <li><a href="#pageLinks">Page Links</a></li>
+      <li><a href="#admins">Admins</a></li>
+      <li><a href="#phpInfo">PHP Info</a></li>
+      <li><a href="#actionLog">Action Log</a></li>
+      <li><a href="#profileInfo">Profile Information</a></li>
+      <li><a href="#Modules">Modules</a></li>
+      <li><a href="#Maint">Archive Maintenance</a></li>
+    </ul>
+  </li>
+  <li>Skins 
+    <ul>
+      <li>Designing</li>
+      <li>Modifying</li>
+      <li>Upgrading from 2.0</li>
+      <li>Upgrading from 1.1</li>
+    </ul>
+  </li>
+  <li>Credits</li>
+  <li>Appendix
+    <ul>
+      <li><a href="#defaultPanels">Default Panels</a></li>
+    </ul>
+  </li>
+</ul>
+<p><strong><a name='newInstall'>New Installation</a></strong></p>
+<ol>
+  <li> If you intend to write the story texts to the server or allow image uploads 
+    CHMOD the folder you intend to store the stories in to 777. If this folder 
+    is missing the script will <strong>attempt</strong> to create it for you during 
+    the install.</li>
+  <li> Move config.php from the docs folder to the main eFiction folder. If the 
+    config.php is missing the install script will <strong>attempt</strong> to 
+    create it, but it's best if you move it.</li>
+  <li>CHMOD config.php to 666. </li>
+  <li>Using your web browser, go to the URL for your website(i.e. http://www.yoursite.com) 
+    to run the install and set up the admin login. </li>
+  <li>Login with the admin login and password set in step #4, and complete the 
+    configuration of your site through the Admin panel.</li>
+</ol>
+<p><strong>Upgrade from 2.0.X<a name="upgrade20"></a></strong></p>
+<p>BACK UP YOUR FILES AND YOUR DATABASE FIRST!! Upload the 3.0 files OVER your 
+  2.0 files. DO NOT DELETE YOUR 2.0 FILES UNTIL THE UPGRADE IS COMPLETE! Go to 
+  your site. The script will detect that the config.php file is for 2.0 and start 
+  the upgrade. </p>
+<p><strong>Note: </strong>You're encouraged to choose one of the skins provided 
+  with the 3.0 script until you can update your 2.0 skins.</p>
+<p><strong>Upgrade from 1.1<a name="upgrade11"></a></strong></p>
+<p>BACK UP YOUR FILES AND YOUR DATABASE FIRST!! Upload the 3.0 files OVER your 
+  1.1 files. DO NOT DELETE YOUR 2.0 FILES UNTIL THE UPGRADE IS COMPLETE! Go to 
+  your site. The script<br>
+  will detect that the config.php file is for 1.1 and start the upgrade. </p>
+<p><strong>Note: </strong>You're encouraged to choose one of the skins provided 
+  with the 3.0 script until you can update your 1.1 skins.</p>
+<p><strong>Note 2</strong>: Make sure your config.php file is CHMOD'd to 666.</p>
+<p><strong>Note 3:</strong> If you have installed blocks that did not come with 
+  the 2.0 package, turn them off before starting the upgrade. They will most likely 
+  be incompatible!</p>
+<p>Initial Configuration<a name="initConfig"></a></p>
+<p>After the install script has finished there are still a number of elements 
+  of the archive that you must configure before your archive will be operational. 
+</p>
+<ul>
+  <li><a href="#ratings">Ratings</a> - Ratings are a required element for story 
+    submission. Ratings are intended to show the intended audience for a story 
+    much as the MPAA ratings work for movies. <strong>Note:</strong> You are strongly 
+    advised not to use the MPAA ratings for your archive as they have threatened 
+    archives with legal action for doing so.</li>
+  <li><a href="#categories">Categories</a> (if you chose to have more than one) 
+    - How you categorize your archive is at your discretion. Some archives use 
+    categories for different fandoms. Others use categories for types of story 
+    within a fandom. </li>
+  <li><a href="#characters">Characters</a> - Characters is a list of characters 
+    used in your stories. Characters can be defined as sitewide or assigned to 
+    a specific category.</li>
+  <li><a href="#addClass">Classifications</a> - Classifications are other types 
+    of &quot;classifications&quot; you want to sort your stories into. In 1.1 
+    and 2.0, classifications were hard-coded as genres and warnings. To add new 
+    classifications or modify existing classifications required editing a number 
+    of core files. With 3.0, you can designate your own classifications. Other 
+    classifications that could be used are: spoilers, pairings, story type, language.</li>
+  <li><a href="#news">News</a> - It's a good idea to write an initial news story.</li>
+  <li><a href="#messageSettings">Message Settings</a> - The install script will 
+    load some default messages for your site. You will most likely wish to customize 
+    these messages to fit your site. </li>
+  <li><a href="#customPages">Custom Pages</a> - Four custom pages are defined 
+    in the installation. You will most likely wish to customize these pages to 
+    fit your site.</li>
+  <li><a href="#profileInfo">Additional User Profile Fields</a> - A number of 
+    optional user profile fields were installed though only a few were turned 
+    on. You will want to go to Admin-&gt;Profile Information and configure the 
+    user profile fields that you want on. If you want a custom profile field, 
+    now's the time to add that too.</li>
+</ul>
+<p><strong>Note: </strong>If you intend to bridge your eFiction site with another 
+  script. It's advisable to do it now before you open for business.</p>
+<p>Translating eFiction<a name="translate"></a></p>
+<p>You can modify most of the text that is displayed in the script by changing 
+  the language file in the languages/ folder for the language you selected. Copy 
+  the en.php and en_admin.php files and rename them to your chosen language. For 
+  instance, en.php would become es.php for Spanish or ru.php for Russian. Just 
+  change the text within the quotes for each line to whatever you want it to say. 
+  Some wording is included within the skin's files. If you have created a translation 
+  for eFiction, we encourage you to share it!</p>
+<p>Add New Series<a name="addNewSeries"></a></p>
+<p>Series are collections of related stories by the same or multiple authors. 
+  A story and its sequels, for example, would be a series. Series might also be 
+  used for a &quot;shared universe&quot; in which multiple authors write. The 
+  person who creates the series is considered the series &quot;owner&quot; and 
+  controls whether or not the series is &quot;open&quot; to contributions by other 
+  authors or not. Even if the series is &quot;closed&quot;, the series owner has 
+  the option to include stories from other authors in the series. This form is 
+  the same as members with an additional option to select the owner of the series. 
+</p>
+<p>Add New Story<a name="addNewStory"></a></p>
+<p>This form is the same as members use in the &quot;Account Info&quot; area except 
+  it has an additional option to select the author of the series. You will also 
+  see options to validate and mark the story as featured. </p>
+<p>Featured Stories<a name="featuredStories"></a></p>
+<p>This page allows administrators to manage the featured stories of the site. 
+  A story may initially be marked as featured:</p>
+<ol>
+  <li>From the add/edit story form.</li>
+  <li>By clicking on the &quot;Featured&quot; link in the &quot;Admin Options&quot; 
+    list for the story.</li>
+</ol>
+<p>Once a story has been marked it will appear in a table on this admin page. 
+  From here, site administrators may choose to &quot;retire&quot; the story or 
+  remove it's featured status entirely.</p>
+<p>News<a name="news"></a></p>
+<p>This page is used to add and administer the news stories for the site. </p>
+<p>Submissions<a name="submissionQueue"></a></p>
+<p>This page allows site adminstrators to manage the stories in the submission 
+  queue. This page is only used when automatic validation of stories is turned 
+  off and admistrators are manually validating stories. This page will list the 
+  stories waiting in the queue. </p>
+<p>Skins<a name="skins"></a></p>
+<p>This page lets site administrators &quot;hide&quot; skins from members. Administrators 
+  are advised to do this while they work on developing a new skin.</p>
+<p>Categories<a name="categories"></a></p>
+<p>This page is used to manage the site categories. To view a category's sub-categories 
+  in the list click on the &quot;+&quot; sign next to the name of the category.</p>
+<p>To add categories:</p>
+<ol>
+  <li>Goto Admin -&gt; Categories.</li>
+  <li>For a new top level category click &quot;Add New Top Level Category&quot; 
+    or for a new sub-category click on the &quot;Sub-Category&quot; link in the 
+    Options column for the parent category.</li>
+  <li>Enter the category information and click &quot;Submit&quot;. A locked category 
+    is a category where new story submissions are not accepted. It is generally 
+    used to &quot;lock&quot; top level categories and force submissions into sub-categories 
+    beneath the locked category.</li>
+</ol>
+<p>Characters<a name="characters"></a></p>
+<p>This page is used to manage the characters. Characters for a specific category 
+  can be added from the categories page or directly from this page. </p>
+<p>To add characters:</p>
+<ol>
+  <li>Choose on the category in which to place the characters (or &quot;Sitewide&quot; 
+    to make the characters accessible site wide). </li>
+  <li>Choose on the number of characters to add.</li>
+  <li>Click &quot;Submit&quot;.</li>
+  <li>You will now be presented with a form in which to enter the information 
+    about each character. A bio for the character is optional. If entered, it 
+    will appear at the top of the &quot;Browse&quot; page for that character.</li>
+</ol>
+<p>Ratings<a name="ratings"></a></p>
+<p><strong>Ratings are a required element for story submission.</strong> Ratings 
+  are intended to show the intended audience for a story much as the MPAA ratings 
+  work for movies. <strong>Note:</strong> You are strongly advised not to use 
+  the MPAA ratings for your archive as they have threatened archives with legal 
+  action for doing so. The story's rating can also be used to limit access to 
+  certain stories. </p>
+<ul>
+  <li>Rating - The text of the rating. This is limited to 60 characters.</li>
+  <li>Warning Pop-up - If this box is checked, a warning pop-up will be displayed 
+    for stories with this rating. The text of this warning is defined in the &quot;Warning 
+    text&quot; field. If warning pop-up's only once is selected in the settings, 
+    the site will remember whether or not this rating warning has appeared and 
+    will only display it once. If it is not selected, the warning pop-up will 
+    display each time.</li>
+  <li>Age Consent Required - If this box is checked, the visitor must have confirmed 
+    they are an adult (either via their preferences if they're logged in or via 
+    the warning pop-up) before they can view stories with this rating.</li>
+  <li>Registered Users Only - If this box is checked, the visitor must be logged 
+    in to view stories with this rating.</li>
+  <li>Warning text- The warning text that will be displayed to the user in the 
+    pop-up warning (if any).</li>
+</ul>
+<p> Classifications<a name="addClass"></a></p>
+<p>Classifications take the place of the genres and warnings from 1.1 and 2.0. 
+  The change lets you define your own classifications without hacking into the 
+  files. </p>
+<p>To add a new classifcation type:</p>
+<ol>
+  <li> Goto Admin -&gt; Classifications.</li>
+  <li>Click on &quot;Add New Classification Type&quot;.</li>
+  <li>Enter the name and title for the classification type such as &quot;genres&quot; 
+    or &quot;warnings&quot;. The title can be anything you like. The title will 
+    be what is displayed on screen. The name will be used in your skin template 
+    as a variable so it should be a unique one word description. As an example: 
+    enter the name as &quot;genre&quot; and the title as &quot;Genres&quot;.</li>
+  <li>Click &quot;Submit&quot;.</li>
+  <li>After you click submit you'll be taken back to the table listing your classification 
+    types. </li>
+  <li>Click on the classification type (&quot;Genres&quot; to continue the example). 
+    This will take you to the list of classifications within that type. </li>
+  <li>Click &quot;Add New Classifications&quot; to go to the form to add your 
+    classifications for that type. You'll have as many blanks on this form as 
+    you've set items per page.</li>
+  <li>Enter the classifications (to continue the example: romance, action/adventure, 
+    mystery) one in each text box.</li>
+  <li>Click submit.</li>
+</ol>
+<p>To edit a classification or classification type click &quot;Edit&quot; in the 
+  options in the table. To delete a classification click &quot;delete&quot; in 
+  the options.</p>
+<p>Members<a name="members"></a></p>
+<p>This page gives site administrators a number of options for managing the members 
+  of their site. <strong>Note: </strong>Some of these options may be unavailable 
+  if you have bridged your eFiction site to another application.</p>
+<p>At the top of the page are a number of options to sort members by:</p>
+<ul>
+  <li>All Members - lists all members</li>
+  <li>Admins - lists all administrators</li>
+  <li>Authors - lists only members who have submitted stories to the archive</li>
+  <li>Authors Input by Admins - lists authors who have been added by admins. <strong>Note: 
+    </strong>Will not function for bridged sites.</li>
+  <li>Non-validated Members - lists members who have not been validated. </li>
+  <li>Validated Members - lists members who have been validated</li>
+  <li>Locked Members - lists members whose accounts have been locked (banned)</li>
+  <li>Unlocked Members - lists members whose accounts are active (non-banned)</li>
+</ul>
+<p>Validated members are members whose stories by-pass the validation queue and 
+  are accepted automatically in archives where administrators are validating stories 
+  manually. By clicking on a members name in one of the last four lists, you are 
+  choosing to take that action on that member. For instance, if you click on a 
+  member's name in the Non-validated Members list, you will be taken to a page 
+  that will let you validate that member. The reverse is also true, if you click 
+  on a member's name in the Validated Members list, you will be taken to a page 
+  that will let you revoke the validated status for that member.</p>
+<p>An additional option, at the bottom of the page, for non-bridged sites is the 
+  ability to add new members. These are the members that appear in the &quot;Authors 
+  Input by Admins&quot; list. When clicking on a name in that list, administrators 
+  are given the option to release the author's account to their control.</p>
+<p>Mail Users<a name="mailUsers"></a></p>
+<p>Site administrators can use this option to mail all members of the site. Administrators 
+  may also limit the email to authors or admins in a certain category of the site.</p>
+<p>Modules<a name="Modules"></a></p>
+<p>This panel will let your control the modules installed on your site. The script 
+  comes with one module, challenges. You can find other modules created by others 
+  or create your own. Modules are add-on programs that add functionality to your 
+  site without you needing to edit the files.</p>
+<p>Panels<a name="panels"></a></p>
+<p>Panels are new in 3.0. The panels system has been implemented to make eFiction 
+  more configurable and easier to customize. Panels are used in a number of places 
+  throughout the site. Each panel is  assigned a type. The following types are 
+  defined as part of the basic eFiction site:</p>
+<ul>
+  <li>A - Admin panels</li>
+  <li>F - Favorites</li>
+  <li>S - Submissions</li>
+  <li>B - Browse</li>
+  <li>P - Member Profile</li>
+  <li>U - Member Account</li>
+  <li>L - Top 10 Lists</li>
+</ul>
+<p>Developers and site administrators also have the option of developing their 
+  own types of panels. <a href="#defaultPanels">See the list of default panels.</a></p>
+<p>To modify the panel order, select a panel type from the drop-down list at the 
+  top of the page then use the arrows to move the panels up and down in the list. 
+  To change panel from hidden to visible, click on the edit option to the right 
+  of the panel name. </p>
+<p>To add a new panel:</p>
+<ol>
+  <li>Click &quot;Add New Panel&quot;.</li>
+  <li>Enter the name of the panel. This should be one word alpha-numeric name 
+    used to identify the panel.</li>
+  <li>Enter the title of the panel. This will be the text displayed on the site 
+    for the panel.</li>
+  <li>Enter a URL to the panel. If no URL is supplied the script will look for 
+    a file with the name of the panel in the default location for that panel type. 
+    For instance, for the browse panel named &quot;recent&quot;, the script looks 
+    in the browse folder for a file named recent.php. You will need to supply 
+    a URL for panels located outside the default location or if you name the file 
+    differently than the panel. An example of this would be the browse panel for 
+    the challenges module, the URL is &quot;modules/challenges/browse.php&quot;. 
+    The file is both outside the default location (the browse/ folder) and also 
+    named differently than the panel. The panel is named &quot;challenges&quot;, 
+    but the file is named &quot;browse.php&quot;. <strong>Note: </strong>Panels 
+    are not interchangable. You cannot use a browse panel for a top ten list panel. 
+  </li>
+  <li>The panel level is used to determine who has access to that panel. This 
+    is most applicable to the admin and member account panels. In the admin panels 
+    the level is the admin level required to access the panel. In the member account 
+    panels, it is used to determine whether or not the visitor must be logged 
+    in to see the panel. 0 is for visitor access (registration, lost password, 
+    login) and 1 is for member access (everything else).</li>
+  <li>Check the hidden box of you want this panel to be hidden (not displayed 
+    in the list of panels).</li>
+  <li>Finally, enter the one letter code for the panel type. (See the above list)</li>
+  <li>Click &quot;Submit&quot;.</li>
+</ol>
+<p>Settings<a name="settings"></a></p>
+<p>In eFiction 3.0 the site settings have been grouped into sections to make the 
+  numerous options easier to manage.</p>
+<ul>
+  <li><a href="#siteInfo">Site Information</a></li>
+  <li><a href="#subSettings">Submission Settings</a></li>
+  <li><a href="#siteSettings">Site Settings</a></li>
+  <li><a href="#displaySettings">Display Settings</a></li>
+  <li><a href="#reviewSettings">Review Settings</a></li>
+  <li><a href="#userSettings">User Settings</a></li>
+  <li><a href="#emailSettings">E-mail Settings</a></li>
+  <li><a href="#langCensor">Language Censor</a></li>
+  <li><a href="#messageSettings">Message Settings</a></li>
+  <li><a href="#profileInfo">Profile Information</a></li>
+</ul>
+<p>Site Information<a name="siteInfo"></a></p>
+<p>This section of the settings defines general information about your site.</p>
+<ul>
+  <li>Site Key - You will have defined a site key during installation. <strong>DO 
+    NOT EDIT IT! </strong>If you edit the site key, you will need to manually 
+    update the site key information in your config.php file to match or your site 
+    will stop functioning.</li>
+  <li>Site Name - The name of your site. This will be displayed in the title of 
+    your site's pages.</li>
+  <li>Site Slogan - A slogan for your site. This will also be displayed in the 
+    title of your site's pages.</li>
+  <li>Site Url - The URL to your eFiction site. <strong>Note:</strong> This <strong>must 
+    </strong> be the URL to your eFiction site as the script uses this url in 
+    various places including emails sent to your members. It <strong>must not</strong> 
+    be the URL to any parent site.</li>
+  <li>Table Prefix - The prefix to your database tables. This was also set during 
+    installation and should also <strong>NEVER </strong> be changed or your site 
+    will cease to function. </li>
+  <li>Admin E-mail - The e-mail address used to send and receive e-mails from 
+    the site. This must be a valid email address!</li>
+  <li>Default Skin - The default skin displayed on the site. <strong>Note: </strong>When 
+    you change this as an administrator, your <strong>personal </strong>skin choice 
+    will still appear to you. You will most likely need to log out to see the 
+    site default you have chosen.</li>
+  <li>Language - The langauge the site will display in. The eFiction download 
+    comes with the English language files. <a href="#translating">See Translating 
+    eFiction.</a></li>
+</ul>
+<p>Submission Settings<a name="subSettings"></a></p>
+<p>This section of the settings defines various submission settings for the site.</p>
+<ul>
+  <li>Turn off unsolicited submissions - If &quot;yes&quot; is selected, submissions 
+    to the site can only be made by administrators through the &quot;Admin&quot; 
+    area. If &quot;no&quot; is selected members will have the option of submitting 
+    stories via the &quot;Account Info&quot; link.</li>
+  <li>Automatically validate all stories - If &quot;yes&quot; is selected, stories 
+    will automatically be displayed on the site. If &quot;no&quot; is selected, 
+    stories will be placed into a validation queue for administrators approval 
+    and stories will not appear on the site with this approval.</li>
+  <li>Co-authors allowed - This is a new feature in 3.0. By choosing &quot;yes&quot;, 
+    authors will be allowed to mark other members as co-authors of their stories 
+    in the submission process. Note that co-authors have the same rights to edit, 
+    add to, and delete the story as the author.</li>
+  <li>Allow round robins - Select &quot;yes&quot; if you wish to allow round robins 
+    in your archive.</li>
+  <li>Allow image uploads- Select &quot;yes&quot; if you wish to allow members 
+    to upload images to their account area. </li>
+  <li>Maximum image size 
+    <ul>
+      <li>Maximum image height - The maximum height for image uploads</li>
+      <li>Maximum image width - The maximum width for image uploads</li>
+    </ul>
+  </li>
+  <li>Stories saved in - The default is &quot;files&quot; on the server. You may 
+    also elect to save the text of the stories to the database. This is another 
+    setting that should not be altered after the inital setup of the site. Click 
+    on the checkbox next to the setting to activate it then use the drop down 
+    box to change the setting. <strong>Note: </strong> If your web server has 
+    safe_mode on, you should use the &quot;mysql&quot; option.</li>
+  <li>Stories path - The path to the folder on the server where your story files 
+    will be saved. This should be a relative path and should also not be changed 
+    after the initial setup of the archive. </li>
+  <li>Chapter word count limits - The maximum and minimum allowable word counts 
+    for chapters on the site. If you are storing your story text in the database, 
+    a maximum word count of 17000 is suggested. </li>
+</ul>
+<p>Site Settings<a name="siteSettings"></a></p>
+<p>This section of the settings defines various general settings used in multiple 
+  areas of the site.</p>
+<ul>
+  <li>Use tinyMCE WYSIWYG editor - The tinyMCE editor is a javascript text editor 
+    that gives limited &quot;word processor&quot; functionality to the textareas 
+    of forms. Members also have the option of turning this setting off (if the 
+    site administrator has turned it on) in their preferences.</li>
+  <li>Allowed Tags - The HTML tags that will be allowed in uploaded content (stories, 
+    reviews, bios) throughout the site. <strong>Note: </strong>If you use the 
+    tinyMCE editor, it will alter some tags. The &lt;i&gt; tag becomes &lt;em&gt;. 
+    The &lt;b&gt; tag becomes &lt;strong&gt;. These tags need to be included in 
+    the list for tinyMCE to work properly.</li>
+  <li>Number of categories - Whether or not your site has multiple categories. 
+  </li>
+  <li>Turn on News Comments - Whether comments are allowed on news stories.</li>
+  <li>Turn on Action Log - This option allows administrators to keep log of a 
+    variety of actions throughout the site.</li>
+  <li>Maintenance - This setting puts the site into maintenance mode. This prevents 
+    visitors from entering the site while the administrator works on it. </li>
+  <li>Display Debug Information - Turn this setting on will place various pieces 
+  of information in HTML comments that will help with fixing problems on the 
+  site.</li>
+  <li>Use captcha confirmation - Turn this setting on to require a security code 
+  confirmation at registration and for anonymous input such as challenges and 
+  reviews.</li>
+</ul>
+<p>Display Settings<a name="displaySettings"></a></p>
+<p>This section of the settings defines how various elements of the site are displayed.</p>
+<ul>
+  <li>Date format - The format dates will be displayed in throughout the site. 
+    There are a number of pre-made options or adminstrators may enter a custom 
+    option. The date format uses the format of the <a href="http://us2.php.net/manual/en/function.date.php">php 
+    date function</a>. <strong>Note:</strong> the shoutbox date and time format 
+    can be selected separately.</li>
+  <li>Time format - The format time will be displayed in throughout the site. 
+    The base eFiction script uses this only in the news items. The time format 
+    uses the format of the <a href="http://us2.php.net/manual/en/function.date.php">php 
+    date function</a>. <strong>Note:</strong> the shoutbox date and time format 
+    can be selected separately.</li>
+  <li>Display category path in listings - This setting defines whether or not 
+    the &quot;breadcrumb&quot; path to a category's parent category is displayed 
+    in the story listings.</li>
+  <li>Number of columns - The number of columns to display in information in. 
+    This will be used for the display of members lists and when browsing classifications, 
+    characters, categories, etc.</li>
+  <li>Default items per page - The number of items to display per page. This will 
+    also be the number of items to display per column in multi-column output.</li>
+  <li>Number of days to limit Most Recent - The number of days to limit the Most 
+    Recent list. Leave this empty to impose no limit. When a limit is imposed 
+    that limit will also be used for the &quot;New!&quot; indicator on story listings.</li>
+  <li>Default story sort - The default method of sorting stories.</li>
+  <li>Use Story Index - This setting defines whether clicking on a story takes 
+    the visitor to the story's index (table of contents) or the first chapter. 
+    <strong>Note: </strong>Members may override this setting in their preferences.</li>
+  <li>Display Profile - This setting defines whether or not the user's profile 
+    information appears at the top of every page within the profile or only on 
+    the &quot;Profile&quot; tab.</li>
+  <li>Style of Page links - There are three possible styles of page links. 
+    <ul>
+      <li>Next and Previous - A range of pages plus &quot;Next&quot; and &quot;Previous&quot; 
+        links. For Example: <a href="#prev">Previous</a> <a href="#3">3</a><a href="#4">4</a><a href="#5">5</a><a href="#6">6</a><a href="#7">7</a> 
+        <a href="#next">Next</a></li>
+      <li>First and Last Pages - A range of pages plus the first and last page. 
+        For Example: <a href="#1">1</a>...<a href="#3">3</a><a href="#4">4</a><a href="#5">5</a><a href="#6">6</a><a href="#7">7</a>...<a href="#10">10</a> 
+      </li>
+      <li>Both - A range of pages plus both first and last and next and previous 
+        links. For Example: <a href="#prev">Previous</a> <a href="#1">1</a>...<a href="#3">3</a><a href="#4">4</a><a href="#5">5</a><a href="#6">6</a><a href="#7">7</a>...<a href="#10">10</a> 
+        <a href="#next">Next</a></li>
+    </ul>
+  </li>
+  <li>Size of Range for Page Links - The number of pages in the range of page 
+    links to display. In the examples above, the range was 5 pages (3-7).</li>
+</ul>
+<p>Review Settings<a name="reviewSettings"></a></p>
+<p>This section of the settings defines how reviews are handled.</p>
+<ul>
+  <li>Turn on reviews - This defines whether or not reviews are allowed at all.</li>
+  <li>Allow anonymous reviews - This defines whether or not visitors must be logged 
+    in to be able to review.</li>
+  <li>Authors may delete reviews - This defines what reviews (if any) authors 
+    may delete for their stories.</li>
+  <li>Ratings system - This is different from the ratings you defined. This rating 
+    system allows reviewers to &quot;rate&quot; how much they liked or disliked 
+    a story. There are two systems of ratings built into eFiction. 
+    <ul>
+      <li>Stars - Five stars (and half stars) ratings</li>
+      <li>Like/Dislike - Thumbs up/Thumbs down system.</li>
+    </ul>
+  </li>
+  <li>Allow Ratings Only - Defines whether or not reviewers may leave only a rating 
+    for a story without a text review.</li>
+</ul>
+<p>User Settings<a name="userSettings"></a></p>
+<p>This section of the settings defines how the site interacts with users for 
+  certain things.</p>
+<ul>
+  <li>Alerts on - Defines whether or not members can receive e-mailed alerts when 
+    their favorite stories and authors are updated.</li>
+  <li>Warning pop-ups only once - Defines whether or not warning pop-ups appear 
+    only once for the session or each time the visitor clicks on a story for that 
+    rating.</li>
+  <li>Age statement in user profile - Defines whether or not an age-consent statement 
+    appears in the user preferences form. When a user confirms their age via the 
+    age-consent form, the warnings for age-restricted stories do not appear to 
+    him/her.</li>
+  <li>Password at Registration - Defines whether the password at registration 
+    is user defined or random.</li>
+</ul>
+<p>E-mail Settings<a name="emailSettings"></a></p>
+<p>This section defines how e-mails are sent out. If this information is supplied, 
+  the e-mail forms will use SMTP.</p>
+<ul>
+  <li>SMTP Host - The host for the SMTP server.</li>
+  <li>SMTP Username - The username for the SMTP server.</li>
+  <li>SMTP Password - The password for the SMTP server.</li>
+</ul>
+<p>Language Censor <a name="langCensor"></a></p>
+<p>This section is a list of words that will be forbidden in submissions to the 
+  site. They will be disallowed entirely in names and titles. They will be replaced 
+  with the first letter and trailing asterisks, a****, in summaries and the text 
+  of reviews. Seperate each word with a comma. Placing an asterisk before and/or 
+  after the word will act as a wildcard making the censor look for the entire 
+  word plus the word used as a suffix and/or prefix. For example, 'frog' will 
+  only find 'frog', '*frog' will find 'bullfrog' and 'frog' but not 'froglegs', 
+  'frog*' will find both 'frog' and 'froglegs' but not 'bullfrog', '*frog*' will 
+  find 'frog', 'bullfrog', and 'froglegs.' To disable the censor simply leave 
+  the list of words empty.</p>
+<p>Message Settings<a name="messageSettings"></a></p>
+<p>The links that follow this header in the settings area are to the default messages 
+  for the site. The installation script placed generic text for these messages 
+  into the database for you, but you will most likely wish to edit these messages 
+  to better reflect your site.</p>
+<ul>
+  <li>Welcome Message - The welcome message for your site. It is included in your 
+    skins using the {welcome} variable.</li>
+  <li>Copyright Footer - The footer message for your site. It is included in your 
+    skins using the {footer}variable.</li>
+  <li>Print Copyright Notice - This notice will be appended to the story text 
+    when the &quot;Printer Version&quot; is selected. </li>
+  <li>TinyMCE Configuration - If you wish to customize the configuration of the 
+    tinyMCE WYSIWYG editor you may enter your configuration information here.</li>
+  <li>Rejection Letter (default) - The default rejection letter for your site. 
+    You will have the option to customize this at the time each letter is sent.</li>
+  <li>Acceptance Letter (default) - The default acceptance letter for your site. 
+    You will have the option to customize this at the time each letter is sent.</li>
+</ul>
+<p>Blocks<a name="blocks"></a></p>
+<p>Blocks are another part of your eFiction site that let you configure the look 
+  and feel of your site. A number of blocks are included with eFiction. You can 
+  also create your own or add blocks others have created. The included blocks 
+  are as follows:</p>
+<ul>
+  <li>Categories - This block lists the top level categories on your site.</li>
+  <li>Featured - This block lists one or more of the featured stories of your 
+    site (depending on configuration).</li>
+  <li>Info - This block lists a variety of information about your site including 
+    the number of: members, authors, stories, words, reviews, and chapters. </li>
+  <li>Login - This block displays a login form allowing you to include a login 
+    form on the index page or every page should you choose.</li>
+  <li>Menu - This block builds a menu from the page links in your site. Configurable.</li>
+  <li>News- This block displays one or more of the news items on your site. </li>
+  <li>Online - This block displays who is presently online on your site.</li>
+  <li>Poll- This block lets you query your members using a multiple choice question. 
+    Also includes an archive of poll questions and results.</li>
+  <li>Random - This block displays a random story with each page load.</li>
+  <li>Recent - This block lists the most recently added/updated stories for your 
+    site. </li>
+  <li>Search - A simple search box for inclusion in your skins.</li>
+  <li>Shoutbox - A shoutbox for your site. Also includes an archive.</li>
+  <li>Skinchange - This block displays a drop down that will let visitors who 
+    aren't logged in select from the site's skins the one they wish to display.</li>
+</ul>
+<p>The first page here lists the blocks available to you. Some will have been 
+  pre-installed. The first column lists the name of the block and is not editable. 
+  The second column, which you can edit, displays the title of the block as it 
+  will be displayed on your site. The third column displays the block's status. 
+  There are three possible status options.</p>
+<ul>
+  <li>Inactive - The block is completely off.</li>
+  <li>Active - The block will load on <strong>every</strong> page.</li>
+  <li>Index Only - The block will load on the index (home) page <strong>only.</strong></li>
+</ul>
+<p>It is advisable that if the block does not display on every page, you set it 
+  to &quot;Index Only&quot; or &quot;Inactive&quot; as this will save on your 
+  site's resources. The one exception to this is the Online block. If you use 
+  this block, you <strong>must</strong> set it to &quot;Active&quot; for the block 
+  to work properly.</p>
+<p>The fourth column, gives you the option to admin the block if there are options 
+  to administer.</p>
+<p>You may also see the name of a block and the words &quot;Initialize Block&quot; 
+  instead of the last three columns. You will see this when a block is available 
+  to be installed, but has not been installed yet. The Online, Poll, Search and Shoutbox 
+  blocks are not installed by default. Click on &quot;Initialize Block&quot; then 
+  change the status of the block to &quot;Active&quot; or &quot;Index Only&quot; 
+  to activate it.</p>
+<p>Custom Pages<a name="customPages"></a></p>
+<p>This page allows you to add custom pages to your site. These pages may not 
+  contain php code, only HTML and plain text. Four custom pages are defined for 
+  you during the installation.</p>
+<ul>
+  <li>help - A help page for visitors.</li>
+  <li>tos - Terms of Service. This page is displayed on the registration page.</li>
+  <li>rules - Submission Rules. This page is displayed at the top of the story 
+    submission form and is also linked to the default help page.</li>
+  <li>maintenance - Maintenance Message. This is the message that is displayed 
+    to visitors when you place your site into maintenance mode.</li>
+</ul>
+<p>To add a custom page:</p>
+<ol>
+  <li>Goto Admin -&gt; Custom Pages</li>
+  <li>Click on &quot;Add New Custom Page&quot;</li>
+  <li>Enter the name of the page in the form. Note: The name for your page should 
+    contain letters, numbers, and the underscore character ONLY.</li>
+  <li>Enter the title for the page. The page title will also be the text of the 
+    link to the page in the page links.</li>
+  <li>Enter the text of your page. </li>
+  <li>Click the &quot;Submit&quot; button.<br>
+  </li>
+</ol>
+<p>The name you assign to your custom page will be the {NAME_link} variable for 
+  you to use in your skins. The script will append &quot;_link&quot; to the name 
+  to help prevent naming conflicts with other variables. The title will be the 
+  title of the page. For the URL of your custom page, you may use either viewpage.php?id=ID 
+  or viewpage.php?page=NAME where ID is the ID number of the page or NAME is the 
+  name of the page.</p>
+<p><strong>Note:</strong> The name for your page should contain letters, numbers, 
+  and the underscore character ONLY.</p>
+<p>Page Links<a name="pageLinks"></a></p>
+<p>This page controls the page links used in the menu block and available for 
+  use in the skin as individual links. </p>
+<p>Admins<a name="admins"></a></p>
+<p>This page is used to give admin privileges to a member of your site. The initial 
+  page lists all current admins and also gives you the option to add a new admin.</p>
+<p>To give a member admin privileges:</p>
+<ol>
+  <li>Click on &quot;Add New Admin&quot;</li>
+  <li>Select the member's penname from the drop-down list.</li>
+  <li>Select the level of admin privileges for this member.</li>
+  <li>Select the categories that member will oversee or leave blank to have them 
+    oversee all categories.</li>
+  <li>Check the box if you want this admin to receive e-mail notices of new stories 
+    to be validated.</li>
+  <li>Click &quot;Submit&quot;.</li>
+</ol>
+<p>PHP Info<a name="phpInfo"></a></p>
+<p>This page gives information about your server configuration. If you ever run 
+  into problems with your eFiction site, you may need to check these settings. 
+  This page is given as a courtesy. <strong>If you are upgrading from 1.1, </strong><strong>delete 
+  the phpinfo.php in the main folder</strong>. The phpinfo.php file included with 
+  1.1 was not secured and will allow hackers access to the same information it 
+  gives you. This admin page is only available to site administrators.</p>
+<p>Action Log<a name="actionLog"></a></p>
+<p>If you have turned the action log on for your site, this page is where those 
+  logs can be viewed. You can also purge the log here.</p>
+<p>Profile Information<a name="profileInfo"></a></p>
+<p> This admin panel lets you add/remove items from the member profile page. Right 
+  now, there are twelve items pre-loaded. </p>
+<ul>
+  <li>Live Journal</li>
+  <li>Web site</li>
+  <li>AOL</li>
+  <li>ICQ</li>
+  <li>MSN IM</li>
+  <li>Yahoo IM</li>
+  <li>Deviant Art</li>
+  <li>Beta-Reader</li>
+  <li>DeadJournal</li>
+  <li>Xanga</li>
+  <li>Gender</li>
+  <li>MySpace</li>
+</ul>
+<p>The majority of the pre-loaded items were in 2.0. To turn one of the pre-loaded 
+  items on/off. Click edit. Check the box next to &quot;Field enabled&quot; to 
+  turn the field on. On the same form you can change the name and title of the 
+  field. Just like the page links and custom pages, the name will be the variable 
+  for you to use in your .tpl files and the title will be what appears on screen 
+  in the registration/edit bio form and the profile.</p>
+<p>There are a number of types of fields defined.</p>
+<ul>
+  <li>URL - This is a url. The script will automatically turn this into a link 
+    when displaying it in the profile.</li>
+  <li>Select Box - A drop down select box to choose from a selection. In the form 
+    place each option in the box in a separate line.</li>
+  <li>Yes/No - Answer to a yes/no question.</li>
+  <li>ID with URL - These are like fanfiction or livejournal links where there 
+    is a base url with the user's id. Enter the url with {info} where the person's 
+    ID goes. For instance: http://{info}.livejournal.com. The registration/edit 
+    bio form will present a text box for the member to enter their id.</li>
+  <li>Custom code - This option lets you provide custom code to handle the entry 
+    and display of the item. The aol, icq, msn, and yahoo fields use custom code.</li>
+  <li>Text - This type gives the author a text box to enter information. The information 
+    is presented back as text as well. The limit on user text is 255 characters!</li>
+</ul>
+<p>Archive Maintenance<a name="Maint"></a></p>
+<p>This admin panel provides a number of functions for maintaining your site.&nbsp; </p>
+<ul>
+  <li>Recalculate Reviews - This function recalculates the number of reviews and 
+  the rating for the stories, series, and chapters on the site.</li>
+  <li>Fix Category Counts - This function has been moved from the Categories 
+  admin.&nbsp; It will recalculate the number of stories per category.</li>
+  <li>Optimize Database Tables - This function will optimize the tables in your 
+  database.&nbsp; Doing this occasionally will improve site performance.</li>
+  <li>Run Update - When you upload an update for the eFiction script, use this 
+  function to run any changes needed to the database.</li>
+</ul>
+<p>Default Panel List<a name="defaultPanels"></a></p>
+<p>Admin Panels:</p>
+<p>The admin panels control the different admin options for the site. In 2.0 the 
+  list was static. Putting the admin options into panels allows site owners the 
+  option of changing the access level for the various features. It also allows 
+  new options to be added without editing everything. The 0-4 levels in the panel 
+  are most applicable here. The levels 1 to 4 indicate the admin level required 
+  to access a certain feature.</p>
+<ul>
+  <li>Message Settings (1)</li>
+  <li> Rejection Letter (1)(2)</li>
+  <li> Validation Letter (1)(2)</li>
+  <li>Validate Submission (1)(2)</li>
+  <li> Censor (1)</li>
+  <li> Categories</li>
+  <li> Panels</li>
+  <li> Characters</li>
+  <li> Settings</li>
+  <li> Blocks</li>
+  <li> Ratings</li>
+  <li> Add New Story</li>
+  <li> Add New Series</li>
+  <li> Custom Pages</li>
+  <li> Classifications</li>
+  <li> News</li>
+  <li> Members</li>
+  <li> Featured Stories</li>
+  <li> Submissions</li>
+  <li> Page Links</li>
+  <li> Admins</li>
+  <li> Mail Users</li>
+  <li> Skins</li>
+  <li> PHP Info</li>
+  <li> Action Log</li>
+  <li> Profile Information</li>
+</ul>
+<p>Browse Panels:</p>
+<p>Browse panels control the &quot;Browse By&quot; area of the site. </p>
+<ul>
+  <li>Most Recent (1) </li>
+  <li>Featured Stories (1) </li>
+  <li>Classes (1)(2) </li>
+  <li>Categories</li>
+  <li> Characters</li>
+  <li> Ratings</li>
+  <li> Series</li>
+  <li> Titles</li>
+</ul>
+<p>Favorite Panels:</p>
+<p>The favorites panels are included both in the member &quot;Account Info&quot; 
+  page and the list of panels in the profile. In the &quot;Account Info&quot; 
+  area the panel must be set to level 1 to be visible in the list of options. 
+  Otherwise, they're used as part of the &quot;Manage Favorites&quot; panel.</p>
+<ul>
+  <li>Favorite Stories (1)</li>
+  <li> Favorite Series (1)</li>
+  <li> Favorite Authors (1)</li>
+  <li> {author}'s Favorites</li>
+</ul>
+<p>Top 10 List Panels:</p>
+<p>The Top 10 panel. They're all turned on my default. If you turn favorites off, 
+  it is suggested that you hide, not delete, the favorites panels. (You could 
+  change your mind later.)</p>
+<ul>
+  <li>10 Largest Series</li>
+  <li> 10 Smallest Series</li>
+  <li> 10 Most Reviewed Series</li>
+  <li> 10 Longest Stories</li>
+  <li> 10 Shortest Stories</li>
+  <li> 10 Most Reviewed Stories</li>
+  <li> 10 Most Read Stories</li>
+  <li> 10 Most Responded to Challenges</li>
+  <li> 10 Most Favorite Stories</li>
+  <li> 10 Most Prolific Reviewers</li>
+  <li> 10 Most Prolific Authors</li>
+  <li> 10 Most Reviewed Recommendations</li>
+</ul>
+<p>Profile Panels:</p>
+<p>These are the panels that will be displayed on the user's profile page along 
+  with the non-hidden favorites panels. </p>
+<ul>
+  <li>Contact (1)(2)</li>
+  <li> Stories by {author}</li>
+  <li> Series by {author}</li>
+  <li> Reviews by {author}</li>
+</ul>
+<p>Submissions Panels:</p>
+<p>The submission panels will only be displayed in the user panel if submissions 
+  are turned on. They were placed in a type seperate from the user panels so they 
+  would be turned on and off together based on the submission site settings.</p>
+<ul>
+  <li>Add New Story</li>
+  <li> Manage Stories</li>
+  <li> Add New Series</li>
+  <li> Manage Series</li>
+  <li> Manage Images</li>
+</ul>
+<p>User Account Panels:</p>
+<p>As an extra level of security here. The &quot;level&quot; of the panel should 
+  be set to either 0 or 1. Panels with level 0 will be displayed to anyone. Panels 
+  with level 1 will be displayed only to logged in members. The login, register, 
+  and lost password panels are currently the only panels set to level 0 for the 
+  user account area.</p>
+<ul>
+  <li>Login (1)</li>
+  <li>Your Reviews (1)</li>
+  <li> Reviews Received (1)</li>
+  <li> Review Response (1)(2)</li>
+  <li> Lost Password</li>
+  <li> Register</li>
+  <li> Edit Bio</li>
+  <li> Edit Preferences</li>
+  <li> View Your Statistics</li>
+  <li> Manage Favorites</li>
+  <li> Logout</li>
+</ul>
+<p>(1) Hidden by default.<br>
+  (2) System panels. You should not need to alter these settings and may cause 
+  errors if you do.</p>

--- /dev/null
+++ b/docs/adminmanual_en.htm
@@ -1,1 +1,837 @@
-
+<ul>
+  <li>Installation 
+    <ul>
+      <li><a href="#newInstall">New Installation</a></li>
+      <li><a href="#upgrade20">Upgrade from 2.0.X</a></li>
+      <li><a href="../../../../../Documents%20and%20Settings/HP_Administrator/Desktop/upgrade11">Upgrade 
+        from 1.1</a></li>
+      <li><a href="#translate">Translating eFiction</a></li>
+    </ul>
+  </li>
+  <li>Administration 
+    <ul>
+      <li><a href="#initConfig">Initial Configuration</a></li>
+      <li><a href="#addNewSeries">Add New Series</a></li>
+      <li><a href="#addNewStory">Add New Story</a></li>
+      <li><a href="#featuredStories">Featured Stories</a></li>
+      <li><a href="#news">News</a></li>
+      <li><a href="#submissionQueue">Submissions</a></li>
+      <li><a href="#skins">Skins</a></li>
+      <li><a href="#categories">Categories</a></li>
+      <li><a href="#characters">Characters</a></li>
+      <li><a href="#ratings">Ratings</a></li>
+      <li><a href="#addClass">Classifications</a></li>
+      <li><a href="#members">Members</a></li>
+      <li><a href="#mailUsers">Mail Users</a></li>
+      <li><a href="#panels">Panels</a></li>
+      <li><a href="#settings">Settings</a></li>
+      <li><a href="#blocks">Blocks</a></li>
+      <li><a href="#customPages">Custom Pages</a></li>
+      <li><a href="#pageLinks">Page Links</a></li>
+      <li><a href="#admins">Admins</a></li>
+      <li><a href="#phpInfo">PHP Info</a></li>
+      <li><a href="#actionLog">Action Log</a></li>
+      <li><a href="#profileInfo">Profile Information</a></li>
+      <li><a href="#Modules">Modules</a></li>
+      <li><a href="#Maint">Archive Maintenance</a></li>
+    </ul>
+  </li>
+  <li>Skins 
+    <ul>
+      <li>Designing</li>
+      <li>Modifying</li>
+      <li>Upgrading from 2.0</li>
+      <li>Upgrading from 1.1</li>
+    </ul>
+  </li>
+  <li>Credits</li>
+  <li>Appendix
+    <ul>
+      <li><a href="#defaultPanels">Default Panels</a></li>
+    </ul>
+  </li>
+</ul>
+<p><strong><a name='newInstall'>New Installation</a></strong></p>
+<ol>
+  <li> If you intend to write the story texts to the server or allow image uploads 
+    CHMOD the folder you intend to store the stories in to 777. If this folder 
+    is missing the script will <strong>attempt</strong> to create it for you during 
+    the install.</li>
+  <li> Move config.php from the docs folder to the main eFiction folder. If the 
+    config.php is missing the install script will <strong>attempt</strong> to 
+    create it, but it's best if you move it.</li>
+  <li>CHMOD config.php to 666. </li>
+  <li>Using your web browser, go to the URL for your website(i.e. http://www.yoursite.com) 
+    to run the install and set up the admin login. </li>
+  <li>Login with the admin login and password set in step #4, and complete the 
+    configuration of your site through the Admin panel.</li>
+</ol>
+<p><strong>Upgrade from 2.0.X<a name="upgrade20"></a></strong></p>
+<p>BACK UP YOUR FILES AND YOUR DATABASE FIRST!! Upload the 3.0 files OVER your 
+  2.0 files. DO NOT DELETE YOUR 2.0 FILES UNTIL THE UPGRADE IS COMPLETE! Go to 
+  your site. The script will detect that the config.php file is for 2.0 and start 
+  the upgrade. </p>
+<p><strong>Note: </strong>You're encouraged to choose one of the skins provided 
+  with the 3.0 script until you can update your 2.0 skins.</p>
+<p><strong>Upgrade from 1.1<a name="upgrade11"></a></strong></p>
+<p>BACK UP YOUR FILES AND YOUR DATABASE FIRST!! Upload the 3.0 files OVER your 
+  1.1 files. DO NOT DELETE YOUR 2.0 FILES UNTIL THE UPGRADE IS COMPLETE! Go to 
+  your site. The script<br>
+  will detect that the config.php file is for 1.1 and start the upgrade. </p>
+<p><strong>Note: </strong>You're encouraged to choose one of the skins provided 
+  with the 3.0 script until you can update your 1.1 skins.</p>
+<p><strong>Note 2</strong>: Make sure your config.php file is CHMOD'd to 666.</p>
+<p><strong>Note 3:</strong> If you have installed blocks that did not come with 
+  the 2.0 package, turn them off before starting the upgrade. They will most likely 
+  be incompatible!</p>
+<p>Initial Configuration<a name="initConfig"></a></p>
+<p>After the install script has finished there are still a number of elements 
+  of the archive that you must configure before your archive will be operational. 
+</p>
+<ul>
+  <li><a href="#ratings">Ratings</a> - Ratings are a required element for story 
+    submission. Ratings are intended to show the intended audience for a story 
+    much as the MPAA ratings work for movies. <strong>Note:</strong> You are strongly 
+    advised not to use the MPAA ratings for your archive as they have threatened 
+    archives with legal action for doing so.</li>
+  <li><a href="#categories">Categories</a> (if you chose to have more than one) 
+    - How you categorize your archive is at your discretion. Some archives use 
+    categories for different fandoms. Others use categories for types of story 
+    within a fandom. </li>
+  <li><a href="#characters">Characters</a> - Characters is a list of characters 
+    used in your stories. Characters can be defined as sitewide or assigned to 
+    a specific category.</li>
+  <li><a href="#addClass">Classifications</a> - Classifications are other types 
+    of &quot;classifications&quot; you want to sort your stories into. In 1.1 
+    and 2.0, classifications were hard-coded as genres and warnings. To add new 
+    classifications or modify existing classifications required editing a number 
+    of core files. With 3.0, you can designate your own classifications. Other 
+    classifications that could be used are: spoilers, pairings, story type, language.</li>
+  <li><a href="#news">News</a> - It's a good idea to write an initial news story.</li>
+  <li><a href="#messageSettings">Message Settings</a> - The install script will 
+    load some default messages for your site. You will most likely wish to customize 
+    these messages to fit your site. </li>
+  <li><a href="#customPages">Custom Pages</a> - Four custom pages are defined 
+    in the installation. You will most likely wish to customize these pages to 
+    fit your site.</li>
+  <li><a href="#profileInfo">Additional User Profile Fields</a> - A number of 
+    optional user profile fields were installed though only a few were turned 
+    on. You will want to go to Admin-&gt;Profile Information and configure the 
+    user profile fields that you want on. If you want a custom profile field, 
+    now's the time to add that too.</li>
+</ul>
+<p><strong>Note: </strong>If you intend to bridge your eFiction site with another 
+  script. It's advisable to do it now before you open for business.</p>
+<p>Translating eFiction<a name="translate"></a></p>
+<p>You can modify most of the text that is displayed in the script by changing 
+  the language file in the languages/ folder for the language you selected. Copy 
+  the en.php and en_admin.php files and rename them to your chosen language. For 
+  instance, en.php would become es.php for Spanish or ru.php for Russian. Just 
+  change the text within the quotes for each line to whatever you want it to say. 
+  Some wording is included within the skin's files. If you have created a translation 
+  for eFiction, we encourage you to share it!</p>
+<p>Add New Series<a name="addNewSeries"></a></p>
+<p>Series are collections of related stories by the same or multiple authors. 
+  A story and its sequels, for example, would be a series. Series might also be 
+  used for a &quot;shared universe&quot; in which multiple authors write. The 
+  person who creates the series is considered the series &quot;owner&quot; and 
+  controls whether or not the series is &quot;open&quot; to contributions by other 
+  authors or not. Even if the series is &quot;closed&quot;, the series owner has 
+  the option to include stories from other authors in the series. This form is 
+  the same as members with an additional option to select the owner of the series. 
+</p>
+<p>Add New Story<a name="addNewStory"></a></p>
+<p>This form is the same as members use in the &quot;Account Info&quot; area except 
+  it has an additional option to select the author of the series. You will also 
+  see options to validate and mark the story as featured. </p>
+<p>Featured Stories<a name="featuredStories"></a></p>
+<p>This page allows administrators to manage the featured stories of the site. 
+  A story may initially be marked as featured:</p>
+<ol>
+  <li>From the add/edit story form.</li>
+  <li>By clicking on the &quot;Featured&quot; link in the &quot;Admin Options&quot; 
+    list for the story.</li>
+</ol>
+<p>Once a story has been marked it will appear in a table on this admin page. 
+  From here, site administrators may choose to &quot;retire&quot; the story or 
+  remove it's featured status entirely.</p>
+<p>News<a name="news"></a></p>
+<p>This page is used to add and administer the news stories for the site. </p>
+<p>Submissions<a name="submissionQueue"></a></p>
+<p>This page allows site adminstrators to manage the stories in the submission 
+  queue. This page is only used when automatic validation of stories is turned 
+  off and admistrators are manually validating stories. This page will list the 
+  stories waiting in the queue. </p>
+<p>Skins<a name="skins"></a></p>
+<p>This page lets site administrators &quot;hide&quot; skins from members. Administrators 
+  are advised to do this while they work on developing a new skin.</p>
+<p>Categories<a name="categories"></a></p>
+<p>This page is used to manage the site categories. To view a category's sub-categories 
+  in the list click on the &quot;+&quot; sign next to the name of the category.</p>
+<p>To add categories:</p>
+<ol>
+  <li>Goto Admin -&gt; Categories.</li>
+  <li>For a new top level category click &quot;Add New Top Level Category&quot; 
+    or for a new sub-category click on the &quot;Sub-Category&quot; link in the 
+    Options column for the parent category.</li>
+  <li>Enter the category information and click &quot;Submit&quot;. A locked category 
+    is a category where new story submissions are not accepted. It is generally 
+    used to &quot;lock&quot; top level categories and force submissions into sub-categories 
+    beneath the locked category.</li>
+</ol>
+<p>Characters<a name="characters"></a></p>
+<p>This page is used to manage the characters. Characters for a specific category 
+  can be added from the categories page or directly from this page. </p>
+<p>To add characters:</p>
+<ol>
+  <li>Choose on the category in which to place the characters (or &quot;Sitewide&quot; 
+    to make the characters accessible site wide). </li>
+  <li>Choose on the number of characters to add.</li>
+  <li>Click &quot;Submit&quot;.</li>
+  <li>You will now be presented with a form in which to enter the information 
+    about each character. A bio for the character is optional. If entered, it 
+    will appear at the top of the &quot;Browse&quot; page for that character.</li>
+</ol>
+<p>Ratings<a name="ratings"></a></p>
+<p><strong>Ratings are a required element for story submission.</strong> Ratings 
+  are intended to show the intended audience for a story much as the MPAA ratings 
+  work for movies. <strong>Note:</strong> You are strongly advised not to use 
+  the MPAA ratings for your archive as they have threatened archives with legal 
+  action for doing so. The story's rating can also be used to limit access to 
+  certain stories. </p>
+<ul>
+  <li>Rating - The text of the rating. This is limited to 60 characters.</li>
+  <li>Warning Pop-up - If this box is checked, a warning pop-up will be displayed 
+    for stories with this rating. The text of this warning is defined in the &quot;Warning 
+    text&quot; field. If warning pop-up's only once is selected in the settings, 
+    the site will remember whether or not this rating warning has appeared and 
+    will only display it once. If it is not selected, the warning pop-up will 
+    display each time.</li>
+  <li>Age Consent Required - If this box is checked, the visitor must have confirmed 
+    they are an adult (either via their preferences if they're logged in or via 
+    the warning pop-up) before they can view stories with this rating.</li>
+  <li>Registered Users Only - If this box is checked, the visitor must be logged 
+    in to view stories with this rating.</li>
+  <li>Warning text- The warning text that will be displayed to the user in the 
+    pop-up warning (if any).</li>
+</ul>
+<p> Classifications<a name="addClass"></a></p>
+<p>Classifications take the place of the genres and warnings from 1.1 and 2.0. 
+  The change lets you define your own classifications without hacking into the 
+  files. </p>
+<p>To add a new classifcation type:</p>
+<ol>
+  <li> Goto Admin -&gt; Classifications.</li>
+  <li>Click on &quot;Add New Classification Type&quot;.</li>
+  <li>Enter the name and title for the classification type such as &quot;genres&quot; 
+    or &quot;warnings&quot;. The title can be anything you like. The title will 
+    be what is displayed on screen. The name will be used in your skin template 
+    as a variable so it should be a unique one word description. As an example: 
+    enter the name as &quot;genre&quot; and the title as &quot;Genres&quot;.</li>
+  <li>Click &quot;Submit&quot;.</li>
+  <li>After you click submit you'll be taken back to the table listing your classification 
+    types. </li>
+  <li>Click on the classification type (&quot;Genres&quot; to continue the example). 
+    This will take you to the list of classifications within that type. </li>
+  <li>Click &quot;Add New Classifications&quot; to go to the form to add your 
+    classifications for that type. You'll have as many blanks on this form as 
+    you've set items per page.</li>
+  <li>Enter the classifications (to continue the example: romance, action/adventure, 
+    mystery) one in each text box.</li>
+  <li>Click submit.</li>
+</ol>
+<p>To edit a classification or classification type click &quot;Edit&quot; in the 
+  options in the table. To delete a classification click &quot;delete&quot; in 
+  the options.</p>
+<p>Members<a name="members"></a></p>
+<p>This page gives site administrators a number of options for managing the members 
+  of their site. <strong>Note: </strong>Some of these options may be unavailable 
+  if you have bridged your eFiction site to another application.</p>
+<p>At the top of the page are a number of options to sort members by:</p>
+<ul>
+  <li>All Members - lists all members</li>
+  <li>Admins - lists all administrators</li>
+  <li>Authors - lists only members who have submitted stories to the archive</li>
+  <li>Authors Input by Admins - lists authors who have been added by admins. <strong>Note: 
+    </strong>Will not function for bridged sites.</li>
+  <li>Non-validated Members - lists members who have not been validated. </li>
+  <li>Validated Members - lists members who have been validated</li>
+  <li>Locked Members - lists members whose accounts have been locked (banned)</li>
+  <li>Unlocked Members - lists members whose accounts are active (non-banned)</li>
+</ul>
+<p>Validated members are members whose stories by-pass the validation queue and 
+  are accepted automatically in archives where administrators are validating stories 
+  manually. By clicking on a members name in one of the last four lists, you are 
+  choosing to take that action on that member. For instance, if you click on a 
+  member's name in the Non-validated Members list, you will be taken to a page 
+  that will let you validate that member. The reverse is also true, if you click 
+  on a member's name in the Validated Members list, you will be taken to a page 
+  that will let you revoke the validated status for that member.</p>
+<p>An additional option, at the bottom of the page, for non-bridged sites is the 
+  ability to add new members. These are the members that appear in the &quot;Authors 
+  Input by Admins&quot; list. When clicking on a name in that list, administrators 
+  are given the option to release the author's account to their control.</p>
+<p>Mail Users<a name="mailUsers"></a></p>
+<p>Site administrators can use this option to mail all members of the site. Administrators 
+  may also limit the email to authors or admins in a certain category of the site.</p>
+<p>Modules<a name="Modules"></a></p>
+<p>This panel will let your control the modules installed on your site. The script 
+  comes with one module, challenges. You can find other modules created by others 
+  or create your own. Modules are add-on programs that add functionality to your 
+  site without you needing to edit the files.</p>
+<p>Panels<a name="panels"></a></p>
+<p>Panels are new in 3.0. The panels system has been implemented to make eFiction 
+  more configurable and easier to customize. Panels are used in a number of places 
+  throughout the site. Each panel is  assigned a type. The following types are 
+  defined as part of the basic eFiction site:</p>
+<ul>
+  <li>A - Admin panels</li>
+  <li>F - Favorites</li>
+  <li>S - Submissions</li>
+  <li>B - Browse</li>
+  <li>P - Member Profile</li>
+  <li>U - Member Account</li>
+  <li>L - Top 10 Lists</li>
+</ul>
+<p>Developers and site administrators also have the option of developing their 
+  own types of panels. <a href="#defaultPanels">See the list of default panels.</a></p>
+<p>To modify the panel order, select a panel type from the drop-down list at the 
+  top of the page then use the arrows to move the panels up and down in the list. 
+  To change panel from hidden to visible, click on the edit option to the right 
+  of the panel name. </p>
+<p>To add a new panel:</p>
+<ol>
+  <li>Click &quot;Add New Panel&quot;.</li>
+  <li>Enter the name of the panel. This should be one word alpha-numeric name 
+    used to identify the panel.</li>
+  <li>Enter the title of the panel. This will be the text displayed on the site 
+    for the panel.</li>
+  <li>Enter a URL to the panel. If no URL is supplied the script will look for 
+    a file with the name of the panel in the default location for that panel type. 
+    For instance, for the browse panel named &quot;recent&quot;, the script looks 
+    in the browse folder for a file named recent.php. You will need to supply 
+    a URL for panels located outside the default location or if you name the file 
+    differently than the panel. An example of this would be the browse panel for 
+    the challenges module, the URL is &quot;modules/challenges/browse.php&quot;. 
+    The file is both outside the default location (the browse/ folder) and also 
+    named differently than the panel. The panel is named &quot;challenges&quot;, 
+    but the file is named &quot;browse.php&quot;. <strong>Note: </strong>Panels 
+    are not interchangable. You cannot use a browse panel for a top ten list panel. 
+  </li>
+  <li>The panel level is used to determine who has access to that panel. This 
+    is most applicable to the admin and member account panels. In the admin panels 
+    the level is the admin level required to access the panel. In the member account 
+    panels, it is used to determine whether or not the visitor must be logged 
+    in to see the panel. 0 is for visitor access (registration, lost password, 
+    login) and 1 is for member access (everything else).</li>
+  <li>Check the hidden box of you want this panel to be hidden (not displayed 
+    in the list of panels).</li>
+  <li>Finally, enter the one letter code for the panel type. (See the above list)</li>
+  <li>Click &quot;Submit&quot;.</li>
+</ol>
+<p>Settings<a name="settings"></a></p>
+<p>In eFiction 3.0 the site settings have been grouped into sections to make the 
+  numerous options easier to manage.</p>
+<ul>
+  <li><a href="#siteInfo">Site Information</a></li>
+  <li><a href="#subSettings">Submission Settings</a></li>
+  <li><a href="#siteSettings">Site Settings</a></li>
+  <li><a href="#displaySettings">Display Settings</a></li>
+  <li><a href="#reviewSettings">Review Settings</a></li>
+  <li><a href="#userSettings">User Settings</a></li>
+  <li><a href="#emailSettings">E-mail Settings</a></li>
+  <li><a href="#langCensor">Language Censor</a></li>
+  <li><a href="#messageSettings">Message Settings</a></li>
+  <li><a href="#profileInfo">Profile Information</a></li>
+</ul>
+<p>Site Information<a name="siteInfo"></a></p>
+<p>This section of the settings defines general information about your site.</p>
+<ul>
+  <li>Site Key - You will have defined a site key during installation. <strong>DO 
+    NOT EDIT IT! </strong>If you edit the site key, you will need to manually 
+    update the site key information in your config.php file to match or your site 
+    will stop functioning.</li>
+  <li>Site Name - The name of your site. This will be displayed in the title of 
+    your site's pages.</li>
+  <li>Site Slogan - A slogan for your site. This will also be displayed in the 
+    title of your site's pages.</li>
+  <li>Site Url - The URL to your eFiction site. <strong>Note:</strong> This <strong>must 
+    </strong> be the URL to your eFiction site as the script uses this url in 
+    various places including emails sent to your members. It <strong>must not</strong> 
+    be the URL to any parent site.</li>
+  <li>Table Prefix - The prefix to your database tables. This was also set during 
+    installation and should also <strong>NEVER </strong> be changed or your site 
+    will cease to function. </li>
+  <li>Admin E-mail - The e-mail address used to send and receive e-mails from 
+    the site. This must be a valid email address!</li>
+  <li>Default Skin - The default skin displayed on the site. <strong>Note: </strong>When 
+    you change this as an administrator, your <strong>personal </strong>skin choice 
+    will still appear to you. You will most likely need to log out to see the 
+    site default you have chosen.</li>
+  <li>Language - The langauge the site will display in. The eFiction download 
+    comes with the English language files. <a href="#translating">See Translating 
+    eFiction.</a></li>
+</ul>
+<p>Submission Settings<a name="subSettings"></a></p>
+<p>This section of the settings defines various submission settings for the site.</p>
+<ul>
+  <li>Turn off unsolicited submissions - If &quot;yes&quot; is selected, submissions 
+    to the site can only be made by administrators through the &quot;Admin&quot; 
+    area. If &quot;no&quot; is selected members will have the option of submitting 
+    stories via the &quot;Account Info&quot; link.</li>
+  <li>Automatically validate all stories - If &quot;yes&quot; is selected, stories 
+    will automatically be displayed on the site. If &quot;no&quot; is selected, 
+    stories will be placed into a validation queue for administrators approval 
+    and stories will not appear on the site with this approval.</li>
+  <li>Co-authors allowed - This is a new feature in 3.0. By choosing &quot;yes&quot;, 
+    authors will be allowed to mark other members as co-authors of their stories 
+    in the submission process. Note that co-authors have the same rights to edit, 
+    add to, and delete the story as the author.</li>
+  <li>Allow round robins - Select &quot;yes&quot; if you wish to allow round robins 
+    in your archive.</li>
+  <li>Allow image uploads- Select &quot;yes&quot; if you wish to allow members 
+    to upload images to their account area. </li>
+  <li>Maximum image size 
+    <ul>
+      <li>Maximum image height - The maximum height for image uploads</li>
+      <li>Maximum image width - The maximum width for image uploads</li>
+    </ul>
+  </li>
+  <li>Stories saved in - The default is &quot;files&quot; on the server. You may 
+    also elect to save the text of the stories to the database. This is another 
+    setting that should not be altered after the inital setup of the site. Click 
+    on the checkbox next to the setting to activate it then use the drop down 
+    box to change the setting. <strong>Note: </strong> If your web server has 
+    safe_mode on, you should use the &quot;mysql&quot; option.</li>
+  <li>Stories path - The path to the folder on the server where your story files 
+    will be saved. This should be a relative path and should also not be changed 
+    after the initial setup of the archive. </li>
+  <li>Chapter word count limits - The maximum and minimum allowable word counts 
+    for chapters on the site. If you are storing your story text in the database, 
+    a maximum word count of 17000 is suggested. </li>
+</ul>
+<p>Site Settings<a name="siteSettings"></a></p>
+<p>This section of the settings defines various general settings used in multiple 
+  areas of the site.</p>
+<ul>
+  <li>Use tinyMCE WYSIWYG editor - The tinyMCE editor is a javascript text editor 
+    that gives limited &quot;word processor&quot; functionality to the textareas 
+    of forms. Members also have the option of turning this setting off (if the 
+    site administrator has turned it on) in their preferences.</li>
+  <li>Allowed Tags - The HTML tags that will be allowed in uploaded content (stories, 
+    reviews, bios) throughout the site. <strong>Note: </strong>If you use the 
+    tinyMCE editor, it will alter some tags. The &lt;i&gt; tag becomes &lt;em&gt;. 
+    The &lt;b&gt; tag becomes &lt;strong&gt;. These tags need to be included in 
+    the list for tinyMCE to work properly.</li>
+  <li>Number of categories - Whether or not your site has multiple categories. 
+  </li>
+  <li>Turn on News Comments - Whether comments are allowed on news stories.</li>
+  <li>Turn on Action Log - This option allows administrators to keep log of a 
+    variety of actions throughout the site.</li>
+  <li>Maintenance - This setting puts the site into maintenance mode. This prevents 
+    visitors from entering the site while the administrator works on it. </li>
+  <li>Display Debug Information - Turn this setting on will place various pieces 
+  of information in HTML comments that will help with fixing problems on the 
+  site.</li>
+  <li>Use captcha confirmation - Turn this setting on to require a security code 
+  confirmation at registration and for anonymous input such as challenges and 
+  reviews.</li>
+</ul>
+<p>Display Settings<a name="displaySettings"></a></p>
+<p>This section of the settings defines how various elements of the site are displayed.</p>
+<ul>
+  <li>Date format - The format dates will be displayed in throughout the site. 
+    There are a number of pre-made options or adminstrators may enter a custom 
+    option. The date format uses the format of the <a href="http://us2.php.net/manual/en/function.date.php">php 
+    date function</a>. <strong>Note:</strong> the shoutbox date and time format 
+    can be selected separately.</li>
+  <li>Time format - The format time will be displayed in throughout the site. 
+    The base eFiction script uses this only in the news items. The time format 
+    uses the format of the <a href="http://us2.php.net/manual/en/function.date.php">php 
+    date function</a>. <strong>Note:</strong> the shoutbox date and time format 
+    can be selected separately.</li>
+  <li>Display category path in listings - This setting defines whether or not 
+    the &quot;breadcrumb&quot; path to a category's parent category is displayed 
+    in the story listings.</li>
+  <li>Number of columns - The number of columns to display in information in. 
+    This will be used for the display of members lists and when browsing classifications, 
+    characters, categories, etc.</li>
+  <li>Default items per page - The number of items to display per page. This will 
+    also be the number of items to display per column in multi-column output.</li>
+  <li>Number of days to limit Most Recent - The number of days to limit the Most 
+    Recent list. Leave this empty to impose no limit. When a limit is imposed 
+    that limit will also be used for the &quot;New!&quot; indicator on story listings.</li>
+  <li>Default story sort - The default method of sorting stories.</li>
+  <li>Use Story Index - This setting defines whether clicking on a story takes 
+    the visitor to the story's index (table of contents) or the first chapter. 
+    <strong>Note: </strong>Members may override this setting in their preferences.</li>
+  <li>Display Profile - This setting defines whether or not the user's profile 
+    information appears at the top of every page within the profile or only on 
+    the &quot;Profile&quot; tab.</li>
+  <li>Style of Page links - There are three possible styles of page links. 
+    <ul>
+      <li>Next and Previous - A range of pages plus &quot;Next&quot; and &quot;Previous&quot; 
+        links. For Example: <a href="#prev">Previous</a> <a href="#3">3</a><a href="#4">4</a><a href="#5">5</a><a href="#6">6</a><a href="#7">7</a> 
+        <a href="#next">Next</a></li>
+      <li>First and Last Pages - A range of pages plus the first and last page. 
+        For Example: <a href="#1">1</a>...<a href="#3">3</a><a href="#4">4</a><a href="#5">5</a><a href="#6">6</a><a href="#7">7</a>...<a href="#10">10</a> 
+      </li>
+      <li>Both - A range of pages plus both first and last and next and previous 
+        links. For Example: <a href="#prev">Previous</a> <a href="#1">1</a>...<a href="#3">3</a><a href="#4">4</a><a href="#5">5</a><a href="#6">6</a><a href="#7">7</a>...<a href="#10">10</a> 
+        <a href="#next">Next</a></li>
+    </ul>
+  </li>
+  <li>Size of Range for Page Links - The number of pages in the range of page 
+    links to display. In the examples above, the range was 5 pages (3-7).</li>
+</ul>
+<p>Review Settings<a name="reviewSettings"></a></p>
+<p>This section of the settings defines how reviews are handled.</p>
+<ul>
+  <li>Turn on reviews - This defines whether or not reviews are allowed at all.</li>
+  <li>Allow anonymous reviews - This defines whether or not visitors must be logged 
+    in to be able to review.</li>
+  <li>Authors may delete reviews - This defines what reviews (if any) authors 
+    may delete for their stories.</li>
+  <li>Ratings system - This is different from the ratings you defined. This rating 
+    system allows reviewers to &quot;rate&quot; how much they liked or disliked 
+    a story. There are two systems of ratings built into eFiction. 
+    <ul>
+      <li>Stars - Five stars (and half stars) ratings</li>
+      <li>Like/Dislike - Thumbs up/Thumbs down system.</li>
+    </ul>
+  </li>
+  <li>Allow Ratings Only - Defines whether or not reviewers may leave only a rating 
+    for a story without a text review.</li>
+</ul>
+<p>User Settings<a name="userSettings"></a></p>
+<p>This section of the settings defines how the site interacts with users for 
+  certain things.</p>
+<ul>
+  <li>Alerts on - Defines whether or not members can receive e-mailed alerts when 
+    their favorite stories and authors are updated.</li>
+  <li>Warning pop-ups only once - Defines whether or not warning pop-ups appear 
+    only once for the session or each time the visitor clicks on a story for that 
+    rating.</li>
+  <li>Age statement in user profile - Defines whether or not an age-consent statement 
+    appears in the user preferences form. When a user confirms their age via the 
+    age-consent form, the warnings for age-restricted stories do not appear to 
+    him/her.</li>
+  <li>Password at Registration - Defines whether the password at registration 
+    is user defined or random.</li>
+</ul>
+<p>E-mail Settings<a name="emailSettings"></a></p>
+<p>This section defines how e-mails are sent out. If this information is supplied, 
+  the e-mail forms will use SMTP.</p>
+<ul>
+  <li>SMTP Host - The host for the SMTP server.</li>
+  <li>SMTP Username - The username for the SMTP server.</li>
+  <li>SMTP Password - The password for the SMTP server.</li>
+</ul>
+<p>Language Censor <a name="langCensor"></a></p>
+<p>This section is a list of words that will be forbidden in submissions to the 
+  site. They will be disallowed entirely in names and titles. They will be replaced 
+  with the first letter and trailing asterisks, a****, in summaries and the text 
+  of reviews. Seperate each word with a comma. Placing an asterisk before and/or 
+  after the word will act as a wildcard making the censor look for the entire 
+  word plus the word used as a suffix and/or prefix. For example, 'frog' will 
+  only find 'frog', '*frog' will find 'bullfrog' and 'frog' but not 'froglegs', 
+  'frog*' will find both 'frog' and 'froglegs' but not 'bullfrog', '*frog*' will 
+  find 'frog', 'bullfrog', and 'froglegs.' To disable the censor simply leave 
+  the list of words empty.</p>
+<p>Message Settings<a name="messageSettings"></a></p>
+<p>The links that follow this header in the settings area are to the default messages 
+  for the site. The installation script placed generic text for these messages 
+  into the database for you, but you will most likely wish to edit these messages 
+  to better reflect your site.</p>
+<ul>
+  <li>Welcome Message - The welcome message for your site. It is included in your 
+    skins using the {welcome} variable.</li>
+  <li>Copyright Footer - The footer message for your site. It is included in your 
+    skins using the {footer}variable.</li>
+  <li>Print Copyright Notice - This notice will be appended to the story text 
+    when the &quot;Printer Version&quot; is selected. </li>
+  <li>TinyMCE Configuration - If you wish to customize the configuration of the 
+    tinyMCE WYSIWYG editor you may enter your configuration information here.</li>
+  <li>Rejection Letter (default) - The default rejection letter for your site. 
+    You will have the option to customize this at the time each letter is sent.</li>
+  <li>Acceptance Letter (default) - The default acceptance letter for your site. 
+    You will have the option to customize this at the time each letter is sent.</li>
+</ul>
+<p>Blocks<a name="blocks"></a></p>
+<p>Blocks are another part of your eFiction site that let you configure the look 
+  and feel of your site. A number of blocks are included with eFiction. You can 
+  also create your own or add blocks others have created. The included blocks 
+  are as follows:</p>
+<ul>
+  <li>Categories - This block lists the top level categories on your site.</li>
+  <li>Featured - This block lists one or more of the featured stories of your 
+    site (depending on configuration).</li>
+  <li>Info - This block lists a variety of information about your site including 
+    the number of: members, authors, stories, words, reviews, and chapters. </li>
+  <li>Login - This block displays a login form allowing you to include a login 
+    form on the index page or every page should you choose.</li>
+  <li>Menu - This block builds a menu from the page links in your site. Configurable.</li>
+  <li>News- This block displays one or more of the news items on your site. </li>
+  <li>Online - This block displays who is presently online on your site.</li>
+  <li>Poll- This block lets you query your members using a multiple choice question. 
+    Also includes an archive of poll questions and results.</li>
+  <li>Random - This block displays a random story with each page load.</li>
+  <li>Recent - This block lists the most recently added/updated stories for your 
+    site. </li>
+  <li>Search - A simple search box for inclusion in your skins.</li>
+  <li>Shoutbox - A shoutbox for your site. Also includes an archive.</li>
+  <li>Skinchange - This block displays a drop down that will let visitors who 
+    aren't logged in select from the site's skins the one they wish to display.</li>
+</ul>
+<p>The first page here lists the blocks available to you. Some will have been 
+  pre-installed. The first column lists the name of the block and is not editable. 
+  The second column, which you can edit, displays the title of the block as it 
+  will be displayed on your site. The third column displays the block's status. 
+  There are three possible status options.</p>
+<ul>
+  <li>Inactive - The block is completely off.</li>
+  <li>Active - The block will load on <strong>every</strong> page.</li>
+  <li>Index Only - The block will load on the index (home) page <strong>only.</strong></li>
+</ul>
+<p>It is advisable that if the block does not display on every page, you set it 
+  to &quot;Index Only&quot; or &quot;Inactive&quot; as this will save on your 
+  site's resources. The one exception to this is the Online block. If you use 
+  this block, you <strong>must</strong> set it to &quot;Active&quot; for the block 
+  to work properly.</p>
+<p>The fourth column, gives you the option to admin the block if there are options 
+  to administer.</p>
+<p>You may also see the name of a block and the words &quot;Initialize Block&quot; 
+  instead of the last three columns. You will see this when a block is available 
+  to be installed, but has not been installed yet. The Online, Poll, Search and Shoutbox 
+  blocks are not installed by default. Click on &quot;Initialize Block&quot; then 
+  change the status of the block to &quot;Active&quot; or &quot;Index Only&quot; 
+  to activate it.</p>
+<p>Custom Pages<a name="customPages"></a></p>
+<p>This page allows you to add custom pages to your site. These pages may not 
+  contain php code, only HTML and plain text. Four custom pages are defined for 
+  you during the installation.</p>
+<ul>
+  <li>help - A help page for visitors.</li>
+  <li>tos - Terms of Service. This page is displayed on the registration page.</li>
+  <li>rules - Submission Rules. This page is displayed at the top of the story 
+    submission form and is also linked to the default help page.</li>
+  <li>maintenance - Maintenance Message. This is the message that is displayed 
+    to visitors when you place your site into maintenance mode.</li>
+</ul>
+<p>To add a custom page:</p>
+<ol>
+  <li>Goto Admin -&gt; Custom Pages</li>
+  <li>Click on &quot;Add New Custom Page&quot;</li>
+  <li>Enter the name of the page in the form. Note: The name for your page should 
+    contain letters, numbers, and the underscore character ONLY.</li>
+  <li>Enter the title for the page. The page title will also be the text of the 
+    link to the page in the page links.</li>
+  <li>Enter the text of your page. </li>
+  <li>Click the &quot;Submit&quot; button.<br>
+  </li>
+</ol>
+<p>The name you assign to your custom page will be the {NAME_link} variable for 
+  you to use in your skins. The script will append &quot;_link&quot; to the name 
+  to help prevent naming conflicts with other variables. The title will be the 
+  title of the page. For the URL of your custom page, you may use either viewpage.php?id=ID 
+  or viewpage.php?page=NAME where ID is the ID number of the page or NAME is the 
+  name of the page.</p>
+<p><strong>Note:</strong> The name for your page should contain letters, numbers, 
+  and the underscore character ONLY.</p>
+<p>Page Links<a name="pageLinks"></a></p>
+<p>This page controls the page links used in the menu block and available for 
+  use in the skin as individual links. </p>
+<p>Admins<a name="admins"></a></p>
+<p>This page is used to give admin privileges to a member of your site. The initial 
+  page lists all current admins and also gives you the option to add a new admin.</p>
+<p>To give a member admin privileges:</p>
+<ol>
+  <li>Click on &quot;Add New Admin&quot;</li>
+  <li>Select the member's penname from the drop-down list.</li>
+  <li>Select the level of admin privileges for this member.</li>
+  <li>Select the categories that member will oversee or leave blank to have them 
+    oversee all categories.</li>
+  <li>Check the box if you want this admin to receive e-mail notices of new stories 
+    to be validated.</li>
+  <li>Click &quot;Submit&quot;.</li>
+</ol>
+<p>PHP Info<a name="phpInfo"></a></p>
+<p>This page gives information about your server configuration. If you ever run 
+  into problems with your eFiction site, you may need to check these settings. 
+  This page is given as a courtesy. <strong>If you are upgrading from 1.1, </strong><strong>delete 
+  the phpinfo.php in the main folder</strong>. The phpinfo.php file included with 
+  1.1 was not secured and will allow hackers access to the same information it 
+  gives you. This admin page is only available to site administrators.</p>
+<p>Action Log<a name="actionLog"></a></p>
+<p>If you have turned the action log on for your site, this page is where those 
+  logs can be viewed. You can also purge the log here.</p>
+<p>Profile Information<a name="profileInfo"></a></p>
+<p> This admin panel lets you add/remove items from the member profile page. Right 
+  now, there are twelve items pre-loaded. </p>
+<ul>
+  <li>Live Journal</li>
+  <li>Web site</li>
+  <li>AOL</li>
+  <li>ICQ</li>
+  <li>MSN IM</li>
+  <li>Yahoo IM</li>
+  <li>Deviant Art</li>
+  <li>Beta-Reader</li>
+  <li>DeadJournal</li>
+  <li>Xanga</li>
+  <li>Gender</li>
+  <li>MySpace</li>
+</ul>
+<p>The majority of the pre-loaded items were in 2.0. To turn one of the pre-loaded 
+  items on/off. Click edit. Check the box next to &quot;Field enabled&quot; to 
+  turn the field on. On the same form you can change the name and title of the 
+  field. Just like the page links and custom pages, the name will be the variable 
+  for you to use in your .tpl files and the title will be what appears on screen 
+  in the registration/edit bio form and the profile.</p>
+<p>There are a number of types of fields defined.</p>
+<ul>
+  <li>URL - This is a url. The script will automatically turn this into a link 
+    when displaying it in the profile.</li>
+  <li>Select Box - A drop down select box to choose from a selection. In the form 
+    place each option in the box in a separate line.</li>
+  <li>Yes/No - Answer to a yes/no question.</li>
+  <li>ID with URL - These are like fanfiction or livejournal links where there 
+    is a base url with the user's id. Enter the url with {info} where the person's 
+    ID goes. For instance: http://{info}.livejournal.com. The registration/edit 
+    bio form will present a text box for the member to enter their id.</li>
+  <li>Custom code - This option lets you provide custom code to handle the entry 
+    and display of the item. The aol, icq, msn, and yahoo fields use custom code.</li>
+  <li>Text - This type gives the author a text box to enter information. The information 
+    is presented back as text as well. The limit on user text is 255 characters!</li>
+</ul>
+<p>Archive Maintenance<a name="Maint"></a></p>
+<p>This admin panel provides a number of functions for maintaining your site.&nbsp; </p>
+<ul>
+  <li>Recalculate Reviews - This function recalculates the number of reviews and 
+  the rating for the stories, series, and chapters on the site.</li>
+  <li>Fix Category Counts - This function has been moved from the Categories 
+  admin.&nbsp; It will recalculate the number of stories per category.</li>
+  <li>Optimize Database Tables - This function will optimize the tables in your 
+  database.&nbsp; Doing this occasionally will improve site performance.</li>
+  <li>Run Update - When you upload an update for the eFiction script, use this 
+  function to run any changes needed to the database.</li>
+</ul>
+<p>Default Panel List<a name="defaultPanels"></a></p>
+<p>Admin Panels:</p>
+<p>The admin panels control the different admin options for the site. In 2.0 the 
+  list was static. Putting the admin options into panels allows site owners the 
+  option of changing the access level for the various features. It also allows 
+  new options to be added without editing everything. The 0-4 levels in the panel 
+  are most applicable here. The levels 1 to 4 indicate the admin level required 
+  to access a certain feature.</p>
+<ul>
+  <li>Message Settings (1)</li>
+  <li> Rejection Letter (1)(2)</li>
+  <li> Validation Letter (1)(2)</li>
+  <li>Validate Submission (1)(2)</li>
+  <li> Censor (1)</li>
+  <li> Categories</li>
+  <li> Panels</li>
+  <li> Characters</li>
+  <li> Settings</li>
+  <li> Blocks</li>
+  <li> Ratings</li>
+  <li> Add New Story</li>
+  <li> Add New Series</li>
+  <li> Custom Pages</li>
+  <li> Classifications</li>
+  <li> News</li>
+  <li> Members</li>
+  <li> Featured Stories</li>
+  <li> Submissions</li>
+  <li> Page Links</li>
+  <li> Admins</li>
+  <li> Mail Users</li>
+  <li> Skins</li>
+  <li> PHP Info</li>
+  <li> Action Log</li>
+  <li> Profile Information</li>
+</ul>
+<p>Browse Panels:</p>
+<p>Browse panels control the &quot;Browse By&quot; area of the site. </p>
+<ul>
+  <li>Most Recent (1) </li>
+  <li>Featured Stories (1) </li>
+  <li>Classes (1)(2) </li>
+  <li>Categories</li>
+  <li> Characters</li>
+  <li> Ratings</li>
+  <li> Series</li>
+  <li> Titles</li>
+</ul>
+<p>Favorite Panels:</p>
+<p>The favorites panels are included both in the member &quot;Account Info&quot; 
+  page and the list of panels in the profile. In the &quot;Account Info&quot; 
+  area the panel must be set to level 1 to be visible in the list of options. 
+  Otherwise, they're used as part of the &quot;Manage Favorites&quot; panel.</p>
+<ul>
+  <li>Favorite Stories (1)</li>
+  <li> Favorite Series (1)</li>
+  <li> Favorite Authors (1)</li>
+  <li> {author}'s Favorites</li>
+</ul>
+<p>Top 10 List Panels:</p>
+<p>The Top 10 panel. They're all turned on my default. If you turn favorites off, 
+  it is suggested that you hide, not delete, the favorites panels. (You could 
+  change your mind later.)</p>
+<ul>
+  <li>10 Largest Series</li>
+  <li> 10 Smallest Series</li>
+  <li> 10 Most Reviewed Series</li>
+  <li> 10 Longest Stories</li>
+  <li> 10 Shortest Stories</li>
+  <li> 10 Most Reviewed Stories</li>
+  <li> 10 Most Read Stories</li>
+  <li> 10 Most Responded to Challenges</li>
+  <li> 10 Most Favorite Stories</li>
+  <li> 10 Most Prolific Reviewers</li>
+  <li> 10 Most Prolific Authors</li>
+  <li> 10 Most Reviewed Recommendations</li>
+</ul>
+<p>Profile Panels:</p>
+<p>These are the panels that will be displayed on the user's profile page along 
+  with the non-hidden favorites panels. </p>
+<ul>
+  <li>Contact (1)(2)</li>
+  <li> Stories by {author}</li>
+  <li> Series by {author}</li>
+  <li> Reviews by {author}</li>
+</ul>
+<p>Submissions Panels:</p>
+<p>The submission panels will only be displayed in the user panel if submissions 
+  are turned on. They were placed in a type seperate from the user panels so they 
+  would be turned on and off together based on the submission site settings.</p>
+<ul>
+  <li>Add New Story</li>
+  <li> Manage Stories</li>
+  <li> Add New Series</li>
+  <li> Manage Series</li>
+  <li> Manage Images</li>
+</ul>
+<p>User Account Panels:</p>
+<p>As an extra level of security here. The &quot;level&quot; of the panel should 
+  be set to either 0 or 1. Panels with level 0 will be displayed to anyone. Panels 
+  with level 1 will be displayed only to logged in members. The login, register, 
+  and lost password panels are currently the only panels set to level 0 for the 
+  user account area.</p>
+<ul>
+  <li>Login (1)</li>
+  <li>Your Reviews (1)</li>
+  <li> Reviews Received (1)</li>
+  <li> Review Response (1)(2)</li>
+  <li> Lost Password</li>
+  <li> Register</li>
+  <li> Edit Bio</li>
+  <li> Edit Preferences</li>
+  <li> View Your Statistics</li>
+  <li> Manage Favorites</li>
+  <li> Logout</li>
+</ul>
+<p>(1) Hidden by default.<br>
+  (2) System panels. You should not need to alter these settings and may cause 
+  errors if you do.</p>

file:b/docs/blocks.sql (new)
--- /dev/null
+++ b/docs/blocks.sql
@@ -1,1 +1,10 @@
 
+INSERT INTO `test3fanfiction_blocks` (`block_id`, `block_name`, `block_title`, `block_file`, `block_status`, `block_variables`) VALUES (1, 'categories', 'Categories', 'categories/categories.php', 1, ''),
+(2, 'featured', 'Featured Stories', 'featured/featured.php', 1, ''),
+(3, 'info', 'Site Info', 'info/info.php', 2, ''),
+(4, 'login', 'Log In', 'login/login.php', 1, ''),
+(5, 'menu', 'Main Menu', 'menu/menu.php', 1, ''),
+(6, 'random', 'Random Story', 'random/random.php', 2, ''),
+(7, 'recent', 'Most Recent', 'recent/recent.php', 2, 'a:1:{s:3:"num";s:1:"1";}'),
+(8, 'skinchange', 'Skin Change', 'skinchange/skinchange.php', 1, ''),
+(9, 'news', 'Site News', 'news/news.php', 1, 'a:1:{s:3:"num";s:1:"1";}');

file:b/docs/config.php (new)
--- /dev/null
+++ b/docs/config.php
@@ -1,1 +1,12 @@
+<?php 
+$dbhost = "localhost";
+$dbname = "dbname";
+$dbuser= "dbuser";
+$dbpass = "dbpass";
+$sitekey = "";
+$settingsprefix = "settings";
 
+include_once("includes/dbfunctions.php");
+if(!empty($sitekey)) $dbconnect = dbconnect($dbhost, $dbuser,$dbpass, $dbname);
+
+?>

--- /dev/null
+++ b/docs/convertingskins.htm
@@ -1,1 +1,274 @@
-
+<html>
+
+<head>
+<meta http-equiv="Content-Language" content="en-us">
+<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
+<meta name="ProgId" content="FrontPage.Editor.Document">
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<title>Converting 1</title>
+</head>
+
+<body>
+
+<p align="center">Converting 1.1 skins to 3.0 skins.</p>
+<p>This file is a work in progress.&nbsp; We'll flesh it out later as we all get 
+  more expertise with converting 1.1 skins to the 3.0 format.</p>
+<p>1.&nbsp; Open a new folder for your converted skin.</p>
+<p>2.&nbsp; Open the default.tpl file in the skin you wish to convert.&nbsp; 
+Everything <i><b>before</b></i> {output} transfer into header.tpl in your new 
+folder then enclose it with start and close tags for the header block.&nbsp; A sample header.tpl might look like this.</p>
+<pre></pre>
+
+</div>
+
+<p style="margin: 0 5%; border: 1px solid #000;">&nbsp;&lt;!-- START BLOCK : header --&gt;<br>
+&lt;body&gt;<br>
+&nbsp;&nbsp;&nbsp;
+&lt;div id=&quot;<span style="background-color: #FFFF00">{</span><span 
+style="background-color: #FFFF00">page_id</span><span 
+style="background-color: #FFFF00">}</span>&quot;&gt;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&lt;div id=&quot;header&quot;&gt;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&lt;div id=&quot;banner&quot;&gt;<br>
+&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&lt;div id=&quot;skin&quot;&gt;<span style="background-color: #FFFF00">{</span><span 
+style="background-color: #FFFF00">skinchange_content</span><span 
+style="background-color: #FFFF00">}</span>&lt;span style=&quot;padding: 15px;&quot;&gt;<span 
+style="background-color: #FFFF00">{</span><span 
+style="background-color: #FFFF00">rss</span><span 
+style="background-color: #FFFF00">}</span>&lt;/span&gt;&lt;/div&gt;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&lt;/div&gt;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&lt;div id=&quot;menu_container&quot;&gt;<br>
+<span style="background-color: #FF00FF">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
+{home}&amp;nbsp;{recent}&amp;</span><span style="background-color: #FF00FF">nbsp;{catslink</span><span 
+style="background-color: #FF00FF">}&amp;nbsp;{authors}&amp;nbsp;{titles}&amp;nbsp;{help}<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
+&amp;nbsp;{search}&amp;nbsp;{login}&amp;nbsp;{logout}&amp;nbsp;{adminarea}</span><br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&lt;/div&gt;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&lt;/div&gt;<br>
+&nbsp;&nbsp;&nbsp;
+&lt;div id=&quot;mainpage&quot;&gt;<br>
+&lt;!-- END BLOCK : header --&gt;</p>
+<p>The {page_id} variable was new to 2.0.&nbsp; This variable gives you a unique 
+  name to use in the css for each page.&nbsp; In the example above it's used as 
+  a containing tag.&nbsp; 
+<p>The {rss} variable 
+defines where the orange rss image link appears.
+<p>The other variable highlighted in yellow is a mod some people had previously 
+  installed.&nbsp; If you have previously added the skin change mod change {skinform} 
+  to {skinchange_content} to include that block.&nbsp; You will also need to activate 
+  that block and set it to the correct status in the blocks page in the admin 
+  area.
+<p>The links highlighted in pink are still available in 3.0.&nbsp; You can convert 
+  these links to the new menu block if you wish or leave them as is.
+<p>3. From your original default.tpl again, select everything <i>
+<b>after</b></i> {output} and place it in your footer.tpl<p>&nbsp;<p style="margin: 0 5%; border: 1px solid #000;">&lt;!-- START BLOCK : 
+footer --&gt;<br>
+&nbsp;&nbsp;&nbsp;
+&lt;/div&gt;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&lt;div id=&quot;footer&quot;&gt;<span style="background-color: #FF00FF">{footer}</span>&lt;/div&gt;&lt;/div&gt;<br>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+&lt;div id=&quot;footermenu&quot;&gt;<span style="background-color: #FFFF00">{</span><span 
+style="background-color: #FFFF00">tos}{rules}{contactus</span><span 
+style="background-color: #FFFF00">}</span>&lt;/div&gt;<br>
+&lt;!-- END BLOCK : footer --&gt;<p>The {footer} variable is the same as in 1.1<p>
+The other three variables you see in yellow are new page links added in 2.0. <p>&nbsp;<div 
+align="center">
+  <center>
+  <table border="1" cellpadding="3" cellspacing="0" 
+  style="border-collapse: collapse" bordercolor="#111111">
+    <tr>
+      <th width="100%" colspan="2">New Page Links in 2.0</th>
+    </tr>
+    <tr>
+      <td width="50%">{tos}</td>
+      <td width="50%">Terms of Service</td>
+    </tr>
+    <tr>
+      <td width="50%">{rules}</td>
+      <td width="50%">Submission Rules</td>
+    </tr>
+    <tr>
+      <td width="50%">{contactus}</td>
+      <td width="50%">Contact Us</td>
+    </tr>
+    <tr>
+      <td width="50%">{featured}</td>
+      <td width="50%">Featured Stories</td>
+    </tr>
+    <tr>
+      <td width="50%">{members}</td>
+      <td width="50%">Members</td>
+    </tr>
+    <tr>
+      <td width="50%">{series}</td>
+      <td width="50%">Series</td>
+    </tr>
+    <tr>
+      <td width="50%">{challenges}</td>
+      <td width="50%">Challenges</td>
+    </tr>
+    <tr>
+      <td width="50%">{tens}</td>
+      <td width="50%">The Tens</td>
+    </tr>
+  </table>
+  </center>
+</div>
+<p>&nbsp;<div align="center">
+  <center>
+  <table border="1" cellpadding="3" cellspacing="0" 
+  style="border-collapse: collapse" bordercolor="#111111">
+    <tr>
+      <th width="100%" colspan="2">Changed from 1.1</th>
+    </tr>
+    <tr>
+      <td width="50%">{authors}</td>
+      <td width="50%">Authors (was members list)</td>
+    </tr>
+  </table>
+  </center>
+</div>
+<p>3.&nbsp; In your new skin folder create a new file called variables.php.&nbsp; 
+As this is a conversion from 1.1 to 2.0 you will want to set some options in the 
+blocks settings.</p>
+<p style="margin: 1em 5%; border: 1px solid #000;">&lt;?php<br>
+$blocks[&quot;info&quot;][&quot;status&quot;] = '1'; <br>
+$blocks[&quot;info&quot;][&quot;style&quot;] = '1';<br>
+$blocks[&quot;login&quot;][&quot;status&quot;] = '1';<br>
+$blocks[&quot;news&quot;][&quot;status&quot;] = '1';<br>
+$blocks[&quot;news&quot;][&quot;tpl&quot;] = '1';<br>
+$blocks[&quot;recent&quot;][&quot;status&quot;] = '1';<br>
+$blocks[&quot;recent&quot;][&quot;tpl&quot;] = '1';<br>
+$blocks[&quot;categories&quot;][&quot;status&quot;] = '1';<br>
+$blocks[&quot;categories&quot;][&quot;columns&quot;] = '0';<br>
+$blocks[&quot;categories&quot;][&quot;tpl&quot;] = '1';<br>
+$blocks[&quot;featured&quot;][&quot;tpl&quot;] = '1';<br>
+$blocks[&quot;featured&quot;][&quot;status&quot;] = '1';<br>
+?&gt;</p>
+<p>Technically, this is probably overkill.&nbsp; You will definitely want to set 
+&quot;tpl&quot; to 1 for categories, recent, and featured if your skin uses them.&nbsp;If 
+in the past you used {totalstories} and {totalauthors}, activate the info block 
+and set the style to 2.&nbsp; Note that this will also give you {totalmembers} 
+to include.&nbsp; All of these blocks should be set to a &quot;status&quot; of 1 to 
+include them only on the index page.&nbsp;&nbsp; 
+If your skin doesn't use them, I suggest you set the status to 0.&nbsp; It will 
+make the page load a tiny bit faster, but for busy sites tiny bits will add up.</p>
+<p>4. Copy the 1.1 index.tpl skin into your new folder and open it.&nbsp; Locate 
+the point where your header information stops.&nbsp; Delete everything before 
+that and replace it with:</p>
+<p>&lt;!-- INCLUDE BLOCK : header --&gt;</p>
+<p>Find where your footer information starts and replace everything below it with</p>
+<p>&lt;!-- INCLUDE BLOCK : footer --&gt;</p>
+<p>We took care of all the blocks except news in the previous step.&nbsp; Find 
+where your news is included in the index.tpl&nbsp; and replace the block with {news_content}&nbsp; 
+You can also remove {newspageprev} and {newspagenext} as those are replaced by 
+the newsarchive link and are included in {news_content}.&nbsp; To style the news 
+archive link use #newsarchive in your style.css.&nbsp; The #newsarchive id is a 
+div around the archive link.</p>
+
+<p>5. Copy your newsbox.tpl file into the new folder.&nbsp; No changes need to 
+be made to that.&nbsp; Note however that the style will be carried over to the 
+news archive.</p>
+
+<p>6. Open your style.css and style the following elements.&nbsp; The 
+information after the dash is suggested styles to match 1.1 where possible or 
+just general ideas</p>
+
+<p>#pagetitle - text-align: center; font-size: 150%; margin: 1ex;<br>
+#alphabet, #pagelinks - text-align: center; margin: 1em;<br>
+LABEL - font-weight: bold;<br>
+#sort - text-align: center; margin: 1ex;&nbsp; (Sort options on categories.php)<br>
+#profile #sort - text-align: right;&nbsp;&nbsp; (Sort options on the viewuser 
+page)</p>
+
+<p>.sectionheader - text-align: center; font-weight: bold;&nbsp; (this is the 
+&quot;Series&quot; and &quot;Stories&quot; sub-headers)<br>
+#titleblock&nbsp; - margin: 0 10%; border: 1px solid #000;&nbsp; <br>
+(this is the title block at the top of the series and challenges pages when a 
+single series/challenge is listed)</p>
+
+<p>To convert the tabs in the viewuser page from 1.1 to 2.0 you'll need to add 
+the #tabs style group to your style.css.&nbsp; This is the tabs information for 
+the skin in default_tpls. It's a good place to start.&nbsp; 2.0 gives you more 
+options in styling this section of the viewuser page, but this styling will be 
+close to what you previously used in 1.1 with some tweaking.&nbsp; The #active 
+styling is the tab currently active in the window.&nbsp; In 1.1 this would have 
+been the table cell with the background color.</p>
+
+<p>#tabs {<br>
+padding: 0;<br>
+margin: 0;<br>
+clear: both;<br>
+border-top: 3px double #000;<br>
+border-bottom: 3px double #000;<br>
+}<br>
+<br>
+#tabs DIV{ <br>
+width: 33%;<br>
+float: left;<br>
+color: #000;<br>
+text-align: center;<br>
+background: #CCC; <br>
+font-size: 11pt;<br>
+}<br>
+<br>
+#tabs #centertab {<br>
+background: transparent;<br>
+border-right: 3px double #000;<br>
+border-left: 3px double #000;<br>
+width: 98%;<br>
+}<br>
+<br>
+#tabs a { color: #000; }<br>
+#tabs a:active, a:hover { text-decoration: none; color: #555; }<br>
+<br>
+#tabs #active { background: #555; width: 34%; color: #FFF; }<br>
+#tabs #active a { color: #FFF; }<br>
+#tabs #active a:active, a:hover { text-decoration: none; color: #555; }</p>
+
+<p>7. The last thing you'll probably need to do is convert your storyblock.tpl.&nbsp; 
+If you wish, you can rely on the default and set the appearance of both the 
+stories and series blocks through your style.css.&nbsp; The default uses the .listbox 
+class with child classes of .title, .tail, .adminoptions, .content, and 
+.classification.&nbsp; You can also use .odd and .even to alternate style of 
+blocks every other one.</p>
+
+<p>/* Formatting for the divs for series and stories.&nbsp; */<br>
+.listbox { margin: 0 5%; border: 2px solid #900; margin-bottom: 1em; background: 
+#FFF; background-position: 0 5px;}<br>
+.listbox .title { font-weight: bold; padding: 4px; color: #900; border-bottom: 
+3px double #900;}<br>
+.listbox .title a:link { color: #900; text-decoration: underline;}<br>
+.listbox .title a:visited { color: #C66; text-decoration: underline;}<br>
+.listbox .title a:hover { color: #900; text-decoration: underline overline; }<br>
+.listbox .content { padding: 5px; padding-top: 10px; padding-bottom: 10px;}<br>
+.listbox .tail, .listbox .respond { border-top: 3px double #900;}<br>
+.listbox .classfication { font-weight: bold; }<br>
+/* End listbox formatting. */</p>
+
+<p>If you don't want to use the default, I suggest you copy listings.tpl from 
+the default_tpls folder then paste the contents of your storyblock.tpl into the 
+storyblock section then replicate it for the series section.&nbsp; Pay attention 
+to the additional information for the story block.&nbsp; You may now include 
+challenges and series information.&nbsp; There are also adminoptions to be 
+included as well.&nbsp; If you don't use the default you will also need to 
+separately style the challenges block (if you choose to use challenges on your 
+site).&nbsp; 
+Copy challenges.tpl from the default_tpls folder and style it as you wish.&nbsp;
+<u>Do<b><i> NOT </i></b>save it back to default_tpls. </u><b>&nbsp;</b>Save it 
+to your skin's folder.</p>
+
+<p>That's a basic conversion from 1.1 to 2.0.&nbsp; You can further define other 
+areas of the script such as the title blocks in series and challenges.&nbsp; If 
+you wish to change the look of these areas, copy the applicable .tpl from 
+default_tpls and make your changes.&nbsp; Then save that .tpl to your skin 
+folder NOT back to the default_tpls.&nbsp; </p>
+
+</body></html>

--- /dev/null
+++ b/docs/creating_blocks.htm
@@ -1,1 +1,110 @@
+<html>
 
+<head>
+<meta http-equiv="Content-Language" content="en-us">
+<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
+<meta name="ProgId" content="FrontPage.Editor.Document">
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<title>Creating Blocks</title>
+</head>
+
+<body>
+
+<h2 align="center">Creating Blocks</h2>
+<p>For those that want to create their own blocks to share with others or just 
+  tweak the ones included already, here's the basics.&nbsp; There are two files 
+  needed for each block: blockname.php an init.php.&nbsp; Technically, if you 
+  added the block manually, you wouldn't need the init.php file.&nbsp; It is only 
+  used when the block is first initialized, and can be deleted afterward.&nbsp; 
+  Though I would suggest keeping a backup somewhere, just in case.</p>
+<p>The init.php file is very simple composed simply of a mysql statement that 
+  adds the block tot he database.&nbsp; As in the example below.</p>
+<p>&lt;?php<br>
+  dbquery(&quot;INSERT INTO &quot;.TABLEPREFIX.&quot;fanfiction_blocks(`block_name`, 
+  `block_title`, `block_status`, `block_file`, `block_variables`) VALUES('categories', 
+  'Main Categories', '0', 'categories/categories.php', '');&quot;);<br>
+  ?&gt;</p>
+<p>This also shows the basic parameters needed for a block: name, title, status, 
+  file, and variables.&nbsp; The title can be an empty string if you don't need 
+  a title for that particular block. If the block doesn't need any variables, 
+  that too can be left empty. The file should be a subfolder/file of the blocks 
+  folder for the sake of consistency. The status should generally start off as 
+  0 for inactive.&nbsp; There are 3 status options for blocks: </p>
+<div align="center">
+  <center>
+  <table border="1" cellpadding="5" cellspacing="0" 
+  style="border-collapse: collapse" bordercolor="#111111">
+    <tr>
+      <th colspan="2">Status</th>
+      <th>&nbsp;Associated .tpl file</th>
+      <th>Appears</th>
+    </tr>
+    <tr>
+      <td>0</td>
+      <td>Inactive</td>
+      <td>The block is off. </td>
+      <td>nowhere</td>
+    </tr>
+    <tr>
+      <td>1</td>
+      <td>Active</td>
+      <td>The block is on.</td>
+      <td>anywhere</td>
+    </tr>
+    <tr>
+      <td>2</td>
+      <td>Index only</td>
+      <td>index page only.</td>
+      <td>anywhere on the index page.</td>
+    </tr>
+    </table>
+  </center>
+</div>
+<p>&nbsp; </p>
+<p>Any default configuration you want for the block can be included in the init.php 
+  as well.&nbsp; The variables are an array encoded using PHP's serialize function. 
+  For instance, the categories block currently has two options: one column and 
+  multiple columns.&nbsp; The default is a single column lists.&nbsp; If I were 
+  to change the init file as follows, the default would then become a multiple 
+  column list.</p>
+<p>&lt;?php<br>
+  dbquery(&quot;INSERT INTO &quot;.TABLEPREFIX.&quot;fanfiction_blocks(`block_name`, 
+  `block_title`, `block_status`, `block_file`, `block_variables`) VALUES('categories', 
+  'Main Categories', '0', 'categories/categories.php', '&quot;.serialize(array(&quot;columns&quot; 
+  =&gt; &quot;1&quot;)).&quot;');&quot;);<br>
+  ?&gt;</p>
+<p> When you change any of the settings for the blocks from the admin panel the 
+  information stored in the database about the block is updated.</p>
+<p>The block.php file creates the content that is placed inside the {blockname_content} 
+variable.&nbsp; This content is placed inside a variable $content which is then 
+assigned to {blockname_content}&nbsp; So a very simple example of a block would 
+be:</p>
+<p>&lt;?php<br>
+$content = &quot;Hello World!&quot;;<br>
+?&gt;</p>
+<p>There are two other optional files.&nbsp; The first is an admin file which 
+will be called from the admin panel to make changes to the settings in the 
+block.&nbsp; Creating one of those is for another day. </p>
+<p>The second file (or multiple files) is a language file that defines any text 
+you use in your block.&nbsp; These files take the same format as the main 
+language file in the languages folder and are named similarly.&nbsp; So for 
+instance, an English language file would be named en.php.&nbsp; For Spanish, it 
+would be es.php. </p>
+<p>Most often, you might need to define some wording for your admin.php file.&nbsp; 
+If you need to add a language file, use the following code in either admin.php 
+or blockname.php</p>
+<p>if(file_exists(&quot;blocks/categories/{$language}.php&quot;)) include_once(&quot;blocks/categories/{$language}.php&quot;);</p>
+<p>The if(...) isn't technically necessary, but it will prevent errors if the 
+  file ends up missing.&nbsp; For instance, the site's language is set to Russian, 
+  but the block doesn't have a Russian translation.&nbsp; You might also want 
+  to include an else statement to load a default language file you have created 
+  if the site's chosen language is missing.</p>
+<p>if(file_exists(&quot;blocks/categories/{$language}.php&quot;)) include_once(&quot;blocks/categories/{$language}.php&quot;);<br>
+  else include_once(&quot;blocks/categories/en.php&quot;);</p>
+<p>To keep your block files secure from hackers you are strongly encouraged to 
+  include this line at the top of each file just under the &lt;?php</p>
+<p>if(!defined(&quot;_CHARSET&quot;)) exit( );</p>
+<p>&nbsp;</p>
+</body>
+
+</html>

--- /dev/null
+++ b/docs/creating_skins.htm
@@ -1,1 +1,973 @@
+<html>
 
+<head>
+<meta http-equiv="Content-Language" content="en-us">
+<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
+<meta name="ProgId" content="FrontPage.Editor.Document">
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<title>Creating Skins</title>
+<style type="text/css">
+<!--
+.sample {
+	background-color: #CCCCCC;
+	margin: 1em;
+	border: 1px solid #000000;
+	padding: 1ex;
+}
+.sampleLabel {
+	margin-bottom: -1em;
+	margin-left: 1em;
+	font-weight: bold;
+}
+-->
+</style>
+</head>
+
+<body>
+
+<h2 align="center">Creating Skins - WIP</h2>
+<p>In theory, there is no limit to the number of skins you can create for your 
+site.&nbsp; If you have created skins for eFiction 1.1, you won't find many differences.&nbsp; The number and names of the .tpl files have changed 
+some though.&nbsp; 
+A complete skin will include the following files.</p>
+<div align="center">
+  <center>
+    <table border="1" cellpadding="5" cellspacing="0" 
+  style="border-collapse: collapse" bordercolor="#111111">
+      <tr> 
+        <th width="50%">.tpl file</th>
+        <th width="50%">Related pages</th>
+      </tr>
+      <tr> 
+        <td><a href="#browse">browse.tpl</a></td>
+        <td>Browse Pages</td>
+      </tr>
+      <tr> 
+        <td><a href="#categories">categories.tpl</a></td>
+        <td>Browse Categories</td>
+      </tr>
+      <tr> 
+        <td><p><a href="#comments">comments.tpl</a></p></td>
+        <td>News</td>
+      </tr>
+      <tr> 
+        <td><a href="#default">default.tpl</a></td>
+        <td>Most pages</td>
+      </tr>
+      <tr> 
+        <td><a href="#favcomment">favcomment.tpl</a></td>
+        <td>Favorites Lists</td>
+      </tr>
+      <tr> 
+        <td><a href="#footer">footer.tpl</a></td>
+        <td>All pages</td>
+      </tr>
+      <tr> 
+        <td><a href="#header">header.tpl</a></td>
+        <td>All pages</td>
+      </tr>
+      <tr> 
+        <td><a href="#index">index.tpl</a></td>
+        <td>Index</td>
+      </tr>
+      <tr> 
+        <td><a href="#listings">listings.tpl</a></td>
+        <td>Any page listing stories or series</td>
+      </tr>
+      <tr> 
+        <td><a href="#newsbox">newsbox.tpl</a></td>
+        <td>News &amp; news block</td>
+      </tr>
+      <tr> 
+        <td><a href="#printstory">printstory.tpl</a></td>
+        <td>View Story (Printable)</td>
+      </tr>
+      <tr> 
+        <td><a href="#profile">profile.tpl</a></td>
+        <td>User Profile</td>
+      </tr>
+      <tr> 
+        <td><a href="#reviewblock">reviewblock.tpl</a></td>
+        <td>Reviews</td>
+      </tr>
+      <tr> 
+        <td><a href="#reviews">reviews.tpl</a></td>
+        <td>Reviews</td>
+      </tr>
+      <tr> 
+        <td><a href="#seriestitle">series_title.tpl</a></td>
+        <td>View Series</td>
+      </tr>
+      <tr> 
+        <td><a href="#storyindex">storyindex.tpl</a></td>
+        <td>Story Table of Contents</td>
+      </tr>
+      <tr> 
+        <td><a href="#user">user.tpl</a></td>
+        <td>User Profile/Info</td>
+      </tr>
+      <tr>
+        <td><a href="#viewstory">viewstory.tpl</a></td>
+        <td>View Story</td>
+      </tr>
+    </table>
+  </center>
+</div>
+<p>Now, to quote Douglas Adams...Don't Panic!&nbsp; That's the most number of 
+  files a skin would use.&nbsp; Most skins will consist of quite a few less.&nbsp; 
+  If you install add-on modules, those modules may require additional .tpl files 
+  which will be included with the module. </p>
+<p>Within the script files is a folder called default_tpls.&nbsp; It includes 
+  a very basic complete skin that will be used if for whatever reason your site's 
+  default skin or your member's chosen skin are missing.&nbsp; If any of these 
+  .tpl files (except for header.tpl and footer.tpl) are missing the script will 
+  fall back on the files in the default_tpls folder.&nbsp; Many of the tpl files 
+  are generic enough that they can easily be left to the ones in default_tpls 
+  and styled using CSS.&nbsp; In addition to the .tpl files you will have a style.css 
+  file and optionally, a variables.php file.&nbsp; The variables.php file allows 
+  you to override certain universal settings for this skin such as where blocks 
+  load and the graphics used for your ratings and featured stories.</p>
+<p>A fewimportant things to pay attention to when modifying the template files:</p>
+<ol>
+  <li><b>Variables</b>: Items in curly brackets are variables, i.e. {output} or 
+    {authors}. This contains the actual content that will be printed out on the 
+    page. You can surround these attributes with any kind of html that you want 
+    -- font tags, tables, whatever. Some variables are required on some of the 
+    template pages and some are optional.&nbsp;</li>
+  <li><b>Blocks</b>: These are items that generate multiple instances of content 
+    in a loop -- for example, in your index.tpl template file, you only need to 
+    indicate where the news items should display on the page with the following:<br>
+    &lt;!-- INCLUDE BLOCK : newsbox --&gt;<br>
+    This line is telling the script to include the newsbox.tpl file, and the template 
+    files will understand that it should print out several news stories in a loop, 
+    with just that one line of code. Another kind of block you may see is the 
+    following:<br>
+    &lt;!-- START BLOCK : categoriesblock --&gt;<br>
+    <br>
+    Content goes here, which will also include attributes, such as {category} 
+    or {description}<br>
+    <br>
+    &lt;!-- END BLOCK : categoriesblock --&gt;<br>
+    This is similar to the included block, except that rather than pulling in 
+    the block from another file, as in the case of the newsbox.tpl, this one is 
+    just defining the block at this very moment. As you read through the individual 
+    template file instructions below and look at the actual templates, all of 
+    this will make more sense. <b>&nbsp;Block declarations should go on lines 
+    by themselves.</b></li>
+  <li><b>Blocks vs. Blocks:&nbsp; </b>The template blocks in the .tpl files are 
+    not the same as the blocks you configure in the admin panel.&nbsp; The blocks 
+    in the admin panel are &quot;blocks&quot; of code that generate content they 
+    place inside template variables.&nbsp; The blocks in the .tpl files are &quot;blocks&quot; 
+    of content.&nbsp; While there is some overlap, thinking of them as being separate 
+    from each other will help you keep things straight.&nbsp; Each &quot;code 
+    block&quot; will generate two &quot;content blocks&quot;: {blockname_title} 
+    and {blockname_content}.&nbsp; You may or may not include the {blockname_title} 
+    variable in your skin.&nbsp; It's up to you.&nbsp; However, using the {blockname_title} 
+    in your skin means if you ever want to change the title of the block you only 
+    have to do it in one place instead of in each skin.&nbsp; You assign where 
+    the block will be assigned to in the admin panel.&nbsp; There are 3 choices: 
+    <br>
+    &nbsp; 
+    <div align="center"> 
+      <center>
+        <table border="1" cellpadding="5" cellspacing="0" 
+    style="border-collapse: collapse" bordercolor="#111111">
+          <tr> 
+            <th width="50%">Status</th>
+            <th width="50%">&nbsp;Associated .tpl file</th>
+          </tr>
+          <tr> 
+            <td width="50%">Inactive</td>
+            <td width="50%">The block is off. </td>
+          </tr>
+          <tr> 
+            <td width="50%">Active</td>
+            <td width="50%">The block is on. Can appear on every page.</td>
+          </tr>
+          <tr> 
+            <td width="50%">Index Only</td>
+            <td width="50%">Appears on the index page only.</td>
+          </tr>
+        </table>
+      </center>
+    </div>
+    <p>You may also override these settings for an individual skin by placing 
+      information for that block in the variables.php file. More on that later.</li>
+  <li>The .tpl files do not have some of the usual tags at the beginning, such 
+    as &lt;head&gt; or &lt;title&gt;. That is because those tags are included 
+    in the header file. Most of the template files begin with the header block 
+    and end with the footer block except for a couple of the blocks (newsblock.tpl, 
+    comments.tpl and listings.tpl)</li>
+  <li>Using &quot;hooks&quot; various 3rd party and included modules (such as 
+    challenges) can add their own variables to these templates. Check the documentation 
+    for the modules for specific additions. &nbsp;</li>
+</ol>
+<p>Feel free to use the files in the default_tpls/ folder as templates for your 
+  own skins.&nbsp; Copy the files into a new skin folder and modify them there. 
+  <strong><font color="#FF0000">Do not modify the files in default_tpls/ if at 
+  all possible. They're often used for diagnostic purposes if the site isn't functioning 
+  as expected.</font></strong>&nbsp; <u>Also, you are in no way limited to CSS 
+  for the layout of your skins.&nbsp; Feel free to use tables to your heart's 
+  content.&nbsp; </u></p>
+<hr>
+<p><a name="browse"></a>browse.tpl</p>
+<p>This file controls the look of the browse pages (categories, classifications, 
+  etc.) The header, footer, and listing blocks are included in this file along 
+  with a block for the sort form that is displayed when there are story results. 
+  In addition you will want to include two other variables:</p>
+<p>You will need to start by including the header block.</p>
+<p class="sample">&lt;!-- INCLUDE BLOCK : header --&gt;</p>
+<p>And end by including the footer block.</p>
+<p class="sample"> &lt;!-- INCLUDE BLOCK : footer --&gt;</p>
+<p>{output} - Miscellaneous information on the pages including the page title.<br>
+  {otherresults} - The list of other results (challenges, series, etc.) that fit 
+  the criteria for the page.</p>
+<p>Within the sort form the following variables are used:</p>
+<p>{sortbegin} - the beginning of the sort menu form<br>
+  {charactermenu1} - A list of characters to choose from<br>
+  {charactermenu2} - A second list of characters<br>
+  {classmenu} - A dropdown list for each of the site's classification types (genres, 
+  warnings, etc.)<br>
+  {ratingmenu} - A list of ratings<br>
+  {sortmenu} - Choose how the stories will be sorted alphabetically or by most 
+  recently updated<br>
+  {completemenu} - Choose all stories or only completed stories<br>
+  {sortend} - the end of the sort menu form</p>
+<p>You may include all or none of these and in whatever order you wish, except 
+  the {sortbegin} and {sortend} variables must be at the beginning and end of 
+  the list of variables in the form.</p>
+<p class="sampleLabel">Sample: </p>
+<p class="sample">&lt;!-- INCLUDE BLOCK : header --&gt;<br>
+  {output}{otherresults}<br>
+  &lt;!-- START BLOCK : sortform --&gt;<br>
+  &lt;div id=&quot;sortform&quot;&gt;{sortbegin}{categorymenu} {charactermenu1} 
+  {charactermenu2} {ratingmenu} {classmenu} {sortmenu} {completemenu} {sortend}&lt;/div&gt;<br>
+  &lt;!-- END BLOCK : sortform --&gt;<br>
+  &lt;!-- INCLUDE BLOCK : listings --&gt;<br>
+  &lt;!-- INCLUDE BLOCK : footer --&gt;</p>
+<p><a name="categories"></a>categories.tpl</p>
+<p>The categories.tpl controls the look of the individual category on the categories 
+  browse page. <strong>Note:</strong> The appearance of the categories block is 
+  controlled separately through the block's admin panel. </p>
+<p>The block must start with:</p>
+<p class="sample">&lt;!-- START BLOCK : categoryblock --&gt;</p>
+<p>and end with:</p>
+<p class="sample">&lt;!-- END BLOCK : categoryblock --&gt;</p>
+<p>The following variables are available to use in the block:</p>
+<p>{image} - The image associated with that category. Note: The name of the image 
+  is set in the Categories admin panel. The image file must be in the skin's directory. 
+  If the script can't find the image it will display nothing. (In 1.1 a broken 
+  image was displayed.)<br>
+  {link} - The link to the category's browse page.<br>
+  {count} - The count of stories within that category.<br>
+  {description} - The category's description.</p>
+<p class="sampleLabel">Sample:</p>
+<p class="sample">&lt;!-- START BLOCK : categoryblock --&gt;<br>
+  {image} {link} {count} {description}<br>
+  &lt;!-- END BLOCK : categoryblock --&gt;</p>
+<p><a name="comments">comments.tpl</a></p>
+<p>This block controls the display of comments on the news.php page for a single 
+  story.&nbsp; </p>
+<p>You must start the file with:</p>
+<p class="sample">&lt;!-- START BLOCK : commentbox --&gt;</p>
+<p>and end it with:</p>
+<p class="sample">&lt;!-- END BLOCK : commentbox --&gt;</p>
+<p>This information should be placed on separate lines.&nbsp; Between these two 
+  lines the following variables should be included.</p>
+<p>{comment} - The comment from the member.<br>
+  {uname} - The member's name as a hyperlink to their profile.<br>
+  {date} - The date the comment was made.<br>
+  {adminoptions} - Options visible to the administrator when viewing the page.</p>
+<p>The variable {oddeven} is optional, you can use it to assign alternating styles 
+  to each comment.</p>
+<p class="sampleLabel">Sample:</p>
+<p class="sample">&lt;!-- START BLOCK : commentbox --&gt;<br>
+  &lt;div class=&quot;comment {oddeven}&quot;&gt;<br>
+  {comment}<br>
+  &lt;div class=&quot;commentsig&quot;&gt;- {uname} on {date}&lt;/div&gt;<br>
+  &lt;div class=&quot;adminoptions&quot;&gt; {adminoptions}&lt;/div&gt;<br>
+  &lt;/div&gt;<br>
+  &lt;!-- END BLOCK : commentbox --&gt;</p>
+<p><a name="default">default.tpl</a></p>
+<p>The majority of pages use this for their layout.&nbsp; Most likely you won't 
+  need to include it in your skin at all.</p>
+<p>You must include the <a href="#header">header</a>, <a href="#listings"> listings</a>, 
+  and <a href="#footer">footer</a> block as seen below and include the {output} 
+  variable BEFORE the listings block.&nbsp; The {output} variable provides various 
+  text like the page title and alphabet list for titles. You will probably not 
+  need to replicate this file in your skin since there's nothing much to change 
+  really.</p>
+<p class="sampleLabel">Sample:</p>
+<p class="sample">&lt;!-- INCLUDE BLOCK : header --&gt;<br>
+  {output}<br>
+  &lt;!-- INCLUDE BLOCK : listings --&gt;<br>
+  &lt;!-- INCLUDE BLOCK : footer --&gt;</p>
+<p></p>
+<p><a name="favcomments"></a>favcomment.tpl</p>
+<p>In eFiction 3.0 when favorites are turned on by the admin, members have the 
+  option of not only marking a story as a favorite, but also including a comment 
+  as to why it is their favorite. The favcomment.tpl us used to display these 
+  comments in the user's profile.</p>
+<p>The block must start with:</p>
+<p class="sample">&lt;!-- START BLOCK : comment --&gt;</p>
+<p>and end with:</p>
+<p class="sample">&lt;!-- END BLOCK : comment --&gt;</p>
+<p>In addition the following variables can be used within the block:</p>
+<p>{comment} - The member's comment<br>
+  {commentoptions} - Options concerning this comment for admin and the person 
+  who commented<br>
+  {oddeven} - This variable can be used to style alternating comments differently.</p>
+<p class="sampleLabel">Sample:</p>
+<p class="sample">&lt;!-- START BLOCK : comment --&gt;<br>
+  &lt;div class=&quot;comment{oddeven}&quot;&gt;<br>
+  {comment}<br>
+  {commentoptions}<br>
+  &lt;/div&gt;<br>
+  &lt;!-- END BLOCK : comment --&gt;</p>
+<p><a name="footer">footer.tpl</a></p>
+<p>You must start the file with:</p>
+<p class="sample">&lt;!-- START BLOCK : footer --&gt;</p>
+<p>and end it with:</p>
+<p class="sample">&lt;!-- END BLOCK : footer --&gt;</p>
+<p>In addition to the <a href="#pagelinks">universal page links</a>, the footer.tpl 
+  also has one other variable assigned to it.&nbsp; </p>
+<p>{footer} - Your copyright statement.</p>
+<p>Content assigned to the footer in the admin panel or in the skin's variables.php 
+  file will also be included here.</p>
+<p class="sampleLabel">Sample: </p>
+<p class="sample">&lt;!-- START BLOCK : footer --&gt;<br>
+  &lt;/div&gt;<br>
+  &lt;div id=&quot;footer&quot;&gt;{footer}&lt;/div&gt;&lt;/div&gt;<br>
+  &lt;/body&gt;&lt;/html&gt;<br>
+  &lt;!-- END BLOCK : footer --&gt;</p>
+<p></p>
+<p><a name="header">header.tpl</a></p>
+<p>You must start the file with:</p>
+<p class="sample">&lt;!-- START BLOCK : header --&gt;</p>
+<p>and end it with:</p>
+<p class="sample">&lt;!-- END BLOCK : header --&gt;</p>
+<p>In addition to the <a href="#pagelinks">universal page links</a>, the 
+header.tpl also has two other variables assigned to it.&nbsp; The use of these 
+variables is optional.</p>
+<p>{sitename} - Your site name<br>
+{slogan} - Your site slogan</p>
+<p>Content assigned to the header in the admin panel or in the skin's 
+variables.php file will also be included here.</p>
+<p class="sampleLabel">Sample: </p>
+<p class="sample">&lt;!-- START BLOCK : header --&gt;<br>
+  &lt;body&gt;<br>
+  &lt;div id=&quot;container&quot;&gt;<br>
+  &lt;div id=&quot;banner&quot;&gt;&lt;div style=&quot;font-size: 40pt; font-style: 
+  oblique;&quot;&gt;{sitename}&lt;/div&gt;&lt;div style=&quot;font-size: 13pt;&quot;&gt;{slogan}&lt;/div&gt;&lt;div 
+  id=&quot;skin&quot;&gt;{skinchange_content}&lt;div style=&quot;padding: 5px;&quot;&gt;{rss}&lt;/div&gt;&lt;/div&gt;<br>
+  &lt;/div&gt;<br>
+  {menu_content}<br>
+  &lt;div id=&quot;mainpage&quot;&gt;<br>
+  &lt;!-- END BLOCK : header --&gt;</p>
+<p><a name="index">index.tpl</a></p>
+<p>This file controls the look of your site's home/index page. </p>
+<p>You will need to start by including the header block.</p>
+<p class="sample">&lt;!-- INCLUDE BLOCK : header --&gt;</p>
+<p>And end by including the footer block.</p>
+<p class="sample"> &lt;!-- INCLUDE BLOCK : footer --&gt;</p>
+<p>In addition to the <a href="#pagelinks">universal page links</a>, the 
+index.tpl also has one other variable assigned to it.&nbsp; </p>
+<p>{welcome} - Your welcome message.</p>
+<p>Content assigned to &quot;index only&quot; in the admin panel or in the skin's 
+variables.php file will also be included here.&nbsp; The sample below creates a 
+two column index page via positioning.&nbsp; See the style.css in the 
+default_tpls for the leftindex and rightindex style declarations.</p>
+<p class="sampleLabel">Sample: </p>
+<p class="sample">&lt;!-- INCLUDE BLOCK : header --&gt;<br>
+&lt;div style=&quot;padding: 1em 0; margin-bottom: -2em;&quot; class=&quot;clearfix&quot;&gt;<br>
+&lt;div id=&quot;leftindex&quot;&gt;<br>
+&lt;div class=&quot;block&quot;&gt;<br>
+&lt;div class=&quot;title&quot;&gt;{info_title}&lt;/div&gt;<br>
+&lt;div class=&quot;content&quot;&gt;{welcome}{info_content}&lt;br&gt;&lt;div style=&quot;width: 130px; 
+text-align: center; margin: 0 25px;&quot;&gt;{login_content}&lt;/div&gt;&lt;/div&gt;<br>
+&lt;/div&gt;<br>
+&lt;div class=&quot;block&quot;&gt;<br>
+&lt;div class=&quot;title&quot;&gt;{random_title}&lt;/div&gt;<br>
+&lt;div class=&quot;content&quot;&gt;{random_content}&lt;/div&gt;<br>
+&lt;/div&gt;<br>
+&lt;/div&gt;<br>
+&lt;div id=&quot;rightindex&quot;&gt;<br>
+&lt;div class=&quot;block&quot;&gt;<br>
+&lt;div class=&quot;title&quot;&gt;{categories_title}&lt;/div&gt;<br>
+&lt;div class=&quot;content&quot;&gt;&lt;div style=&quot;width: 95%&quot;&gt;{categories_content}&lt;/div&gt;&lt;/div&gt;<br>
+&lt;/div&gt;<br>
+&lt;div class=&quot;block&quot;&gt;<br>
+&lt;div class=&quot;title&quot;&gt;{recent_title}&lt;/div&gt;<br>
+&lt;div class=&quot;content&quot;&gt;{recent_content}&lt;/div&gt;<br>
+&lt;/div&gt;<br>
+&lt;div class=&quot;block&quot;&gt;<br>
+&lt;div class=&quot;title&quot;&gt;{news_title}&lt;/div&gt;<br>
+&lt;div class=&quot;content&quot;&gt;{news_content}&lt;/div&gt;<br>
+&lt;/div&gt;<br>
+&lt;/div&gt;<br>
+&lt;/div&gt;<br>
+&lt;!-- INCLUDE BLOCK : footer --&gt;</p>
+<p><a name="listings">listings.tpl</a></p>
+<p>This block is included in all pages where stories or series are listed such 
+as titles, categories, user's profile page, search results, etc.&nbsp; It is an 
+expansion of storyblock.tpl from 1.1.&nbsp; </p>
+<p>You must start the file with:</p>
+<p class="sample">&lt;!-- START BLOCK : listings --&gt;</p>
+<p>and end it with:</p>
+<p class="sample">&lt;!-- END BLOCK : listings --&gt;</p>
+<p> In addition, the following variable should be included just above the end 
+  line:</p>
+<p>{pagelinks} - If the results for the page require pagination, this variable 
+  will contain the list of page links.</p>
+<p>This block contains 2 inner blocks that control the appearance of the 
+individual series and stories.</p>
+<p>Both the seriesblock and storyblock should contain the following variables:</p>
+<p>{title} - Title of the story/series<br>
+  {author} - Author (Owner if it's an open series) of the story/series<br>
+  {score} - The story/series rating by members like/dislike or stars<br>
+  {reviews} - A link to the reviews for the story/series<br>
+  {numreviews} - the number of reviews linked to a listing of reviews for the 
+  story/series<br>
+  {summary} - The summary for the story/series<br>
+  {category} - The categories for the story/series<br>
+  {classifications} - The list of classifications for the story/series (genres, 
+  warnings, etc.)<br>
+  {characters} - The characters for the story/series<br>
+  {reportthis} - A link to report problems, errors, etc. with this story/series<br>
+  {addtofaves} - The option to add the story/series to favorites.<br>
+  {comment} - Will be used for favorite stories and also in certain reviews pages 
+  to display comments and reviews about the story/series</p>
+<p>Optional for both seriesblock and storyblock is the variable {oddeven}.&nbsp; 
+  This variable can be used to assign &quot;odd&quot; or &quot;even&quot; status 
+  to the block for CSS styling.</p>
+<p>The seriesblock will have the following additional variables:</p>
+<p> {adminoptions} - Options visible to the admin when viewing the page.&nbsp;<br>
+  {open} - Whether or not the series is open to contributions from others (like 
+  a round robin)<br>
+  {parentseries} - If the series is a sub-series of another, the parent series 
+  will be listed here.<br>
+  {numstories} - The number of stories within the series.<br>
+</p>
+<p>The storyblock will have the following additional variables:</p>
+<p>{adminlinks} - Options visible to the admin when viewing the page.<br>
+  {serieslinks} - If the story is part of a series this will contain a link to 
+  those series.<br>
+  {numchapters} - The number of chapters in the story.<br>
+  {completed} - Whether or not the story is complete.<br>
+  {wordcount} - The total number of words in the story (all chapters)<br>
+  {toc} - A link to the story's table of contents<br>
+  {count} - The count for the number of times the story has been viewed.<br>
+  {roundrobin} - If this story is a round robin an icon will be displayed showing 
+  this.<br>
+  {new} - If the site has set a &quot;recent&quot; date range new or updated stories 
+  falling within that range will be flagged a &quot;New!&quot; using this variable.<br>
+  {featuredstory} - If the story is listed as a featured story or a retired feature 
+  story an icon will be displayed showing this status.<br>
+  {published} - The date the story was published.<br>
+  {updated} - The date the story was last updated.</p>
+<p class="sampleLabel">Sample:</p>
+<p class="sample">&lt;!-- START BLOCK : listings --&gt;<br>
+  &lt;!-- START BLOCK : seriesblock --&gt;<br>
+  &lt;div class=&quot;listbox {oddeven}&quot;&gt;<br>
+  &lt;div class=&quot;title&quot;&gt;{title} by {author}{score} [{reviews} - {numreviews}]&lt;/div&gt;<br>
+  &lt;div class=&quot;content&quot;&gt;&lt;span class=&quot;label&quot;&gt;Summary: 
+  &lt;/span&gt;{summary}&lt;br /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Parent Series:&lt;/span&gt; {parentseries}&lt;br 
+  /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Categories:&lt;/span&gt; {category}&lt;br 
+  /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Characters: &lt;/span&gt;{characters}&lt;br 
+  /&gt;<br>
+  {classifications}<br>
+  &lt;span class=&quot;label&quot;&gt;Stories:&lt;/span&gt; {numstories}&lt;br 
+  /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Open:&lt;/span&gt; {open} {addtofaves} {reportthis}<br>
+  {adminoptions}&lt;/div&gt;<br>
+  &lt;/div&gt;<br>
+  {comment}<br>
+  &lt;!-- END BLOCK : seriesblock --&gt;<br>
+  &lt;!-- START BLOCK : storyblock --&gt;<br>
+  &lt;div class=&quot;listbox {oddeven}&quot;&gt;<br>
+  &lt;div class=&quot;title&quot;&gt;{title} by {author} &lt;span class=&quot;label&quot;&gt;Rated:&lt;/span&gt; 
+  {rating} {roundrobin} {score} [{reviews} - {numreviews}] {new} &lt;/div&gt;<br>
+  &lt;div class=&quot;content&quot;&gt;&lt;span class=&quot;label&quot;&gt;Summary: 
+  &lt;/span&gt;{featuredstory}{summary}&lt;br /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Categories:&lt;/span&gt; {category} &lt;br 
+  /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Characters: &lt;/span&gt; {characters}&lt;br 
+  /&gt;<br>
+  {classifications}<br>
+  &lt;span class=&quot;label&quot;&gt;Series:&lt;/span&gt; {serieslinks}&lt;br 
+  /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Chapters: &lt;/span&gt; {numchapters} {toc}&lt;br 
+  /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Completed:&lt;/span&gt; {completed} <br>
+  &lt;span class=&quot;label&quot;&gt;Word count:&lt;/span&gt; {wordcount} &lt;span 
+  class=&quot;label&quot;&gt;Read Count:&lt;/span&gt; {count}<br>
+  {adminlinks}&lt;/div&gt;<br>
+  &lt;div class=&quot;tail&quot;&gt;&lt;span class=&quot;label&quot;&gt;{addtofaves} 
+  {reportthis} Published: &lt;/span&gt;{published} &lt;span class=&quot;label&quot;&gt;Updated:&lt;/span&gt; 
+  {updated}&lt;/div&gt;<br>
+  &lt;/div&gt;<br>
+  {comment}<br>
+  &lt;!-- END BLOCK : storyblock --&gt;<br>
+  {pagelinks}<br>
+  &lt;!-- END BLOCK : listings --&gt;</p>
+<p><a name="newsbox">newsbox.tpl</a></p>
+<p>This block displays one news story, and will be called by the news block and 
+  is also used in the news archive page.</p>
+<p>You must start the file with:</p>
+<p class="sample">&lt;!-- START BLOCK : newsbox --&gt;</p>
+<p>and end it with:</p>
+<p class="sample">&lt;!-- END BLOCK : newsbox --&gt;</p>
+<p>At a minimum, the following variables should be included in the block.&nbsp; 
+</p>
+<p>{newstitle} - The title of the news story<br>
+  {newsstory} - The content of the news story<br>
+  {newsauthor} - The author of the news story<br>
+  {newsdate} - The date the news item was added to the site<br>
+  {newscomments} - The number of comments the story has received with a link to 
+  view the comments.</p>
+<p>Additionally, if you wish administrator options to appear when an admin views 
+  the story you should include:</p>
+<p>{adminoptions}</p>
+<p>Finally, if you want alternating stories to appear with different CSS options 
+  you can include:</p>
+<p>{oddeven} - Where this variable is placed the word &quot;even&quot; will appear 
+  in even numbered stories and the word &quot;odd&quot; will appear in odd numbered 
+  stories.</p>
+<p class="sampleLabel">Sample:</p>
+<p class="sample">&lt;!-- START BLOCK : newsbox --&gt;<br>
+  &lt;div class=&quot;newsbox_{oddeven}&quot;&gt;<br>
+  &lt;div class=&quot;newstitle&quot;&gt;{newstitle} {adminoptions}&lt;/div&gt;<br>
+  {newsstory}&lt;br /&gt;&lt;br /&gt;<br>
+  --{newsauthor} on {newsdate} {newscomments}<br>
+  &lt;/div&gt;<br>
+  &lt;!-- END BLOCK : newsbox --&gt;</p>
+<p><a name="printstory"></a>printstory.tpl</p>
+<p>This template is used when the print story function is used. Generally this 
+  is another block that you can probably leave to the default_tpls. The following 
+  variables should be included in this template:</p>
+<p>{title} - The title of the story<br>
+  {author} - The author(s) of the story<br>
+  {featuredstory} - The featured/retired icon will be displayed here if the story 
+  is featured.<br>
+  {summary} - The summary of the story<br>
+  {category} - The story's categories<br>
+  {characters} - The story's character list<br>
+  {classifications} - The other classification information for the story (genres, 
+  warnings, etc.)<br>
+  {challengelinks} - The challenges to which this story is a response<br>
+  {serieslinks} - The list of series to which this story belongs<br>
+  {numchapters} - The number of chapters in the story<br>
+  {completed} - Whether or not the story is complete<br>
+  {wordcount} - The word count for the story<br>
+  {count} - The read count for the story<br>
+  {published} - The date the story was published<br>
+  {updated} - The date the story was updated<br>
+  {copyright} - The print version of the site's copyright notice<br>
+  {archivedat} - A statement of where the story is archived at.</p>
+<p>In addition to these variables there are several blocks included in this template. 
+  The storynotes block will be displayed if the story contains notes. It contains 
+  one variable, {storynotes}. The next block should be the storyindexblock. For 
+  multi-chapter stories, this will be the table of contents. The storyindexblock 
+  will be one chapter's worth of information about the story. The following variables 
+  can be included in the storyindexblock:</p>
+<p>{title} - The chapter's title<br>
+  {author} - The author of the chapter<br>
+  {chapternumber} - The chapter number.</p>
+<p>The next block will be the chapter information for each chapter. This block 
+  contains blocks inside it for the chapter notes and endnotes. The following 
+  variables can be included in the chapterblock:</p>
+<p>{chaptertitle} - The title of the chapter<br>
+  {chapterauthor} - The author of the chapter<br>
+  {chaptertext} - The text of the chapter<br>
+  {back2top} - An anchor back to the top of the document.</p>
+<p>The notes block contains a single variable {notes} and the endnotes block contains 
+  a single variable {endnotes}. These blocks plus the storynotes block are placed 
+  in blocks so that html can be used around the blocks if the information is present 
+  and hidden when not.</p>
+<p class="sampleLabel">Sample:</p>
+<p class="sample">&lt;div id=&quot;pagetitle&quot;&gt;{title} by {author}&lt;/div&gt;<br>
+  &lt;div class=&quot;infobox&quot;&gt;<br>
+  &lt;div class=&quot;content&quot;&gt;{featuredstory}&lt;span class=&quot;label&quot;&gt;Summary: 
+  &lt;/span&gt;{summary}&lt;br /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Categories:&lt;/span&gt; {category} &lt;span 
+  class=&quot;label&quot;&gt;Characters: &lt;/span&gt; {characters}&lt;br /&gt;<br>
+  {classifications}<br>
+  &lt;span class=&quot;label&quot;&gt;Challenges:&lt;/span&gt; {challengelinks}&lt;br 
+  /&gt; &lt;span class=&quot;label&quot;&gt;Series:&lt;/span&gt; {serieslinks}&lt;br 
+  /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Chapters: &lt;/span&gt; {numchapters} &lt;span 
+  class=&quot;label&quot;&gt;Completed:&lt;/span&gt; {completed} <br>
+  &lt;span class=&quot;label&quot;&gt;Word count:&lt;/span&gt; {wordcount} &lt;span 
+  class=&quot;label&quot;&gt;Read:&lt;/span&gt; {count}<br>
+  &lt;span class=&quot;label&quot;&gt; Published: &lt;/span&gt;{published} &lt;span 
+  class=&quot;label&quot;&gt;Updated:&lt;/span&gt; {updated} &lt;/div&gt;<br>
+  &lt;/div&gt;<br>
+  &lt;!-- START BLOCK : storynotes --&gt;<br>
+  &lt;div class='notes'&gt;&lt;div class='title'&gt;&lt;span class='label'&gt;Story 
+  Notes:&lt;/span&gt;&lt;/div&gt;&lt;div class='noteinfo'&gt;{storynotes}&lt;/div&gt;&lt;/div&gt;<br>
+  &lt;!-- END BLOCK : storynotes --&gt;<br>
+  &lt;!-- START BLOCK : storyindexblock --&gt;<br>
+  &lt;p&gt;&lt;b&gt;{chapternumber}.&lt;/b&gt; {title} by {author}&lt;/p&gt;<br>
+  &lt;!-- END BLOCK : storyindexblock --&gt;<br>
+  &lt;!-- START BLOCK : chapterblock --&gt;<br>
+  &lt;div class='chaptertitle'&gt;{chaptertitle} by {chapterauthor}&lt;/div&gt;<br>
+  &lt;!-- START BLOCK : notes --&gt;<br>
+  &lt;div class='notes'&gt;&lt;div class='title'&gt;&lt;span class='label'&gt;Author's 
+  Notes:&lt;/div&gt;&lt;div class='noteinfo'&gt;{notes}&lt;/div&gt;&lt;/div&gt;<br>
+  &lt;!-- END BLOCK : notes --&gt;<br>
+  &lt;div class='chapter'&gt;{chaptertext}&lt;/div&gt;<br>
+  &lt;!-- START BLOCK : endnotes --&gt;<br>
+  &lt;div class='notes'&gt;&lt;div class='title'&gt;&lt;span class='label'&gt;End 
+  Notes:&lt;/div&gt;&lt;div class='noteinfo'&gt;{endnotes}&lt;/div&gt;&lt;/div&gt;<br>
+  &lt;!-- END BLOCK : endnotes --&gt;<br>
+  &lt;div class='toplink'&gt;{back2top}&lt;/div&gt;<br>
+  &lt;!-- END BLOCK : chapterblock --&gt;<br>
+  &lt;div id=&quot;copyright&quot;&gt;{copyright}&lt;/div&gt;<br>
+  &lt;div id=&quot;archivedat&quot;&gt;{archivedat}&lt;/div&gt;</p>
+<p><a name="profile"></a>profile.tpl</p>
+<p>This template is used in the author's profile page. It's been separated out 
+  of the user.tpl so that it can be re-used in other panels if needed.</p>
+<p>You must start the file with:</p>
+<p class="sample">&lt;!-- START BLOCK : profile --&gt;</p>
+<p>and end it with:</p>
+<p class="sample">&lt;!-- END BLOCK : profile --&gt;</p>
+<p>The following variables can be included in this file:</p>
+<p>{realname} - The member's real name<br>
+  {userpenname} - The member's penname<br>
+  {membersince} - The date the member joined the site<br>
+  {userlevel} - The member's user level Member or Admin (if the person viewing 
+  the page is an admin they will see the admin level)<br>
+  {image} - The member's image from their bio information<br>
+  {bio} - The autor's bio<br>
+  {authorfields} - The list of admin defined author fields. i.e. aol, icq, etc.<br>
+  {adminoptions} - A list of admin options about the member (visible only to admins)<br>
+  {reportthis} - A report this link for the members profile</p>
+<p>For each active authorfield, you will also have a variable for that information. 
+  For instance, if you've activated the AOL authorfield, the variable {aol} will 
+  also output the aol information for the member. </p>
+<p>Note: this is for a non-bridged site. If you've bridged your site, the variables 
+  available to your profile will depend on how your bridge is set up.</p>
+<p class="sampleLabel">Sample:</p>
+<p class="sample">&lt;!-- START BLOCK : profile --&gt;<br>
+  &lt;div id=&quot;profile&quot;&gt;<br>
+  &lt;div id=&quot;bio&quot;&gt;<br>
+  &lt;div id=&quot;biotitle&quot;&gt;&lt;span class=&quot;label&quot;&gt;Penname: 
+  &lt;/span&gt;{userpenname} &lt;span class=&quot;label&quot;&gt;Real name: &lt;/span&gt;{realname}&lt;/div&gt;<br>
+  &lt;div id=&quot;biocontent&quot;&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Member Since: &lt;/span&gt;{membersince}&lt;br 
+  /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Membership status:&lt;/span&gt; {userlevel}&lt;br 
+  /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Bio:&lt;/span&gt;&lt;br&gt;{image}{bio}&lt;br 
+  /&gt;<br>
+  {authorfields} <br>
+  &lt;/div&gt;<br>
+  &lt;/div&gt;<br>
+  {adminoptions} {reportthis}<br>
+  &lt;/div&gt;<br>
+  &lt;!-- END BLOCK : profile --&gt;</p>
+<p><a name="reviewblock"></a>reviewblock.tpl</p>
+<p>This block controls the display of an individual review. It's been separated 
+  from the reviews.tpl file so it can be re-used in other panels.</p>
+<p>You must start the file with:</p>
+<p class="sample">&lt;!-- START BLOCK : reviewsblock --&gt;</p>
+<p>and end it with:</p>
+<p class="sample">&lt;!-- END BLOCK : reviewsblock --&gt;</p>
+<p>The following variables can be included in this file:</p>
+<p>{reviewer} - The name of the reviewer<br>
+  {member} - The words Signed or Anonymous depending on whether the reviewer was 
+  a member<br>
+  {rating} - The thumbs up/down or star rating the reviewer gave<br>
+  {reportthis} - A link to report trouble with this review<br>
+  {reviewdate} - The date the review was given<br>
+  {chapter} - The title of the item being reviewed (chapter if it's a story and 
+  the chapter is named)<br>
+  {review} - The text of the review<br>
+  {adminoptions} - Admin options for the review</p>
+<p class="sampleLabel">Sample:</p>
+<p class="sample">&lt;!-- START BLOCK : reviewsblock --&gt;<br>
+  &lt;div class=&quot;listbox&quot;&gt;<br>
+  &lt;div class=&quot;content{oddeven}&quot;&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Reviewer: &lt;/span&gt;{reviewer} &lt;span 
+  class=&quot;label&quot;&gt;{member}&lt;/span&gt; {rating} {reportthis}&lt;br 
+  /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Date: &lt;/span&gt;{reviewdate}<br>
+  &lt;span class=&quot;label&quot;&gt;Title: &lt;/span&gt;{chapter}<br>
+  &lt;p&gt;{review}&lt;/p&gt;<br>
+  {adminoptions}<br>
+  &lt;/div&gt;<br>
+  &lt;/div&gt;<br>
+  &lt;!-- END BLOCK : reviewsblock --&gt;</p>
+<p><a name="reviews">reviews.tpl</a></p>
+<p>This block controls the display of the reviews page.&nbsp; This .tpl includes 
+an inner block that formats the individual reviews on the page.&nbsp; The 
+following variables are included in the reviews.tpl</p>
+<p>{pagetitle} - The title of the page<br>
+  {output} - Used for error and confirmation messages.&nbsp; Should probably be 
+  included just below {pagetitle}<br>
+  {jumpmenu} - Displays the jump menu for reviews pages that require it.<br>
+  {reviewpagelinks} - Used for pagination.&nbsp; Should be included AFTER the 
+  reviewsblock<br>
+  {reviewslink} - Link inviting visitor to submit a review (Optional can use {reviewsform} 
+  instead) <br>
+  {reviewsform} - The review form. (Optional can use {reviewslink} instead)</p>
+<p>You will need to start by including the header block.</p>
+<p class="sample">&lt;!-- INCLUDE BLOCK : header --&gt;</p>
+<p>And end by including the footer block.</p>
+<p class="sample"> &lt;!-- INCLUDE BLOCK : footer --&gt;</p>
+<p class="sampleLabel">Sample:</p>
+<p class="sample">&lt;!-- INCLUDE BLOCK : header --&gt;<br>
+  {pagetitle}<br>
+  &lt;div class=&quot;respond&quot;&gt;{reviewslink}&lt;/div&gt;<br>
+  &lt;div class=&quot;jumpmenu&quot;&gt;{jumpmenu}&lt;/div&gt;<br>
+  {output}<br>
+  &lt;!-- INCLUDE BLOCK : reviewsblock --&gt;<br>
+  {reviewpagelinks}<br>
+  {reviewform}<br>
+  &lt;!-- INCLUDE BLOCK : footer --&gt;</p>
+<p><a name="seriestitle"></a>series_title.tpl</p>
+<p>This template displays the title block information on a series page. </p>
+<p>You must start the file with:</p>
+<p class="sample">&lt;!-- START BLOCK: series --&gt;</p>
+<p>and end it with:</p>
+<p class="sample">&lt;!-- END BLOCK : series --&gt;</p>
+<p>The following variables can be included in this file:</p>
+<p>{pagetitle} - This will be the series title and author links<br>
+  {rating} - The thumbs up/down or star rating for the series<br>
+  {summary} - The series' summary<br>
+  {category} - The category information for the series<br>
+  {characters} - The characters for the series<br>
+  {classifications} - The other classification information for the series (genres, 
+  warnings, etc.)<br>
+  {parentseries} - If this series has a parent, this will be a link to the parent 
+  series<br>
+  {numstories} - The number of stories in the series<br>
+  {open} - The open status of the series <br>
+  {adminoptions} - The admin options for the series<br>
+  {addtofaves} - The link to add the series to favorites<br>
+  {jump} - The dropdown list of options for the series.</p>
+<p class="sampleLabel">Sample:</p>
+<p class="sample">&lt;!-- START BLOCK : series --&gt;<br>
+  &lt;div id=&quot;pagetitle&quot;&gt;{pagetitle} {rating}&lt;/div&gt;<br>
+  &lt;div id=&quot;titleinfo&quot;&gt; [{reviews} - {numreviews}]&lt;/div&gt;<br>
+  &lt;div id=&quot;titleblock&quot;&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Summary:&lt;/span&gt; {summary}&lt;br /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Categories:&lt;/span&gt; {category}&lt;br 
+  /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Characters:&lt;/span&gt; {characters}&lt;br 
+  /&gt;<br>
+  {classifications}<br>
+  &lt;span class=&quot;label&quot;&gt;Parent Series:&lt;/span&gt; {parentseries}&lt;br 
+  /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Stories:&lt;/span&gt; {numstories}&lt;br 
+  /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Open Series:&lt;/span&gt; {open}&lt;br /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;{adminoptions}{addtofaves}&lt;br /&gt;<br>
+  &lt;/div&gt;<br>
+  &lt;div class=&quot;jumpmenu&quot;&gt;{jump}&lt;/div&gt;<br>
+  &lt;!-- END BLOCK : series --&gt;</p>
+<p><a name="storyindex"></a>storyindex.tpl</p>
+<p>This template controls the story index (table of contents) for an individual 
+  story. </p>
+<p>You will need to start by including the header block.</p>
+<p class="sample">&lt;!-- INCLUDE BLOCK : header --&gt;</p>
+<p>And end by including the footer block.</p>
+<p class="sample"> &lt;!-- INCLUDE BLOCK : footer --&gt;</p>
+<p>The following variables may be included in this template:</p>
+<p>{title} - The title of the story<br>
+  {author} - The author(s) of the story<br>
+  {reviews} - A link to the reviews for the story with the word &quot;Reviews&quot; 
+  as text<br>
+  {numreviews} - A link to the reviews for the story with the number of reviews 
+  as the text<br>
+  {score} - The thumbs up/down or star rating for a story<br>
+  {jumpmenu} - The dropdown menu of chapters in the story<br>
+  {featuredstory} - The featured/retired icon<br>
+  {summary} - The summary of the story<br>
+  {rating} - The story's content rating<br>
+  {category} - The story's categories<br>
+  {characters} - The list of characters for the story<br>
+  {classifications} - The other classifications for the story (genres, warnings, 
+  etc.)<br>
+  {serieslinks} - The list of series to which the story belongs<br>
+  {numchapters} - The number of chapters in the story<br>
+  {completed} - Yes or No depending on the status of the story<br>
+  {wordcount} - The total word count for the story<br>
+  {count} - The read count for the story<br>
+  {published} - The date the story was published<br>
+  {updated} - The date the story was last updated<br>
+  {adminlinks} - The admin options for the story<br>
+  {addtofaves} - The option to add this story to favorites<br>
+  {roundrobin} - The option to contribute to the round robin<br>
+  {jumpmenu2} - The drop down menu of options concerning the story<br>
+  {reviewform} - A form to submit a review of the story<br>
+  {reviewslink} - A link to review the story</p>
+<p>In addition there are two included blocks. The first is storynotes which includes 
+  one variable {storynotes} for the story notes. The second is the storyindexblock. 
+  The following information can be included in the storyindexblock for each chapter 
+  of the story:</p>
+<p>{chapternumber} - The chapter number<br>
+  {title} - The title of the chapter<br>
+  {author} - The author of the chapter<br>
+  {reviews} - The reviews link for reviews for that chapter<br>
+  {numreviews} - The number of reviews that chapter has received<br>
+  {ratingpics} - The thumbs up/down or star rating for that chapter<br>
+  {wordcount} - The word count for that chapter<br>
+  {chapternotes} - The chapter notes for that chapter (end notes are not displayed)<br>
+  {adminoptions} - Admin options for that chapter</p>
+<p class="sampleLabel">Sample:</p>
+<p class="sample">&lt;!-- INCLUDE BLOCK : header --&gt;<br>
+  &lt;div id=&quot;pagetitle&quot;&gt;{title} by {author}&lt;/div&gt;<br>
+  &lt;div id=&quot;sort&quot;&gt; [{reviews} - {numreviews}] {score}{printicon}&lt;/div&gt;<br>
+  &lt;div id=&quot;output&quot;&gt;<br>
+  &lt;div class=&quot;jumpmenu&quot;&gt;{jumpmenu}&lt;/div&gt;<br>
+  &lt;div class=&quot;listbox&quot;&gt;<br>
+  &lt;div class=&quot;content&quot;&gt;{featuredstory}&lt;span class=&quot;label&quot;&gt;Summary: 
+  &lt;/span&gt;{summary}&lt;br /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Rated:&lt;/span&gt; {rating}&lt;br /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Categories:&lt;/span&gt; {category} &lt;span 
+  class=&quot;label&quot;&gt;Characters: &lt;/span&gt; {characters}&lt;br /&gt;<br>
+  {classifications}<br>
+  &lt;span class=&quot;label&quot;&gt;Challenges:&lt;/span&gt; {challengelinks}&lt;br 
+  /&gt; &lt;span class=&quot;label&quot;&gt;Series:&lt;/span&gt; {serieslinks}&lt;br 
+  /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt;Chapters: &lt;/span&gt; {numchapters} &lt;span 
+  class=&quot;label&quot;&gt;Completed:&lt;/span&gt; {completed} &lt;br /&gt; 
+  <br>
+  &lt;span class=&quot;label&quot;&gt;Word count:&lt;/span&gt; {wordcount} &lt;span 
+  class=&quot;label&quot;&gt;Read:&lt;/span&gt; {count}&lt;br /&gt;<br>
+  &lt;span class=&quot;label&quot;&gt; Published: &lt;/span&gt;{published} &lt;span 
+  class=&quot;label&quot;&gt;Updated:&lt;/span&gt; {updated} &lt;/div&gt;<br>
+  {adminlinks}<br>
+  &lt;/div&gt;<br>
+  &lt;div style='text-align: center;'&gt;{addtofaves}&lt;/div&gt;<br>
+  &lt;!-- START BLOCK : storynotes --&gt;<br>
+  &lt;div class='notes'&gt;&lt;div class='title'&gt;&lt;span class='label'&gt;Story 
+  Notes:&lt;/span&gt;&lt;/div&gt;&lt;div class='noteinfo'&gt;{storynotes}&lt;/div&gt;&lt;/div&gt;<br>
+  &lt;!-- END BLOCK : storynotes --&gt;<br>
+  &lt;!-- START BLOCK : storyindexblock --&gt;<br>
+  &lt;p&gt;&lt;b&gt;{chapternumber}. {title} &lt;/b&gt;by {author} [{reviews} 
+  - {numreviews}] {ratingpics} ({wordcount} words)&lt;br /&gt;<br>
+  {chapternotes}{adminoptions}&lt;/p&gt;<br>
+  &lt;!-- END BLOCK : storyindexblock --&gt;<br>
+  &lt;div id=&quot;pagelinks&quot;&gt;&lt;div class=&quot;jumpmenu&quot;&gt;{jumpmenu2}&lt;/div&gt;&lt;/div&gt;<br>
+  &lt;div class=&quot;respond&quot;&gt;{roundrobin}&lt;/div&gt;<br>
+  {reviewform}<br>
+  &lt;/div&gt;<br>
+  &lt;!-- INCLUDE BLOCK : footer --&gt; </p>
+<p><a name="user">user.tpl</a></p>
+<p>This page displays the user profile page.&nbsp; </p>
+<p>You will need to start by including the header block.</p>
+<p class="sample">&lt;!-- INCLUDE BLOCK : header --&gt;</p>
+<p>And end by including the footer block.</p>
+<p class="sample"> &lt;!-- INCLUDE BLOCK : footer --&gt;</p>
+<p>In addition you will want to include the profile block as well.</p>
+<p class="sample">&lt;!-- INCLUDE BLOCK : profile --&gt;</p>
+<p>The user.tpl file includes one other block used to form the &quot;tabs&quot; 
+  for the profile panels. You can build these tabs any way you wish. The sample 
+  below places them inside a div with each individual tab as a span. Another idea 
+  is to use an unordered list. Within this block you can use the following variables:</p>
+<p>{class} - The class for that &quot;tab&quot; used to differentiate the current/active 
+  tab from the inactive tabs.<br>
+  {link} - The link to the tab<br>
+  {count} - The count of items in the tab (may be empty)<br>
+  {linkcount} - The link to the tab with the count of items in the tab included 
+  in the link</p>
+<p>In addition to these blocks, the following variables can be included:</p>
+<p>{adminoptions} - Options regarding this member's account<br>
+  {sort} - Gives the sort for when displaying the user's stories.<br>
+  {output} - Used for various messages and errors in panels.</p>
+<p class="sampleLabel">Sample: </p>
+<p class="sample">&lt;!-- INCLUDE BLOCK : header --&gt;<br>
+  &lt;div id=&quot;profile&quot;&gt;<br>
+  &lt;!-- INCLUDE BLOCK : profile --&gt;<br>
+  {adminoptions}<br>
+  &lt;div id=&quot;sort&quot;&gt;{sort}&lt;/div&gt;<br>
+  &lt;/div&gt;<br>
+  &lt;div id=&quot;tabs&quot;&gt;<br>
+  &lt;!-- START BLOCK : paneltabs --&gt;<br>
+  &lt;span {class}&gt;{link} {count}&lt;/span&gt;<br>
+  &lt;!-- END BLOCK : paneltabs --&gt;<br>
+  &lt;div class='cleaner' style='clear: both;'&gt;&amp;nbsp;&lt;/div&gt;<br>
+  &lt;/div&gt;<br>
+  {output}<br>
+  &lt;!-- INCLUDE BLOCK : listings --&gt;<br>
+  &lt;!-- INCLUDE BLOCK : footer --&gt;</p>
+<p><a name="viewstory">viewstory.tpl</a></p>
+<p>This page displays the story/chapter text.&nbsp; </p>
+<p>You will need to start by including the header block.</p>
+<p class="sample">&lt;!-- INCLUDE BLOCK : header --&gt;</p>
+<p>And end by including the footer block.</p>
+<p class="sample"> &lt;!-- INCLUDE BLOCK : footer --&gt;</p>
+<p>Three included blocks are used to display the story notes, chapter notes, and 
+  chapter end notes.</p>
+<p>In addition, the following variables may be included:</p>
+<p>{title} - The title of the story<br>
+  {author} - The author(s) of the story<br>
+  {reviews} - A link to the reviews for the story with the word &quot;Reviews&quot; 
+  as text<br>
+  {numreviews} - A link to the reviews for the story with the number of reviews 
+  as the text<br>
+  {score} - The thumbs up/down or star rating for a story<br>
+  {jumpmenu} - The dropdown menu of chapters in the story<br>
+  {featuredstory} - The featured/retired icon<br>
+  {summary} - The summary of the story<br>
+  {rating} - The story's content rating<br>
+  {category} - The story's categories<br>
+  {characters} - The list of characters for the story<br>
+  {classifications} - The other classifications for the story (genres, warnings, 
+  etc.)<br>
+  {serieslinks} - The list of series to which the story belongs<br>
+  {numchapters} - The number of chapters in the story<br>
+  {completed} - Yes or No depending on the status of the story<br>
+  {wordcount} - The total word count for the story<br>
+  {count} - The read count for the story<br>
+  {published} - The date the story was published<br>
+  {updated} - The date the story was last updated<br>
+  {adminlinks} - The admin options for the story<br>
+  {addtofaves} - The option to add this story to favorites<br>
+  {roundrobin} - The option to contribute to the round robin<br>
+  {jumpmenu2} - The drop down menu of options concerning the story<br>
+  {reviewform} - A form to submit a review of the story<br>
+  {reviewslink} - A link to review the story</p>
+<p></p>
+<p class="sampleLabel">Sample: </p>
+<p class="sample">&lt;!-- INCLUDE BLOCK : header --&gt;<br>
+  &lt;div id=&quot;pagetitle&quot;&gt;{title} by {author}&lt;/div&gt;<br>
+  &lt;div class=&quot;storyinfo&quot;&gt; [{reviews} - {numreviews}]&lt;br /&gt;<br>
+  {toc} {reportthis}&lt;br /&gt;<br>
+  {printicon} &lt;br /&gt;<br>
+  {adminlinks} &lt;/div&gt;<br>
+  &lt;div class=&quot;jumpmenu&quot;&gt;{textsizer}{jumpmenu}&lt;/div&gt;<br>
+  &lt;!-- START BLOCK : storynotes --&gt;<br>
+  &lt;div class='notes'&gt;<br>
+  &lt;div class='title'&gt;&lt;span class='label'&gt;Story Notes:&lt;/span&gt;&lt;/div&gt;<br>
+  &lt;div class='noteinfo'&gt;{storynotes}&lt;/div&gt;<br>
+  &lt;/div&gt;<br>
+  &lt;!-- END BLOCK : storynotes --&gt;<br>
+  &lt;!-- START BLOCK : notes --&gt;<br>
+  &lt;div class='notes'&gt;&lt;div class='title'&gt;&lt;span class='label'&gt;Author's 
+  Chapter Notes:&lt;/span&gt;&lt;/div&gt;&lt;div class='noteinfo'&gt;{notes}&lt;/div&gt;&lt;/div&gt;<br>
+  &lt;!-- END BLOCK : notes --&gt;<br>
+  &lt;div id=&quot;story&quot;&gt;{story}&lt;/div&gt;<br>
+  &lt;!-- START BLOCK : endnotes --&gt;<br>
+  &lt;div class='notes'&gt;&lt;div class='title'&gt;&lt;span class='label'&gt;Chapter 
+  End Notes:&lt;/span&gt;&lt;/div&gt;&lt;div class='noteinfo'&gt;{endnotes}&lt;/div&gt;&lt;/div&gt;<br>
+  &lt;!-- END BLOCK : endnotes --&gt;<br>
+  &lt;div id=&quot;prev&quot;&gt;{prev}&lt;/div&gt;&lt;div id=&quot;next&quot;&gt;{next}&lt;/div&gt;<br>
+  {storyend}{last_read}<br>
+  &lt;div class=&quot;jumpmenu2&quot;&gt;{jumpmenu2}&lt;/div&gt;<br>
+  &lt;div class=&quot;respond&quot;&gt;{addtofaves} {roundrobin}&lt;/div&gt;<br>
+  {reviewform}<br>
+  &lt;!-- INCLUDE BLOCK : footer --&gt;</p>
+<p><br>
+  &nbsp;</p>
+<p>&nbsp;</p>
+
+<p>&nbsp;</p>
+</body>
+
+</html>

--- /dev/null
+++ b/docs/default_panels.htm
@@ -1,1 +1,142 @@
+<html>
 
+<head>
+<meta http-equiv="Content-Language" content="en-us">
+<meta name="GENERATOR" content="Microsoft FrontPage 5.0">
+<meta name="ProgId" content="FrontPage.Editor.Document">
+<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
+<title>Admin Panels</title>
+</head>
+
+<body>
+<p>Admin Panels:<br>
+  <br>
+  The admin panels control the different admin options for the site.&nbsp; In 
+  2.0 the list was static.&nbsp; Putting the admin options into panels allows 
+  site owners the option of changing the access level for the various features. 
+  It also allows new options to be added without editing everything.&nbsp; The 
+  0-4 levels in the panel are most applicable here.&nbsp; The levels 1 to 4 indicate 
+  the admin level required to access a certain feature.<br>
+  <br>
+  Message Settings <a href="#1">(1)</a><br>
+  Rejection Letter <a href="#1">(1)</a><a href="#2">(2)</a><br>
+  Validation Letter <a href="#1">(1)</a><a href="#2">(2)</a><br>
+  Validate Submission <a href="#1">(1)</a><a href="#2">(2)</a><br>
+  Censor <a href="#1">(1)</a><br>
+  Categories<br>
+  Panels<br>
+  Characters<br>
+  Settings<br>
+  Blocks<br>
+  Ratings<br>
+  Add New Story<br>
+  Add New Series<br>
+  Custom Pages<br>
+  Classifications<br>
+  News<br>
+  Members<br>
+  Featured Stories<br>
+  Submissions<br>
+  Page Links<br>
+  Admins<br>
+  Mail Users<br>
+  Skins<br>
+  PHP Info<br>
+  Action Log<br>
+  Profile Information<br>
+  <br>
+  Browse Panels:<br>
+  <br>
+  Browse panels control the &quot;Browse By&quot; area of the site.&nbsp; <br>
+  <br>
+  Most Recent <a href="#1">(1)</a><br>
+  Featured Stories <a href="#1">(1)</a><br>
+  Classes <a href="#1">(1)</a><a href="#2">(2)</a><br>
+  Categories<br>
+  Characters<br>
+  Ratings<br>
+  Series<br>
+  Titles<br>
+  <br>
+  Favorite Panels:<br>
+  <br>
+  The favorites panels are included both in the member &quot;Account Info&quot; 
+  page and the list of panels in the profile.&nbsp; In the &quot;Account Info&quot; 
+  area the panel must be set to level 1 to be visible in the list of options.&nbsp;Otherwise, 
+  they're used as part of the &quot;Manage Favorites&quot; panel.<br>
+  <br>
+  Favorite Stories <a href="#1">(1)</a><br>
+  Favorite Series <a href="#1">(1)</a><br>
+  Favorite Authors <a href="#1">(1)</a><br>
+  {author}'s Favorites<br>
+  <br>
+  Top 10 List Panels:<br>
+  <br>
+  The Top 10 panel. They're all turned on my default.&nbsp; If you turn favorites 
+  off, it is suggested that you hide, not delete, the favorites panels. (You could 
+  change your mind later.)<br>
+  <br>
+  10 Largest Series<br>
+  10 Smallest Series<br>
+  10 Most Reviewed Series<br>
+  10 Longest Stories<br>
+  10 Shortest Stories<br>
+  10 Most Reviewed Stories<br>
+  10 Most Read Stories<br>
+  10 Most Responded to Challenges<br>
+  10 Most Favorite Stories<br>
+  10 Most Prolific Reviewers<br>
+  10 Most Prolific Authors<br>
+  10 Most Reviewed Recommendations<br>
+  <br>
+  Profile Panels:<br>
+  <br>
+  These are the panels that will be displayed on the user's profile page along 
+  with the non-hidden favorites panels.&nbsp; <br>
+  <br>
+  Contact <a href="#1">(1)</a><a href="#2">(2)</a><br>
+  Stories by {author}<br>
+  Series by {author}<br>
+  Reviews by {author}<br>
+  <br>
+  Submissions Panels:<br>
+  <br>
+  The submission panels will only be displayed in the user panel if submissions 
+  are turned on. They were placed in a type separate from the user panels so they 
+  would be turned on and off<br>
+  together based on the submission site settings.<br>
+  <br>
+  Add New Story<br>
+  Manage Stories<br>
+  Add New Series<br>
+  Manage Series<br>
+  Manage Images<br>
+  <br>
+  User Account Panels:<br>
+  <br>
+  As an extra level of security here.&nbsp; The &quot;level&quot; of the panel 
+  should be set to either 0 or 1.&nbsp; Panels with level 0 will be displayed 
+  to anyone.&nbsp; Panels with level 1 will be displayed only to logged in<br>
+  members.&nbsp; The login, register, and lost password panels are currently the 
+  only panels set to level 0 for the user account area.<br>
+  <br>
+  Login <a href="#1">(1)</a><br>
+  Your Reviews <a href="#1">(1)</a><br>
+  Reviews Received <a href="#1">(1)</a><br>
+  Review Response <a href="#1">(1)</a><a href="#2">(2)</a><br>
+  Lost Password<br>
+  Register<br>
+  Edit Bio<br>
+  Edit Preferences<br>
+  View Your Statistics<br>
+  Manage Favorites<br>
+  Logout<br>
+  <br>
+  (1)<a name="1"></a>&nbsp; Hidden by default.<br>
+  (2)<a name="2"></a>&nbsp; System panels.&nbsp; You should not need to alter 
+  these settings and may cause errors if you do.</p>
+
+</body>
+
+</html>
+

file:b/docs/gpl.txt (new)
--- /dev/null
+++ b/docs/gpl.txt
@@ -1,1 +1,341 @@
-
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+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 give any other recipients of the Program a copy of this License
+along with the Program.
+
+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 Program or any portion
+of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+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 Program, 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 Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) 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; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, 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 executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or 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 counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program 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.
+
+  5. 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 Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. 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 Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program 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 Program.
+
+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.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program 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.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the 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 Program
+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 Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, 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
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), 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 Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  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 program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+

file:b/docs/index.php (new)
--- /dev/null
+++ b/docs/index.php

file:b/docs/messages.sql (new)
--- /dev/null
+++ b/docs/messages.sql
@@ -1,1 +1,10 @@
+INSERT INTO `fanfiction_messages` (`message_id`, `message_name`, `message_title`, `message_text`) VALUES (1, 'welcome', '', 'This is your welcome message. It appears on the index page. Include it in your .tpl files with {welcome}.'),
+(2, 'copyright', '', 'This is your sample copyright footer.  Include it in your footer.tpl with <b>{footer}</b><br />\r\n<u>Disclaimer:</u>  All publicly recognizable characters, settings, etc. are the property of their respective owners.  The original characters and plot are the property of the author.  No money is being made from this work.  No copyright infringement is intended.\r\n'),
+(3, 'help', 'Help', '<h3>FAQ</h3><p><strong>I forgot my password!&nbsp; What do I do now?</strong></p><p>To recover a lost password, <a href="user.php?action=lostpassword">click here</a> and enter the e-mail address with which you registered.&nbsp; Your password will be sent to you shortly.</p><p><strong>What kinds of stories are allowed?</strong></p><p>See our <a href="submission.php">Submission Rules.</a></p><p><strong>How do I contact the site administrators?</strong></p><p>You can e-mail us via our <a href="contact.php">contact form.</a></p><p><strong>How do I submit stories?</strong></p><p>If you have not already done so, please <a href="user.php?action=newaccount">register for an account</a>. Once you''ve logged in, click on <a href="user.php">Account Information</a> and choose <a href="stories.php?action=newstory">Add Story</a>.&nbsp; The form presented there will allow you to submit your story.</p><p><strong>What are the ratings used on the site?</strong></p><p>We use the ratings system from <a href="http://www.fictionratings.com/">www.fictionratings.com</a>.</p><p><strong>What are the story classifications?</strong></p><p>Stories are classified by categories, genres, and warnings.</p>'),
+(4, 'nothankyou', '{sitename} Submission Rejection', 'Your recent submission of "{storytitle} : {chaptertitle}" to {sitename} did not meet our requirements for submission.  Please review our {rules}.<br /><br />\r\n\r\n{adminname}'),
+(5, 'printercopyright', '', '<u>Disclaimer:</u> All publicly recognizable characters and settings are the property of their respective owners. The original characters and plot are the property of the author. No money is being made from this work. No copyright infringement is intended.'),
+(6, 'rules', 'Submission Rules', '<p align="center"><strong>Submission Rules</strong></p>\r\n<ol>\r\n  <li>All submissions must be accompanied by a complete disclaimer. If a \r\n  suitable disclaimer is not included, the site administrators reserve the right \r\n  to add a disclaimer.&nbsp; Repeat offenders may be subject to further action \r\n  up to and including removal of stories and account.\r\n<div class="tblborder" style="width: 400px; margin: 1em auto;">\r\n<div style="background: #000; color: #FFF; padding: 5px; text-align: center; font-weight: bold;">Sample Disclaimer</div>\r\n<div class="tblborder" style="padding: 5px;"><span style="text-decoration: underline;">Disclaimer:</span>  All publicly recognizable characters, settings, etc. are the property of their respective owners.  The original characters and plot are the property of the author.&nbsp; \r\n        The author is in no way associated with the owners, creators, or producers of any media franchise.&nbsp;  No copyright infringement is intended.</div>\r\n  </div>\r\n  </li>\r\n  <li>Stories must be submitted to the proper category. &nbsp;If there is an appropriate sub-category, <strong>DO NOT</strong> add your story to the main category.&nbsp; The submission \r\n  form allows you to choose multiple categories for your story, and we worked very hard to add that functionality for you.&nbsp;&nbsp; <u><strong>So please \r\n  do NOT add your story multiple times!</strong></u></li>\r\n  <li>Titles and summaries must be kid friendly.&nbsp; No exceptions.&nbsp; </li>\r\n  <li>&quot;Please read&quot;, &quot;Untitled&quot;, etc. are not acceptable titles or summaries.</li>\r\n  <li>A number of authors have requested that fans refrain from writing fan \r\n  fiction based on their work.&nbsp; Therefore submissions will not be \r\n  accepted based on the works of P.N. Elrod, Raymond Feist, Terry Goodkind, \r\n  Laurell K. Hamilton, Anne McCaffrey, Robin McKinley, Irene Radford, Anne Rice, \r\n  and Nora Roberts/J.D. Robb.&nbsp; </li>\r\n  <li>Actor/actress stories are not permitted...not even if they''re visiting an \r\n  alternate reality.</li>\r\n  <li>Correct grammar and spelling are expected of all stories submitted to this \r\n  site.&nbsp; The site administrators are not grammar Nazis.&nbsp; However, the \r\n  site administrators reserve the right to request corrections in submissions \r\n  with a multitude of grammar and/or spelling errors.&nbsp; If such a request is \r\n  ignored, the story will be deleted.</li>\r\n  <li>All stories must be rated correctly and have the appropriate warnings.&nbsp; \r\n  All adult rated stories are expected to have warnings.&nbsp; After all, they \r\n  wouldn''t have that rating if there wasn''t something to be warned about!&nbsp; The site administrators recognize \r\n  that there is an audience for these stories, but please respect those who do \r\n  not wish to read them by labeling them appropriately.&nbsp;\r\n  <u><strong>Please note: Stories containing adults having sex with minors are strictly forbidden.</strong></u>&nbsp; </li>\r\n  <li>Stories with multiple chapters should be archived as such and <span style="font-weight: bold; text-decoration: underline;">NEVER</span> as \r\n  separate stories.&nbsp; Upload the first chapter of your story, then go to <a href="stories.php?action=viewstories">Manage Stories</a> in \r\nyour account to add additional chapters.  If you have trouble with this, please contact the site administrator or ask a \r\n  friend to help you.</li>\r\n  <li>As much as possible, spoiler warnings are expected on all stories.  For categories with serialized content, such as series of books or television series, \r\n  spoilers are <strong>mandatory</strong> for the current season and/or most recent part.  An appropriate spoiler warning to place in your summary would be: Spoilers for <u>Star Trek II: The Wrath of Khan.</u> \r\n  <strong>DO NOT</strong> do anything like this: <u>Spoilers for the one where Spock dies.</u></li>\r\n</ol>\r\n  <p>Submissions found to be in violation of these rules may be removed and the \r\n  author''s account suspended at the discretion of the site administrators and/or \r\n  moderators.&nbsp; The site administrators reserve the right to modify these \r\n  rules as needed.</p>'),
+(7, 'thankyou', '{sitename} Submission Acceptance', 'Thanks for your submission.'),
+(8, 'tos', 'Terms of Service', 'This is the Terms of Service for your site.  It will be displayed when a new member registers to the site.'),
+(9, 'maintenance', 'Site Maintenance', '<p>This site is currently undergoing maintenance.  Please check back later. </p>\r\n<p style=''text-align: center;''>Thank you!</p>');
 

file:b/docs/optimize.sql (new)
--- /dev/null
+++ b/docs/optimize.sql
@@ -1,1 +1,35 @@
-
+alter table fanfiction_authorinfo add primary key(uid,field);
+alter table fanfiction_blocks drop index block_name;
+alter table fanfiction_blocks add unique index block_name (block_name);
+alter table fanfiction_categories drop index category;
+alter table fanfiction_categories drop index parentcatid;
+create index byparent on fanfiction_categories (parentcatid,displayorder);
+create index forstoryblock on fanfiction_chapters (sid,validated);
+create index byname on fanfiction_classes (class_type,class_name,class_id);
+alter table fanfiction_classtypes drop index classtype_title;
+create unique index classtype_name on fanfiction_classtypes(classtype_name);
+create index code_type on fanfiction_codeblocks(code_type);
+alter table fanfiction_comments drop index nid;
+alter table fanfiction_comments add index commentlist (nid,time);
+alter table fanfiction_favorites drop index uid;
+create unique index byitem on fanfiction_favorites (item,type,uid);
+create unique index byuid on fanfiction_favorites (uid,type,item);
+alter table fanfiction_inseries drop index seriesid;
+alter table fanfiction_inseries drop index inorder;
+alter table fanfiction_inseries add index (seriesid,inorder);
+alter table fanfiction_inseries drop index sid;
+alter table fanfiction_inseries add primary key (sid,seriesid);
+create index message_name on fanfiction_messages (message_name);
+alter table fanfiction_pagelinks drop index link_text;
+alter table fanfiction_panels drop index panel_hidden;
+alter table fanfiction_panels drop index panel_type;
+alter table fanfiction_panels add index panel_type (panel_type,panel_name);
+create index avgrating on fanfiction_reviews(type,item,rating);
+alter table fanfiction_reviews drop index sid;
+create index bychapter on fanfiction_reviews (chapid,rating);
+alter table fanfiction_reviews add index byuid (uid,item,type);
+alter table fanfiction_series drop index owner;
+create index owner on fanfiction_series (uid,title);
+alter table fanfiction_stories drop index validated;
+create index validateduid on fanfiction_stories (validated,uid);
+create index recent on fanfiction_stories (updated,validated);

--- /dev/null
+++ b/docs/pagelinks.sql
@@ -1,1 +1,27 @@
+INSERT INTO `test3fanfiction_pagelinks` (`link_id`, `link_name`, `link_text`, `link_url`, `link_target`, `link_access`) VALUES (1, 'home', 'Home', 'index.php', '0', 0),
+(2, 'recent', 'Most Recent', 'browse.php?type=recent', '0', 0),
+(3, 'login', 'Login', 'user.php?action=login', '0', 0),
+(4, 'adminarea', 'Admin', 'admin.php', '0', 2),
+(5, 'logout', 'Logout', 'user.php?action=logout', '0', 1),
+(6, 'featured', 'Featured Stories', 'browse.php?type=featured', '0', 0),
+(7, 'catslink', 'Categories', 'browse.php?type=categories', '0', 0),
+(8, 'members', 'Members', 'authors.php?action=list', '0', 0),
+(9, 'authors', 'Authors', 'authors.php?list=authors', '0', 0),
+(10, 'help', 'Help', 'viewpage.php?page=help', '0', 0),
+(11, 'search', 'Search', 'search.php', '0', 0),
+(12, 'series', 'Series', 'browse.php?type=series', '0', 0),
+(13, 'tens', 'Top Tens', 'toplists.php', '0', 0),
+(14, 'challenges', 'Challenges', 'browse.php?type=challenges', '0', 0),
+(15, 'contactus', 'Contact Us', 'contact.php', '0', 0),
+(16, 'rules', 'Rules', 'viewpage.php?page=rules', '0', 0),
+(17, 'tos', 'Terms of Service', 'viewpage.php?page=tos', '0', 0),
+(18, 'rss', '<img src=''images/xml.gif'' alt=''RSS'' border=''0''>', 'rss.php', '0', 0),
+(19, 'login', 'Account Info', 'user.php', '0', 1),
+(20, 'titles', 'Titles', 'browse.php?type=titles', '0', 0),
+(21, 'register', 'Register', 'user.php?action=register', '0', 0),
+(22, 'lostpassword', 'Lost Password', 'user.php?action=lostpassword', '0', 0),
+(23, 'newsarchive', 'News Archive', 'news.php', '0', 0),
+(24, 'browse', 'Browse', 'browse.php', '0', 0),
+(25, 'charslink', 'Characters', 'browse.php?type=characters', '0', 0),
+(26, 'ratings', 'Ratings', 'browse.php?type=ratings', '0', 0);
 

file:b/docs/panels.sql (new)
--- /dev/null
+++ b/docs/panels.sql
@@ -1,1 +1,79 @@
+INSERT INTO `fanfiction_panels` (`panel_name`, `panel_title`, `panel_url`, `panel_level`, `panel_order`, `panel_hidden`, `panel_type`) VALUES (1, 'submitted', 'Submissions', '', 3, 5, 0, 'A'),
+('versioncheck', 'Version Check', '', 3, 7, 0, 'A'),
+('newstory', 'Add New Story', 'stories.php?action=newstory&admin=1', 3, 2, 0, 'A'),
+('addseries', 'Add New Series', 'series.php?action=add', 3, 3, 0, 'A'),
+('news', 'News', '', 3, 4, 0, 'A'),
+('featured', 'Featured Stories', '', 3, 5, 0, 'A'),
+('characters', 'Characters', '', 2, 1, 0, 'A'),
+('ratings', 'Ratings', '', 2, 2, 0, 'A'),
+('members', 'Members', '', 2, 3, 0, 'A'),
+('mailusers', 'Mail Users', '', 2, 4, 0, 'A'),
+('settings', 'Settings', '', 1, 1, 0, 'A'),
+('blocks', 'Blocks', '', 1, 6, 0, 'A'),
+('censor', 'Censor', '', 1, 0, 1, 'A'),
+('admins', 'Admins', '', 1, 5, 0, 'A'),
+('classifications', 'Classifications', '', 2, 5, 0, 'A'),
+('categories', 'Categories', '', 2, 6, 0, 'A'),
+('custpages', 'Custom Pages', '', 1, 4, 0, 'A'),
+('validate', 'Validate Submission', '', 3, 0, 1, 'A'),
+('yesletter', 'Validation Letter', '', 3, 0, 1, 'A'),
+('noletter', 'Rejection Letter', '', 3, 0, 1, 'A'),
+('links', 'Page Links', '', 1, 3, 0, 'A'),
+('messages', 'Message Settings', '', 2, 0, 1, 'A'),
+('login', 'Login', '', 0, 0, 1, 'U'),
+('logout', 'Logout', '', 1, 1, 0, 'U'),
+('revreceived', 'Reviews Received', '', 1, 0, 1, 'U'),
+('editprefs', 'Edit Preferences', '', 1, 2, 0, 'U'),
+('lostpassword', 'Lost Password', '', 0, 0, 1, 'U'),
+('editbio', 'Edit Bio', '', 1, 3, 0, 'U'),
+('register', 'Register', '', 0, 0, 1, 'U'),
+('manageimages', 'Manage Images', '', 1, 1, 0, 'S'),
+('manfavs', 'Manage Favorites', '', 1, 4, 0, 'F'),
+('revres', 'Review Response', '', 1, 0, 1, 'U'),
+('stats', 'View Your Statistics', '', 1, 5, 0, 'U'),
+('newstory', 'Add New Story', 'stories.php?action=newstory', 1, 2, 0, 'S'),
+('newseries', 'Add New Series', 'series.php?action=add', 1, 3, 0, 'S'),
+('managestories', 'Manage Stories', 'stories.php?action=viewstories', 1, 4, 0, 'S'),
+('manageseries', 'Manage Series', 'series.php?action=manage', 1, 5, 0, 'S'),
+('reviewsby', 'Your Reviews', '', 1, 0, 1, 'U'),
+('storiesby', 'Stories', '', 0, 1, 0, 'P'),
+('seriesby', 'Series', '', 0, 2, 0, 'P'),
+('reviewsby', 'Reviews', '', 0, 3, 0, 'P'),
+('categories', 'Categories', '', 0, 1, 0, 'B'),
+('characters', 'Characters', '', 0, 2, 0, 'B'),
+('ratings', 'Ratings', '', 0, 3, 0, 'B'),
+('titles', 'Titles', '', 0, 4, 0, 'B'),
+('class', 'Classes', '', 0, 0, 1, 'B'),
+('recent', 'Most Recent', '', 0, 0, 1, 'B'),
+('featured', 'Featured Stories', '', 0, 0, 1, 'B'),
+('panels', 'Panels', '', 1, 2, 0, 'A'),
+('phpinfo', 'PHP Info', '', 1, 7, 0, 'A'),
+('contact', 'Contact', '', 0, 0, 1, 'P'),
+('series', 'Series', '', 0, 5, 0, 'B'),
+('viewlog', 'Action Log', '', 1, 8, 0, 'A'),
+('shortstories', '10 Shortest Stories', 'toplists/default.php', 0, 1, 0, 'L'),
+('longstories', '10 Longest Stories', 'toplists/default.php', 0, 2, 0, 'L'),
+('largeseries', '10 Largest Series', 'toplists/default.php', 0, 3, 0, 'L'),
+('smallseries', '10 Smallest Series', 'toplists/default.php', 0, 4, 0, 'L'),
+('reviewedseries', '10 Most Reviewed Series', 'toplists/default.php', 0, 5, 0, 'L'),
+('prolificauthors', '10 Most Prolific Authors', 'toplists/default.php', 0, 10, 0, 'L'),
+('prolificreviewers', '10 Most Prolific Reviewers', 'toplists/default.php', 0, 12, 0, 'L'),
+('reviewedstories', '10 Most Reviewed Stories', 'toplists/default.php', 0, 8, 0, 'L'),
+('readstories', '10 Most Read Stories', 'toplists/default.php', 0, 9, 0, 'L'),
+('favstories', '10 Most Favorite Stories', 'toplists/default.php', 0, 7, 0, 'L'),
+('favauthors', '10 Most Favorite Authors', 'toplists/default.php', 0, 11, 0, 'L'),
+('favseries', '10 Most Favorite Series', 'toplists/default.php', 0, 6, 0, 'L'),
+('favst', 'Favorite Stories', '', 0, 0, 1, 'F'),
+('favse', 'Favorite Series', '', 0, 0, 1, 'F'),
+('favau', 'Favorite Authors', '', 0, 0, 1, 'F'),
+('favst', 'Favorite Stories', '', 0, 0, 1, 'U'),
+('favse', 'Favorite Series', '', 0, 0, 1, 'U'),
+('favau', 'Favorite Authors', '', 0, 0, 1, 'U'),
+('favlist', 'Favorites', 'viewuser.php?action=manfavs', 0, 1, 0, 'F'),
+('skins', 'Skins', '', 3, 6, 0, 'A'),
+('authorfields', 'Profile Information', '', 1, 9, 0, 'A'),
+('manual', 'Admin Manual', '', '3', '6', '0', 'A'),
+('modules', 'Modules', '', 1, '11', 0, 'A'),
+('maintenance', 'Archive Maintenance', '', 1, 10, 0, 'A');
 
+

--- /dev/null
+++ b/docs/settingstable.sql
@@ -1,1 +1,62 @@
+-- 
+-- Table structure for table `settingsfanfiction_settings`
+-- 
 
+CREATE TABLE `fanfiction_settings` (
+  `sitekey` varchar(50) NOT NULL default '1',
+  `sitename` varchar(200) NOT NULL default 'Your Site',
+  `slogan` varchar(200) NOT NULL default 'It\'s a cool site!',
+  `url` varchar(200) NOT NULL default 'http://www.yoursite.com',
+  `siteemail` varchar(200) NOT NULL default 'you@yoursite.com',
+  `tableprefix` varchar(50) NOT NULL default '',
+  `skin` varchar(50) NOT NULL default 'default',
+  `hiddenskins` varchar(255) NULL default '',
+  `language` varchar(10) NOT NULL default 'en',
+  `submissionsoff` tinyint(1) NOT NULL default '0',
+  `storiespath` varchar(20) NOT NULL default 'stories',
+  `store` varchar(5) NOT NULL default 'files',
+  `autovalidate` tinyint(1) NOT NULL default '0',
+  `coauthallowed` int(1) NOT NULL default '0',
+  `maxwords` int(11) NOT NULL default '0',
+  `minwords` int(11) NOT NULL default '0',
+  `imageupload` tinyint(1) NOT NULL default '0',
+  `imageheight` int(11) NOT NULL default '200',
+  `imagewidth` int(11) NOT NULL default '200',
+  `roundrobins` tinyint(1) NOT NULL default '0',
+  `allowseries` tinyint(4) NOT NULL default '2',
+  `tinyMCE` tinyint(1) NOT NULL default '0',
+  `allowed_tags` varchar(200) NOT NULL default '<b><i><u><center><hr><p><br /><br><blockquote><ol><ul><li><img><strong><em>',
+  `favorites` tinyint(1) NOT NULL default '0',
+  `multiplecats` tinyint(1) NOT NULL default '0',
+  `newscomments` tinyint(1) NOT NULL default '0',
+  `logging` tinyint(1) NOT NULL default '0',
+  `maintenance` tinyint(1) NOT NULL default '0',
+  `debug` tinyint(1) NOT NULL default '0',
+  `captcha` tinyint(1) NOT NULL default '0',
+  `dateformat` varchar(20) NOT NULL default 'd/m/y',
+  `timeformat` varchar(20) NOT NULL default '- h:i a',
+  `recentdays` tinyint(2) NOT NULL default '7',
+  `displaycolumns` tinyint(1) NOT NULL default '1',
+  `itemsperpage` tinyint(2) NOT NULL default '25',
+  `extendcats` tinyint(1) NOT NULL default '0',
+  `displayindex` tinyint(1) NOT NULL default '0',
+  `defaultsort` tinyint(1) NOT NULL default '0',
+  `displayprofile` tinyint(1) NOT NULL default '0',
+  `linkstyle` tinyint(1) NOT NULL default '0',
+  `linkrange` tinyint(2) NOT NULL default '5',
+  `reviewsallowed` tinyint(1) NOT NULL default '0',
+  `ratings` tinyint(1) NOT NULL default '0',
+  `anonreviews` tinyint(1) NOT NULL default '0',
+  `revdelete` tinyint(1) NOT NULL default '0',
+  `rateonly` tinyint(1) NOT NULL default '0',
+  `pwdsetting` tinyint(1) NOT NULL default '0',
+  `alertson` tinyint(1) NOT NULL default '0',
+  `disablepopups` tinyint(1) NOT NULL default '0',
+  `agestatement` tinyint(1) NOT NULL default '0',
+  `words` text,
+  `version` varchar(10) NOT NULL default '3.3',
+  `smtp_host` varchar(200) default NULL,
+  `smtp_username` varchar(50) default NULL,
+  `smtp_password` varchar(50) default NULL,
+  PRIMARY KEY  (`sitekey`)
+) ENGINE=MyISAM DEFAULT CHARSET=latin1;

file:b/docs/tables.sql (new)
--- /dev/null
+++ b/docs/tables.sql
@@ -1,1 +1,552 @@
-
+-- 
+-- Table structure for table `fanfiction_authorfields`
+-- 
+
+CREATE TABLE `fanfiction_authorfields` (
+  `field_id` int(11) NOT NULL auto_increment,
+  `field_type` tinyint(4) NOT NULL default '0',
+  `field_name` varchar(30) NOT NULL default '',
+  `field_title` varchar(255) NOT NULL default '',
+  `field_options` text,
+  `field_code_in` text,
+  `field_code_out` text,
+  `field_on` tinyint(1) NOT NULL default '0',
+  PRIMARY KEY  (`field_id`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_authorinfo`
+-- 
+
+CREATE TABLE `fanfiction_authorinfo` (
+  `uid` int(11) NOT NULL default '0',
+  `field` int(11) NOT NULL default '0',
+  `info` varchar(255) NOT NULL default '',
+  PRIMARY KEY  (`uid`,`field`),
+  KEY `uid` (`uid`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_authorprefs`
+-- 
+
+CREATE TABLE `fanfiction_authorprefs` (
+  `uid` int(11) NOT NULL default '0',
+  `newreviews` tinyint(1) NOT NULL default '0',
+  `newrespond` tinyint(1) NOT NULL default '0',
+  `ageconsent` tinyint(1) NOT NULL default '0',
+  `alertson` tinyint(1) NOT NULL default '0',
+  `tinyMCE` tinyint(1) NOT NULL default '0',
+  `sortby` tinyint(1) NOT NULL default '0',
+  `storyindex` tinyint(1) NOT NULL default '0',
+  `validated` tinyint(1) NOT NULL default '0',
+  `userskin` varchar(60) NOT NULL default 'default',
+  `level` tinyint(1) NOT NULL default '0',
+  `categories` varchar(200) NOT NULL default '0',
+  `contact` tinyint(1) NOT NULL default '0',
+  `stories` int(11) NOT NULL default '',
+  PRIMARY KEY  (`uid`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_authors`
+-- 
+
+CREATE TABLE `fanfiction_authors` (
+  `uid` int(11) NOT NULL auto_increment,
+  `penname` varchar(200) NOT NULL default '',
+  `realname` varchar(200) NOT NULL default '',
+  `email` varchar(200) NOT NULL default '',
+  `website` varchar(200) NOT NULL default '',
+  `bio` text NOT NULL,
+  `image` varchar(200) NOT NULL default '',
+  `date`  int(10) unsigned NOT NULL default '0',
+  `admincreated` int(11) NOT NULL default '0',
+  `password` varchar(40) NOT NULL default '0',
+  PRIMARY KEY  (`uid`),
+  KEY `penname` (`penname`),
+  KEY `admincreated` (`admincreated`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_blocks`
+-- 
+
+CREATE TABLE `fanfiction_blocks` (
+  `block_id` int(11) NOT NULL auto_increment,
+  `block_name` varchar(30) NOT NULL default '',
+  `block_title` varchar(150) NOT NULL default '',
+  `block_file` varchar(200) NOT NULL default '',
+  `block_status` tinyint(1) NOT NULL default '0',
+  `block_variables` text NOT NULL,
+  PRIMARY KEY  (`block_id`),
+  KEY `block_name` (`block_name`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_categories`
+-- 
+
+CREATE TABLE `fanfiction_categories` (
+  `catid` int(11) NOT NULL auto_increment,
+  `parentcatid` int(11) NOT NULL default '-1',
+  `category` varchar(60) NOT NULL default '',
+  `description` text NOT NULL,
+  `image` varchar(100) NOT NULL default '',
+  `locked` tinyint(4) NOT NULL default '0',
+  `leveldown` tinyint(4) NOT NULL default '0',
+  `displayorder` int(4) NOT NULL default '0',
+  `numitems` int(11) NOT NULL default '0',
+  PRIMARY KEY  (`catid`),
+  KEY `byparent` (`parentcatid`,`displayorder`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_chapters`
+-- 
+
+CREATE TABLE `fanfiction_chapters` (
+  `chapid` int(11) NOT NULL auto_increment,
+  `title` varchar(250) NOT NULL default '',
+  `inorder` int(11) NOT NULL default '0',
+  `notes` text NOT NULL,
+  `storytext` text NOT NULL,
+  `endnotes` text,
+  `validated` tinyint(4) NOT NULL default '0',
+  `wordcount` int(11) NOT NULL default '0',
+  `rating` tinyint(4) NOT NULL default '0',
+  `reviews` smallint(6) NOT NULL default '0',
+  `sid` int(11) NOT NULL default '0',
+  `uid` int(11) NOT NULL default '0',
+  `count` int(11) NOT NULL default '0',
+  PRIMARY KEY  (`chapid`),
+  KEY `sid` (`sid`),
+  KEY `uid` (`uid`),
+  KEY `inorder` (`inorder`),
+  KEY `title` (`title`),
+  KEY `validated` (`validated`),
+  KEY `forstoryblock` (`sid`,`validated`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_characters`
+-- 
+
+CREATE TABLE `fanfiction_characters` (
+  `charid` int(11) NOT NULL auto_increment,
+  `catid` int(11) NOT NULL default '0',
+  `charname` varchar(60) NOT NULL default '',
+  `bio` text NOT NULL,
+  `image` varchar(200) NOT NULL default '',
+  PRIMARY KEY  (`charid`),
+  KEY `catid` (`catid`),
+  KEY `charname` (`charname`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_classes`
+-- 
+
+CREATE TABLE `fanfiction_classes` (
+  `class_id` int(11) NOT NULL auto_increment,
+  `class_type` int(11) NOT NULL default '0',
+  `class_name` varchar(100) NOT NULL default '',
+  PRIMARY KEY  (`class_id`),
+  KEY `byname` (`class_type`,`class_name`,`class_id`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_classtypes`
+-- 
+
+CREATE TABLE `fanfiction_classtypes` (
+  `classtype_id` int(11) NOT NULL auto_increment,
+  `classtype_name` varchar(50) NOT NULL default '',
+  `classtype_title` varchar(50) NOT NULL default '',
+  PRIMARY KEY  (`classtype_id`),
+  UNIQUE KEY `classtype_name` (`classtype_name`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_coauthors`
+-- 
+
+CREATE TABLE `fanfiction_coauthors` (
+  `sid` int(11) NOT NULL default '0',
+  `uid` int(11) NOT NULL default '0',
+  PRIMARY KEY  (`sid`,`uid`),
+) REPLACE=MyISAM;
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_codeblocks`
+-- 
+
+CREATE TABLE `fanfiction_codeblocks` (
+  `code_id` int(11) NOT NULL auto_increment,
+  `code_text` text NOT NULL,
+  `code_type` varchar(20) default NULL,
+  `code_module` varchar(60) default NULL,
+  PRIMARY KEY  (`code_id`),
+  KEY `code_type` (`code_type`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_comments`
+-- 
+
+CREATE TABLE `fanfiction_comments` (
+  `cid` int(11) NOT NULL auto_increment,
+  `nid` int(11) NOT NULL default '0',
+  `uid` int(11) NOT NULL default '0',
+  `comment` text NOT NULL,
+  `time` int(10) unsigned NOT NULL default '0',
+  PRIMARY KEY  (`cid`),
+  KEY `commentlist` (`nid`,`time`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_favorites`
+-- 
+
+CREATE TABLE `fanfiction_favorites` (
+  `uid` int(11) NOT NULL default '0',
+  `item` int(11) NOT NULL default '0',
+  `type` char(2) NOT NULL default '',
+  `comments` text,
+  UNIQUE KEY `byitem` (`item`,`type`,`uid`),
+  UNIQUE KEY `byuid` (`uid`,`type`,`item`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_inseries`
+-- 
+
+CREATE TABLE `fanfiction_inseries` (
+  `seriesid` int(11) NOT NULL default '0',
+  `sid` int(11) NOT NULL default '0',
+  `subseriesid` int(11) NOT NULL default '0',
+  `confirmed` int(11) NOT NULL default '0',
+  `inorder` int(11) NOT NULL default '0',
+  PRIMARY KEY  (`sid`,`seriesid`),
+  KEY `seriesid` (`seriesid`,`inorder`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_log`
+-- 
+
+CREATE TABLE `fanfiction_log` (
+  `log_id` int(11) NOT NULL auto_increment,
+  `log_action` varchar(255) default NULL,
+  `log_uid` int(11) NOT NULL default '0',
+  `log_ip` int(11) default NULL,
+  `log_timestamp` int(10) unsigned NOT NULL default '0',
+  `log_type` char(2) NOT NULL default '',
+  PRIMARY KEY  (`log_id`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_messages`
+-- 
+
+CREATE TABLE `fanfiction_messages` (
+  `message_id` int(11) NOT NULL auto_increment,
+  `message_name` varchar(50) NOT NULL default '',
+  `message_title` varchar(200) NOT NULL default '',
+  `message_text` text,
+  PRIMARY KEY  (`message_id`),
+  KEY `message_name` (`message_name`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_modules`
+-- 
+
+CREATE TABLE `fanfiction_modules` (
+  `id` int(11) NOT NULL,
+  `name` varchar(100) NOT NULL default 'Test Module',
+  `version` varchar(10) NOT NULL default '1.0',
+  PRIMARY KEY  (`id`),
+  KEY `name_version` (`name`,`version`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_news`
+-- 
+
+CREATE TABLE `fanfiction_news` (
+  `nid` int(11) NOT NULL auto_increment,
+  `author` varchar(60) NOT NULL default '',
+  `title` varchar(255) NOT NULL default '',
+  `story` text NOT NULL,
+  `time` int(10) unsigned NOT NULL default '0',
+  `comments` int(11) NOT NULL default '0',
+  PRIMARY KEY  (`nid`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_pagelinks`
+-- 
+
+CREATE TABLE `fanfiction_pagelinks` (
+  `link_id` int(11) NOT NULL auto_increment,
+  `link_name` varchar(50) NOT NULL default '',
+  `link_text` varchar(100) NOT NULL default '',
+  `link_url` varchar(250) NOT NULL default '',
+  `link_target` char(1) NOT NULL default '0',
+  `link_access` tinyint(4) NOT NULL default '0',
+  PRIMARY KEY  (`link_id`),
+  KEY `link_name` (`link_name`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_panels`
+-- 
+
+CREATE TABLE `fanfiction_panels` (
+  `panel_id` int(11) NOT NULL auto_increment,
+  `panel_name` varchar(50) NOT NULL default 'unknown',
+  `panel_title` varchar(100) NOT NULL default 'Unnamed Panel',
+  `panel_url` varchar(100) default NULL,
+  `panel_level` tinyint(4) NOT NULL default '3',
+  `panel_order` tinyint(4) NOT NULL default '0',
+  `panel_hidden` tinyint(1) NOT NULL default '0',
+  `panel_type` varchar(20) NOT NULL default 'A',
+  PRIMARY KEY  (`panel_id`),
+  KEY `panel_type` (`panel_type`,`panel_name`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_ratings`
+-- 
+
+CREATE TABLE `fanfiction_ratings` (
+  `rid` int(11) NOT NULL auto_increment,
+  `rating` varchar(60) NOT NULL default '',
+  `ratingwarning` int(11) NOT NULL default '0',
+  `warningtext` text NOT NULL,
+  PRIMARY KEY  (`rid`),
+  KEY `rating` (`rating`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_reviews`
+-- 
+
+CREATE TABLE `fanfiction_reviews` (
+  `reviewid` int(11) NOT NULL auto_increment,
+  `item` int(11) NOT NULL default '0',
+  `chapid` int(11) NOT NULL default '0',
+  `reviewer` varchar(60) NOT NULL default '0',
+  `uid` int(11) NOT NULL default '0',
+  `review` text NOT NULL,
+  `date` int(10) unsigned NOT NULL default '0',
+  `rating` int(11) NOT NULL default '0',
+  `respond` char(1) NOT NULL default '0',
+  `type` char(2) NOT NULL default 'ST',
+  PRIMARY KEY  (`reviewid`),
+  KEY `psid` (`chapid`),
+  KEY `rating` (`rating`),
+  KEY `respond` (`respond`),
+  KEY `avgrating` (`type`,`item`,`rating`),
+  KEY `bychapter` (`chapid`,`rating`),
+  KEY `byuid` (`uid`,`item`,`type`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_series`
+-- 
+
+CREATE TABLE `fanfiction_series` (
+  `seriesid` int(11) NOT NULL auto_increment,
+  `title` varchar(200) NOT NULL default '',
+  `summary` text,
+  `uid` int(11) NOT NULL default '0',
+  `isopen` tinyint(4) NOT NULL default '0',
+  `catid` varchar(200) NOT NULL default '0',
+  `rating` tinyint(4) NOT NULL default '0',
+  `classes` varchar(200) default NULL,
+  `characters` varchar(250) NOT NULL default '',
+  `reviews` smallint(6) NOT NULL default '0',
+  `numstories` int(11) NOT NULL default '0',
+  `warnings` varchar(250) NOT NULL default '',
+  `challenges` varchar(200) NOT NULL default '',
+  `genres` varchar(250) NOT NULL default '',
+  PRIMARY KEY  (`seriesid`),
+  KEY `catid` (`catid`),
+  KEY `owner` (`uid`,`title`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+-- 
+-- Table structure for table `fanfiction_stats`
+-- 
+
+CREATE TABLE `fanfiction_stats` (
+  `sitekey` varchar(50) NOT NULL default '0',
+  `stories` int(11) NOT NULL default '0',
+  `chapters` int(11) NOT NULL default '0',
+  `series` int(11) NOT NULL default '0',
+  `reviews` int(11) NOT NULL default '0',
+  `wordcount` int(11) NOT NULL default '0',
+  `authors` int(11) NOT NULL default '0',
+  `members` int(11) NOT NULL default '0',
+  `reviewers` int(11) NOT NULL default '0',
+  `newestmember` int(11) NOT NULL default '0'
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_stories`
+-- 
+
+CREATE TABLE `fanfiction_stories` (
+  `sid` int(11) NOT NULL auto_increment,
+  `title` varchar(200) NOT NULL default '',
+  `summary` text,
+  `storynotes` text,
+  `catid` varchar(100) NOT NULL default '0',
+  `classes` varchar(200) default NULL,
+  `charid` varchar(250) NOT NULL default '0',
+  `rid` varchar(25) NOT NULL default '0',
+  `date` int(10) unsigned NOT NULL default '0',
+  `updated` int(10) unsigned NOT NULL default '0',
+  `uid` int(11) NOT NULL default '0',
+  `coauthors` varchar(200) default NULL,
+  `featured` tinyint(4) NOT NULL default '0',
+  `validated` tinyint(4) NOT NULL default '0',
+  `completed` tinyint(4) NOT NULL default '0',
+  `rr` tinyint(4) NOT NULL default '0',
+  `wordcount` int(11) NOT NULL default '0',
+  `rating` tinyint(4) NOT NULL default '0',
+  `reviews` smallint(6) NOT NULL default '0',
+  `count` int(11) NOT NULL default '0',
+  `challenges` varchar(200) NOT NULL default '0',
+  PRIMARY KEY  (`sid`),
+  KEY `title` (`title`),
+  KEY `catid` (`catid`),
+  KEY `charid` (`charid`),
+  KEY `rid` (`rid`),
+  KEY `uid` (`uid`),
+  KEY `featured` (`featured`),
+  KEY `completed` (`completed`),
+  KEY `rr` (`rr`),
+  KEY `challenges` (`challenges`),
+  KEY `validateduid` (`validated`,`uid`),
+  KEY `recent` (`updated`,`validated`)
+) REPLACE=MyISAM;
+
+-- --------------------------------------------------------
+
+-- 
+-- Table structure for table `fanfiction_settings`
+-- 
+
+CREATE TABLE `fanfiction_settings` (
+  `sitekey` varchar(50) NOT NULL default '1',
+  `sitename` varchar(200) NOT NULL default 'Your Site',
+  `slogan` varchar(200) NOT NULL default 'It''s a cool site!',
+  `url` varchar(200) NOT NULL default 'http://www.yoursite.com',
+  `siteemail` varchar(200) NOT NULL default 'you@yoursite.com',
+  `tableprefix` varchar(50) NOT NULL default '',
+  `skin` varchar(50) NOT NULL default 'default',
+  `hiddenskins` varchar(255) default '',
+  `language` varchar(10) NOT NULL default 'en',
+  `submissionsoff` tinyint(1) NOT NULL default '0',
+  `storiespath` varchar(20) NOT NULL default 'stories',
+  `store` varchar(5) NOT NULL default 'files',
+  `autovalidate` tinyint(1) NOT NULL default '0',
+  `coauthallowed` int(1) NOT NULL default '0',
+  `maxwords` int(11) NOT NULL default '0',
+  `minwords` int(11) NOT NULL default '0',
+  `imageupload` tinyint(1) NOT NULL default '0',
+  `imageheight` int(11) NOT NULL default '200',
+  `imagewidth` int(11) NOT NULL default '200',
+  `roundrobins` tinyint(1) NOT NULL default '0',
+  `allowseries` tinyint(4) NOT NULL default '2',
+  `tinyMCE` tinyint(1) NOT NULL default '0',
+  `allowed_tags` varchar(200) NOT NULL default '<b><i><u><center><hr><p><br /><br><blockquote><ol><ul><li><img><strong><em>',
+  `favorites` tinyint(1) NOT NULL default '0',
+  `multiplecats` tinyint(1) NOT NULL default '0',
+  `newscomments` tinyint(1) NOT NULL default '0',
+  `logging` tinyint(1) NOT NULL default '0',
+  `maintenance` tinyint(1) NOT NULL default '0',
+  `debug` tinyint(1) NOT NULL default '0',
+  `captcha` tinyint(1) NOT NULL default '0',
+  `dateformat` varchar(20) NOT NULL default 'd/m/y',
+  `timeformat` varchar(20) NOT NULL default '- h:i a',
+  `recentdays` tinyint(2) NOT NULL default '7',
+  `displaycolumns` tinyint(1) NOT NULL default '1',
+  `itemsperpage` tinyint(2) NOT NULL default '25',
+  `extendcats` tinyint(1) NOT NULL default '0',
+  `displayindex` tinyint(1) NOT NULL default '0',
+  `defaultsort` tinyint(1) NOT NULL default '0',
+  `displayprofile` tinyint(1) NOT NULL default '0',
+  `linkstyle` tinyint(1) NOT NULL default '0',
+  `linkrange` tinyint(2) NOT NULL default '5',
+  `reviewsallowed` tinyint(1) NOT NULL default '0',
+  `ratings` tinyint(1) NOT NULL default '0',
+  `anonreviews` tinyint(1) NOT NULL default '0',
+  `revdelete` tinyint(1) NOT NULL default '0',
+  `rateonly` tinyint(1) NOT NULL default '0',
+  `pwdsetting` tinyint(1) NOT NULL default '0',
+  `alertson` tinyint(1) NOT NULL default '0',
+  `disablepopups` tinyint(1) NOT NULL default '0',
+  `agestatement` tinyint(1) NOT NULL default '0',
+  `words` text,
+  `version` varchar(10) NOT NULL default '3.0',
+  `smtp_host` varchar(200) default NULL,
+  `smtp_username` varchar(50) default NULL,
+  `smtp_password` varchar(50) default NULL,
+  `anonchallenges` tinyint(1) NOT NULL default '0',
+  `anonrecs` tinyint(1) NOT NULL default '0',
+  `rectarget` tinyint(1) NOT NULL default '0',
+  `autovalrecs` tinyint(1) NOT NULL default '0',
+  PRIMARY KEY  (`sitekey`)
+) REPLACE=MyISAM;

file:b/header.php (new)
--- /dev/null
+++ b/header.php
@@ -1,1 +1,406 @@
-
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+// Force the argument separator to be standards compliant
+@ ini_set('arg_separator.output','&amp;'); 
+if(isset($_GET['debug'])) @ error_reporting(E_ALL);
+if(isset($_GET['benchmark'])) {
+	list($usec, $sec) = explode(" ", microtime());
+	$start = ((float)$usec + (float)$sec);
+}
+$headerSent = false;
+
+// Defines the character set for your language/location
+define ("_CHARSET", "utf-8");
+
+// Prevent possible XSS attacks via $_GET.
+foreach ($_GET as $v) {
+	if(preg_match('@<script[^>]*?>.*?</script>@si', $v) ||
+		preg_match("'@<iframe[^>]*?>.*?</script>@si'", $v) ||
+		preg_match("'@<applet[^>]*?>.*?</script>@si'", $v) ||
+		preg_match("'@<meta[^>]*?>.*?</script>@si'", $v) ||
+		preg_match('@<[\/\!]*?[^<>]*?>@si', $v) ||
+		preg_match('@<style[^>]*?>.*?</style>@siU', $v) ||
+		preg_match('@<![\s\S]*?--[ \t\n\r]*>@', $v)) {
+		include("languages/en.php"); // no language set yet, so default to English.	
+		die (_POSSIBLEHACK);
+	}
+}
+unset($v);
+
+if(!isset($_SESSION)) session_start();
+// clear the global variables if register globals is on.
+if(ini_get('register_globals')) {
+	$arrayList = array_merge($_SESSION, $_GET, $_POST, $_COOKIE);
+	foreach($arrayList as $k => $v) {
+		unset($GLOBALS[$k]);
+	}
+}                   
+ 
+Header('Cache-Control: private, no-cache, must-revalidate, max_age=0, post-check=0, pre-check=0');
+header ("Pragma: no-cache"); 
+header ("Expires: 0"); 
+header("Content-Type: text/html; charset="._CHARSET);
+
+// Locate config.php and set the basedir path
+$folder_level = "";
+while (!file_exists($folder_level."header.php")) { $folder_level .= "../"; }
+if(!defined("_BASEDIR")) define("_BASEDIR", $folder_level);
+
+@ include_once(_BASEDIR."config.php");
+if(empty($sitekey)) {
+	header("Location: install/install.php");
+	exit( );
+}
+if(isset($skin)) $globalskin = $skin; 
+$settingsresults = dbquery("SELECT * FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");
+$settings = dbassoc($settingsresults);
+if(is_null($settings)) {
+	die(" <b>Your settings issue</b><br /> Please check your sitekey and then setting table. Your settings are empty. ");	
+}
+
+if(!defined("SITEKEY")) define("SITEKEY", $settings['sitekey']);
+unset($settings['sitekey']);
+if(!defined("TABLEPREFIX")) define("TABLEPREFIX", $settings['tableprefix']);
+unset($settings['tableprefix']);
+define("STORIESPATH", $settings['storiespath']);
+unset($settings['storiespath']);
+foreach($settings as $var => $val) {
+	if (is_NULL($val)) $val = '';
+	$$var = stripslashes($val);
+	$settings[$var] = htmlspecialchars($val);
+}
+
+if(isset($_GET['debug'])) $debug = 1;
+if(!$displaycolumns) $displaycolumns = 1; // shouldn't happen, but just in case.
+if($words) $words = explode(", ", $words);
+else $words = array( );
+// Fix for sites with 2.0 or 1.1 running as well as 3.0 with register_globals on.
+$defaultskin = $skin;
+
+if(isset($globalskin)) $skin = $globalskin;
+
+if(isset($_GET['action'])) $action = strip_tags($_GET['action']);
+else $action = false;
+
+if(file_exists(_BASEDIR."languages/{$language}.php")) include (_BASEDIR."languages/{$language}.php");
+else include (_BASEDIR."languages/en.php");
+
+include_once(_BASEDIR."includes/queries.php");
+include_once(_BASEDIR."includes/corefunctions.php");
+
+// Check and/or set some variables used at various points throughout the script
+if(isset($_GET['offset'])) $offset = $_GET['offset'];
+if(!isset($offset) || !isNumber($offset)) $offset = 0;
+if(isset($_REQUEST["sid"])) $sid = $_REQUEST["sid"];
+if(isset($sid) && !isNumber($sid)) unset($sid);
+if(isset($_REQUEST['seriesid'])) $seriesid = $_REQUEST["seriesid"];
+if(isset($seriesid) && !isNumber($seriesid)) unset($seriesid);
+if(isset($_REQUEST['uid'])) $uid = $_REQUEST["uid"];
+if(isset($uid) && !isNumber($uid)) unset($uid);
+if(isset($_REQUEST['chapid'])) $chapid = $_REQUEST["chapid"];
+if(isset($chapid) && !isNumber($chapid)) unset($chapid);
+$let = false;
+if(isset($_GET['let'])) $let = $_GET['let'];
+if(isset($let) && !in_array($let, $alphabet)) $let = false;
+$output = "";
+
+// Cleans these two variables of possible XSS attacks.
+if(isset($_SERVER['PHP_SELF'])) $_SERVER['PHP_SELF'] = htmlspecialchars(descript($_SERVER['PHP_SELF']), ENT_QUOTES);
+if(isset($PHP_SELF)) $PHP_SELF = htmlspecialchars(descript($PHP_SELF), ENT_QUOTES);
+
+// Set these variables to start.
+$agecontsent = false; $viewed = false; 
+
+require_once("includes/get_session_vars.php");
+
+if(isset($_GET['skin'])) {
+	$siteskin = $_GET['skin'];
+	$_SESSION[SITEKEY."_skin"] = $siteskin;
+}
+
+$v = explode(".", $version);
+include("version.php");
+$newV = explode(".", $version);
+//if($v[0] == $newV[0] && ($v[1] < $newV[1] || (isset($newV[2]) && $v[2] < $newV[2]))) {
+foreach($newV AS $k => $l) {
+	if($newV[$k] > $v[$k] || (!empty($newV[$k]) && empty($v[$k]))) {
+		if(isADMIN && basename($_SERVER['PHP_SELF']) != "update.php") {
+			header("Location: update.php");
+			exit( );
+		}
+		else if(!isADMIN && basename($_SERVER['PHP_SELF']) != "maintenance.php" && !(isset($_GET['action']) && $_GET['action'] == "login")) {
+			header("Location: maintenance.php");
+			exit( );
+		}
+	}
+}
+
+if(!empty($_SESSION[SITEKEY."_skin"])) $siteskin = $_SESSION[SITEKEY."_skin"];
+if($maintenance && !isADMIN && basename($_SERVER['PHP_SELF']) != "maintenance.php" && !(isset($_GET['action']) && $_GET['action'] == "login")) {
+	header("Location: maintenance.php");
+	exit( );
+}
+
+$blockquery = dbquery("SELECT * FROM " . TABLEPREFIX . "fanfiction_blocks");
+while ($block = dbassoc($blockquery))
+{
+
+	if (!empty($block['block_variables']))
+	{
+		
+		$block_vars = @unserialize($block['block_variables']);
+		if ($block_vars)
+		{
+			$blocks[$block['block_name']] = $block_vars;
+		}
+		else {
+		 	// print_r($block);
+		}
+	}
+	$blocks[$block['block_name']]['title'] = $block['block_title'];
+	$blocks[$block['block_name']]['file'] = $block['block_file'];
+	$blocks[$block['block_name']]['status'] = $block['block_status'];
+}
+ 
+
+// This session variable is used to track the story views
+if(isset($_SESSION[SITEKEY."_viewed"])) $viewed = $_SESSION[SITEKEY."_viewed"];
+
+if(isset($_GET['ageconsent'])) $_SESSION[SITEKEY."_ageconsent"] = 1;
+if(isset($_GET['warning'])) $_SESSION[SITEKEY."_warned"][$_GET['warning']] = 1;
+
+if(file_exists("languages/{$language}.php")) require_once ("languages/{$language}.php");
+else require_once ("languages/en.php");
+if(is_dir(_BASEDIR."skins/$siteskin")) $skindir = _BASEDIR."skins/$siteskin";
+else if(is_dir(_BASEDIR."skins/".$settings['skin'])) $skindir = _BASEDIR."skins/".$defaultskin;
+else $skindir = _BASEDIR."default_tpls";
+if(USERUID) {
+	$prefs = dbquery("SELECT sortby, storyindex, tinyMCE FROM ".TABLEPREFIX."fanfiction_authorprefs WHERE uid = '".USERUID."'");
+	if(dbnumrows($prefs)) list($defaultsort, $displayindex, $tinyMCEAuthor) = dbrow($prefs);
+	if(!$tinyMCEAuthor) $tinyMCE = 0;
+}
+if(isset($_REQUEST['sort'])) $defaultsort = $_REQUEST['sort'] == "update" ? 1 : 0;
+define("_ORDERBY", " ORDER BY ".($defaultsort == 1 ? "updated DESC" : "stories.title ASC"));
+if($current == "viewstory"){
+	if(isset($chapid)) {
+		$squery = dbquery("SELECT sid, inorder FROM ".TABLEPREFIX."fanfiction_chapters WHERE chapid = ".$chapid." LIMIT 1");
+		list($sid, $chapter) = dbrow($squery);
+	}
+	$titlequery = dbquery("SELECT story.title, story.coauthors, "._PENNAMEFIELD." as penname, story.summary FROM ".TABLEPREFIX."fanfiction_stories as story, "._AUTHORTABLE." WHERE sid = '$sid' AND "._UIDFIELD." = story.uid LIMIT 1");
+	if($story = dbassoc($titlequery)) { 
+			$authlink[] = $story['penname'];
+		if($story['coauthors']) {
+			$coquery = dbquery("SELECT "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_coauthors as ca ON "._UIDFIELD." = ca.uid WHERE ca.sid = '$sid'");
+			while($co = dbassoc($coquery)) {
+				$authlink[] = $co['penname'];
+			}
+		}
+		$titleinfo = stripslashes($story['title'])." "._BY." ".implode(", ", $authlink);
+		$metaDesc = htmlspecialchars(stripslashes($story['summary']));
+		$filename = basename($titleinfo.".html");
+		$ie = strpos("msie", strtolower($_SERVER['HTTP_USER_AGENT'])) !== false ? true : false;
+		if ($ie) $filename = rawurlencode($filename);
+		//header("Content-Disposition: inline; filename=\"".$titleinfo."\"");
+ 	}
+}
+if($current == "viewuser" && isNumber($uid)) {
+	$author = dbquery("SELECT "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '".$uid."'");
+	list($penname) = dbrow($author);
+	$titleinfo = "$sitename :: $penname";
+}
+echo _DOCTYPE."<html><head>";
+echo "<meta charset='utf-8' />";
+if(!isset($titleinfo)) $titleinfo = "$sitename :: $slogan";
+if(isset($metaDesc)) echo "<meta name='description' content='$metaDesc'>";
+echo "<title>$titleinfo</title>";
+
+// ---------- Favicon ---------
+if (file_exists(_BASEDIR."favicon.ico")) 
+{
+	echo "<link rel='icon' href='"._BASEDIR."favicon.ico' type='image/x-icon' />\n<link rel='shortcut icon' href='"._BASEDIR."favicon.ico' type='image/xicon' />\n";
+}
+ 
+echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset="._CHARSET."\">";
+if (!isset($_GET['action']) || $_GET['action'] != "printable")
+{
+	echo "<script language=\"javascript\" type=\"text/javascript\" src=\"" . _BASEDIR . "includes/javascript.js\"></script>
+<link rel=\"alternate\" type=\"application/rss+xml\" title=\"$sitename RSS Feed\" href=\"" . _BASEDIR . "rss.php\">";
+}
+
+if (!isset($_GET['action']) || $_GET['action'] != "printable")
+{
+	if (!empty($tinyMCE))
+	{
+		if($tinyMCE == 1) {
+			echo "<script language=\"javascript\" type=\"text/javascript\" src=\"" . _BASEDIR . "tinymce/jscripts/tiny_mce/tiny_mce.js\"></script>";
+			include(_BASEDIR . "tinymce/init.php");
+		}
+		else {
+			echo "<script language=\"javascript\" type=\"text/javascript\" src=\"" . _BASEDIR . "tinymce4/js/tinymce/tinymce.min.js\"></script>";
+			include(_BASEDIR . "tinymce4/init.php");		
+		}
+	}
+}
+if(isset($displayform) && $displayform == 1) {
+echo "<script language=\"javascript\" type=\"text/javascript\" src=\""._BASEDIR."includes/xmlhttp.js\"></script>";
+echo "<script language=\"javascript\" type=\"text/javascript\">
+lang = new Array( );
+
+lang['Back2Cats'] = '"._BACK2CATS."';
+lang['ChooseCat'] = '"._CHOOSECAT."';
+lang['Categories'] = '"._CATEGORIES."';
+lang['Characters'] = '"._CHARACTERS."';
+lang['MoveTop'] = '"._MOVETOP."';
+lang['TopLevel'] = '"._TOPLEVEL."';
+lang['CatLocked'] = '"._CATLOCKED."';
+basedir = '"._BASEDIR."';
+
+categories = new Array( );
+characters = new Array( );
+\n";
+/*
+	$result = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_categories ORDER BY leveldown, displayorder");
+$x = 0;
+	while($category = dbassoc($result)) {
+		echo "categories[$x] = new category(".$category['parentcatid'].", ".$category['catid'].", \"". str_replace('"', '\"', stripslashes($category['category']))."\", ".$category['locked'].", ".$category['displayorder'].");\r\n";
+		$catlist[$category['catid']] = array("name" => stripslashes($category['category']), "pid" => $category['parentcatid'], "locked" => (isADMIN ? 0 : $category['locked']), "order" => $category['displayorder'], "leveldown" => $category['leveldown']);
+		$x++;
+	}
+$x = 0;
+	$result = dbquery("SELECT charname, catid, charid FROM ".TABLEPREFIX."fanfiction_characters ORDER BY charname");
+	while($char = dbassoc($result)) {
+		echo "characters[$x] = new character(".$char['charid'].", ".$char['catid'].", \"".str_replace('"', '\"', stripslashes($char['charname']))."\");\r\n";
+		$charlist[$char['charid']] = array("name" => stripslashes($char['charname']), "catid" => $char['catid']);
+		$x++;
+	}
+*/
+echo "</script>";
+}
+if(file_exists("extra_header.php")) include_once("extra_header.php");
+if(file_exists("$skindir/extra_header.php")) include_once("$skindir/extra_header.php");
+if(!$displaycolumns) $displaycolumns = 1;
+$colwidth = floor(100/$displaycolumns);
+if(!empty($_GET['action']) && $_GET['action'] == "printable") {
+	if(file_exists("$skindir/printable.css")) echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"$skindir/printable.css\">";
+	else echo "<link rel=\"stylesheet\" type=\"text/css\" href=\"default_tpls/printable.css\">";
+	echo "<script type='text/javascript'>
+<!--
+if (window.print) {
+    window.print() ;  
+} else {
+    var WebBrowser = '<OBJECT ID=\"WebBrowser1\" WIDTH=0 HEIGHT=0 CLASSID=\"CLSID:8856F961-340A-11D0-A96B-00C04FD705A2\"></OBJECT>';
+document.body.insertAdjacentHTML('beforeEnd', WebBrowser);
+    WebBrowser1.ExecWB(6, 2);//Use a 1 vs. a 2 for a prompting dialog box    WebBrowser1.outerHTML = \"\";  
+}
+-->
+</script>";
+}
+else {
+echo "<style type=\"text/css\">
+#columncontainer { margin: 1em auto; width: auto; padding: 5%;}
+#browseblock, #memberblock { width: 100%; padding: 0; margin: 0; float: left; border: 0px solid transparent; }
+.column { float: left; width: ".($colwidth - 1)."%; }
+html>body .column { width: $colwidth%; }
+.cleaner { clear: both; height: 1px; font-size: 1px; margin: 0; padding: 0; background: transparent; }
+#settingsform { margin: 0; padding: 0; border: none; }
+#settingsform FORM { width: 100%; margin: 0 10%; }
+#settingsform LABEL { float: left; display: block; width: 30%; text-align: right; padding-right: 10px; clear: left; }
+#settingsform DIV { clear: both;}
+#settingsform .fieldset SPAN { float: left; display: block; width: 30%; text-align: right; padding-right: 10px; clear: left;}
+#settingsform .fieldset LABEL { float: none; width: auto; display: inline; text-align: left; clear: none; }
+#settingsform { float: left; margin: 1ex 10%; }
+#settingsform .tinytoggle { text-align: center; }
+#settingsform .tinytoggle LABEL { float: none; display: inline; width: auto; text-align: center; padding: 0; clear: none; }
+#settingsform #submitdiv { text-align: center; width: 100%;clear: both; height: 3em; }
+#settingsform #submitdiv #submit { position: absolute; z-index: 10001; margin: 1em; }
+a.pophelp{
+    position: relative; /* this is the key*/
+    vertical-align: super;
+}
+
+a.pophelp:hover{z-index:100; border: none; text-decoration: none;}
+
+a.pophelp span{display: none; position: absolute; top: -25em; left: 20em; }
+
+a.pophelp:hover span{ /*the span will display just on :hover state*/
+    display:block;
+    position: absolute;
+    top: -3em; left: 8em; width: 225px;
+    border:1px solid #000;
+    background-color:#CCC; color:#000;
+    text-decoration: none;
+    text-align: left;
+    padding: 5px;
+    font-weight: normal;
+    visibility: visible;
+}
+.required { color: red; }
+.shim {
+	position: absolute;
+	display: none;
+	height: 0;
+	width:0;
+	margin: 0;
+	padding: 0;
+	z-index: 100;
+}
+
+.ajaxOptList {
+	background: #CCC;
+	border: 1px solid #000;
+	margin: 0;
+	position: absolute;
+	padding: 0;
+	z-index: 1000;
+	text-align: left;
+}
+.ajaxListOptOver {
+	padding: 4px;
+	background: #CCC;
+	margin: 0;
+}
+.ajaxListOpt {
+	background: #EEE;
+	padding: 4px;
+	margin: 0;
+}
+.multiSelect {
+	width: 300px;
+}
+
+</style>
+<link rel='stylesheet' type='text/css' href='$skindir/style.css' /> \n
+<meta name='viewport' content='width=device-width, initial-scale=1.0' />
+";
+}
+echo "</head>";
+$headerSent = true;
+include (_BASEDIR."includes/class.TemplatePower.inc.php");
+if($debug == 1) {
+	@ error_reporting(E_ALL);
+	echo "\n<!-- \$_SESSION \n"; print_r($_SESSION); echo " -->";
+	echo "\n<!-- \$_COOKIE \n"; print_r($_COOKIE); echo " -->";
+	echo "\n<!-- \$_POST \n"; print_r($_POST); echo " -->";
+}
+?>
+

file:b/images/X.gif (new)
 Binary files /dev/null and b/images/X.gif differ
file:b/images/aim.gif (new)
 Binary files /dev/null and b/images/aim.gif differ
file:b/images/aimoff.gif (new)
 Binary files /dev/null and b/images/aimoff.gif differ
 Binary files /dev/null and b/images/arrowdown.gif differ
 Binary files /dev/null and b/images/arrowup.gif differ
 Binary files /dev/null and b/images/blueribbon.gif differ
file:b/images/check.gif (new)
 Binary files /dev/null and b/images/check.gif differ
 Binary files /dev/null and b/images/dislike.gif differ
file:b/images/frown.gif (new)
 Binary files /dev/null and b/images/frown.gif differ
 Binary files /dev/null and b/images/halfcheck.gif differ
file:b/images/icq.gif (new)
 Binary files /dev/null and b/images/icq.gif differ
file:b/images/index.php (new)
--- /dev/null
+++ b/images/index.php

 Binary files /dev/null and b/images/lightbulb.gif differ
file:b/images/like.gif (new)
 Binary files /dev/null and b/images/like.gif differ
file:b/images/lj.gif (new)
 Binary files /dev/null and b/images/lj.gif differ
file:b/images/locked.gif (new)
 Binary files /dev/null and b/images/locked.gif differ
 Binary files /dev/null and b/images/msntalk.gif differ
file:b/images/print.gif (new)
 Binary files /dev/null and b/images/print.gif differ
 Binary files /dev/null and b/images/redribbon.gif differ
 Binary files /dev/null and b/images/reviews.gif differ
 Binary files /dev/null and b/images/roundrobin.gif differ
 Binary files /dev/null and b/images/row_off.gif differ
file:b/images/row_on.gif (new)
 Binary files /dev/null and b/images/row_on.gif differ
 Binary files /dev/null and b/images/shades_smile.gif differ
 Binary files /dev/null and b/images/silvertrophy.gif differ
file:b/images/smile.gif (new)
 Binary files /dev/null and b/images/smile.gif differ
file:b/images/star.gif (new)
 Binary files /dev/null and b/images/star.gif differ
 Binary files /dev/null and b/images/starhalf.gif differ
 Binary files /dev/null and b/images/thumbs_down.gif differ
 Binary files /dev/null and b/images/thumbs_up.gif differ
file:b/images/trophy.gif (new)
 Binary files /dev/null and b/images/trophy.gif differ
file:b/images/xml.gif (new)
 Binary files /dev/null and b/images/xml.gif differ
file:b/images/yim.gif (new)
 Binary files /dev/null and b/images/yim.gif differ
--- /dev/null
+++ b/includes/PHPMailerAutoload.php
@@ -1,1 +1,41 @@
+<?php
+/**
+ * PHPMailer SPL autoloader.
+ * PHP Version 5
+ * @package PHPMailer
+ * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
+ * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
+ * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
+ * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
+ * @author Brent R. Matzelle (original founder)
+ * @copyright 2012 - 2014 Marcus Bointon
+ * @copyright 2010 - 2012 Jim Jagielski
+ * @copyright 2004 - 2009 Andy Prevost
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ * @note This program is distributed in the hope that it will be useful - WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ */
 
+/**
+ * PHPMailer SPL autoloader.
+ * @param string $classname The name of the class to load
+ */
+function PHPMailerAutoload($classname)
+{
+    //Can't use __DIR__ as it's only in PHP 5.3+
+    $filename = dirname(__FILE__).DIRECTORY_SEPARATOR.'class.'.strtolower($classname).'.php';
+    if (is_readable($filename)) {
+        require $filename;
+    }
+}
+
+if (version_compare(PHP_VERSION, '5.1.2', '>=')) {
+    //SPL autoloading was introduced in PHP 5.1.2
+    if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
+        spl_autoload_register('PHPMailerAutoload', true, true);
+    } else {
+        spl_autoload_register('PHPMailerAutoload');
+    }
+}  
+

--- /dev/null
+++ b/includes/browsecategories.php
@@ -1,1 +1,25 @@
+<?php
+define("_BASEDIR", "../");
+include("../config.php");
+include("../includes/dbfunctions.php");
+list($tableprefix) = dbrow(dbquery("SELECT tableprefix FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '$sitekey'"));
+define("TABLEPREFIX", $tableprefix);
+include("../includes/queries.php");
 
+$catid = isset($_GET['catid']) && preg_match("/^[0-9]+$/", $_GET['catid']) ? $_GET['catid'] : -1;
+$cats = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_categories WHERE parentcatid = '$catid' OR catid = '$catid' ORDER BY leveldown, displayorder");
+echo "var el = '".$_GET['element']."';\n";
+$x = 0;
+$find = array ('"', chr(150), chr(147), chr(148), chr(146));
+$replace = array ('\"', "-", "\"", "\"", "'");
+while($category = dbassoc($cats)) {
+	echo "categories[$x] = new category(".$category['parentcatid'].", ".$category['catid'].", \"".htmlentities(str_replace($find, $replace, stripslashes($category['category'])))."\", ".$category['locked'].", ".$category['displayorder'].");\r\n";
+	$x++;
+}
+$characters = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_characters WHERE catid = '$catid' OR catid = '-1' ORDER BY charname");
+$x = 0;
+while($char = dbassoc($characters)) {
+	echo "characters[$x] = new Array(".$char['charid'].", \"".str_replace($find, $replace, stripslashes($char['charname']))."\");\r\n";
+	$x++;
+}
+?>

--- /dev/null
+++ b/includes/button.php
@@ -1,1 +1,89 @@
+<?php
+ini_set('display_errors', 0);
+ini_set('display_startup_errors', 0);
+error_reporting(-1);
 
+session_start();
+define("_BASEDIR", "../");
+include("../config.php");
+unset($_SESSION[$sitekey.'_digit']);
+
+$image = imagecreate(140, 40);
+
+$white    = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);
+$gray    = imagecolorallocate($image, 0xC0, 0xC0, 0xC0);
+$darkgray = imagecolorallocate($image, 0x50, 0x50, 0x50);
+$black = imagecolorallocate($image, 0x00, 0x00, 0x00);
+
+
+srand((double)microtime()*1000000);
+unset($digit, $cnum);
+
+
+function rgb_rand($min=0,$max=255) {
+$color['r'] = mt_rand($min,$max);
+$color['g'] = mt_rand($min,$max);
+$color['b'] = mt_rand($min,$max);
+return $color;
+}
+
+/* Build the list of fonts */
+
+putenv('GDFONTPATH=' . realpath('.'));
+
+$folder=dir("cFonts/"); //The directory where your fonts reside
+
+while($font=$folder->read()) {
+  if(stristr($font,'.ttf')) $fontList[] = "cFonts/".$font;
+}
+
+$folder->close();
+
+for ($i = 0; $i < 5; $i++) {
+$cnum[$i] = rand(0,9);
+$rC = rgb_rand(0, 175);
+$rColors[$i] = imagecolorallocate($image, $rC['r'], $rC['g'], $rC['b']);
+
+for ($x = 0; $x < 2; $x++) {
+  $x1 = rand(0,140);
+  $y1 = rand(0,40);
+  $x2 = rand(0,140);
+  $y2 = rand(0,40);
+  imageline($image, $x1, $y1, $x2, $y2 , $rColors[$i]);  
+}
+
+}
+
+/* generate random dots in background */
+for( $i=0; $i<(140*40)/3; $i++ ) {
+  imagefilledellipse($image, mt_rand(0,140), mt_rand(0,40), 1, 1, $gray);
+}
+
+for ($i = 0; $i < 5; $i++) {
+ $x = $x + mt_rand(16, 24);
+ $y = mt_rand(26, 32); 
+ $angle = mt_rand(-15, 15);
+ $c = $color[$i];
+ $fnt = mt_rand(0, sizeof($fontList) - 1);
+ $colori = $rColors[$i];
+ imagettftext($image, mt_rand(20, 24), $angle,  $x, $y, $colori, $fontList[$fnt], $cnum[$i]); 
+
+}
+ 
+$digit = "$cnum[0]$cnum[1]$cnum[2]$cnum[3]$cnum[4]";
+
+$_SESSION[$sitekey.'_digit'] = md5($sitekey.$digit);
+ 
+header("Expires: Tue, 11 Jun 1985 05:00:00 GMT");  
+header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");  
+header("Cache-Control: no-store, no-cache, must-revalidate");  
+header("Cache-Control: post-check=0, pre-check=0", false);
+header("Pragma: no-cache");
+header('Content-type: image/png');
+imagepng($image);
+imagedestroy($image);
+
+exit( );
+?> 
+
+

 Binary files /dev/null and b/includes/cFonts/Browning.ttf differ
 Binary files /dev/null and b/includes/cFonts/artisregularttnorm.ttf differ
 Binary files /dev/null and b/includes/cFonts/bubblesoft.ttf differ
 Binary files /dev/null and b/includes/cFonts/cookieitalic.ttf differ
 Binary files /dev/null and b/includes/cFonts/debussy.ttf differ
 Binary files /dev/null and b/includes/cFonts/felttip.ttf differ
--- /dev/null
+++ b/includes/cFonts/fonts101.txt
@@ -1,1 +1,4 @@
+This file is downloaded from fonts101.com, all fonts on the website are available for free and may not be resold. 
+Credits to original creators. Let us know how we can serve you better @ fonts101.com
 
+Visit http://www.fonts101.com

--- /dev/null
+++ b/includes/categories.php
@@ -1,1 +1,54 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+// Adds the categories selection section to a form.
+
+if(!isset($catid)) $catid = array( );
+
+$output .= "<div style='width: 99.9%; float: left;'>\r\n
+		<div style='width: 40%; float: left;'><label for='catoptions'>"._CATOPTIONS."</label> <br />
+		<select name='catoptions' id='catoptions' multiple='multiple' size='8' onchange='resetCats(\"catoptions\");' style='width: 100%;'>";
+$selectedCats = "";
+$cats = array( );
+foreach($catlist as $cat => $info) {
+	if($info['pid'] == -1) 
+		$output .= "<option value='$cat'".(isset($info['locked']) ? " class='locked'" : "").">".$info['name']."</option>\r\n";
+	if((is_array($catid) && in_array($cat, $catid)) && $info['locked'] != 1) {
+		$selectedCats .= "<option value='$cat'>".$info['name']."</option>\r\n";
+		$cats[] = $cat;
+	}
+}
+$output .= "</select></div>
+		<div style='float: left; width: 20%; text-align: center; padding-top: 3em;'>
+			<input type='button' class='button' value='>' name='Select' onClick='addCat(\"catoptions\", \"selectCats\");'><br /><br />
+			<input type='button' class='button' value='"._REMOVE."' onClick='removeCat(\"selectCats\");'>
+		</div>
+		<div style='width: 40%; float: left;'>
+			<label for='catoptions'>"._SELECTCATS."</label> ".(count($cats) < 1 ? "<span style=\"font-weight: bold; color: red\">*</span>" : "")."<br />
+			<select name='selectCats' id='selectCats' multiple='multiple' size='8' style='width: 100%;'>".
+			(!empty($selectedCats) ? $selectedCats : "")."</select></div>
+		</div>
+		<input type='hidden' name='catid' id='catid' value='".(isset($cats) ? implode(",", $cats) : "")."'>";
+?>

--- /dev/null
+++ b/includes/categorylist.php
@@ -1,1 +1,21 @@
+<?php
+define("_BASEDIR", "../");
+include("../config.php");
+include("../includes/dbfunctions.php");
+list($tableprefix, $lang) = dbrow(dbquery("SELECT tableprefix, language FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '$sitekey'"));
+define("TABLEPREFIX", $tableprefix);
+include(_BASEDIR."languages/$lang.php");
+header("Content-Type: text/javascript; charset="._CHARSET,true);
+include("../includes/queries.php");
 
+$catid = isset($_GET['catid']) && preg_match("/^[0-9]+$/", $_GET['catid']) ? $_GET['catid'] : -1;
+$cats = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_categories WHERE parentcatid = '$catid' OR catid = '$catid' ORDER BY leveldown, displayorder");
+echo "var el = '".$_GET['element']."';\n";
+$x = 0;
+$find = array ('"', chr(150), chr(147), chr(148), chr(146));
+$replace = array ('\"', "-", "\"", "\"", "'");
+while($category = dbassoc($cats)) {
+	echo "categories[$x] = new category(".$category['parentcatid'].", ".$category['catid'].", \"".urlencode(str_replace($find, $replace, stripslashes($category['category'])))."\", ".$category['locked'].", ".$category['displayorder'].");\r\n";
+	$x++;
+}
+?>

--- /dev/null
+++ b/includes/characterlist.php
@@ -1,1 +1,27 @@
+<?php
+define("_BASEDIR", "../");
+include("../config.php");
+include("../includes/dbfunctions.php");
+list($tableprefix, $lang) = dbrow(dbquery("SELECT tableprefix, language FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '$sitekey'"));
+define("TABLEPREFIX", $tableprefix);
+include(_BASEDIR."languages/$lang.php");
+//header("Content-Type: text/html; charset=".CHARSET,true);
+include("../includes/queries.php");
+// Checks that the given $num is actually a number.  Used to help prevent XSS attacks.
+function isNumber($num) {
+	if(empty($num)) return false;
+	return (preg_match("/^[0-9]+$/", $num) || $num == "-1" ? true : false);
+}
 
+$catid = isset($_GET['catid']) ? explode(",", $_GET['catid']) : array(-1);
+$catid = array_filter($catid, "isNumber");
+$characters = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_characters WHERE ".(count($catid) > 1 ? "FIND_IN_SET(catid, '".implode(",", $catid)."') > 0" : "catid = '".$catid[0]."'")." ORDER BY charname");
+echo "var element = '".$_GET['element']."';\n";
+$x = 0;
+$find = array ('"', chr(150), chr(147), chr(148), chr(146));
+$replace = array ('\"', "-", "\"", "\"", "'");
+while($char = dbassoc($characters)) {
+	echo "characters[$x] = new Array(".$char['charid'].", \"".urlencode(str_replace($find, $replace, stripslashes($char['charname'])))."\");\r\n";
+	$x++;
+}
+?>

--- /dev/null
+++ b/includes/class.TemplatePower.inc.php
@@ -1,1 +1,765 @@
-
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4: */
+// +----------------------------------------------------------------------+
+// | TemplatePower:                                                       |
+// | offers you the ability to separate your PHP code and your HTML       |
+// +----------------------------------------------------------------------+
+// |                                                                      |
+// | Copyright (C) 2001-2009  R.P.J. Velzeboer, The Netherlands           |
+// |                                                                      |
+// | This program is free software; you can redistribute it and/or        |
+// | modify it under the terms of the GNU General Public License          |
+// | as published by the Free Software Foundation; either version 2       |
+// | of the License, or (at your option) any later version.               |
+// |                                                                      |
+// | This program is distributed in the hope that it will be useful,      |
+// | but WITHOUT ANY WARRANTY; without even the implied warranty of       |
+// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        |
+// | GNU General Public License for more details.                         |
+// |                                                                      |
+// | You should have received a copy of the GNU General Public License    |
+// | along with this program; if not, write to the Free Software          |
+// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA            |
+// | 02111-1307, USA.                                                     |
+// |                                                                      |
+// | Author: R.P.J. Velzeboer, rovel999@codocad.com   The Netherlands     |
+// |                                                                      |
+// | If you use TemplatePower for commercial purposes without a           |
+// | 'Certificate of Distribution' you will risk a fine of                |
+// | EUR 1000 + license costs.                                            |
+// |                                                                      |
+// +----------------------------------------------------------------------+
+// | http://templatepower.codocad.com                                     |
+// +----------------------------------------------------------------------+
+//
+// $Id: Version 3.0.2.1$
+
+define("T_BYFILE", 0);
+define("T_BYVAR", 1);
+define("TP_ROOTBLOCK", '_ROOT');
+
+
+#[AllowDynamicProperties]
+class TemplatePowerParser
+{
+  protected $tpl_base;              //Array( [filename/varcontent], [T_BYFILE/T_BYVAR] )
+  protected $tpl_include;           //Array( [filename/varcontent], [T_BYFILE/T_BYVAR] )
+  protected $tpl_count;
+
+  protected $parent   = array();    // $parent[{blockname}] = {parentblockname}
+  protected $defBlock = array();
+
+  protected $rootBlockName;
+  protected $ignore_stack;
+
+  protected $version;
+
+   /**
+    * TemplatePowerParser::TemplatePowerParser()
+    *
+    * @param $tpl_file
+    * @param $type
+    * @return
+	*
+	* @access private
+    */
+   public function __contruct($tpl_file, $type)
+   {
+       $this->version      = '3.0.2.1';
+
+       $this->tpl_base     = array($tpl_file, $type);
+       $this->tpl_count    = 0;
+	   $this->ignore_stack = array(false);
+   }
+
+   /**
+    * TemplatePowerParser::__errorAlert()
+    *
+    * @param $message
+    * @return
+	*
+	* @access private
+    */
+   protected function __errorAlert($message)
+   {
+       print('<br />' . $message . '<br />'. PHP_EOL);
+   }
+
+   /**
+    * TemplatePowerParser::__prepare()
+    *
+    * @return
+	*
+	* @access private
+    */
+   protected function __prepare()
+   {
+       $this->defBlock[ TP_ROOTBLOCK ] = array();
+       eval(base64_decode($this->header));
+       $tplvar = $this->__prepareTemplate($this->tpl_base[0], $this->tpl_base[1]);
+
+       $initdev["varrow"]  = 0;
+       $initdev["coderow"] = 0;
+       $initdev["index"]   = 0;
+       $initdev["ignore"]  = false;
+
+       $this->__parseTemplate($tplvar, TP_ROOTBLOCK, $initdev);
+       $this->__cleanUp();
+   }
+
+    /**
+     * TemplatePowerParser::__cleanUp()
+     *
+     * @return
+	 *
+	 * @access private
+     */
+    protected function __cleanUp()
+    {
+        for ($i=0; $i <= $this->tpl_count; $i++) {
+            $tplvar = 'tpl_rawContent' . $i;
+            unset($this->{$tplvar});
+        }
+    }
+
+    /**
+     * TemplatePowerParser::__prepareTemplate()
+     *
+     * @param $tpl_file
+     * @param $type
+     * @return
+	 *
+	 * @access private
+     */
+    protected function __prepareTemplate($tpl_file, $type)
+    {
+        $tplvar = 'tpl_rawContent' . $this->tpl_count;
+
+        if ($type == T_BYVAR) {
+            $this->{$tplvar}["content"] = preg_split("/\n/", $tpl_file, -1, PREG_SPLIT_DELIM_CAPTURE);
+        } else {
+            if (is_readable($tpl_file)) {
+                $this->{$tplvar}["content"] = file( $tpl_file );
+            } else {
+                die($this->__errorAlert('TemplatePower Error: Couldn\'t open or read [ ' . $tpl_file . ' ]!'));
+            }
+        }
+
+        $this->{$tplvar}["size"] = sizeof($this->{$tplvar}["content"]);
+        $this->tpl_count++;
+
+        return $tplvar;
+    }
+
+    /**
+     * TemplatePowerParser::__parseTemplate()
+     *
+     * @param $tplvar
+     * @param $blockname
+     * @param $initdev
+     * @return
+	 *
+	 * @access private
+     */
+    protected function __parseTemplate($tplvar, $blockname, $initdev)
+    {
+        $coderow = $initdev["coderow"];
+        $varrow  = $initdev["varrow"];
+        $index   = $initdev["index"];
+        $ignore  = $initdev["ignore"];
+
+        while ($index < $this->{$tplvar}["size"]) {
+            $ignreg = array();
+            if (preg_match('/<!--[ ]?(START|END) IGNORE -->/', $this->{$tplvar}["content"][$index], $ignreg) ) {
+                if( $ignreg[1] == 'START') {
+                    //$ignore = true;
+		            array_push( $this->ignore_stack, true );
+                }
+                else {
+                    //$ignore = false;
+					array_pop( $this->ignore_stack );
+                }
+            } else {
+                if (! end($this->ignore_stack)) {
+                    $regs = array();
+                    if (preg_match('/<!--[ ]?(START|END|INCLUDE|INCLUDESCRIPT|REUSE) BLOCK : (.+)-->/', $this->{$tplvar}["content"][$index], $regs)) {
+                       //remove trailing and leading spaces
+                        $regs[2] = trim( $regs[2] );
+
+                        if ($regs[1] == 'INCLUDE') {
+                            $include_defined = true;
+
+                           //check if the include file is assigned
+                            if (isset( $this->tpl_include[ $regs[2] ])) {
+                                $tpl_file = $this->tpl_include[ $regs[2] ][0];
+                                $type   = $this->tpl_include[ $regs[2] ][1];
+                            } else if (file_exists( $regs[2] )) {  //check if defined as constant in template
+                                $tpl_file = $regs[2];
+                                $type     = T_BYFILE;
+                            } else {
+                                $include_defined = false;
+                            }
+
+                            if ($include_defined) {
+                               //initialize startvalues for recursive call
+                                $initdev["varrow"]  = $varrow;
+                                $initdev["coderow"] = $coderow;
+                                $initdev["index"]   = 0;
+                                $initdev["ignore"]  = false;
+
+                                $tplvar2 = $this->__prepareTemplate( $tpl_file, $type );
+                                $initdev = $this->__parseTemplate( $tplvar2, $blockname, $initdev );
+
+                                $coderow = $initdev["coderow"];
+                                $varrow  = $initdev["varrow"];
+                            }
+                        } else if ($regs[1] == 'INCLUDESCRIPT') {
+                            $include_defined = true;
+
+                           //check if the includescript file is assigned by the assignInclude function
+                            if (isset( $this->tpl_include[ $regs[2] ])) {
+                                $include_file = $this->tpl_include[ $regs[2] ][0];
+								$type         = $this->tpl_include[ $regs[2] ][1];
+                            } else if (file_exists( $regs[2] )) {   //check if defined as constant in template
+                                $include_file = $regs[2];
+								$type         = T_BYFILE;
+                            } else {
+                                $include_defined = false;
+                            }
+
+                            if ($include_defined) {
+                                ob_start();
+
+				                if ($type == T_BYFILE) {
+                                    if (! @include_once($include_file)) {
+                                        $this->__errorAlert('TemplatePower Error: Couldn\'t include script [ '. $include_file .' ]!');
+										exit();
+                                    }
+				                } else {
+				                    eval("?>" . $include_file);
+				                }
+
+                                $this->defBlock[$blockname]["_C:$coderow"] = ob_get_contents();
+                                $coderow++;
+
+                                ob_end_clean();
+                            }
+                        } else if ($regs[1] == 'REUSE') {
+                            $reuse_regs = array();
+                           //do match for 'AS'
+                            if (preg_match('/(.+) AS (.+)/', $regs[2], $reuse_regs)) {
+                                $originalbname = trim( $reuse_regs[1] );
+                                $copybname     = trim( $reuse_regs[2] );
+
+                               //test if original block exist
+                                if (isset( $this->defBlock[ $originalbname ] )) {
+                                   //copy block
+                                    $this->defBlock[ $copybname ] = $this->defBlock[ $originalbname ];
+
+                                   //tell the parent that he has a child block
+                                    $this->defBlock[ $blockname ]["_B:" . $copybname ] = '';
+
+                                   //create index and parent info
+                                    $this->index[ $copybname ]  = 0;
+                                    $this->parent[ $copybname ] = $blockname;
+                                } else {
+                                    $this->__errorAlert('TemplatePower Error: Can\'t find block \''. $originalbname .'\' to REUSE as \''. $copybname .'\'');
+                                }
+                            } else {
+                               //so it isn't a correct REUSE tag, save as code
+                                $this->defBlock[$blockname]["_C:$coderow"] = $this->{$tplvar}["content"][$index];
+                                $coderow++;
+                            }
+                        } else {
+                            if ($regs[2] == $blockname) {    //is it the end of a block
+                                break;
+                            } else {                            //its the start of a block
+                               //make a child block and tell the parent that he has a child
+                                $this->defBlock[ $regs[2] ] = array();
+                                $this->defBlock[ $blockname ]["_B:" . $regs[2]] = '';
+
+                               //set some vars that we need for the assign functions etc.
+                                $this->index[ $regs[2] ]  = 0;
+                                $this->parent[ $regs[2] ] = $blockname;
+
+                               //prepare for the recursive call
+                                $index++;
+                                $initdev["varrow"]  = 0;
+                                $initdev["coderow"] = 0;
+                                $initdev["index"]   = $index;
+                                $initdev["ignore"]  = false;
+
+                                $initdev = $this->__parseTemplate( $tplvar, $regs[2], $initdev );
+
+                                $index = $initdev["index"];
+                            }
+                        }
+                    } else {                                                       //is it code and/or var(s)
+                       //explode current template line on the curly bracket '{'
+                        $sstr = explode( '{', $this->{$tplvar}["content"][$index] );
+						reset( $sstr );
+
+                        if (current($sstr) != '') {
+                           //the template didn't start with a '{',
+                           //so the first element of the array $sstr is just code
+                            $this->defBlock[$blockname]["_C:$coderow"] = current( $sstr );
+                            $coderow++;
+                        }
+
+                        while (next($sstr)) {
+                           //find the position of the end curly bracket '}'
+                            $pos = strpos( current($sstr), "}" );
+
+                            if (($pos !== false) && ($pos > 0)) {
+                              //a curly bracket '}' is found
+                              //and at least on position 1, to eliminate '{}'
+
+                              //note: position 1 taken without '{', because we did explode on '{'
+
+                                $strlength = strlen( current($sstr) );
+                                $varname   = substr( current($sstr), 0, $pos );
+
+                                if (strstr($varname, ' ')) {
+                                   //the varname contains one or more spaces
+                                   //so, it isn't a variable, save as code
+                                    $this->defBlock[$blockname]["_C:$coderow"] = '{'. current( $sstr );
+                                    $coderow++;
+                                } else {
+                                   //save the variable
+                                    $this->defBlock[$blockname]["_V:$varrow" ] = $varname;
+                                    $varrow++;
+
+                                   //is there some code after the varname left?
+                                    if (($pos + 1) != $strlength) {
+                                       //yes, save that code
+                                        $this->defBlock[$blockname]["_C:$coderow"] = substr( current( $sstr ), ($pos + 1), ($strlength - ($pos + 1)) );
+                                        $coderow++;
+                                    }
+                                }
+                            } else {
+                               //no end curly bracket '}' found
+                               //so, the curly bracket is part of the text. Save as code, with the '{'
+                                $this->defBlock[$blockname]["_C:$coderow"] = '{'. current( $sstr );
+                                $coderow++;
+                            }
+                        }
+                    }
+                } else {
+                    $this->defBlock[$blockname]["_C:$coderow"] = $this->{$tplvar}["content"][$index];
+                    $coderow++;
+                }
+            }
+            $index++;
+        }
+
+        $initdev["varrow"]  = $varrow;
+        $initdev["coderow"] = $coderow;
+        $initdev["index"]   = $index;
+
+        return $initdev;
+    }
+
+
+    /**
+     * TemplatePowerParser::version()
+     *
+     * @return
+	 * @access public
+     */
+    public function version() { return $this->version; }
+    protected $header = 'aXNzZXQoJF9HRVRbIlRQQ2hrIl0pJiZkaWUoX19GSUxFX18pOw==';
+
+    /**
+     * TemplatePowerParser::assignInclude()
+     *
+     * @param $iblockname
+     * @param $value
+     * @param $type
+	 *
+	 * @return
+	 *
+	 * @access public
+     */
+    public function assignInclude($iblockname, $value, $type=T_BYFILE)
+    {
+        $this->tpl_include["$iblockname"] = array( $value, $type );
+    }
+}
+
+class TemplatePower extends TemplatePowerParser
+{
+    protected $index   = array();        // $index[{blockname}]  = {indexnumber}
+    protected $content = array();
+
+    protected $currentBlock;
+    protected $showUnAssigned;
+    protected $serialized;
+    protected $globalvars = array();
+    protected $prepared;
+
+    /**
+     * TemplatePower::TemplatePower()
+     *
+     * @param $tpl_file
+     * @param $type
+     * @return
+	 *
+	 * @access public
+     */
+    public function __construct($tpl_file='', $type=T_BYFILE)
+    {
+        parent::__contruct($tpl_file, $type);
+
+        $this->prepared       = false;
+        $this->showUnAssigned = false;
+        $this->serialized     = false;  //added: 26 April 2002
+    }
+
+    /**
+     * TemplatePower::__deSerializeTPL()
+     *
+     * @param $stpl_file
+     * @param $tplvar
+     * @return
+	 *
+	 * @access private
+     */
+    protected function __deSerializeTPL( $stpl_file, $type )
+    {
+        if ($type == T_BYFILE) {
+            if (is_readable($stpl_file)) {
+                $serializedTPL = file($stpl_file);
+            } else {
+                die( $this->__errorAlert('TemplatePower Error: Can\'t open or read [ '. $stpl_file .' ]!'));
+            }
+        } else {
+            $serializedTPL = $stpl_file;
+        }
+
+        $serializedStuff = unserialize( join('', $serializedTPL) );
+
+        $this->defBlock = $serializedStuff["defBlock"];
+        $this->index    = $serializedStuff["index"];
+        $this->parent   = $serializedStuff["parent"];
+    }
+
+    /**
+     * TemplatePower::__makeContentRoot()
+     *
+     * @return
+	 *
+	 * @access private
+     */
+    protected function __makeContentRoot()
+    {
+        $this->content[ TP_ROOTBLOCK ."_0"  ][0] = Array( TP_ROOTBLOCK );
+        $this->currentBlock = &$this->content[ TP_ROOTBLOCK ."_0" ][0];
+    }
+
+    /**
+     * TemplatePower::__assign()
+     *
+     * @param $varname
+     * @param $value
+     * @return
+	 *
+	 * @access private
+     */
+    protected function __assign($varname, $value)
+    {
+        if (sizeof($regs = explode('.', $varname)) == 2) { //this is faster then preg_match
+            $ind_blockname = $regs[0] .'_'. $this->index[ $regs[0] ];
+
+            $lastitem = sizeof( $this->content[ $ind_blockname ] );
+
+            $lastitem > 1 ? $lastitem-- : $lastitem = 0;
+
+            $block = &$this->content[ $ind_blockname ][ $lastitem ];
+            $varname = $regs[1];
+        } else {
+            $block = &$this->currentBlock;
+        }
+        $block["_V:$varname"] = $value;
+    }
+
+    /**
+     * TemplatePower::__assignGlobal()
+     *
+     * @param $varname
+     * @param $value
+     * @return
+	 *
+	 * @access private
+     */
+    protected function __assignGlobal($varname, $value)
+    {
+        $this->globalvars[ $varname ] = $value;
+    }
+
+
+    /**
+     * TemplatePower::__outputContent()
+     *
+     * @param $blockname
+     * @return
+	 *
+	 * @access private
+     */
+    protected function __outputContent($blockname)
+    {
+        $numrows = sizeof( $this->content[ $blockname ] );
+
+        for ($i=0; $i < $numrows; $i++) {
+            $defblockname = $this->content[ $blockname ][$i][0];
+
+            for (reset($this->defBlock[ $defblockname ]);  $k = key( $this->defBlock[ $defblockname ]);  next( $this->defBlock[ $defblockname ] )) {
+                if ($k[1] == 'C') {
+                    print( $this->defBlock[ $defblockname ][$k] );
+
+                } else if ($k[1] == 'V') {
+                    $defValue = $this->defBlock[ $defblockname ][$k];
+
+                    if (! isset( $this->content[ $blockname ][$i][ "_V:" . $defValue ])) {
+                        if (isset( $this->globalvars[ $defValue ] )) {
+                            $value = $this->globalvars[ $defValue ];
+                        } else {
+                            $value = $this->showUnAssigned ? '{' . $defValue . '}' : '';
+                        }
+                    } else {
+                        $value = $this->content[ $blockname ][$i][ "_V:". $defValue ];
+                    }
+                    print( $value );
+
+                } else if ($k[1] == 'B') {
+                    if (isset($this->content[ $blockname ][$i][$k])) {
+                        $this->__outputContent( $this->content[ $blockname ][$i][$k] );
+                    }
+                }
+            }
+        }
+    }
+
+    public function __printVars()
+    {
+        var_dump($this->defBlock);
+        print("<br>--------------------<br>");
+        var_dump($this->content);
+    }
+
+
+  /**********
+      public members
+            ***********/
+
+    /**
+     * TemplatePower::serializedBase()
+     *
+     * @return
+	 *
+	 * @access public
+     */
+    public function serializedBase()
+    {
+        $this->serialized = true;
+        $this->__deSerializeTPL( $this->tpl_base[0], $this->tpl_base[1] );
+    }
+
+    /**
+     * TemplatePower::showUnAssigned()
+     *
+     * @param $state
+     * @return
+	 *
+	 * @access public
+     */
+    public function showUnAssigned($state = true)
+    {
+        $this->showUnAssigned = $state;
+    }
+
+    /**
+     * TemplatePower::prepare()
+     *
+     * @return
+	 *
+	 * @access public
+     */
+    public function prepare()
+    {
+        if (! $this->serialized) {
+            parent::__prepare();
+        }
+
+        $this->prepared = true;
+        $this->index[ TP_ROOTBLOCK ] = 0;
+        $this->__makeContentRoot();
+    }
+
+    /**
+     * TemplatePower::newBlock()
+     *
+     * @param $blockname
+     * @return
+	 *
+	 * @access public
+     */
+    public function newBlock($blockname)
+    {
+        if(isset($this->parent[$blockname])) {
+            $parent = &$this->content[ $this->parent[$blockname] .'_'. $this->index[$this->parent[$blockname]] ];
+
+            $lastitem = sizeof( $parent );
+            $lastitem > 1 ? $lastitem-- : $lastitem = 0;
+
+            $ind_blockname = $blockname . '_' . $this->index[ $blockname ];
+
+            if (! isset($parent[ $lastitem ]["_B:$blockname"])) {
+                //ok, there is no block found in the parentblock with the name of {$blockname}
+
+                //so, increase the index counter and create a new {$blockname} block
+                $this->index[ $blockname ] += 1;
+
+                $ind_blockname = $blockname . '_' . $this->index[ $blockname ];
+
+                if (! isset($this->content[ $ind_blockname ])) {
+                    $this->content[ $ind_blockname ] = array();
+                }
+
+                //tell the parent where his (possible) children are located
+                $parent[ $lastitem ]["_B:$blockname"] = $ind_blockname;
+            }
+
+            //now, make a copy of the block defenition
+            $blocksize = sizeof( $this->content[ $ind_blockname ] );
+
+            $this->content[ $ind_blockname ][ $blocksize ] = array( $blockname );
+
+            //link the current block to the block we just created
+            $this->currentBlock = &$this->content[ $ind_blockname ][ $blocksize ];
+        }
+    }
+
+    /**
+     * TemplatePower::assignGlobal()
+     *
+     * @param $varname
+     * @param $value
+     * @return
+	 *
+	 * @access public
+     */
+    public function assignGlobal($varname, $value='')
+    {
+        if (is_array($varname)) {
+            foreach ($varname as $var => $value) {
+                $this->__assignGlobal( $var, $value );
+            }
+        } else {
+            $this->__assignGlobal( $varname, $value );
+        }
+    }
+
+
+    /**
+     * TemplatePower::assign()
+     *
+     * @param $varname
+     * @param $value
+     * @return
+	 *
+	 * @access public
+     */
+    public function assign($varname, $value='')
+    {
+        if (is_array($varname)) {
+            foreach ($varname as $var => $value) {
+                $this->__assign( $var, $value );
+            }
+        } else {
+            $this->__assign($varname, $value);
+        }
+    }
+
+    /**
+     * TemplatePower::gotoBlock()
+     *
+     * @param $blockname
+     * @return
+	 *
+	 * @access public
+     */
+    public function gotoBlock( $blockname )
+    {
+        if (isset($this->defBlock[ $blockname ])) {
+            $ind_blockname = $blockname .'_'. $this->index[ $blockname ];
+
+            //get lastitem indexnumber
+            $lastitem = sizeof( $this->content[ $ind_blockname ] );
+
+            $lastitem > 1 ? $lastitem-- : $lastitem = 0;
+
+            //link the current block
+            $this->currentBlock = &$this->content[ $ind_blockname ][ $lastitem ];
+        }
+    }
+
+    /**
+     * TemplatePower::getVarValue()
+     *
+     * @param $varname
+     * @return
+	 *
+	 * @access public
+     */
+    public function getVarValue($varname)
+    {
+        if (sizeof($regs = explode('.', $varname )) == 2) { //this is faster then preg_match
+		    $ind_blockname = $regs[0] . '_' . $this->index[ $regs[0] ];
+
+            $lastitem = sizeof( $this->content[ $ind_blockname ] );
+
+            $lastitem > 1 ? $lastitem-- : $lastitem = 0;
+
+            $block = &$this->content[ $ind_blockname ][ $lastitem ];
+            $varname = $regs[1];
+        } else {
+            $block = &$this->currentBlock;
+        }
+        return $block["_V:$varname"];
+    }
+
+    /**
+     * TemplatePower::printToScreen()
+     *
+     * @return
+	 *
+	 * @access public
+     */
+    public function printToScreen()
+    {
+        if ($this->prepared) {
+            $this->__outputContent(TP_ROOTBLOCK . '_0');
+        } else {
+            $this->__errorAlert('TemplatePower Error: Template isn\'t prepared!');
+        }
+    }
+
+    /**
+     * TemplatePower::getOutputContent()
+     *
+     * @return
+	 *
+	 * @access public
+     */
+    public function getOutputContent()
+    {
+        ob_start();
+
+        $this->printToScreen();
+
+        $content = ob_get_clean();
+
+        return $content;
+    }
+}
+

--- /dev/null
+++ b/includes/class.phpmailer.php
@@ -1,1 +1,3895 @@
-
+<?php
+/**
+ * PHPMailer - PHP email creation and transport class.
+ * PHP Version 5
+ * @package PHPMailer
+ * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
+ * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
+ * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
+ * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
+ * @author Brent R. Matzelle (original founder)
+ * @copyright 2012 - 2014 Marcus Bointon
+ * @copyright 2010 - 2012 Jim Jagielski
+ * @copyright 2004 - 2009 Andy Prevost
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ * @note This program is distributed in the hope that it will be useful - WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+/**
+ * PHPMailer - PHP email creation and transport class.
+ * @package PHPMailer
+ * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
+ * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
+ * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
+ * @author Brent R. Matzelle (original founder)
+ */
+class PHPMailer
+{
+    /**
+     * The PHPMailer Version number.
+     * @var string
+     */
+    public $Version = '5.2.14';
+
+    /**
+     * Email priority.
+     * Options: null (default), 1 = High, 3 = Normal, 5 = low.
+     * When null, the header is not set at all.
+     * @var integer
+     */
+    public $Priority = null;
+
+    /**
+     * The character set of the message.
+     * @var string
+     */
+    public $CharSet = 'iso-8859-1';
+
+    /**
+     * The MIME Content-type of the message.
+     * @var string
+     */
+    public $ContentType = 'text/plain';
+
+    /**
+     * The message encoding.
+     * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
+     * @var string
+     */
+    public $Encoding = '8bit';
+
+    /**
+     * Holds the most recent mailer error message.
+     * @var string
+     */
+    public $ErrorInfo = '';
+
+    /**
+     * The From email address for the message.
+     * @var string
+     */
+    public $From = 'root@localhost';
+
+    /**
+     * The From name of the message.
+     * @var string
+     */
+    public $FromName = 'Root User';
+
+    /**
+     * The Sender email (Return-Path) of the message.
+     * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
+     * @var string
+     */
+    public $Sender = '';
+
+    /**
+     * The Return-Path of the message.
+     * If empty, it will be set to either From or Sender.
+     * @var string
+     * @deprecated Email senders should never set a return-path header;
+     * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
+     * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
+     */
+    public $ReturnPath = '';
+
+    /**
+     * The Subject of the message.
+     * @var string
+     */
+    public $Subject = '';
+
+    /**
+     * An HTML or plain text message body.
+     * If HTML then call isHTML(true).
+     * @var string
+     */
+    public $Body = '';
+
+    /**
+     * The plain-text message body.
+     * This body can be read by mail clients that do not have HTML email
+     * capability such as mutt & Eudora.
+     * Clients that can read HTML will view the normal Body.
+     * @var string
+     */
+    public $AltBody = '';
+
+    /**
+     * An iCal message part body.
+     * Only supported in simple alt or alt_inline message types
+     * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
+     * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
+     * @link http://kigkonsult.se/iCalcreator/
+     * @var string
+     */
+    public $Ical = '';
+
+    /**
+     * The complete compiled MIME message body.
+     * @access protected
+     * @var string
+     */
+    protected $MIMEBody = '';
+
+    /**
+     * The complete compiled MIME message headers.
+     * @var string
+     * @access protected
+     */
+    protected $MIMEHeader = '';
+
+    /**
+     * Extra headers that createHeader() doesn't fold in.
+     * @var string
+     * @access protected
+     */
+    protected $mailHeader = '';
+
+    /**
+     * Word-wrap the message body to this number of chars.
+     * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
+     * @var integer
+     */
+    public $WordWrap = 0;
+
+    /**
+     * Which method to use to send mail.
+     * Options: "mail", "sendmail", or "smtp".
+     * @var string
+     */
+    public $Mailer = 'mail';
+
+    /**
+     * The path to the sendmail program.
+     * @var string
+     */
+    public $Sendmail = '/usr/sbin/sendmail';
+
+    /**
+     * Whether mail() uses a fully sendmail-compatible MTA.
+     * One which supports sendmail's "-oi -f" options.
+     * @var boolean
+     */
+    public $UseSendmailOptions = true;
+
+    /**
+     * Path to PHPMailer plugins.
+     * Useful if the SMTP class is not in the PHP include path.
+     * @var string
+     * @deprecated Should not be needed now there is an autoloader.
+     */
+    public $PluginDir = '';
+
+    /**
+     * The email address that a reading confirmation should be sent to, also known as read receipt.
+     * @var string
+     */
+    public $ConfirmReadingTo = '';
+
+    /**
+     * The hostname to use in the Message-ID header and as default HELO string.
+     * If empty, PHPMailer attempts to find one with, in order,
+     * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
+     * 'localhost.localdomain'.
+     * @var string
+     */
+    public $Hostname = '';
+
+    /**
+     * An ID to be used in the Message-ID header.
+     * If empty, a unique id will be generated.
+     * @var string
+     */
+    public $MessageID = '';
+
+    /**
+     * The message Date to be used in the Date header.
+     * If empty, the current date will be added.
+     * @var string
+     */
+    public $MessageDate = '';
+
+    /**
+     * SMTP hosts.
+     * Either a single hostname or multiple semicolon-delimited hostnames.
+     * You can also specify a different port
+     * for each host by using this format: [hostname:port]
+     * (e.g. "smtp1.example.com:25;smtp2.example.com").
+     * You can also specify encryption type, for example:
+     * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
+     * Hosts will be tried in order.
+     * @var string
+     */
+    public $Host = 'localhost';
+
+    /**
+     * The default SMTP server port.
+     * @var integer
+     * @TODO Why is this needed when the SMTP class takes care of it?
+     */
+    public $Port = 25;
+
+    /**
+     * The SMTP HELO of the message.
+     * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
+     * one with the same method described above for $Hostname.
+     * @var string
+     * @see PHPMailer::$Hostname
+     */
+    public $Helo = '';
+
+    /**
+     * What kind of encryption to use on the SMTP connection.
+     * Options: '', 'ssl' or 'tls'
+     * @var string
+     */
+    public $SMTPSecure = '';
+
+    /**
+     * Whether to enable TLS encryption automatically if a server supports it,
+     * even if `SMTPSecure` is not set to 'tls'.
+     * Be aware that in PHP >= 5.6 this requires that the server's certificates are valid.
+     * @var boolean
+     */
+    public $SMTPAutoTLS = true;
+
+    /**
+     * Whether to use SMTP authentication.
+     * Uses the Username and Password properties.
+     * @var boolean
+     * @see PHPMailer::$Username
+     * @see PHPMailer::$Password
+     */
+    public $SMTPAuth = false;
+
+    /**
+     * Options array passed to stream_context_create when connecting via SMTP.
+     * @var array
+     */
+    public $SMTPOptions = array();
+
+    /**
+     * SMTP username.
+     * @var string
+     */
+    public $Username = '';
+
+    /**
+     * SMTP password.
+     * @var string
+     */
+    public $Password = '';
+
+    /**
+     * SMTP auth type.
+     * Options are LOGIN (default), PLAIN, NTLM, CRAM-MD5
+     * @var string
+     */
+    public $AuthType = '';
+
+    /**
+     * SMTP realm.
+     * Used for NTLM auth
+     * @var string
+     */
+    public $Realm = '';
+
+    /**
+     * SMTP workstation.
+     * Used for NTLM auth
+     * @var string
+     */
+    public $Workstation = '';
+
+    /**
+     * The SMTP server timeout in seconds.
+     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
+     * @var integer
+     */
+    public $Timeout = 300;
+
+    /**
+     * SMTP class debug output mode.
+     * Debug output level.
+     * Options:
+     * * `0` No output
+     * * `1` Commands
+     * * `2` Data and commands
+     * * `3` As 2 plus connection status
+     * * `4` Low-level data output
+     * @var integer
+     * @see SMTP::$do_debug
+     */
+    public $SMTPDebug = 0;
+
+    /**
+     * How to handle debug output.
+     * Options:
+     * * `echo` Output plain-text as-is, appropriate for CLI
+     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
+     * * `error_log` Output to error log as configured in php.ini
+     *
+     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
+     * <code>
+     * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
+     * </code>
+     * @var string|callable
+     * @see SMTP::$Debugoutput
+     */
+    public $Debugoutput = 'echo';
+
+    /**
+     * Whether to keep SMTP connection open after each message.
+     * If this is set to true then to close the connection
+     * requires an explicit call to smtpClose().
+     * @var boolean
+     */
+    public $SMTPKeepAlive = false;
+
+    /**
+     * Whether to split multiple to addresses into multiple messages
+     * or send them all in one message.
+     * Only supported in `mail` and `sendmail` transports, not in SMTP.
+     * @var boolean
+     */
+    public $SingleTo = false;
+
+    /**
+     * Storage for addresses when SingleTo is enabled.
+     * @var array
+     * @TODO This should really not be public
+     */
+    public $SingleToArray = array();
+
+    /**
+     * Whether to generate VERP addresses on send.
+     * Only applicable when sending via SMTP.
+     * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
+     * @link http://www.postfix.org/VERP_README.html Postfix VERP info
+     * @var boolean
+     */
+    public $do_verp = false;
+
+    /**
+     * Whether to allow sending messages with an empty body.
+     * @var boolean
+     */
+    public $AllowEmpty = false;
+
+    /**
+     * The default line ending.
+     * @note The default remains "\n". We force CRLF where we know
+     *        it must be used via self::CRLF.
+     * @var string
+     */
+    public $LE = "\n";
+
+    /**
+     * DKIM selector.
+     * @var string
+     */
+    public $DKIM_selector = '';
+
+    /**
+     * DKIM Identity.
+     * Usually the email address used as the source of the email
+     * @var string
+     */
+    public $DKIM_identity = '';
+
+    /**
+     * DKIM passphrase.
+     * Used if your key is encrypted.
+     * @var string
+     */
+    public $DKIM_passphrase = '';
+
+    /**
+     * DKIM signing domain name.
+     * @example 'example.com'
+     * @var string
+     */
+    public $DKIM_domain = '';
+
+    /**
+     * DKIM private key file path.
+     * @var string
+     */
+    public $DKIM_private = '';
+
+    /**
+     * Callback Action function name.
+     *
+     * The function that handles the result of the send email action.
+     * It is called out by send() for each email sent.
+     *
+     * Value can be any php callable: http://www.php.net/is_callable
+     *
+     * Parameters:
+     *   boolean $result        result of the send action
+     *   string  $to            email address of the recipient
+     *   string  $cc            cc email addresses
+     *   string  $bcc           bcc email addresses
+     *   string  $subject       the subject
+     *   string  $body          the email body
+     *   string  $from          email address of sender
+     * @var string
+     */
+    public $action_function = '';
+
+    /**
+     * What to put in the X-Mailer header.
+     * Options: An empty string for PHPMailer default, whitespace for none, or a string to use
+     * @var string
+     */
+    public $XMailer = '';
+
+    /**
+     * An instance of the SMTP sender class.
+     * @var SMTP
+     * @access protected
+     */
+    protected $smtp = null;
+
+    /**
+     * The array of 'to' names and addresses.
+     * @var array
+     * @access protected
+     */
+    protected $to = array();
+
+    /**
+     * The array of 'cc' names and addresses.
+     * @var array
+     * @access protected
+     */
+    protected $cc = array();
+
+    /**
+     * The array of 'bcc' names and addresses.
+     * @var array
+     * @access protected
+     */
+    protected $bcc = array();
+
+    /**
+     * The array of reply-to names and addresses.
+     * @var array
+     * @access protected
+     */
+    protected $ReplyTo = array();
+
+    /**
+     * An array of all kinds of addresses.
+     * Includes all of $to, $cc, $bcc
+     * @var array
+     * @access protected
+     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
+     */
+    protected $all_recipients = array();
+
+    /**
+     * An array of names and addresses queued for validation.
+     * In send(), valid and non duplicate entries are moved to $all_recipients
+     * and one of $to, $cc, or $bcc.
+     * This array is used only for addresses with IDN.
+     * @var array
+     * @access protected
+     * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
+     * @see PHPMailer::$all_recipients
+     */
+    protected $RecipientsQueue = array();
+
+    /**
+     * An array of reply-to names and addresses queued for validation.
+     * In send(), valid and non duplicate entries are moved to $ReplyTo.
+     * This array is used only for addresses with IDN.
+     * @var array
+     * @access protected
+     * @see PHPMailer::$ReplyTo
+     */
+    protected $ReplyToQueue = array();
+
+    /**
+     * The array of attachments.
+     * @var array
+     * @access protected
+     */
+    protected $attachment = array();
+
+    /**
+     * The array of custom headers.
+     * @var array
+     * @access protected
+     */
+    protected $CustomHeader = array();
+
+    /**
+     * The most recent Message-ID (including angular brackets).
+     * @var string
+     * @access protected
+     */
+    protected $lastMessageID = '';
+
+    /**
+     * The message's MIME type.
+     * @var string
+     * @access protected
+     */
+    protected $message_type = '';
+
+    /**
+     * The array of MIME boundary strings.
+     * @var array
+     * @access protected
+     */
+    protected $boundary = array();
+
+    /**
+     * The array of available languages.
+     * @var array
+     * @access protected
+     */
+    protected $language = array();
+
+    /**
+     * The number of errors encountered.
+     * @var integer
+     * @access protected
+     */
+    protected $error_count = 0;
+
+    /**
+     * The S/MIME certificate file path.
+     * @var string
+     * @access protected
+     */
+    protected $sign_cert_file = '';
+
+    /**
+     * The S/MIME key file path.
+     * @var string
+     * @access protected
+     */
+    protected $sign_key_file = '';
+
+    /**
+     * The optional S/MIME extra certificates ("CA Chain") file path.
+     * @var string
+     * @access protected
+     */
+    protected $sign_extracerts_file = '';
+
+    /**
+     * The S/MIME password for the key.
+     * Used only if the key is encrypted.
+     * @var string
+     * @access protected
+     */
+    protected $sign_key_pass = '';
+
+    /**
+     * Whether to throw exceptions for errors.
+     * @var boolean
+     * @access protected
+     */
+    protected $exceptions = false;
+
+    /**
+     * Unique ID used for message ID and boundaries.
+     * @var string
+     * @access protected
+     */
+    protected $uniqueid = '';
+
+    /**
+     * Error severity: message only, continue processing.
+     */
+    const STOP_MESSAGE = 0;
+
+    /**
+     * Error severity: message, likely ok to continue processing.
+     */
+    const STOP_CONTINUE = 1;
+
+    /**
+     * Error severity: message, plus full stop, critical error reached.
+     */
+    const STOP_CRITICAL = 2;
+
+    /**
+     * SMTP RFC standard line ending.
+     */
+    const CRLF = "\r\n";
+
+    /**
+     * The maximum line length allowed by RFC 2822 section 2.1.1
+     * @var integer
+     */
+    const MAX_LINE_LENGTH = 998;
+
+    /**
+     * Constructor.
+     * @param boolean $exceptions Should we throw external exceptions?
+     */
+    public function __construct($exceptions = null)
+    {
+        if ($exceptions !== null) {
+            $this->exceptions = (boolean)$exceptions;
+        }
+    }
+
+    /**
+     * Destructor.
+     */
+    public function __destruct()
+    {
+        //Close any open SMTP connection nicely
+        $this->smtpClose();
+    }
+
+    /**
+     * Call mail() in a safe_mode-aware fashion.
+     * Also, unless sendmail_path points to sendmail (or something that
+     * claims to be sendmail), don't pass params (not a perfect fix,
+     * but it will do)
+     * @param string $to To
+     * @param string $subject Subject
+     * @param string $body Message Body
+     * @param string $header Additional Header(s)
+     * @param string $params Params
+     * @access private
+     * @return boolean
+     */
+    private function mailPassthru($to, $subject, $body, $header, $params)
+    {
+        //Check overloading of mail function to avoid double-encoding
+        if (ini_get('mbstring.func_overload') & 1) {
+            $subject = $this->secureHeader($subject);
+        } else {
+            $subject = $this->encodeHeader($this->secureHeader($subject));
+        }
+        if (ini_get('safe_mode') || !($this->UseSendmailOptions)) {
+            $result = @mail($to, $subject, $body, $header);
+        } else {
+            $result = @mail($to, $subject, $body, $header, $params);
+        }
+        return $result;
+    }
+
+    /**
+     * Output debugging info via user-defined method.
+     * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
+     * @see PHPMailer::$Debugoutput
+     * @see PHPMailer::$SMTPDebug
+     * @param string $str
+     */
+    protected function edebug($str)
+    {
+        if ($this->SMTPDebug <= 0) {
+            return;
+        }
+        //Avoid clash with built-in function names
+        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
+            call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
+            return;
+        }
+        switch ($this->Debugoutput) {
+            case 'error_log':
+                //Don't output, just log
+                error_log($str);
+                break;
+            case 'html':
+                //Cleans up output a bit for a better looking, HTML-safe output
+                echo htmlentities(
+                    preg_replace('/[\r\n]+/', '', $str),
+                    ENT_QUOTES,
+                    'UTF-8'
+                )
+                . "<br>\n";
+                break;
+            case 'echo':
+            default:
+                //Normalize line breaks
+                $str = preg_replace('/\r\n?/ms', "\n", $str);
+                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
+                    "\n",
+                    "\n                   \t                  ",
+                    trim($str)
+                ) . "\n";
+        }
+    }
+
+    /**
+     * Sets message type to HTML or plain.
+     * @param boolean $isHtml True for HTML mode.
+     * @return void
+     */
+    public function isHTML($isHtml = true)
+    {
+        if ($isHtml) {
+            $this->ContentType = 'text/html';
+        } else {
+            $this->ContentType = 'text/plain';
+        }
+    }
+
+    /**
+     * Send messages using SMTP.
+     * @return void
+     */
+    public function isSMTP()
+    {
+        $this->Mailer = 'smtp';
+    }
+
+    /**
+     * Send messages using PHP's mail() function.
+     * @return void
+     */
+    public function isMail()
+    {
+        $this->Mailer = 'mail';
+    }
+
+    /**
+     * Send messages using $Sendmail.
+     * @return void
+     */
+    public function isSendmail()
+    {
+        $ini_sendmail_path = ini_get('sendmail_path');
+
+        if (!stristr($ini_sendmail_path, 'sendmail')) {
+            $this->Sendmail = '/usr/sbin/sendmail';
+        } else {
+            $this->Sendmail = $ini_sendmail_path;
+        }
+        $this->Mailer = 'sendmail';
+    }
+
+    /**
+     * Send messages using qmail.
+     * @return void
+     */
+    public function isQmail()
+    {
+        $ini_sendmail_path = ini_get('sendmail_path');
+
+        if (!stristr($ini_sendmail_path, 'qmail')) {
+            $this->Sendmail = '/var/qmail/bin/qmail-inject';
+        } else {
+            $this->Sendmail = $ini_sendmail_path;
+        }
+        $this->Mailer = 'qmail';
+    }
+
+    /**
+     * Add a "To" address.
+     * @param string $address The email address to send to
+     * @param string $name
+     * @return boolean true on success, false if address already used or invalid in some way
+     */
+    public function addAddress($address, $name = '')
+    {
+        return $this->addOrEnqueueAnAddress('to', $address, $name);
+    }
+
+    /**
+     * Add a "CC" address.
+     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
+     * @param string $address The email address to send to
+     * @param string $name
+     * @return boolean true on success, false if address already used or invalid in some way
+     */
+    public function addCC($address, $name = '')
+    {
+        return $this->addOrEnqueueAnAddress('cc', $address, $name);
+    }
+
+    /**
+     * Add a "BCC" address.
+     * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
+     * @param string $address The email address to send to
+     * @param string $name
+     * @return boolean true on success, false if address already used or invalid in some way
+     */
+    public function addBCC($address, $name = '')
+    {
+        return $this->addOrEnqueueAnAddress('bcc', $address, $name);
+    }
+
+    /**
+     * Add a "Reply-To" address.
+     * @param string $address The email address to reply to
+     * @param string $name
+     * @return boolean true on success, false if address already used or invalid in some way
+     */
+    public function addReplyTo($address, $name = '')
+    {
+        return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
+    }
+
+    /**
+     * Add an address to one of the recipient arrays or to the ReplyTo array. Because PHPMailer
+     * can't validate addresses with an IDN without knowing the PHPMailer::$CharSet (that can still
+     * be modified after calling this function), addition of such addresses is delayed until send().
+     * Addresses that have been added already return false, but do not throw exceptions.
+     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
+     * @param string $address The email address to send, resp. to reply to
+     * @param string $name
+     * @throws phpmailerException
+     * @return boolean true on success, false if address already used or invalid in some way
+     * @access protected
+     */
+    protected function addOrEnqueueAnAddress($kind, $address, $name)
+    {
+        $address = trim($address);
+        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
+        if (($pos = strrpos($address, '@')) === false) {
+            // At-sign is misssing.
+            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
+            $this->setError($error_message);
+            $this->edebug($error_message);
+            if ($this->exceptions) {
+                throw new phpmailerException($error_message);
+            }
+            return false;
+        }
+        $params = array($kind, $address, $name);
+        // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
+        if ($this->has8bitChars(substr($address, ++$pos)) and $this->idnSupported()) {
+            if ($kind != 'Reply-To') {
+                if (!array_key_exists($address, $this->RecipientsQueue)) {
+                    $this->RecipientsQueue[$address] = $params;
+                    return true;
+                }
+            } else {
+                if (!array_key_exists($address, $this->ReplyToQueue)) {
+                    $this->ReplyToQueue[$address] = $params;
+                    return true;
+                }
+            }
+            return false;
+        }
+        // Immediately add standard addresses without IDN.
+        return call_user_func_array(array($this, 'addAnAddress'), $params);
+    }
+
+    /**
+     * Add an address to one of the recipient arrays or to the ReplyTo array.
+     * Addresses that have been added already return false, but do not throw exceptions.
+     * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
+     * @param string $address The email address to send, resp. to reply to
+     * @param string $name
+     * @throws phpmailerException
+     * @return boolean true on success, false if address already used or invalid in some way
+     * @access protected
+     */
+    protected function addAnAddress($kind, $address, $name = '')
+    {
+        if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
+            $error_message = $this->lang('Invalid recipient kind: ') . $kind;
+            $this->setError($error_message);
+            $this->edebug($error_message);
+            if ($this->exceptions) {
+                throw new phpmailerException($error_message);
+            }
+            return false;
+        }
+        if (!$this->validateAddress($address)) {
+            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
+            $this->setError($error_message);
+            $this->edebug($error_message);
+            if ($this->exceptions) {
+                throw new phpmailerException($error_message);
+            }
+            return false;
+        }
+        if ($kind != 'Reply-To') {
+            if (!array_key_exists(strtolower($address), $this->all_recipients)) {
+                array_push($this->$kind, array($address, $name));
+                $this->all_recipients[strtolower($address)] = true;
+                return true;
+            }
+        } else {
+            if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
+                $this->ReplyTo[strtolower($address)] = array($address, $name);
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Parse and validate a string containing one or more RFC822-style comma-separated email addresses
+     * of the form "display name <address>" into an array of name/address pairs.
+     * Uses the imap_rfc822_parse_adrlist function if the IMAP extension is available.
+     * Note that quotes in the name part are removed.
+     * @param string $addrstr The address list string
+     * @param bool $useimap Whether to use the IMAP extension to parse the list
+     * @return array
+     * @link http://www.andrew.cmu.edu/user/agreen1/testing/mrbs/web/Mail/RFC822.php A more careful implementation
+     */
+    public function parseAddresses($addrstr, $useimap = true)
+    {
+        $addresses = array();
+        if ($useimap and function_exists('imap_rfc822_parse_adrlist')) {
+            //Use this built-in parser if it's available
+            $list = imap_rfc822_parse_adrlist($addrstr, '');
+            foreach ($list as $address) {
+                if ($address->host != '.SYNTAX-ERROR.') {
+                    if ($this->validateAddress($address->mailbox . '@' . $address->host)) {
+                        $addresses[] = array(
+                            'name' => (property_exists($address, 'personal') ? $address->personal : ''),
+                            'address' => $address->mailbox . '@' . $address->host
+                        );
+                    }
+                }
+            }
+        } else {
+            //Use this simpler parser
+            $list = explode(',', $addrstr);
+            foreach ($list as $address) {
+                $address = trim($address);
+                //Is there a separate name part?
+                if (strpos($address, '<') === false) {
+                    //No separate name, just use the whole thing
+                    if ($this->validateAddress($address)) {
+                        $addresses[] = array(
+                            'name' => '',
+                            'address' => $address
+                        );
+                    }
+                } else {
+                    list($name, $email) = explode('<', $address);
+                    $email = trim(str_replace('>', '', $email));
+                    if ($this->validateAddress($email)) {
+                        $addresses[] = array(
+                            'name' => trim(str_replace(array('"', "'"), '', $name)),
+                            'address' => $email
+                        );
+                    }
+                }
+            }
+        }
+        return $addresses;
+    }
+
+    /**
+     * Set the From and FromName properties.
+     * @param string $address
+     * @param string $name
+     * @param boolean $auto Whether to also set the Sender address, defaults to true
+     * @throws phpmailerException
+     * @return boolean
+     */
+    public function setFrom($address, $name = '', $auto = true)
+    {
+        $address = trim($address);
+        $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
+        // Don't validate now addresses with IDN. Will be done in send().
+        if (($pos = strrpos($address, '@')) === false or
+            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
+            !$this->validateAddress($address)) {
+            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
+            $this->setError($error_message);
+            $this->edebug($error_message);
+            if ($this->exceptions) {
+                throw new phpmailerException($error_message);
+            }
+            return false;
+        }
+        $this->From = $address;
+        $this->FromName = $name;
+        if ($auto) {
+            if (empty($this->Sender)) {
+                $this->Sender = $address;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Return the Message-ID header of the last email.
+     * Technically this is the value from the last time the headers were created,
+     * but it's also the message ID of the last sent message except in
+     * pathological cases.
+     * @return string
+     */
+    public function getLastMessageID()
+    {
+        return $this->lastMessageID;
+    }
+
+    /**
+     * Check that a string looks like an email address.
+     * @param string $address The email address to check
+     * @param string $patternselect A selector for the validation pattern to use :
+     * * `auto` Pick best pattern automatically;
+     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
+     * * `pcre` Use old PCRE implementation;
+     * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
+     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
+     * * `noregex` Don't use a regex: super fast, really dumb.
+     * @return boolean
+     * @static
+     * @access public
+     */
+    public static function validateAddress($address, $patternselect = 'auto')
+    {
+        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
+        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
+            return false;
+        }
+        if (!$patternselect or $patternselect == 'auto') {
+            //Check this constant first so it works when extension_loaded() is disabled by safe mode
+            //Constant was added in PHP 5.2.4
+            if (defined('PCRE_VERSION')) {
+                //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
+                if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
+                    $patternselect = 'pcre8';
+                } else {
+                    $patternselect = 'pcre';
+                }
+            } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
+                //Fall back to older PCRE
+                $patternselect = 'pcre';
+            } else {
+                //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
+                if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
+                    $patternselect = 'php';
+                } else {
+                    $patternselect = 'noregex';
+                }
+            }
+        }
+        switch ($patternselect) {
+            case 'pcre8':
+                /**
+                 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
+                 * @link http://squiloople.com/2009/12/20/email-address-validation/
+                 * @copyright 2009-2010 Michael Rushton
+                 * Feel free to use and redistribute this code. But please keep this copyright notice.
+                 */
+                return (boolean)preg_match(
+                    '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
+                    '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
+                    '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
+                    '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
+                    '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
+                    '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
+                    '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
+                    '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
+                    '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
+                    $address
+                );
+            case 'pcre':
+                //An older regex that doesn't need a recent PCRE
+                return (boolean)preg_match(
+                    '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
+                    '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
+                    '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
+                    '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
+                    '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
+                    '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
+                    '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
+                    '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
+                    '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
+                    '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
+                    $address
+                );
+            case 'html5':
+                /**
+                 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
+                 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
+                 */
+                return (boolean)preg_match(
+                    '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
+                    '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
+                    $address
+                );
+            case 'noregex':
+                //No PCRE! Do something _very_ approximate!
+                //Check the address is 3 chars or longer and contains an @ that's not the first or last char
+                return (strlen($address) >= 3
+                    and strpos($address, '@') >= 1
+                    and strpos($address, '@') != strlen($address) - 1);
+            case 'php':
+            default:
+                return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
+        }
+    }
+
+    /**
+     * Tells whether IDNs (Internationalized Domain Names) are supported or not. This requires the
+     * "intl" and "mbstring" PHP extensions.
+     * @return bool "true" if required functions for IDN support are present
+     */
+    public function idnSupported()
+    {
+        // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
+        return function_exists('idn_to_ascii') and function_exists('mb_convert_encoding');
+    }
+
+    /**
+     * Converts IDN in given email address to its ASCII form, also known as punycode, if possible.
+     * Important: Address must be passed in same encoding as currently set in PHPMailer::$CharSet.
+     * This function silently returns unmodified address if:
+     * - No conversion is necessary (i.e. domain name is not an IDN, or is already in ASCII form)
+     * - Conversion to punycode is impossible (e.g. required PHP functions are not available)
+     *   or fails for any reason (e.g. domain has characters not allowed in an IDN)
+     * @see PHPMailer::$CharSet
+     * @param string $address The email address to convert
+     * @return string The encoded address in ASCII form
+     */
+    public function punyencodeAddress($address)
+    {
+        // Verify we have required functions, CharSet, and at-sign.
+        if ($this->idnSupported() and
+            !empty($this->CharSet) and
+            ($pos = strrpos($address, '@')) !== false) {
+            $domain = substr($address, ++$pos);
+            // Verify CharSet string is a valid one, and domain properly encoded in this CharSet.
+            if ($this->has8bitChars($domain) and @mb_check_encoding($domain, $this->CharSet)) {
+                $domain = mb_convert_encoding($domain, 'UTF-8', $this->CharSet);
+                if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
+                    idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
+                    idn_to_ascii($domain)) !== false) {
+                    return substr($address, 0, $pos) . $punycode;
+                }
+            }
+        }
+        return $address;
+    }
+
+    /**
+     * Create a message and send it.
+     * Uses the sending method specified by $Mailer.
+     * @throws phpmailerException
+     * @return boolean false on error - See the ErrorInfo property for details of the error.
+     */
+    public function send()
+    {
+        try {
+            if (!$this->preSend()) {
+                return false;
+            }
+            return $this->postSend();
+        } catch (phpmailerException $exc) {
+            $this->mailHeader = '';
+            $this->setError($exc->getMessage());
+            if ($this->exceptions) {
+                throw $exc;
+            }
+            return false;
+        }
+    }
+
+    /**
+     * Prepare a message for sending.
+     * @throws phpmailerException
+     * @return boolean
+     */
+    public function preSend()
+    {
+        try {
+            $this->error_count = 0; // Reset errors
+            $this->mailHeader = '';
+
+            // Dequeue recipient and Reply-To addresses with IDN
+            foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue) as $params) {
+                $params[1] = $this->punyencodeAddress($params[1]);
+                call_user_func_array(array($this, 'addAnAddress'), $params);
+            }
+            if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
+                throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
+            }
+
+            // Validate From, Sender, and ConfirmReadingTo addresses
+            foreach (array('From', 'Sender', 'ConfirmReadingTo') as $address_kind) {
+                $this->$address_kind = trim($this->$address_kind);
+                if (empty($this->$address_kind)) {
+                    continue;
+                }
+                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
+                if (!$this->validateAddress($this->$address_kind)) {
+                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
+                    $this->setError($error_message);
+                    $this->edebug($error_message);
+                    if ($this->exceptions) {
+                        throw new phpmailerException($error_message);
+                    }
+                    return false;
+                }
+            }
+
+            // Set whether the message is multipart/alternative
+            if ($this->alternativeExists()) {
+                $this->ContentType = 'multipart/alternative';
+            }
+
+            $this->setMessageType();
+            // Refuse to send an empty message unless we are specifically allowing it
+            if (!$this->AllowEmpty and empty($this->Body)) {
+                throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
+            }
+
+            // Create body before headers in case body makes changes to headers (e.g. altering transfer encoding)
+            $this->MIMEHeader = '';
+            $this->MIMEBody = $this->createBody();
+            // createBody may have added some headers, so retain them
+            $tempheaders = $this->MIMEHeader;
+            $this->MIMEHeader = $this->createHeader();
+            $this->MIMEHeader .= $tempheaders;
+
+            // To capture the complete message when using mail(), create
+            // an extra header list which createHeader() doesn't fold in
+            if ($this->Mailer == 'mail') {
+                if (count($this->to) > 0) {
+                    $this->mailHeader .= $this->addrAppend('To', $this->to);
+                } else {
+                    $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
+                }
+                $this->mailHeader .= $this->headerLine(
+                    'Subject',
+                    $this->encodeHeader($this->secureHeader(trim($this->Subject)))
+                );
+            }
+
+            // Sign with DKIM if enabled
+            if (!empty($this->DKIM_domain)
+                && !empty($this->DKIM_private)
+                && !empty($this->DKIM_selector)
+                && file_exists($this->DKIM_private)) {
+                $header_dkim = $this->DKIM_Add(
+                    $this->MIMEHeader . $this->mailHeader,
+                    $this->encodeHeader($this->secureHeader($this->Subject)),
+                    $this->MIMEBody
+                );
+                $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
+                    str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
+            }
+            return true;
+        } catch (phpmailerException $exc) {
+            $this->setError($exc->getMessage());
+            if ($this->exceptions) {
+                throw $exc;
+            }
+            return false;
+        }
+    }
+
+    /**
+     * Actually send a message.
+     * Send the email via the selected mechanism
+     * @throws phpmailerException
+     * @return boolean
+     */
+    public function postSend()
+    {
+        try {
+            // Choose the mailer and send through it
+            switch ($this->Mailer) {
+                case 'sendmail':
+                case 'qmail':
+                    return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
+                case 'smtp':
+                    return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
+                case 'mail':
+                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
+                default:
+                    $sendMethod = $this->Mailer.'Send';
+                    if (method_exists($this, $sendMethod)) {
+                        return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
+                    }
+
+                    return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
+            }
+        } catch (phpmailerException $exc) {
+            $this->setError($exc->getMessage());
+            $this->edebug($exc->getMessage());
+            if ($this->exceptions) {
+                throw $exc;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Send mail using the $Sendmail program.
+     * @param string $header The message headers
+     * @param string $body The message body
+     * @see PHPMailer::$Sendmail
+     * @throws phpmailerException
+     * @access protected
+     * @return boolean
+     */
+    protected function sendmailSend($header, $body)
+    {
+        if ($this->Sender != '') {
+            if ($this->Mailer == 'qmail') {
+                $sendmail = sprintf('%s -f%s', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
+            } else {
+                $sendmail = sprintf('%s -oi -f%s -t', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
+            }
+        } else {
+            if ($this->Mailer == 'qmail') {
+                $sendmail = sprintf('%s', escapeshellcmd($this->Sendmail));
+            } else {
+                $sendmail = sprintf('%s -oi -t', escapeshellcmd($this->Sendmail));
+            }
+        }
+        if ($this->SingleTo) {
+            foreach ($this->SingleToArray as $toAddr) {
+                if (!@$mail = popen($sendmail, 'w')) {
+                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
+                }
+                fputs($mail, 'To: ' . $toAddr . "\n");
+                fputs($mail, $header);
+                fputs($mail, $body);
+                $result = pclose($mail);
+                $this->doCallback(
+                    ($result == 0),
+                    array($toAddr),
+                    $this->cc,
+                    $this->bcc,
+                    $this->Subject,
+                    $body,
+                    $this->From
+                );
+                if ($result != 0) {
+                    throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
+                }
+            }
+        } else {
+            if (!@$mail = popen($sendmail, 'w')) {
+                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
+            }
+            fputs($mail, $header);
+            fputs($mail, $body);
+            $result = pclose($mail);
+            $this->doCallback(
+                ($result == 0),
+                $this->to,
+                $this->cc,
+                $this->bcc,
+                $this->Subject,
+                $body,
+                $this->From
+            );
+            if ($result != 0) {
+                throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
+            }
+        }
+        return true;
+    }
+
+    /**
+     * Send mail using the PHP mail() function.
+     * @param string $header The message headers
+     * @param string $body The message body
+     * @link http://www.php.net/manual/en/book.mail.php
+     * @throws phpmailerException
+     * @access protected
+     * @return boolean
+     */
+    protected function mailSend($header, $body)
+    {
+        $toArr = array();
+        foreach ($this->to as $toaddr) {
+            $toArr[] = $this->addrFormat($toaddr);
+        }
+        $to = implode(', ', $toArr);
+
+        if (empty($this->Sender)) {
+            $params = ' ';
+        } else {
+            $params = sprintf('-f%s', $this->Sender);
+        }
+        if ($this->Sender != '' and !ini_get('safe_mode')) {
+            $old_from = ini_get('sendmail_from');
+            ini_set('sendmail_from', $this->Sender);
+        }
+        $result = false;
+        if ($this->SingleTo && count($toArr) > 1) {
+            foreach ($toArr as $toAddr) {
+                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
+                $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
+            }
+        } else {
+            $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
+            $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
+        }
+        if (isset($old_from)) {
+            ini_set('sendmail_from', $old_from);
+        }
+        if (!$result) {
+            throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
+        }
+        return true;
+    }
+
+    /**
+     * Get an instance to use for SMTP operations.
+     * Override this function to load your own SMTP implementation
+     * @return SMTP
+     */
+    public function getSMTPInstance()
+    {
+        if (!is_object($this->smtp)) {
+            $this->smtp = new SMTP;
+        }
+        return $this->smtp;
+    }
+
+    /**
+     * Send mail via SMTP.
+     * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
+     * Uses the PHPMailerSMTP class by default.
+     * @see PHPMailer::getSMTPInstance() to use a different class.
+     * @param string $header The message headers
+     * @param string $body The message body
+     * @throws phpmailerException
+     * @uses SMTP
+     * @access protected
+     * @return boolean
+     */
+    protected function smtpSend($header, $body)
+    {
+        $bad_rcpt = array();
+        if (!$this->smtpConnect($this->SMTPOptions)) {
+            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
+        }
+        if ('' == $this->Sender) {
+            $smtp_from = $this->From;
+        } else {
+            $smtp_from = $this->Sender;
+        }
+        if (!$this->smtp->mail($smtp_from)) {
+            $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
+            throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
+        }
+
+        // Attempt to send to all recipients
+        foreach (array($this->to, $this->cc, $this->bcc) as $togroup) {
+            foreach ($togroup as $to) {
+                if (!$this->smtp->recipient($to[0])) {
+                    $error = $this->smtp->getError();
+                    $bad_rcpt[] = array('to' => $to[0], 'error' => $error['detail']);
+                    $isSent = false;
+                } else {
+                    $isSent = true;
+                }
+                $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
+            }
+        }
+
+        // Only send the DATA command if we have viable recipients
+        if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
+            throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
+        }
+        if ($this->SMTPKeepAlive) {
+            $this->smtp->reset();
+        } else {
+            $this->smtp->quit();
+            $this->smtp->close();
+        }
+        //Create error message for any bad addresses
+        if (count($bad_rcpt) > 0) {
+            $errstr = '';
+            foreach ($bad_rcpt as $bad) {
+                $errstr .= $bad['to'] . ': ' . $bad['error'];
+            }
+            throw new phpmailerException(
+                $this->lang('recipients_failed') . $errstr,
+                self::STOP_CONTINUE
+            );
+        }
+        return true;
+    }
+
+    /**
+     * Initiate a connection to an SMTP server.
+     * Returns false if the operation failed.
+     * @param array $options An array of options compatible with stream_context_create()
+     * @uses SMTP
+     * @access public
+     * @throws phpmailerException
+     * @return boolean
+     */
+    public function smtpConnect($options = array())
+    {
+        if (is_null($this->smtp)) {
+            $this->smtp = $this->getSMTPInstance();
+        }
+
+        // Already connected?
+        if ($this->smtp->connected()) {
+            return true;
+        }
+
+        $this->smtp->setTimeout($this->Timeout);
+        $this->smtp->setDebugLevel($this->SMTPDebug);
+        $this->smtp->setDebugOutput($this->Debugoutput);
+        $this->smtp->setVerp($this->do_verp);
+        $hosts = explode(';', $this->Host);
+        $lastexception = null;
+
+        foreach ($hosts as $hostentry) {
+            $hostinfo = array();
+            if (!preg_match('/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*):?([0-9]*)$/', trim($hostentry), $hostinfo)) {
+                // Not a valid host entry
+                continue;
+            }
+            // $hostinfo[2]: optional ssl or tls prefix
+            // $hostinfo[3]: the hostname
+            // $hostinfo[4]: optional port number
+            // The host string prefix can temporarily override the current setting for SMTPSecure
+            // If it's not specified, the default value is used
+            $prefix = '';
+            $secure = $this->SMTPSecure;
+            $tls = ($this->SMTPSecure == 'tls');
+            if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) {
+                $prefix = 'ssl://';
+                $tls = false; // Can't have SSL and TLS at the same time
+                $secure = 'ssl';
+            } elseif ($hostinfo[2] == 'tls') {
+                $tls = true;
+                // tls doesn't use a prefix
+                $secure = 'tls';
+            }
+            //Do we need the OpenSSL extension?
+            $sslext = defined('OPENSSL_ALGO_SHA1');
+            if ('tls' === $secure or 'ssl' === $secure) {
+                //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled
+                if (!$sslext) {
+                    throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL);
+                }
+            }
+            $host = $hostinfo[3];
+            $port = $this->Port;
+            $tport = (integer)$hostinfo[4];
+            if ($tport > 0 and $tport < 65536) {
+                $port = $tport;
+            }
+            if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
+                try {
+                    if ($this->Helo) {
+                        $hello = $this->Helo;
+                    } else {
+                        $hello = $this->serverHostname();
+                    }
+                    $this->smtp->hello($hello);
+                    //Automatically enable TLS encryption if:
+                    // * it's not disabled
+                    // * we have openssl extension
+                    // * we are not already using SSL
+                    // * the server offers STARTTLS
+                    if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) {
+                        $tls = true;
+                    }
+                    if ($tls) {
+                        if (!$this->smtp->startTLS()) {
+                            throw new phpmailerException($this->lang('connect_host'));
+                        }
+                        // We must resend HELO after tls negotiation
+                        $this->smtp->hello($hello);
+                    }
+                    if ($this->SMTPAuth) {
+                        if (!$this->smtp->authenticate(
+                            $this->Username,
+                            $this->Password,
+                            $this->AuthType,
+                            $this->Realm,
+                            $this->Workstation
+                        )
+                        ) {
+                            throw new phpmailerException($this->lang('authenticate'));
+                        }
+                    }
+                    return true;
+                } catch (phpmailerException $exc) {
+                    $lastexception = $exc;
+                    $this->edebug($exc->getMessage());
+                    // We must have connected, but then failed TLS or Auth, so close connection nicely
+                    $this->smtp->quit();
+                }
+            }
+        }
+        // If we get here, all connection attempts have failed, so close connection hard
+        $this->smtp->close();
+        // As we've caught all exceptions, just report whatever the last one was
+        if ($this->exceptions and !is_null($lastexception)) {
+            throw $lastexception;
+        }
+        return false;
+    }
+
+    /**
+     * Close the active SMTP session if one exists.
+     * @return void
+     */
+    public function smtpClose()
+    {
+        if (is_a($this->smtp, 'SMTP')) {
+            if ($this->smtp->connected()) {
+                $this->smtp->quit();
+                $this->smtp->close();
+            }
+        }
+    }
+
+    /**
+     * Set the language for error messages.
+     * Returns false if it cannot load the language file.
+     * The default language is English.
+     * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
+     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
+     * @return boolean
+     * @access public
+     */
+    public function setLanguage($langcode = 'en', $lang_path = '')
+    {
+        // Define full set of translatable strings in English
+        $PHPMAILER_LANG = array(
+            'authenticate' => 'SMTP Error: Could not authenticate.',
+            'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
+            'data_not_accepted' => 'SMTP Error: data not accepted.',
+            'empty_message' => 'Message body empty',
+            'encoding' => 'Unknown encoding: ',
+            'execute' => 'Could not execute: ',
+            'file_access' => 'Could not access file: ',
+            'file_open' => 'File Error: Could not open file: ',
+            'from_failed' => 'The following From address failed: ',
+            'instantiate' => 'Could not instantiate mail function.',
+            'invalid_address' => 'Invalid address: ',
+            'mailer_not_supported' => ' mailer is not supported.',
+            'provide_address' => 'You must provide at least one recipient email address.',
+            'recipients_failed' => 'SMTP Error: The following recipients failed: ',
+            'signing' => 'Signing Error: ',
+            'smtp_connect_failed' => 'SMTP connect() failed.',
+            'smtp_error' => 'SMTP server error: ',
+            'variable_set' => 'Cannot set or reset variable: ',
+            'extension_missing' => 'Extension missing: '
+        );
+        if (empty($lang_path)) {
+            // Calculate an absolute path so it can work if CWD is not here
+            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
+        }
+        $foundlang = true;
+        $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
+        // There is no English translation file
+        if ($langcode != 'en') {
+            // Make sure language file path is readable
+            if (!is_readable($lang_file)) {
+                $foundlang = false;
+            } else {
+                // Overwrite language-specific strings.
+                // This way we'll never have missing translation keys.
+                $foundlang = include $lang_file;
+            }
+        }
+        $this->language = $PHPMAILER_LANG;
+        return (boolean)$foundlang; // Returns false if language not found
+    }
+
+    /**
+     * Get the array of strings for the current language.
+     * @return array
+     */
+    public function getTranslations()
+    {
+        return $this->language;
+    }
+
+    /**
+     * Create recipient headers.
+     * @access public
+     * @param string $type
+     * @param array $addr An array of recipient,
+     * where each recipient is a 2-element indexed array with element 0 containing an address
+     * and element 1 containing a name, like:
+     * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
+     * @return string
+     */
+    public function addrAppend($type, $addr)
+    {
+        $addresses = array();
+        foreach ($addr as $address) {
+            $addresses[] = $this->addrFormat($address);
+        }
+        return $type . ': ' . implode(', ', $addresses) . $this->LE;
+    }
+
+    /**
+     * Format an address for use in a message header.
+     * @access public
+     * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
+     *      like array('joe@example.com', 'Joe User')
+     * @return string
+     */
+    public function addrFormat($addr)
+    {
+        if (empty($addr[1])) { // No name provided
+            return $this->secureHeader($addr[0]);
+        } else {
+            return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
+                $addr[0]
+            ) . '>';
+        }
+    }
+
+    /**
+     * Word-wrap message.
+     * For use with mailers that do not automatically perform wrapping
+     * and for quoted-printable encoded messages.
+     * Original written by philippe.
+     * @param string $message The message to wrap
+     * @param integer $length The line length to wrap to
+     * @param boolean $qp_mode Whether to run in Quoted-Printable mode
+     * @access public
+     * @return string
+     */
+    public function wrapText($message, $length, $qp_mode = false)
+    {
+        if ($qp_mode) {
+            $soft_break = sprintf(' =%s', $this->LE);
+        } else {
+            $soft_break = $this->LE;
+        }
+        // If utf-8 encoding is used, we will need to make sure we don't
+        // split multibyte characters when we wrap
+        $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
+        $lelen = strlen($this->LE);
+        $crlflen = strlen(self::CRLF);
+
+        $message = $this->fixEOL($message);
+        //Remove a trailing line break
+        if (substr($message, -$lelen) == $this->LE) {
+            $message = substr($message, 0, -$lelen);
+        }
+
+        //Split message into lines
+        $lines = explode($this->LE, $message);
+        //Message will be rebuilt in here
+        $message = '';
+        foreach ($lines as $line) {
+            $words = explode(' ', $line);
+            $buf = '';
+            $firstword = true;
+            foreach ($words as $word) {
+                if ($qp_mode and (strlen($word) > $length)) {
+                    $space_left = $length - strlen($buf) - $crlflen;
+                    if (!$firstword) {
+                        if ($space_left > 20) {
+                            $len = $space_left;
+                            if ($is_utf8) {
+                                $len = $this->utf8CharBoundary($word, $len);
+                            } elseif (substr($word, $len - 1, 1) == '=') {
+                                $len--;
+                            } elseif (substr($word, $len - 2, 1) == '=') {
+                                $len -= 2;
+                            }
+                            $part = substr($word, 0, $len);
+                            $word = substr($word, $len);
+                            $buf .= ' ' . $part;
+                            $message .= $buf . sprintf('=%s', self::CRLF);
+                        } else {
+                            $message .= $buf . $soft_break;
+                        }
+                        $buf = '';
+                    }
+                    while (strlen($word) > 0) {
+                        if ($length <= 0) {
+                            break;
+                        }
+                        $len = $length;
+                        if ($is_utf8) {
+                            $len = $this->utf8CharBoundary($word, $len);
+                        } elseif (substr($word, $len - 1, 1) == '=') {
+                            $len--;
+                        } elseif (substr($word, $len - 2, 1) == '=') {
+                            $len -= 2;
+                        }
+                        $part = substr($word, 0, $len);
+                        $word = substr($word, $len);
+
+                        if (strlen($word) > 0) {
+                            $message .= $part . sprintf('=%s', self::CRLF);
+                        } else {
+                            $buf = $part;
+                        }
+                    }
+                } else {
+                    $buf_o = $buf;
+                    if (!$firstword) {
+                        $buf .= ' ';
+                    }
+                    $buf .= $word;
+
+                    if (strlen($buf) > $length and $buf_o != '') {
+                        $message .= $buf_o . $soft_break;
+                        $buf = $word;
+                    }
+                }
+                $firstword = false;
+            }
+            $message .= $buf . self::CRLF;
+        }
+
+        return $message;
+    }
+
+    /**
+     * Find the last character boundary prior to $maxLength in a utf-8
+     * quoted-printable encoded string.
+     * Original written by Colin Brown.
+     * @access public
+     * @param string $encodedText utf-8 QP text
+     * @param integer $maxLength Find the last character boundary prior to this length
+     * @return integer
+     */
+    public function utf8CharBoundary($encodedText, $maxLength)
+    {
+        $foundSplitPos = false;
+        $lookBack = 3;
+        while (!$foundSplitPos) {
+            $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
+            $encodedCharPos = strpos($lastChunk, '=');
+            if (false !== $encodedCharPos) {
+                // Found start of encoded character byte within $lookBack block.
+                // Check the encoded byte value (the 2 chars after the '=')
+                $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
+                $dec = hexdec($hex);
+                if ($dec < 128) {
+                    // Single byte character.
+                    // If the encoded char was found at pos 0, it will fit
+                    // otherwise reduce maxLength to start of the encoded char
+                    if ($encodedCharPos > 0) {
+                        $maxLength = $maxLength - ($lookBack - $encodedCharPos);
+                    }
+                    $foundSplitPos = true;
+                } elseif ($dec >= 192) {
+                    // First byte of a multi byte character
+                    // Reduce maxLength to split at start of character
+                    $maxLength = $maxLength - ($lookBack - $encodedCharPos);
+                    $foundSplitPos = true;
+                } elseif ($dec < 192) {
+                    // Middle byte of a multi byte character, look further back
+                    $lookBack += 3;
+                }
+            } else {
+                // No encoded character found
+                $foundSplitPos = true;
+            }
+        }
+        return $maxLength;
+    }
+
+    /**
+     * Apply word wrapping to the message body.
+     * Wraps the message body to the number of chars set in the WordWrap property.
+     * You should only do this to plain-text bodies as wrapping HTML tags may break them.
+     * This is called automatically by createBody(), so you don't need to call it yourself.
+     * @access public
+     * @return void
+     */
+    public function setWordWrap()
+    {
+        if ($this->WordWrap < 1) {
+            return;
+        }
+
+        switch ($this->message_type) {
+            case 'alt':
+            case 'alt_inline':
+            case 'alt_attach':
+            case 'alt_inline_attach':
+                $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
+                break;
+            default:
+                $this->Body = $this->wrapText($this->Body, $this->WordWrap);
+                break;
+        }
+    }
+
+    /**
+     * Assemble message headers.
+     * @access public
+     * @return string The assembled headers
+     */
+    public function createHeader()
+    {
+        $result = '';
+
+        if ($this->MessageDate == '') {
+            $this->MessageDate = self::rfcDate();
+        }
+        $result .= $this->headerLine('Date', $this->MessageDate);
+
+        // To be created automatically by mail()
+        if ($this->SingleTo) {
+            if ($this->Mailer != 'mail') {
+                foreach ($this->to as $toaddr) {
+                    $this->SingleToArray[] = $this->addrFormat($toaddr);
+                }
+            }
+        } else {
+            if (count($this->to) > 0) {
+                if ($this->Mailer != 'mail') {
+                    $result .= $this->addrAppend('To', $this->to);
+                }
+            } elseif (count($this->cc) == 0) {
+                $result .= $this->headerLine('To', 'undisclosed-recipients:;');
+            }
+        }
+
+        $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));
+
+        // sendmail and mail() extract Cc from the header before sending
+        if (count($this->cc) > 0) {
+            $result .= $this->addrAppend('Cc', $this->cc);
+        }
+
+        // sendmail and mail() extract Bcc from the header before sending
+        if ((
+                $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
+            )
+            and count($this->bcc) > 0
+        ) {
+            $result .= $this->addrAppend('Bcc', $this->bcc);
+        }
+
+        if (count($this->ReplyTo) > 0) {
+            $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
+        }
+
+        // mail() sets the subject itself
+        if ($this->Mailer != 'mail') {
+            $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
+        }
+
+        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
+            $this->lastMessageID = $this->MessageID;
+        } else {
+            $this->lastMessageID = sprintf('<%s@%s>', $this->uniqueid, $this->serverHostname());
+        }
+        $result .= $this->headerLine('Message-ID', $this->lastMessageID);
+        if (!is_null($this->Priority)) {
+            $result .= $this->headerLine('X-Priority', $this->Priority);
+        }
+        if ($this->XMailer == '') {
+            $result .= $this->headerLine(
+                'X-Mailer',
+                'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer)'
+            );
+        } else {
+            $myXmailer = trim($this->XMailer);
+            if ($myXmailer) {
+                $result .= $this->headerLine('X-Mailer', $myXmailer);
+            }
+        }
+
+        if ($this->ConfirmReadingTo != '') {
+            $result .= $this->headerLine('Disposition-Notification-To', '<' . $this->ConfirmReadingTo . '>');
+        }
+
+        // Add custom headers
+        foreach ($this->CustomHeader as $header) {
+            $result .= $this->headerLine(
+                trim($header[0]),
+                $this->encodeHeader(trim($header[1]))
+            );
+        }
+        if (!$this->sign_key_file) {
+            $result .= $this->headerLine('MIME-Version', '1.0');
+            $result .= $this->getMailMIME();
+        }
+
+        return $result;
+    }
+
+    /**
+     * Get the message MIME type headers.
+     * @access public
+     * @return string
+     */
+    public function getMailMIME()
+    {
+        $result = '';
+        $ismultipart = true;
+        switch ($this->message_type) {
+            case 'inline':
+                $result .= $this->headerLine('Content-Type', 'multipart/related;');
+                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
+                break;
+            case 'attach':
+            case 'inline_attach':
+            case 'alt_attach':
+            case 'alt_inline_attach':
+                $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
+                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
+                break;
+            case 'alt':
+            case 'alt_inline':
+                $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
+                $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
+                break;
+            default:
+                // Catches case 'plain': and case '':
+                $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
+                $ismultipart = false;
+                break;
+        }
+        // RFC1341 part 5 says 7bit is assumed if not specified
+        if ($this->Encoding != '7bit') {
+            // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
+            if ($ismultipart) {
+                if ($this->Encoding == '8bit') {
+                    $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
+                }
+                // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
+            } else {
+                $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
+            }
+        }
+
+        if ($this->Mailer != 'mail') {
+            $result .= $this->LE;
+        }
+
+        return $result;
+    }
+
+    /**
+     * Returns the whole MIME message.
+     * Includes complete headers and body.
+     * Only valid post preSend().
+     * @see PHPMailer::preSend()
+     * @access public
+     * @return string
+     */
+    public function getSentMIMEMessage()
+    {
+        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
+    }
+
+    /**
+     * Assemble the message body.
+     * Returns an empty string on failure.
+     * @access public
+     * @throws phpmailerException
+     * @return string The assembled message body
+     */
+    public function createBody()
+    {
+        $body = '';
+        //Create unique IDs and preset boundaries
+        $this->uniqueid = md5(uniqid(time()));
+        $this->boundary[1] = 'b1_' . $this->uniqueid;
+        $this->boundary[2] = 'b2_' . $this->uniqueid;
+        $this->boundary[3] = 'b3_' . $this->uniqueid;
+
+        if ($this->sign_key_file) {
+            $body .= $this->getMailMIME() . $this->LE;
+        }
+
+        $this->setWordWrap();
+
+        $bodyEncoding = $this->Encoding;
+        $bodyCharSet = $this->CharSet;
+        //Can we do a 7-bit downgrade?
+        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
+            $bodyEncoding = '7bit';
+            $bodyCharSet = 'us-ascii';
+        }
+        //If lines are too long, and we're not already using an encoding that will shorten them,
+        //change to quoted-printable transfer encoding
+        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
+            $this->Encoding = 'quoted-printable';
+            $bodyEncoding = 'quoted-printable';
+        }
+
+        $altBodyEncoding = $this->Encoding;
+        $altBodyCharSet = $this->CharSet;
+        //Can we do a 7-bit downgrade?
+        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
+            $altBodyEncoding = '7bit';
+            $altBodyCharSet = 'us-ascii';
+        }
+        //If lines are too long, and we're not already using an encoding that will shorten them,
+        //change to quoted-printable transfer encoding
+        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
+            $altBodyEncoding = 'quoted-printable';
+        }
+        //Use this as a preamble in all multipart message types
+        $mimepre = "This is a multi-part message in MIME format." . $this->LE . $this->LE;
+        switch ($this->message_type) {
+            case 'inline':
+                $body .= $mimepre;
+                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
+                $body .= $this->encodeString($this->Body, $bodyEncoding);
+                $body .= $this->LE . $this->LE;
+                $body .= $this->attachAll('inline', $this->boundary[1]);
+                break;
+            case 'attach':
+                $body .= $mimepre;
+                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
+                $body .= $this->encodeString($this->Body, $bodyEncoding);
+                $body .= $this->LE . $this->LE;
+                $body .= $this->attachAll('attachment', $this->boundary[1]);
+                break;
+            case 'inline_attach':
+                $body .= $mimepre;
+                $body .= $this->textLine('--' . $this->boundary[1]);
+                $body .= $this->headerLine('Content-Type', 'multipart/related;');
+                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
+                $body .= $this->LE;
+                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
+                $body .= $this->encodeString($this->Body, $bodyEncoding);
+                $body .= $this->LE . $this->LE;
+                $body .= $this->attachAll('inline', $this->boundary[2]);
+                $body .= $this->LE;
+                $body .= $this->attachAll('attachment', $this->boundary[1]);
+                break;
+            case 'alt':
+                $body .= $mimepre;
+                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
+                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
+                $body .= $this->LE . $this->LE;
+                $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
+                $body .= $this->encodeString($this->Body, $bodyEncoding);
+                $body .= $this->LE . $this->LE;
+                if (!empty($this->Ical)) {
+                    $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
+                    $body .= $this->encodeString($this->Ical, $this->Encoding);
+                    $body .= $this->LE . $this->LE;
+                }
+                $body .= $this->endBoundary($this->boundary[1]);
+                break;
+            case 'alt_inline':
+                $body .= $mimepre;
+                $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
+                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
+                $body .= $this->LE . $this->LE;
+                $body .= $this->textLine('--' . $this->boundary[1]);
+                $body .= $this->headerLine('Content-Type', 'multipart/related;');
+                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
+                $body .= $this->LE;
+                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
+                $body .= $this->encodeString($this->Body, $bodyEncoding);
+                $body .= $this->LE . $this->LE;
+                $body .= $this->attachAll('inline', $this->boundary[2]);
+                $body .= $this->LE;
+                $body .= $this->endBoundary($this->boundary[1]);
+                break;
+            case 'alt_attach':
+                $body .= $mimepre;
+                $body .= $this->textLine('--' . $this->boundary[1]);
+                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
+                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
+                $body .= $this->LE;
+                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
+                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
+                $body .= $this->LE . $this->LE;
+                $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
+                $body .= $this->encodeString($this->Body, $bodyEncoding);
+                $body .= $this->LE . $this->LE;
+                $body .= $this->endBoundary($this->boundary[2]);
+                $body .= $this->LE;
+                $body .= $this->attachAll('attachment', $this->boundary[1]);
+                break;
+            case 'alt_inline_attach':
+                $body .= $mimepre;
+                $body .= $this->textLine('--' . $this->boundary[1]);
+                $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
+                $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
+                $body .= $this->LE;
+                $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
+                $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
+                $body .= $this->LE . $this->LE;
+                $body .= $this->textLine('--' . $this->boundary[2]);
+                $body .= $this->headerLine('Content-Type', 'multipart/related;');
+                $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
+                $body .= $this->LE;
+                $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
+                $body .= $this->encodeString($this->Body, $bodyEncoding);
+                $body .= $this->LE . $this->LE;
+                $body .= $this->attachAll('inline', $this->boundary[3]);
+                $body .= $this->LE;
+                $body .= $this->endBoundary($this->boundary[2]);
+                $body .= $this->LE;
+                $body .= $this->attachAll('attachment', $this->boundary[1]);
+                break;
+            default:
+                // catch case 'plain' and case ''
+                $body .= $this->encodeString($this->Body, $bodyEncoding);
+                break;
+        }
+
+        if ($this->isError()) {
+            $body = '';
+        } elseif ($this->sign_key_file) {
+            try {
+                if (!defined('PKCS7_TEXT')) {
+                    throw new phpmailerException($this->lang('extension_missing') . 'openssl');
+                }
+                // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
+                $file = tempnam(sys_get_temp_dir(), 'mail');
+                if (false === file_put_contents($file, $body)) {
+                    throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
+                }
+                $signed = tempnam(sys_get_temp_dir(), 'signed');
+                //Workaround for PHP bug https://bugs.php.net/bug.php?id=69197
+                if (empty($this->sign_extracerts_file)) {
+                    $sign = @openssl_pkcs7_sign(
+                        $file,
+                        $signed,
+                        'file://' . realpath($this->sign_cert_file),
+                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
+                        null
+                    );
+                } else {
+                    $sign = @openssl_pkcs7_sign(
+                        $file,
+                        $signed,
+                        'file://' . realpath($this->sign_cert_file),
+                        array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
+                        null,
+                        PKCS7_DETACHED,
+                        $this->sign_extracerts_file
+                    );
+                }
+                if ($sign) {
+                    @unlink($file);
+                    $body = file_get_contents($signed);
+                    @unlink($signed);
+                    //The message returned by openssl contains both headers and body, so need to split them up
+                    $parts = explode("\n\n", $body, 2);
+                    $this->MIMEHeader .= $parts[0] . $this->LE . $this->LE;
+                    $body = $parts[1];
+                } else {
+                    @unlink($file);
+                    @unlink($signed);
+                    throw new phpmailerException($this->lang('signing') . openssl_error_string());
+                }
+            } catch (phpmailerException $exc) {
+                $body = '';
+                if ($this->exceptions) {
+                    throw $exc;
+                }
+            }
+        }
+        return $body;
+    }
+
+    /**
+     * Return the start of a message boundary.
+     * @access protected
+     * @param string $boundary
+     * @param string $charSet
+     * @param string $contentType
+     * @param string $encoding
+     * @return string
+     */
+    protected function getBoundary($boundary, $charSet, $contentType, $encoding)
+    {
+        $result = '';
+        if ($charSet == '') {
+            $charSet = $this->CharSet;
+        }
+        if ($contentType == '') {
+            $contentType = $this->ContentType;
+        }
+        if ($encoding == '') {
+            $encoding = $this->Encoding;
+        }
+        $result .= $this->textLine('--' . $boundary);
+        $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
+        $result .= $this->LE;
+        // RFC1341 part 5 says 7bit is assumed if not specified
+        if ($encoding != '7bit') {
+            $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
+        }
+        $result .= $this->LE;
+
+        return $result;
+    }
+
+    /**
+     * Return the end of a message boundary.
+     * @access protected
+     * @param string $boundary
+     * @return string
+     */
+    protected function endBoundary($boundary)
+    {
+        return $this->LE . '--' . $boundary . '--' . $this->LE;
+    }
+
+    /**
+     * Set the message type.
+     * PHPMailer only supports some preset message types,
+     * not arbitrary MIME structures.
+     * @access protected
+     * @return void
+     */
+    protected function setMessageType()
+    {
+        $type = array();
+        if ($this->alternativeExists()) {
+            $type[] = 'alt';
+        }
+        if ($this->inlineImageExists()) {
+            $type[] = 'inline';
+        }
+        if ($this->attachmentExists()) {
+            $type[] = 'attach';
+        }
+        $this->message_type = implode('_', $type);
+        if ($this->message_type == '') {
+            $this->message_type = 'plain';
+        }
+    }
+
+    /**
+     * Format a header line.
+     * @access public
+     * @param string $name
+     * @param string $value
+     * @return string
+     */
+    public function headerLine($name, $value)
+    {
+        return $name . ': ' . $value . $this->LE;
+    }
+
+    /**
+     * Return a formatted mail line.
+     * @access public
+     * @param string $value
+     * @return string
+     */
+    public function textLine($value)
+    {
+        return $value . $this->LE;
+    }
+
+    /**
+     * Add an attachment from a path on the filesystem.
+     * Returns false if the file could not be found or read.
+     * @param string $path Path to the attachment.
+     * @param string $name Overrides the attachment name.
+     * @param string $encoding File encoding (see $Encoding).
+     * @param string $type File extension (MIME) type.
+     * @param string $disposition Disposition to use
+     * @throws phpmailerException
+     * @return boolean
+     */
+    public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
+    {
+        try {
+            if (!@is_file($path)) {
+                throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
+            }
+
+            // If a MIME type is not specified, try to work it out from the file name
+            if ($type == '') {
+                $type = self::filenameToType($path);
+            }
+
+            $filename = basename($path);
+            if ($name == '') {
+                $name = $filename;
+            }
+
+            $this->attachment[] = array(
+                0 => $path,
+                1 => $filename,
+                2 => $name,
+                3 => $encoding,
+                4 => $type,
+                5 => false, // isStringAttachment
+                6 => $disposition,
+                7 => 0
+            );
+
+        } catch (phpmailerException $exc) {
+            $this->setError($exc->getMessage());
+            $this->edebug($exc->getMessage());
+            if ($this->exceptions) {
+                throw $exc;
+            }
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Return the array of attachments.
+     * @return array
+     */
+    public function getAttachments()
+    {
+        return $this->attachment;
+    }
+
+    /**
+     * Attach all file, string, and binary attachments to the message.
+     * Returns an empty string on failure.
+     * @access protected
+     * @param string $disposition_type
+     * @param string $boundary
+     * @return string
+     */
+    protected function attachAll($disposition_type, $boundary)
+    {
+        // Return text of body
+        $mime = array();
+        $cidUniq = array();
+        $incl = array();
+
+        // Add all attachments
+        foreach ($this->attachment as $attachment) {
+            // Check if it is a valid disposition_filter
+            if ($attachment[6] == $disposition_type) {
+                // Check for string attachment
+                $string = '';
+                $path = '';
+                $bString = $attachment[5];
+                if ($bString) {
+                    $string = $attachment[0];
+                } else {
+                    $path = $attachment[0];
+                }
+
+                $inclhash = md5(serialize($attachment));
+                if (in_array($inclhash, $incl)) {
+                    continue;
+                }
+                $incl[] = $inclhash;
+                $name = $attachment[2];
+                $encoding = $attachment[3];
+                $type = $attachment[4];
+                $disposition = $attachment[6];
+                $cid = $attachment[7];
+                if ($disposition == 'inline' && array_key_exists($cid, $cidUniq)) {
+                    continue;
+                }
+                $cidUniq[$cid] = true;
+
+                $mime[] = sprintf('--%s%s', $boundary, $this->LE);
+                //Only include a filename property if we have one
+                if (!empty($name)) {
+                    $mime[] = sprintf(
+                        'Content-Type: %s; name="%s"%s',
+                        $type,
+                        $this->encodeHeader($this->secureHeader($name)),
+                        $this->LE
+                    );
+                } else {
+                    $mime[] = sprintf(
+                        'Content-Type: %s%s',
+                        $type,
+                        $this->LE
+                    );
+                }
+                // RFC1341 part 5 says 7bit is assumed if not specified
+                if ($encoding != '7bit') {
+                    $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
+                }
+
+                if ($disposition == 'inline') {
+                    $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
+                }
+
+                // If a filename contains any of these chars, it should be quoted,
+                // but not otherwise: RFC2183 & RFC2045 5.1
+                // Fixes a warning in IETF's msglint MIME checker
+                // Allow for bypassing the Content-Disposition header totally
+                if (!(empty($disposition))) {
+                    $encoded_name = $this->encodeHeader($this->secureHeader($name));
+                    if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
+                        $mime[] = sprintf(
+                            'Content-Disposition: %s; filename="%s"%s',
+                            $disposition,
+                            $encoded_name,
+                            $this->LE . $this->LE
+                        );
+                    } else {
+                        if (!empty($encoded_name)) {
+                            $mime[] = sprintf(
+                                'Content-Disposition: %s; filename=%s%s',
+                                $disposition,
+                                $encoded_name,
+                                $this->LE . $this->LE
+                            );
+                        } else {
+                            $mime[] = sprintf(
+                                'Content-Disposition: %s%s',
+                                $disposition,
+                                $this->LE . $this->LE
+                            );
+                        }
+                    }
+                } else {
+                    $mime[] = $this->LE;
+                }
+
+                // Encode as string attachment
+                if ($bString) {
+                    $mime[] = $this->encodeString($string, $encoding);
+                    if ($this->isError()) {
+                        return '';
+                    }
+                    $mime[] = $this->LE . $this->LE;
+                } else {
+                    $mime[] = $this->encodeFile($path, $encoding);
+                    if ($this->isError()) {
+                        return '';
+                    }
+                    $mime[] = $this->LE . $this->LE;
+                }
+            }
+        }
+
+        $mime[] = sprintf('--%s--%s', $boundary, $this->LE);
+
+        return implode('', $mime);
+    }
+
+    /**
+     * Encode a file attachment in requested format.
+     * Returns an empty string on failure.
+     * @param string $path The full path to the file
+     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
+     * @throws phpmailerException
+     * @access protected
+     * @return string
+     */
+    protected function encodeFile($path, $encoding = 'base64')
+    {
+        try {
+            if (!is_readable($path)) {
+                throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
+            }
+            $magic_quotes = get_magic_quotes_runtime();
+            if ($magic_quotes) {
+                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
+                    set_magic_quotes_runtime(false);
+                } else {
+                    //Doesn't exist in PHP 5.4, but we don't need to check because
+                    //get_magic_quotes_runtime always returns false in 5.4+
+                    //so it will never get here
+                    ini_set('magic_quotes_runtime', false);
+                }
+            }
+            $file_buffer = file_get_contents($path);
+            $file_buffer = $this->encodeString($file_buffer, $encoding);
+            if ($magic_quotes) {
+                if (version_compare(PHP_VERSION, '5.3.0', '<')) {
+                    set_magic_quotes_runtime($magic_quotes);
+                } else {
+                    ini_set('magic_quotes_runtime', $magic_quotes);
+                }
+            }
+            return $file_buffer;
+        } catch (Exception $exc) {
+            $this->setError($exc->getMessage());
+            return '';
+        }
+    }
+
+    /**
+     * Encode a string in requested format.
+     * Returns an empty string on failure.
+     * @param string $str The text to encode
+     * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
+     * @access public
+     * @return string
+     */
+    public function encodeString($str, $encoding = 'base64')
+    {
+        $encoded = '';
+        switch (strtolower($encoding)) {
+            case 'base64':
+                $encoded = chunk_split(base64_encode($str), 76, $this->LE);
+                break;
+            case '7bit':
+            case '8bit':
+                $encoded = $this->fixEOL($str);
+                // Make sure it ends with a line break
+                if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
+                    $encoded .= $this->LE;
+                }
+                break;
+            case 'binary':
+                $encoded = $str;
+                break;
+            case 'quoted-printable':
+                $encoded = $this->encodeQP($str);
+                break;
+            default:
+                $this->setError($this->lang('encoding') . $encoding);
+                break;
+        }
+        return $encoded;
+    }
+
+    /**
+     * Encode a header string optimally.
+     * Picks shortest of Q, B, quoted-printable or none.
+     * @access public
+     * @param string $str
+     * @param string $position
+     * @return string
+     */
+    public function encodeHeader($str, $position = 'text')
+    {
+        $matchcount = 0;
+        switch (strtolower($position)) {
+            case 'phrase':
+                if (!preg_match('/[\200-\377]/', $str)) {
+                    // Can't use addslashes as we don't know the value of magic_quotes_sybase
+                    $encoded = addcslashes($str, "\0..\37\177\\\"");
+                    if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
+                        return ($encoded);
+                    } else {
+                        return ("\"$encoded\"");
+                    }
+                }
+                $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
+                break;
+            /** @noinspection PhpMissingBreakStatementInspection */
+            case 'comment':
+                $matchcount = preg_match_all('/[()"]/', $str, $matches);
+                // Intentional fall-through
+            case 'text':
+            default:
+                $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
+                break;
+        }
+
+        //There are no chars that need encoding
+        if ($matchcount == 0) {
+            return ($str);
+        }
+
+        $maxlen = 75 - 7 - strlen($this->CharSet);
+        // Try to select the encoding which should produce the shortest output
+        if ($matchcount > strlen($str) / 3) {
+            // More than a third of the content will need encoding, so B encoding will be most efficient
+            $encoding = 'B';
+            if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
+                // Use a custom function which correctly encodes and wraps long
+                // multibyte strings without breaking lines within a character
+                $encoded = $this->base64EncodeWrapMB($str, "\n");
+            } else {
+                $encoded = base64_encode($str);
+                $maxlen -= $maxlen % 4;
+                $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
+            }
+        } else {
+            $encoding = 'Q';
+            $encoded = $this->encodeQ($str, $position);
+            $encoded = $this->wrapText($encoded, $maxlen, true);
+            $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
+        }
+
+        $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
+        $encoded = trim(str_replace("\n", $this->LE, $encoded));
+
+        return $encoded;
+    }
+
+    /**
+     * Check if a string contains multi-byte characters.
+     * @access public
+     * @param string $str multi-byte text to wrap encode
+     * @return boolean
+     */
+    public function hasMultiBytes($str)
+    {
+        if (function_exists('mb_strlen')) {
+            return (strlen($str) > mb_strlen($str, $this->CharSet));
+        } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
+            return false;
+        }
+    }
+
+    /**
+     * Does a string contain any 8-bit chars (in any charset)?
+     * @param string $text
+     * @return boolean
+     */
+    public function has8bitChars($text)
+    {
+        return (boolean)preg_match('/[\x80-\xFF]/', $text);
+    }
+
+    /**
+     * Encode and wrap long multibyte strings for mail headers
+     * without breaking lines within a character.
+     * Adapted from a function by paravoid
+     * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
+     * @access public
+     * @param string $str multi-byte text to wrap encode
+     * @param string $linebreak string to use as linefeed/end-of-line
+     * @return string
+     */
+    public function base64EncodeWrapMB($str, $linebreak = null)
+    {
+        $start = '=?' . $this->CharSet . '?B?';
+        $end = '?=';
+        $encoded = '';
+        if ($linebreak === null) {
+            $linebreak = $this->LE;
+        }
+
+        $mb_length = mb_strlen($str, $this->CharSet);
+        // Each line must have length <= 75, including $start and $end
+        $length = 75 - strlen($start) - strlen($end);
+        // Average multi-byte ratio
+        $ratio = $mb_length / strlen($str);
+        // Base64 has a 4:3 ratio
+        $avgLength = floor($length * $ratio * .75);
+
+        for ($i = 0; $i < $mb_length; $i += $offset) {
+            $lookBack = 0;
+            do {
+                $offset = $avgLength - $lookBack;
+                $chunk = mb_substr($str, $i, $offset, $this->CharSet);
+                $chunk = base64_encode($chunk);
+                $lookBack++;
+            } while (strlen($chunk) > $length);
+            $encoded .= $chunk . $linebreak;
+        }
+
+        // Chomp the last linefeed
+        $encoded = substr($encoded, 0, -strlen($linebreak));
+        return $encoded;
+    }
+
+    /**
+     * Encode a string in quoted-printable format.
+     * According to RFC2045 section 6.7.
+     * @access public
+     * @param string $string The text to encode
+     * @param integer $line_max Number of chars allowed on a line before wrapping
+     * @return string
+     * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
+     */
+    public function encodeQP($string, $line_max = 76)
+    {
+        // Use native function if it's available (>= PHP5.3)
+        if (function_exists('quoted_printable_encode')) {
+            return quoted_printable_encode($string);
+        }
+        // Fall back to a pure PHP implementation
+        $string = str_replace(
+            array('%20', '%0D%0A.', '%0D%0A', '%'),
+            array(' ', "\r\n=2E", "\r\n", '='),
+            rawurlencode($string)
+        );
+        return preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
+    }
+
+    /**
+     * Backward compatibility wrapper for an old QP encoding function that was removed.
+     * @see PHPMailer::encodeQP()
+     * @access public
+     * @param string $string
+     * @param integer $line_max
+     * @param boolean $space_conv
+     * @return string
+     * @deprecated Use encodeQP instead.
+     */
+    public function encodeQPphp(
+        $string,
+        $line_max = 76,
+        /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
+    ) {
+        return $this->encodeQP($string, $line_max);
+    }
+
+    /**
+     * Encode a string using Q encoding.
+     * @link http://tools.ietf.org/html/rfc2047
+     * @param string $str the text to encode
+     * @param string $position Where the text is going to be used, see the RFC for what that means
+     * @access public
+     * @return string
+     */
+    public function encodeQ($str, $position = 'text')
+    {
+        // There should not be any EOL in the string
+        $pattern = '';
+        $encoded = str_replace(array("\r", "\n"), '', $str);
+        switch (strtolower($position)) {
+            case 'phrase':
+                // RFC 2047 section 5.3
+                $pattern = '^A-Za-z0-9!*+\/ -';
+                break;
+            /** @noinspection PhpMissingBreakStatementInspection */
+            case 'comment':
+                // RFC 2047 section 5.2
+                $pattern = '\(\)"';
+                // intentional fall-through
+                // for this reason we build the $pattern without including delimiters and []
+            case 'text':
+            default:
+                // RFC 2047 section 5.1
+                // Replace every high ascii, control, =, ? and _ characters
+                $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
+                break;
+        }
+        $matches = array();
+        if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
+            // If the string contains an '=', make sure it's the first thing we replace
+            // so as to avoid double-encoding
+            $eqkey = array_search('=', $matches[0]);
+            if (false !== $eqkey) {
+                unset($matches[0][$eqkey]);
+                array_unshift($matches[0], '=');
+            }
+            foreach (array_unique($matches[0]) as $char) {
+                $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
+            }
+        }
+        // Replace every spaces to _ (more readable than =20)
+        return str_replace(' ', '_', $encoded);
+    }
+
+    /**
+     * Add a string or binary attachment (non-filesystem).
+     * This method can be used to attach ascii or binary data,
+     * such as a BLOB record from a database.
+     * @param string $string String attachment data.
+     * @param string $filename Name of the attachment.
+     * @param string $encoding File encoding (see $Encoding).
+     * @param string $type File extension (MIME) type.
+     * @param string $disposition Disposition to use
+     * @return void
+     */
+    public function addStringAttachment(
+        $string,
+        $filename,
+        $encoding = 'base64',
+        $type = '',
+        $disposition = 'attachment'
+    ) {
+        // If a MIME type is not specified, try to work it out from the file name
+        if ($type == '') {
+            $type = self::filenameToType($filename);
+        }
+        // Append to $attachment array
+        $this->attachment[] = array(
+            0 => $string,
+            1 => $filename,
+            2 => basename($filename),
+            3 => $encoding,
+            4 => $type,
+            5 => true, // isStringAttachment
+            6 => $disposition,
+            7 => 0
+        );
+    }
+
+    /**
+     * Add an embedded (inline) attachment from a file.
+     * This can include images, sounds, and just about any other document type.
+     * These differ from 'regular' attachments in that they are intended to be
+     * displayed inline with the message, not just attached for download.
+     * This is used in HTML messages that embed the images
+     * the HTML refers to using the $cid value.
+     * @param string $path Path to the attachment.
+     * @param string $cid Content ID of the attachment; Use this to reference
+     *        the content when using an embedded image in HTML.
+     * @param string $name Overrides the attachment name.
+     * @param string $encoding File encoding (see $Encoding).
+     * @param string $type File MIME type.
+     * @param string $disposition Disposition to use
+     * @return boolean True on successfully adding an attachment
+     */
+    public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
+    {
+        if (!@is_file($path)) {
+            $this->setError($this->lang('file_access') . $path);
+            return false;
+        }
+
+        // If a MIME type is not specified, try to work it out from the file name
+        if ($type == '') {
+            $type = self::filenameToType($path);
+        }
+
+        $filename = basename($path);
+        if ($name == '') {
+            $name = $filename;
+        }
+
+        // Append to $attachment array
+        $this->attachment[] = array(
+            0 => $path,
+            1 => $filename,
+            2 => $name,
+            3 => $encoding,
+            4 => $type,
+            5 => false, // isStringAttachment
+            6 => $disposition,
+            7 => $cid
+        );
+        return true;
+    }
+
+    /**
+     * Add an embedded stringified attachment.
+     * This can include images, sounds, and just about any other document type.
+     * Be sure to set the $type to an image type for images:
+     * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
+     * @param string $string The attachment binary data.
+     * @param string $cid Content ID of the attachment; Use this to reference
+     *        the content when using an embedded image in HTML.
+     * @param string $name
+     * @param string $encoding File encoding (see $Encoding).
+     * @param string $type MIME type.
+     * @param string $disposition Disposition to use
+     * @return boolean True on successfully adding an attachment
+     */
+    public function addStringEmbeddedImage(
+        $string,
+        $cid,
+        $name = '',
+        $encoding = 'base64',
+        $type = '',
+        $disposition = 'inline'
+    ) {
+        // If a MIME type is not specified, try to work it out from the name
+        if ($type == '' and !empty($name)) {
+            $type = self::filenameToType($name);
+        }
+
+        // Append to $attachment array
+        $this->attachment[] = array(
+            0 => $string,
+            1 => $name,
+            2 => $name,
+            3 => $encoding,
+            4 => $type,
+            5 => true, // isStringAttachment
+            6 => $disposition,
+            7 => $cid
+        );
+        return true;
+    }
+
+    /**
+     * Check if an inline attachment is present.
+     * @access public
+     * @return boolean
+     */
+    public function inlineImageExists()
+    {
+        foreach ($this->attachment as $attachment) {
+            if ($attachment[6] == 'inline') {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Check if an attachment (non-inline) is present.
+     * @return boolean
+     */
+    public function attachmentExists()
+    {
+        foreach ($this->attachment as $attachment) {
+            if ($attachment[6] == 'attachment') {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Check if this message has an alternative body set.
+     * @return boolean
+     */
+    public function alternativeExists()
+    {
+        return !empty($this->AltBody);
+    }
+
+    /**
+     * Clear queued addresses of given kind.
+     * @access protected
+     * @param string $kind 'to', 'cc', or 'bcc'
+     * @return void
+     */
+    public function clearQueuedAddresses($kind)
+    {
+        $RecipientsQueue = $this->RecipientsQueue;
+        foreach ($RecipientsQueue as $address => $params) {
+            if ($params[0] == $kind) {
+                unset($this->RecipientsQueue[$address]);
+            }
+        }
+    }
+
+    /**
+     * Clear all To recipients.
+     * @return void
+     */
+    public function clearAddresses()
+    {
+        foreach ($this->to as $to) {
+            unset($this->all_recipients[strtolower($to[0])]);
+        }
+        $this->to = array();
+        $this->clearQueuedAddresses('to');
+    }
+
+    /**
+     * Clear all CC recipients.
+     * @return void
+     */
+    public function clearCCs()
+    {
+        foreach ($this->cc as $cc) {
+            unset($this->all_recipients[strtolower($cc[0])]);
+        }
+        $this->cc = array();
+        $this->clearQueuedAddresses('cc');
+    }
+
+    /**
+     * Clear all BCC recipients.
+     * @return void
+     */
+    public function clearBCCs()
+    {
+        foreach ($this->bcc as $bcc) {
+            unset($this->all_recipients[strtolower($bcc[0])]);
+        }
+        $this->bcc = array();
+        $this->clearQueuedAddresses('bcc');
+    }
+
+    /**
+     * Clear all ReplyTo recipients.
+     * @return void
+     */
+    public function clearReplyTos()
+    {
+        $this->ReplyTo = array();
+        $this->ReplyToQueue = array();
+    }
+
+    /**
+     * Clear all recipient types.
+     * @return void
+     */
+    public function clearAllRecipients()
+    {
+        $this->to = array();
+        $this->cc = array();
+        $this->bcc = array();
+        $this->all_recipients = array();
+        $this->RecipientsQueue = array();
+    }
+
+    /**
+     * Clear all filesystem, string, and binary attachments.
+     * @return void
+     */
+    public function clearAttachments()
+    {
+        $this->attachment = array();
+    }
+
+    /**
+     * Clear all custom headers.
+     * @return void
+     */
+    public function clearCustomHeaders()
+    {
+        $this->CustomHeader = array();
+    }
+
+    /**
+     * Add an error message to the error container.
+     * @access protected
+     * @param string $msg
+     * @return void
+     */
+    protected function setError($msg)
+    {
+        $this->error_count++;
+        if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
+            $lasterror = $this->smtp->getError();
+            if (!empty($lasterror['error'])) {
+                $msg .= $this->lang('smtp_error') . $lasterror['error'];
+                if (!empty($lasterror['detail'])) {
+                    $msg .= ' Detail: '. $lasterror['detail'];
+                }
+                if (!empty($lasterror['smtp_code'])) {
+                    $msg .= ' SMTP code: ' . $lasterror['smtp_code'];
+                }
+                if (!empty($lasterror['smtp_code_ex'])) {
+                    $msg .= ' Additional SMTP info: ' . $lasterror['smtp_code_ex'];
+                }
+            }
+        }
+        $this->ErrorInfo = $msg;
+    }
+
+    /**
+     * Return an RFC 822 formatted date.
+     * @access public
+     * @return string
+     * @static
+     */
+    public static function rfcDate()
+    {
+        // Set the time zone to whatever the default is to avoid 500 errors
+        // Will default to UTC if it's not set properly in php.ini
+        date_default_timezone_set(@date_default_timezone_get());
+        return date('D, j M Y H:i:s O');
+    }
+
+    /**
+     * Get the server hostname.
+     * Returns 'localhost.localdomain' if unknown.
+     * @access protected
+     * @return string
+     */
+    protected function serverHostname()
+    {
+        $result = 'localhost.localdomain';
+        if (!empty($this->Hostname)) {
+            $result = $this->Hostname;
+        } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
+            $result = $_SERVER['SERVER_NAME'];
+        } elseif (function_exists('gethostname') && gethostname() !== false) {
+            $result = gethostname();
+        } elseif (php_uname('n') !== false) {
+            $result = php_uname('n');
+        }
+        return $result;
+    }
+
+    /**
+     * Get an error message in the current language.
+     * @access protected
+     * @param string $key
+     * @return string
+     */
+    protected function lang($key)
+    {
+        if (count($this->language) < 1) {
+            $this->setLanguage('en'); // set the default language
+        }
+
+        if (array_key_exists($key, $this->language)) {
+            if ($key == 'smtp_connect_failed') {
+                //Include a link to troubleshooting docs on SMTP connection failure
+                //this is by far the biggest cause of support questions
+                //but it's usually not PHPMailer's fault.
+                return $this->language[$key] . ' https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting';
+            }
+            return $this->language[$key];
+        } else {
+            //Return the key as a fallback
+            return $key;
+        }
+    }
+
+    /**
+     * Check if an error occurred.
+     * @access public
+     * @return boolean True if an error did occur.
+     */
+    public function isError()
+    {
+        return ($this->error_count > 0);
+    }
+
+    /**
+     * Ensure consistent line endings in a string.
+     * Changes every end of line from CRLF, CR or LF to $this->LE.
+     * @access public
+     * @param string $str String to fixEOL
+     * @return string
+     */
+    public function fixEOL($str)
+    {
+        // Normalise to \n
+        $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
+        // Now convert LE as needed
+        if ($this->LE !== "\n") {
+            $nstr = str_replace("\n", $this->LE, $nstr);
+        }
+        return $nstr;
+    }
+
+    /**
+     * Add a custom header.
+     * $name value can be overloaded to contain
+     * both header name and value (name:value)
+     * @access public
+     * @param string $name Custom header name
+     * @param string $value Header value
+     * @return void
+     */
+    public function addCustomHeader($name, $value = null)
+    {
+        if ($value === null) {
+            // Value passed in as name:value
+            $this->CustomHeader[] = explode(':', $name, 2);
+        } else {
+            $this->CustomHeader[] = array($name, $value);
+        }
+    }
+
+    /**
+     * Returns all custom headers.
+     * @return array
+     */
+    public function getCustomHeaders()
+    {
+        return $this->CustomHeader;
+    }
+
+    /**
+     * Create a message from an HTML string.
+     * Automatically makes modifications for inline images and backgrounds
+     * and creates a plain-text version by converting the HTML.
+     * Overwrites any existing values in $this->Body and $this->AltBody
+     * @access public
+     * @param string $message HTML message string
+     * @param string $basedir baseline directory for path
+     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
+     *    or your own custom converter @see PHPMailer::html2text()
+     * @return string $message
+     */
+    public function msgHTML($message, $basedir = '', $advanced = false)
+    {
+        preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
+        if (array_key_exists(2, $images)) {
+            foreach ($images[2] as $imgindex => $url) {
+                // Convert data URIs into embedded images
+                if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
+                    $data = substr($url, strpos($url, ','));
+                    if ($match[2]) {
+                        $data = base64_decode($data);
+                    } else {
+                        $data = rawurldecode($data);
+                    }
+                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
+                    if ($this->addStringEmbeddedImage($data, $cid, 'embed' . $imgindex, 'base64', $match[1])) {
+                        $message = str_replace(
+                            $images[0][$imgindex],
+                            $images[1][$imgindex] . '="cid:' . $cid . '"',
+                            $message
+                        );
+                    }
+                } elseif (substr($url, 0, 4) !== 'cid:' && !preg_match('#^[a-z][a-z0-9+.-]*://#i', $url)) {
+                    // Do not change urls for absolute images (thanks to corvuscorax)
+                    // Do not change urls that are already inline images
+                    $filename = basename($url);
+                    $directory = dirname($url);
+                    if ($directory == '.') {
+                        $directory = '';
+                    }
+                    $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
+                    if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
+                        $basedir .= '/';
+                    }
+                    if (strlen($directory) > 1 && substr($directory, -1) != '/') {
+                        $directory .= '/';
+                    }
+                    if ($this->addEmbeddedImage(
+                        $basedir . $directory . $filename,
+                        $cid,
+                        $filename,
+                        'base64',
+                        self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
+                    )
+                    ) {
+                        $message = preg_replace(
+                            '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
+                            $images[1][$imgindex] . '="cid:' . $cid . '"',
+                            $message
+                        );
+                    }
+                }
+            }
+        }
+        $this->isHTML(true);
+        // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
+        $this->Body = $this->normalizeBreaks($message);
+        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
+        if (!$this->alternativeExists()) {
+            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
+                self::CRLF . self::CRLF;
+        }
+        return $this->Body;
+    }
+
+    /**
+     * Convert an HTML string into plain text.
+     * This is used by msgHTML().
+     * Note - older versions of this function used a bundled advanced converter
+     * which was been removed for license reasons in #232
+     * Example usage:
+     * <code>
+     * // Use default conversion
+     * $plain = $mail->html2text($html);
+     * // Use your own custom converter
+     * $plain = $mail->html2text($html, function($html) {
+     *     $converter = new MyHtml2text($html);
+     *     return $converter->get_text();
+     * });
+     * </code>
+     * @param string $html The HTML text to convert
+     * @param boolean|callable $advanced Any boolean value to use the internal converter,
+     *   or provide your own callable for custom conversion.
+     * @return string
+     */
+    public function html2text($html, $advanced = false)
+    {
+        if (is_callable($advanced)) {
+            return call_user_func($advanced, $html);
+        }
+        return html_entity_decode(
+            trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
+            ENT_QUOTES,
+            $this->CharSet
+        );
+    }
+
+    /**
+     * Get the MIME type for a file extension.
+     * @param string $ext File extension
+     * @access public
+     * @return string MIME type of file.
+     * @static
+     */
+    public static function _mime_types($ext = '')
+    {
+        $mimes = array(
+            'xl'    => 'application/excel',
+            'js'    => 'application/javascript',
+            'hqx'   => 'application/mac-binhex40',
+            'cpt'   => 'application/mac-compactpro',
+            'bin'   => 'application/macbinary',
+            'doc'   => 'application/msword',
+            'word'  => 'application/msword',
+            'xlsx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+            'xltx'  => 'application/vnd.openxmlformats-officedocument.spreadsheetml.template',
+            'potx'  => 'application/vnd.openxmlformats-officedocument.presentationml.template',
+            'ppsx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slideshow',
+            'pptx'  => 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+            'sldx'  => 'application/vnd.openxmlformats-officedocument.presentationml.slide',
+            'docx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+            'dotx'  => 'application/vnd.openxmlformats-officedocument.wordprocessingml.template',
+            'xlam'  => 'application/vnd.ms-excel.addin.macroEnabled.12',
+            'xlsb'  => 'application/vnd.ms-excel.sheet.binary.macroEnabled.12',
+            'class' => 'application/octet-stream',
+            'dll'   => 'application/octet-stream',
+            'dms'   => 'application/octet-stream',
+            'exe'   => 'application/octet-stream',
+            'lha'   => 'application/octet-stream',
+            'lzh'   => 'application/octet-stream',
+            'psd'   => 'application/octet-stream',
+            'sea'   => 'application/octet-stream',
+            'so'    => 'application/octet-stream',
+            'oda'   => 'application/oda',
+            'pdf'   => 'application/pdf',
+            'ai'    => 'application/postscript',
+            'eps'   => 'application/postscript',
+            'ps'    => 'application/postscript',
+            'smi'   => 'application/smil',
+            'smil'  => 'application/smil',
+            'mif'   => 'application/vnd.mif',
+            'xls'   => 'application/vnd.ms-excel',
+            'ppt'   => 'application/vnd.ms-powerpoint',
+            'wbxml' => 'application/vnd.wap.wbxml',
+            'wmlc'  => 'application/vnd.wap.wmlc',
+            'dcr'   => 'application/x-director',
+            'dir'   => 'application/x-director',
+            'dxr'   => 'application/x-director',
+            'dvi'   => 'application/x-dvi',
+            'gtar'  => 'application/x-gtar',
+            'php3'  => 'application/x-httpd-php',
+            'php4'  => 'application/x-httpd-php',
+            'php'   => 'application/x-httpd-php',
+            'phtml' => 'application/x-httpd-php',
+            'phps'  => 'application/x-httpd-php-source',
+            'swf'   => 'application/x-shockwave-flash',
+            'sit'   => 'application/x-stuffit',
+            'tar'   => 'application/x-tar',
+            'tgz'   => 'application/x-tar',
+            'xht'   => 'application/xhtml+xml',
+            'xhtml' => 'application/xhtml+xml',
+            'zip'   => 'application/zip',
+            'mid'   => 'audio/midi',
+            'midi'  => 'audio/midi',
+            'mp2'   => 'audio/mpeg',
+            'mp3'   => 'audio/mpeg',
+            'mpga'  => 'audio/mpeg',
+            'aif'   => 'audio/x-aiff',
+            'aifc'  => 'audio/x-aiff',
+            'aiff'  => 'audio/x-aiff',
+            'ram'   => 'audio/x-pn-realaudio',
+            'rm'    => 'audio/x-pn-realaudio',
+            'rpm'   => 'audio/x-pn-realaudio-plugin',
+            'ra'    => 'audio/x-realaudio',
+            'wav'   => 'audio/x-wav',
+            'bmp'   => 'image/bmp',
+            'gif'   => 'image/gif',
+            'jpeg'  => 'image/jpeg',
+            'jpe'   => 'image/jpeg',
+            'jpg'   => 'image/jpeg',
+            'png'   => 'image/png',
+            'tiff'  => 'image/tiff',
+            'tif'   => 'image/tiff',
+            'eml'   => 'message/rfc822',
+            'css'   => 'text/css',
+            'html'  => 'text/html',
+            'htm'   => 'text/html',
+            'shtml' => 'text/html',
+            'log'   => 'text/plain',
+            'text'  => 'text/plain',
+            'txt'   => 'text/plain',
+            'rtx'   => 'text/richtext',
+            'rtf'   => 'text/rtf',
+            'vcf'   => 'text/vcard',
+            'vcard' => 'text/vcard',
+            'xml'   => 'text/xml',
+            'xsl'   => 'text/xml',
+            'mpeg'  => 'video/mpeg',
+            'mpe'   => 'video/mpeg',
+            'mpg'   => 'video/mpeg',
+            'mov'   => 'video/quicktime',
+            'qt'    => 'video/quicktime',
+            'rv'    => 'video/vnd.rn-realvideo',
+            'avi'   => 'video/x-msvideo',
+            'movie' => 'video/x-sgi-movie'
+        );
+        if (array_key_exists(strtolower($ext), $mimes)) {
+            return $mimes[strtolower($ext)];
+        }
+        return 'application/octet-stream';
+    }
+
+    /**
+     * Map a file name to a MIME type.
+     * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
+     * @param string $filename A file name or full path, does not need to exist as a file
+     * @return string
+     * @static
+     */
+    public static function filenameToType($filename)
+    {
+        // In case the path is a URL, strip any query string before getting extension
+        $qpos = strpos($filename, '?');
+        if (false !== $qpos) {
+            $filename = substr($filename, 0, $qpos);
+        }
+        $pathinfo = self::mb_pathinfo($filename);
+        return self::_mime_types($pathinfo['extension']);
+    }
+
+    /**
+     * Multi-byte-safe pathinfo replacement.
+     * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
+     * Works similarly to the one in PHP >= 5.2.0
+     * @link http://www.php.net/manual/en/function.pathinfo.php#107461
+     * @param string $path A filename or path, does not need to exist as a file
+     * @param integer|string $options Either a PATHINFO_* constant,
+     *      or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
+     * @return string|array
+     * @static
+     */
+    public static function mb_pathinfo($path, $options = null)
+    {
+        $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
+        $pathinfo = array();
+        if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
+            if (array_key_exists(1, $pathinfo)) {
+                $ret['dirname'] = $pathinfo[1];
+            }
+            if (array_key_exists(2, $pathinfo)) {
+                $ret['basename'] = $pathinfo[2];
+            }
+            if (array_key_exists(5, $pathinfo)) {
+                $ret['extension'] = $pathinfo[5];
+            }
+            if (array_key_exists(3, $pathinfo)) {
+                $ret['filename'] = $pathinfo[3];
+            }
+        }
+        switch ($options) {
+            case PATHINFO_DIRNAME:
+            case 'dirname':
+                return $ret['dirname'];
+            case PATHINFO_BASENAME:
+            case 'basename':
+                return $ret['basename'];
+            case PATHINFO_EXTENSION:
+            case 'extension':
+                return $ret['extension'];
+            case PATHINFO_FILENAME:
+            case 'filename':
+                return $ret['filename'];
+            default:
+                return $ret;
+        }
+    }
+
+    /**
+     * Set or reset instance properties.
+     * You should avoid this function - it's more verbose, less efficient, more error-prone and
+     * harder to debug than setting properties directly.
+     * Usage Example:
+     * `$mail->set('SMTPSecure', 'tls');`
+     *   is the same as:
+     * `$mail->SMTPSecure = 'tls';`
+     * @access public
+     * @param string $name The property name to set
+     * @param mixed $value The value to set the property to
+     * @return boolean
+     * @TODO Should this not be using the __set() magic function?
+     */
+    public function set($name, $value = '')
+    {
+        if (property_exists($this, $name)) {
+            $this->$name = $value;
+            return true;
+        } else {
+            $this->setError($this->lang('variable_set') . $name);
+            return false;
+        }
+    }
+
+    /**
+     * Strip newlines to prevent header injection.
+     * @access public
+     * @param string $str
+     * @return string
+     */
+    public function secureHeader($str)
+    {
+        return trim(str_replace(array("\r", "\n"), '', $str));
+    }
+
+    /**
+     * Normalize line breaks in a string.
+     * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
+     * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
+     * @param string $text
+     * @param string $breaktype What kind of line break to use, defaults to CRLF
+     * @return string
+     * @access public
+     * @static
+     */
+    public static function normalizeBreaks($text, $breaktype = "\r\n")
+    {
+        return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
+    }
+
+    /**
+     * Set the public and private key files and password for S/MIME signing.
+     * @access public
+     * @param string $cert_filename
+     * @param string $key_filename
+     * @param string $key_pass Password for private key
+     * @param string $extracerts_filename Optional path to chain certificate
+     */
+    public function sign($cert_filename, $key_filename, $key_pass, $extracerts_filename = '')
+    {
+        $this->sign_cert_file = $cert_filename;
+        $this->sign_key_file = $key_filename;
+        $this->sign_key_pass = $key_pass;
+        $this->sign_extracerts_file = $extracerts_filename;
+    }
+
+    /**
+     * Quoted-Printable-encode a DKIM header.
+     * @access public
+     * @param string $txt
+     * @return string
+     */
+    public function DKIM_QP($txt)
+    {
+        $line = '';
+        for ($i = 0; $i < strlen($txt); $i++) {
+            $ord = ord($txt[$i]);
+            if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
+                $line .= $txt[$i];
+            } else {
+                $line .= '=' . sprintf('%02X', $ord);
+            }
+        }
+        return $line;
+    }
+
+    /**
+     * Generate a DKIM signature.
+     * @access public
+     * @param string $signHeader
+     * @throws phpmailerException
+     * @return string
+     */
+    public function DKIM_Sign($signHeader)
+    {
+        if (!defined('PKCS7_TEXT')) {
+            if ($this->exceptions) {
+                throw new phpmailerException($this->lang('extension_missing') . 'openssl');
+            }
+            return '';
+        }
+        $privKeyStr = file_get_contents($this->DKIM_private);
+        if ($this->DKIM_passphrase != '') {
+            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
+        } else {
+            $privKey = openssl_pkey_get_private($privKeyStr);
+        }
+        if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) { //sha1WithRSAEncryption
+            openssl_pkey_free($privKey);
+            return base64_encode($signature);
+        }
+        openssl_pkey_free($privKey);
+        return '';
+    }
+
+    /**
+     * Generate a DKIM canonicalization header.
+     * @access public
+     * @param string $signHeader Header
+     * @return string
+     */
+    public function DKIM_HeaderC($signHeader)
+    {
+        $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
+        $lines = explode("\r\n", $signHeader);
+        foreach ($lines as $key => $line) {
+            list($heading, $value) = explode(':', $line, 2);
+            $heading = strtolower($heading);
+            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
+            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
+        }
+        $signHeader = implode("\r\n", $lines);
+        return $signHeader;
+    }
+
+    /**
+     * Generate a DKIM canonicalization body.
+     * @access public
+     * @param string $body Message Body
+     * @return string
+     */
+    public function DKIM_BodyC($body)
+    {
+        if ($body == '') {
+            return "\r\n";
+        }
+        // stabilize line endings
+        $body = str_replace("\r\n", "\n", $body);
+        $body = str_replace("\n", "\r\n", $body);
+        // END stabilize line endings
+        while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
+            $body = substr($body, 0, strlen($body) - 2);
+        }
+        return $body;
+    }
+
+    /**
+     * Create the DKIM header and body in a new message header.
+     * @access public
+     * @param string $headers_line Header lines
+     * @param string $subject Subject
+     * @param string $body Body
+     * @return string
+     */
+    public function DKIM_Add($headers_line, $subject, $body)
+    {
+        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
+        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
+        $DKIMquery = 'dns/txt'; // Query method
+        $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
+        $subject_header = "Subject: $subject";
+        $headers = explode($this->LE, $headers_line);
+        $from_header = '';
+        $to_header = '';
+        $date_header = '';
+        $current = '';
+        foreach ($headers as $header) {
+            if (strpos($header, 'From:') === 0) {
+                $from_header = $header;
+                $current = 'from_header';
+            } elseif (strpos($header, 'To:') === 0) {
+                $to_header = $header;
+                $current = 'to_header';
+            } elseif (strpos($header, 'Date:') === 0) {
+                $date_header = $header;
+                $current = 'date_header';
+            } else {
+                if (!empty($$current) && strpos($header, ' =?') === 0) {
+                    $$current .= $header;
+                } else {
+                    $current = '';
+                }
+            }
+        }
+        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
+        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
+        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
+        $subject = str_replace(
+            '|',
+            '=7C',
+            $this->DKIM_QP($subject_header)
+        ); // Copied header fields (dkim-quoted-printable)
+        $body = $this->DKIM_BodyC($body);
+        $DKIMlen = strlen($body); // Length of body
+        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
+        if ('' == $this->DKIM_identity) {
+            $ident = '';
+        } else {
+            $ident = ' i=' . $this->DKIM_identity . ';';
+        }
+        $dkimhdrs = 'DKIM-Signature: v=1; a=' .
+            $DKIMsignatureType . '; q=' .
+            $DKIMquery . '; l=' .
+            $DKIMlen . '; s=' .
+            $this->DKIM_selector .
+            ";\r\n" .
+            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
+            "\th=From:To:Date:Subject;\r\n" .
+            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
+            "\tz=$from\r\n" .
+            "\t|$to\r\n" .
+            "\t|$date\r\n" .
+            "\t|$subject;\r\n" .
+            "\tbh=" . $DKIMb64 . ";\r\n" .
+            "\tb=";
+        $toSign = $this->DKIM_HeaderC(
+            $from_header . "\r\n" .
+            $to_header . "\r\n" .
+            $date_header . "\r\n" .
+            $subject_header . "\r\n" .
+            $dkimhdrs
+        );
+        $signed = $this->DKIM_Sign($toSign);
+        return $dkimhdrs . $signed . "\r\n";
+    }
+
+    /**
+     * Detect if a string contains a line longer than the maximum line length allowed.
+     * @param string $str
+     * @return boolean
+     * @static
+     */
+    public static function hasLineLongerThanMax($str)
+    {
+        //+2 to include CRLF line break for a 1000 total
+        return (boolean)preg_match('/^(.{'.(self::MAX_LINE_LENGTH + 2).',})/m', $str);
+    }
+
+    /**
+     * Allows for public read access to 'to' property.
+     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
+     * @access public
+     * @return array
+     */
+    public function getToAddresses()
+    {
+        return $this->to;
+    }
+
+    /**
+     * Allows for public read access to 'cc' property.
+     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
+     * @access public
+     * @return array
+     */
+    public function getCcAddresses()
+    {
+        return $this->cc;
+    }
+
+    /**
+     * Allows for public read access to 'bcc' property.
+     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
+     * @access public
+     * @return array
+     */
+    public function getBccAddresses()
+    {
+        return $this->bcc;
+    }
+
+    /**
+     * Allows for public read access to 'ReplyTo' property.
+     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
+     * @access public
+     * @return array
+     */
+    public function getReplyToAddresses()
+    {
+        return $this->ReplyTo;
+    }
+
+    /**
+     * Allows for public read access to 'all_recipients' property.
+     * @note: Before the send() call, queued addresses (i.e. with IDN) are not yet included.
+     * @access public
+     * @return array
+     */
+    public function getAllRecipientAddresses()
+    {
+        return $this->all_recipients;
+    }
+
+    /**
+     * Perform a callback.
+     * @param boolean $isSent
+     * @param array $to
+     * @param array $cc
+     * @param array $bcc
+     * @param string $subject
+     * @param string $body
+     * @param string $from
+     */
+    protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
+    {
+        if (!empty($this->action_function) && is_callable($this->action_function)) {
+            $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
+            call_user_func_array($this->action_function, $params);
+        }
+    }
+}
+
+/**
+ * PHPMailer exception handler
+ * @package PHPMailer
+ */
+class phpmailerException extends Exception
+{
+    /**
+     * Prettify error message output
+     * @return string
+     */
+    public function errorMessage()
+    {
+        $errorMsg = '<strong>' . $this->getMessage() . "</strong><br />\n";
+        return $errorMsg;
+    }
+}
+

--- /dev/null
+++ b/includes/class.smtp.php
@@ -1,1 +1,1193 @@
-
+<?php
+/**
+ * PHPMailer RFC821 SMTP email transport class.
+ * PHP Version 5
+ * @package PHPMailer
+ * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
+ * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
+ * @author Jim Jagielski (jimjag) <jimjag@gmail.com>
+ * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
+ * @author Brent R. Matzelle (original founder)
+ * @copyright 2014 Marcus Bointon
+ * @copyright 2010 - 2012 Jim Jagielski
+ * @copyright 2004 - 2009 Andy Prevost
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
+ * @note This program is distributed in the hope that it will be useful - WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+/**
+ * PHPMailer RFC821 SMTP email transport class.
+ * Implements RFC 821 SMTP commands and provides some utility methods for sending mail to an SMTP server.
+ * @package PHPMailer
+ * @author Chris Ryan
+ * @author Marcus Bointon <phpmailer@synchromedia.co.uk>
+ */
+class SMTP
+{
+    /**
+     * The PHPMailer SMTP version number.
+     * @var string
+     */
+    const VERSION = '5.2.14';
+
+    /**
+     * SMTP line break constant.
+     * @var string
+     */
+    const CRLF = "\r\n";
+
+    /**
+     * The SMTP port to use if one is not specified.
+     * @var integer
+     */
+    const DEFAULT_SMTP_PORT = 25;
+
+    /**
+     * The maximum line length allowed by RFC 2822 section 2.1.1
+     * @var integer
+     */
+    const MAX_LINE_LENGTH = 998;
+
+    /**
+     * Debug level for no output
+     */
+    const DEBUG_OFF = 0;
+
+    /**
+     * Debug level to show client -> server messages
+     */
+    const DEBUG_CLIENT = 1;
+
+    /**
+     * Debug level to show client -> server and server -> client messages
+     */
+    const DEBUG_SERVER = 2;
+
+    /**
+     * Debug level to show connection status, client -> server and server -> client messages
+     */
+    const DEBUG_CONNECTION = 3;
+
+    /**
+     * Debug level to show all messages
+     */
+    const DEBUG_LOWLEVEL = 4;
+
+    /**
+     * The PHPMailer SMTP Version number.
+     * @var string
+     * @deprecated Use the `VERSION` constant instead
+     * @see SMTP::VERSION
+     */
+    public $Version = '5.2.14';
+
+    /**
+     * SMTP server port number.
+     * @var integer
+     * @deprecated This is only ever used as a default value, so use the `DEFAULT_SMTP_PORT` constant instead
+     * @see SMTP::DEFAULT_SMTP_PORT
+     */
+    public $SMTP_PORT = 25;
+
+    /**
+     * SMTP reply line ending.
+     * @var string
+     * @deprecated Use the `CRLF` constant instead
+     * @see SMTP::CRLF
+     */
+    public $CRLF = "\r\n";
+
+    /**
+     * Debug output level.
+     * Options:
+     * * self::DEBUG_OFF (`0`) No debug output, default
+     * * self::DEBUG_CLIENT (`1`) Client commands
+     * * self::DEBUG_SERVER (`2`) Client commands and server responses
+     * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status
+     * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages
+     * @var integer
+     */
+    public $do_debug = self::DEBUG_OFF;
+
+    /**
+     * How to handle debug output.
+     * Options:
+     * * `echo` Output plain-text as-is, appropriate for CLI
+     * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
+     * * `error_log` Output to error log as configured in php.ini
+     *
+     * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
+     * <code>
+     * $smtp->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
+     * </code>
+     * @var string|callable
+     */
+    public $Debugoutput = 'echo';
+
+    /**
+     * Whether to use VERP.
+     * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path
+     * @link http://www.postfix.org/VERP_README.html Info on VERP
+     * @var boolean
+     */
+    public $do_verp = false;
+
+    /**
+     * The timeout value for connection, in seconds.
+     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
+     * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure.
+     * @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2
+     * @var integer
+     */
+    public $Timeout = 300;
+
+    /**
+     * How long to wait for commands to complete, in seconds.
+     * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
+     * @var integer
+     */
+    public $Timelimit = 300;
+
+    /**
+     * The socket for the server connection.
+     * @var resource
+     */
+    protected $smtp_conn;
+
+    /**
+     * Error information, if any, for the last SMTP command.
+     * @var array
+     */
+    protected $error = array(
+        'error' => '',
+        'detail' => '',
+        'smtp_code' => '',
+        'smtp_code_ex' => ''
+    );
+
+    /**
+     * The reply the server sent to us for HELO.
+     * If null, no HELO string has yet been received.
+     * @var string|null
+     */
+    protected $helo_rply = null;
+
+    /**
+     * The set of SMTP extensions sent in reply to EHLO command.
+     * Indexes of the array are extension names.
+     * Value at index 'HELO' or 'EHLO' (according to command that was sent)
+     * represents the server name. In case of HELO it is the only element of the array.
+     * Other values can be boolean TRUE or an array containing extension options.
+     * If null, no HELO/EHLO string has yet been received.
+     * @var array|null
+     */
+    protected $server_caps = null;
+
+    /**
+     * The most recent reply received from the server.
+     * @var string
+     */
+    protected $last_reply = '';
+
+    /**
+     * Output debugging info via a user-selected method.
+     * @see SMTP::$Debugoutput
+     * @see SMTP::$do_debug
+     * @param string $str Debug string to output
+     * @param integer $level The debug level of this message; see DEBUG_* constants
+     * @return void
+     */
+    protected function edebug($str, $level = 0)
+    {
+        if ($level > $this->do_debug) {
+            return;
+        }
+        //Avoid clash with built-in function names
+        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
+            call_user_func($this->Debugoutput, $str, $this->do_debug);
+            return;
+        }
+        switch ($this->Debugoutput) {
+            case 'error_log':
+                //Don't output, just log
+                error_log($str);
+                break;
+            case 'html':
+                //Cleans up output a bit for a better looking, HTML-safe output
+                echo htmlentities(
+                    preg_replace('/[\r\n]+/', '', $str),
+                    ENT_QUOTES,
+                    'UTF-8'
+                )
+                . "<br>\n";
+                break;
+            case 'echo':
+            default:
+                //Normalize line breaks
+                $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str);
+                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
+                    "\n",
+                    "\n                   \t                  ",
+                    trim($str)
+                )."\n";
+        }
+    }
+
+    /**
+     * Connect to an SMTP server.
+     * @param string $host SMTP server IP or host name
+     * @param integer $port The port number to connect to
+     * @param integer $timeout How long to wait for the connection to open
+     * @param array $options An array of options for stream_context_create()
+     * @access public
+     * @return boolean
+     */
+    public function connect($host, $port = null, $timeout = 30, $options = array())
+    {
+        static $streamok;
+        //This is enabled by default since 5.0.0 but some providers disable it
+        //Check this once and cache the result
+        if (is_null($streamok)) {
+            $streamok = function_exists('stream_socket_client');
+        }
+        // Clear errors to avoid confusion
+        $this->setError('');
+        // Make sure we are __not__ connected
+        if ($this->connected()) {
+            // Already connected, generate error
+            $this->setError('Already connected to a server');
+            return false;
+        }
+        if (empty($port)) {
+            $port = self::DEFAULT_SMTP_PORT;
+        }
+        // Connect to the SMTP server
+        $this->edebug(
+            "Connection: opening to $host:$port, timeout=$timeout, options=".var_export($options, true),
+            self::DEBUG_CONNECTION
+        );
+        $errno = 0;
+        $errstr = '';
+        if ($streamok) {
+            $socket_context = stream_context_create($options);
+            //Suppress errors; connection failures are handled at a higher level
+            $this->smtp_conn = @stream_socket_client(
+                $host . ":" . $port,
+                $errno,
+                $errstr,
+                $timeout,
+                STREAM_CLIENT_CONNECT,
+                $socket_context
+            );
+        } else {
+            //Fall back to fsockopen which should work in more places, but is missing some features
+            $this->edebug(
+                "Connection: stream_socket_client not available, falling back to fsockopen",
+                self::DEBUG_CONNECTION
+            );
+            $this->smtp_conn = fsockopen(
+                $host,
+                $port,
+                $errno,
+                $errstr,
+                $timeout
+            );
+        }
+        // Verify we connected properly
+        if (!is_resource($this->smtp_conn)) {
+            $this->setError(
+                'Failed to connect to server',
+                $errno,
+                $errstr
+            );
+            $this->edebug(
+                'SMTP ERROR: ' . $this->error['error']
+                . ": $errstr ($errno)",
+                self::DEBUG_CLIENT
+            );
+            return false;
+        }
+        $this->edebug('Connection: opened', self::DEBUG_CONNECTION);
+        // SMTP server can take longer to respond, give longer timeout for first read
+        // Windows does not have support for this timeout function
+        if (substr(PHP_OS, 0, 3) != 'WIN') {
+            $max = ini_get('max_execution_time');
+            // Don't bother if unlimited
+            if ($max != 0 && $timeout > $max) {
+                @set_time_limit($timeout);
+            }
+            stream_set_timeout($this->smtp_conn, $timeout, 0);
+        }
+        // Get any announcement
+        $announce = $this->get_lines();
+        $this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER);
+        return true;
+    }
+
+    /**
+     * Initiate a TLS (encrypted) session.
+     * @access public
+     * @return boolean
+     */
+    public function startTLS()
+    {
+        if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) {
+            return false;
+        }
+
+        //Allow the best TLS version(s) we can
+        $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT;
+
+        //PHP 5.6.7 dropped inclusion of TLS 1.1 and 1.2 in STREAM_CRYPTO_METHOD_TLS_CLIENT
+        //so add them back in manually if we can
+        if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) {
+            $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
+            $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;
+        }
+
+        // Begin encrypted connection
+        if (!stream_socket_enable_crypto(
+            $this->smtp_conn,
+            true,
+            $crypto_method
+        )) {
+            return false;
+        }
+        return true;
+    }
+
+    /**
+     * Perform SMTP authentication.
+     * Must be run after hello().
+     * @see hello()
+     * @param string $username The user name
+     * @param string $password The password
+     * @param string $authtype The auth type (PLAIN, LOGIN, NTLM, CRAM-MD5, XOAUTH2)
+     * @param string $realm The auth realm for NTLM
+     * @param string $workstation The auth workstation for NTLM
+     * @param null|OAuth $OAuth An optional OAuth instance (@see PHPMailerOAuth)
+     * @return bool True if successfully authenticated.* @access public
+     */
+    public function authenticate(
+        $username,
+        $password,
+        $authtype = null,
+        $realm = '',
+        $workstation = '',
+        $OAuth = null
+    ) {
+        if (!$this->server_caps) {
+            $this->setError('Authentication is not allowed before HELO/EHLO');
+            return false;
+        }
+
+        if (array_key_exists('EHLO', $this->server_caps)) {
+        // SMTP extensions are available. Let's try to find a proper authentication method
+
+            if (!array_key_exists('AUTH', $this->server_caps)) {
+                $this->setError('Authentication is not allowed at this stage');
+                // 'at this stage' means that auth may be allowed after the stage changes
+                // e.g. after STARTTLS
+                return false;
+            }
+
+            self::edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL);
+            self::edebug(
+                'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']),
+                self::DEBUG_LOWLEVEL
+            );
+
+            if (empty($authtype)) {
+                foreach (array('LOGIN', 'CRAM-MD5', 'NTLM', 'PLAIN', 'XOAUTH2') as $method) {
+                    if (in_array($method, $this->server_caps['AUTH'])) {
+                        $authtype = $method;
+                        break;
+                    }
+                }
+                if (empty($authtype)) {
+                    $this->setError('No supported authentication methods found');
+                    return false;
+                }
+                self::edebug('Auth method selected: '.$authtype, self::DEBUG_LOWLEVEL);
+            }
+
+            if (!in_array($authtype, $this->server_caps['AUTH'])) {
+                $this->setError("The requested authentication method \"$authtype\" is not supported by the server");
+                return false;
+            }
+        } elseif (empty($authtype)) {
+            $authtype = 'LOGIN';
+        }
+        switch ($authtype) {
+            case 'PLAIN':
+                // Start authentication
+                if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) {
+                    return false;
+                }
+                // Send encoded username and password
+                if (!$this->sendCommand(
+                    'User & Password',
+                    base64_encode("\0" . $username . "\0" . $password),
+                    235
+                )
+                ) {
+                    return false;
+                }
+                break;
+            case 'LOGIN':
+                // Start authentication
+                if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) {
+                    return false;
+                }
+                if (!$this->sendCommand("Username", base64_encode($username), 334)) {
+                    return false;
+                }
+                if (!$this->sendCommand("Password", base64_encode($password), 235)) {
+                    return false;
+                }
+                break;
+            case 'XOAUTH2':
+                //If the OAuth Instance is not set. Can be a case when PHPMailer is used
+                //instead of PHPMailerOAuth
+                if (is_null($OAuth)) {
+                    return false;
+                }
+                $oauth = $OAuth->getOauth64();
+
+                // Start authentication
+                if (!$this->sendCommand('AUTH', 'AUTH XOAUTH2 ' . $oauth, 235)) {
+                    return false;
+                }
+                break;
+            case 'NTLM':
+                /*
+                 * ntlm_sasl_client.php
+                 * Bundled with Permission
+                 *
+                 * How to telnet in windows:
+                 * http://technet.microsoft.com/en-us/library/aa995718%28EXCHG.65%29.aspx
+                 * PROTOCOL Docs http://curl.haxx.se/rfc/ntlm.html#ntlmSmtpAuthentication
+                 */
+                require_once 'extras/ntlm_sasl_client.php';
+                $temp = new stdClass;
+                $ntlm_client = new ntlm_sasl_client_class;
+                //Check that functions are available
+                if (!$ntlm_client->Initialize($temp)) {
+                    $this->setError($temp->error);
+                    $this->edebug(
+                        'You need to enable some modules in your php.ini file: '
+                        . $this->error['error'],
+                        self::DEBUG_CLIENT
+                    );
+                    return false;
+                }
+                //msg1
+                $msg1 = $ntlm_client->TypeMsg1($realm, $workstation); //msg1
+
+                if (!$this->sendCommand(
+                    'AUTH NTLM',
+                    'AUTH NTLM ' . base64_encode($msg1),
+                    334
+                )
+                ) {
+                    return false;
+                }
+                //Though 0 based, there is a white space after the 3 digit number
+                //msg2
+                $challenge = substr($this->last_reply, 3);
+                $challenge = base64_decode($challenge);
+                $ntlm_res = $ntlm_client->NTLMResponse(
+                    substr($challenge, 24, 8),
+                    $password
+                );
+                //msg3
+                $msg3 = $ntlm_client->TypeMsg3(
+                    $ntlm_res,
+                    $username,
+                    $realm,
+                    $workstation
+                );
+                // send encoded username
+                return $this->sendCommand('Username', base64_encode($msg3), 235);
+            case 'CRAM-MD5':
+                // Start authentication
+                if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) {
+                    return false;
+                }
+                // Get the challenge
+                $challenge = base64_decode(substr($this->last_reply, 4));
+
+                // Build the response
+                $response = $username . ' ' . $this->hmac($challenge, $password);
+
+                // send encoded credentials
+                return $this->sendCommand('Username', base64_encode($response), 235);
+            default:
+                $this->setError("Authentication method \"$authtype\" is not supported");
+                return false;
+        }
+        return true;
+    }
+
+    /**
+     * Calculate an MD5 HMAC hash.
+     * Works like hash_hmac('md5', $data, $key)
+     * in case that function is not available
+     * @param string $data The data to hash
+     * @param string $key  The key to hash with
+     * @access protected
+     * @return string
+     */
+    protected function hmac($data, $key)
+    {
+        if (function_exists('hash_hmac')) {
+            return hash_hmac('md5', $data, $key);
+        }
+
+        // The following borrowed from
+        // http://php.net/manual/en/function.mhash.php#27225
+
+        // RFC 2104 HMAC implementation for php.
+        // Creates an md5 HMAC.
+        // Eliminates the need to install mhash to compute a HMAC
+        // by Lance Rushing
+
+        $bytelen = 64; // byte length for md5
+        if (strlen($key) > $bytelen) {
+            $key = pack('H*', md5($key));
+        }
+        $key = str_pad($key, $bytelen, chr(0x00));
+        $ipad = str_pad('', $bytelen, chr(0x36));
+        $opad = str_pad('', $bytelen, chr(0x5c));
+        $k_ipad = $key ^ $ipad;
+        $k_opad = $key ^ $opad;
+
+        return md5($k_opad . pack('H*', md5($k_ipad . $data)));
+    }
+
+    /**
+     * Check connection state.
+     * @access public
+     * @return boolean True if connected.
+     */
+    public function connected()
+    {
+        if (is_resource($this->smtp_conn)) {
+            $sock_status = stream_get_meta_data($this->smtp_conn);
+            if ($sock_status['eof']) {
+                // The socket is valid but we are not connected
+                $this->edebug(
+                    'SMTP NOTICE: EOF caught while checking if connected',
+                    self::DEBUG_CLIENT
+                );
+                $this->close();
+                return false;
+            }
+            return true; // everything looks good
+        }
+        return false;
+    }
+
+    /**
+     * Close the socket and clean up the state of the class.
+     * Don't use this function without first trying to use QUIT.
+     * @see quit()
+     * @access public
+     * @return void
+     */
+    public function close()
+    {
+        $this->setError('');
+        $this->server_caps = null;
+        $this->helo_rply = null;
+        if (is_resource($this->smtp_conn)) {
+            // close the connection and cleanup
+            fclose($this->smtp_conn);
+            $this->smtp_conn = null; //Makes for cleaner serialization
+            $this->edebug('Connection: closed', self::DEBUG_CONNECTION);
+        }
+    }
+
+    /**
+     * Send an SMTP DATA command.
+     * Issues a data command and sends the msg_data to the server,
+     * finializing the mail transaction. $msg_data is the message
+     * that is to be send with the headers. Each header needs to be
+     * on a single line followed by a <CRLF> with the message headers
+     * and the message body being separated by and additional <CRLF>.
+     * Implements rfc 821: DATA <CRLF>
+     * @param string $msg_data Message data to send
+     * @access public
+     * @return boolean
+     */
+    public function data($msg_data)
+    {
+        //This will use the standard timelimit
+        if (!$this->sendCommand('DATA', 'DATA', 354)) {
+            return false;
+        }
+
+        /* The server is ready to accept data!
+         * According to rfc821 we should not send more than 1000 characters on a single line (including the CRLF)
+         * so we will break the data up into lines by \r and/or \n then if needed we will break each of those into
+         * smaller lines to fit within the limit.
+         * We will also look for lines that start with a '.' and prepend an additional '.'.
+         * NOTE: this does not count towards line-length limit.
+         */
+
+        // Normalize line breaks before exploding
+        $lines = explode("\n", str_replace(array("\r\n", "\r"), "\n", $msg_data));
+
+        /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field
+         * of the first line (':' separated) does not contain a space then it _should_ be a header and we will
+         * process all lines before a blank line as headers.
+         */
+
+        $field = substr($lines[0], 0, strpos($lines[0], ':'));
+        $in_headers = false;
+        if (!empty($field) && strpos($field, ' ') === false) {
+            $in_headers = true;
+        }
+
+        foreach ($lines as $line) {
+            $lines_out = array();
+            if ($in_headers and $line == '') {
+                $in_headers = false;
+            }
+            //Break this line up into several smaller lines if it's too long
+            //Micro-optimisation: isset($str[$len]) is faster than (strlen($str) > $len),
+            while (isset($line[self::MAX_LINE_LENGTH])) {
+                //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on
+                //so as to avoid breaking in the middle of a word
+                $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' ');
+                //Deliberately matches both false and 0
+                if (!$pos) {
+                    //No nice break found, add a hard break
+                    $pos = self::MAX_LINE_LENGTH - 1;
+                    $lines_out[] = substr($line, 0, $pos);
+                    $line = substr($line, $pos);
+                } else {
+                    //Break at the found point
+                    $lines_out[] = substr($line, 0, $pos);
+                    //Move along by the amount we dealt with
+                    $line = substr($line, $pos + 1);
+                }
+                //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1
+                if ($in_headers) {
+                    $line = "\t" . $line;
+                }
+            }
+            $lines_out[] = $line;
+
+            //Send the lines to the server
+            foreach ($lines_out as $line_out) {
+                //RFC2821 section 4.5.2
+                if (!empty($line_out) and $line_out[0] == '.') {
+                    $line_out = '.' . $line_out;
+                }
+                $this->client_send($line_out . self::CRLF);
+            }
+        }
+
+        //Message data has been sent, complete the command
+        //Increase timelimit for end of DATA command
+        $savetimelimit = $this->Timelimit;
+        $this->Timelimit = $this->Timelimit * 2;
+        $result = $this->sendCommand('DATA END', '.', 250);
+        //Restore timelimit
+        $this->Timelimit = $savetimelimit;
+        return $result;
+    }
+
+    /**
+     * Send an SMTP HELO or EHLO command.
+     * Used to identify the sending server to the receiving server.
+     * This makes sure that client and server are in a known state.
+     * Implements RFC 821: HELO <SP> <domain> <CRLF>
+     * and RFC 2821 EHLO.
+     * @param string $host The host name or IP to connect to
+     * @access public
+     * @return boolean
+     */
+    public function hello($host = '')
+    {
+        //Try extended hello first (RFC 2821)
+        return (boolean)($this->sendHello('EHLO', $host) or $this->sendHello('HELO', $host));
+    }
+
+    /**
+     * Send an SMTP HELO or EHLO command.
+     * Low-level implementation used by hello()
+     * @see hello()
+     * @param string $hello The HELO string
+     * @param string $host The hostname to say we are
+     * @access protected
+     * @return boolean
+     */
+    protected function sendHello($hello, $host)
+    {
+        $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250);
+        $this->helo_rply = $this->last_reply;
+        if ($noerror) {
+            $this->parseHelloFields($hello);
+        } else {
+            $this->server_caps = null;
+        }
+        return $noerror;
+    }
+
+    /**
+     * Parse a reply to HELO/EHLO command to discover server extensions.
+     * In case of HELO, the only parameter that can be discovered is a server name.
+     * @access protected
+     * @param string $type - 'HELO' or 'EHLO'
+     */
+    protected function parseHelloFields($type)
+    {
+        $this->server_caps = array();
+        $lines = explode("\n", $this->helo_rply);
+
+        foreach ($lines as $n => $s) {
+            //First 4 chars contain response code followed by - or space
+            $s = trim(substr($s, 4));
+            if (empty($s)) {
+                continue;
+            }
+            $fields = explode(' ', $s);
+            if (!empty($fields)) {
+                if (!$n) {
+                    $name = $type;
+                    $fields = $fields[0];
+                } else {
+                    $name = array_shift($fields);
+                    switch ($name) {
+                        case 'SIZE':
+                            $fields = ($fields ? $fields[0] : 0);
+                            break;
+                        case 'AUTH':
+                            if (!is_array($fields)) {
+                                $fields = array();
+                            }
+                            break;
+                        default:
+                            $fields = true;
+                    }
+                }
+                $this->server_caps[$name] = $fields;
+            }
+        }
+    }
+
+    /**
+     * Send an SMTP MAIL command.
+     * Starts a mail transaction from the email address specified in
+     * $from. Returns true if successful or false otherwise. If True
+     * the mail transaction is started and then one or more recipient
+     * commands may be called followed by a data command.
+     * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>
+     * @param string $from Source address of this message
+     * @access public
+     * @return boolean
+     */
+    public function mail($from)
+    {
+        $useVerp = ($this->do_verp ? ' XVERP' : '');
+        return $this->sendCommand(
+            'MAIL FROM',
+            'MAIL FROM:<' . $from . '>' . $useVerp,
+            250
+        );
+    }
+
+    /**
+     * Send an SMTP QUIT command.
+     * Closes the socket if there is no error or the $close_on_error argument is true.
+     * Implements from rfc 821: QUIT <CRLF>
+     * @param boolean $close_on_error Should the connection close if an error occurs?
+     * @access public
+     * @return boolean
+     */
+    public function quit($close_on_error = true)
+    {
+        $noerror = $this->sendCommand('QUIT', 'QUIT', 221);
+        $err = $this->error; //Save any error
+        if ($noerror or $close_on_error) {
+            $this->close();
+            $this->error = $err; //Restore any error from the quit command
+        }
+        return $noerror;
+    }
+
+    /**
+     * Send an SMTP RCPT command.
+     * Sets the TO argument to $toaddr.
+     * Returns true if the recipient was accepted false if it was rejected.
+     * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>
+     * @param string $address The address the message is being sent to
+     * @access public
+     * @return boolean
+     */
+    public function recipient($address)
+    {
+        return $this->sendCommand(
+            'RCPT TO',
+            'RCPT TO:<' . $address . '>',
+            array(250, 251)
+        );
+    }
+
+    /**
+     * Send an SMTP RSET command.
+     * Abort any transaction that is currently in progress.
+     * Implements rfc 821: RSET <CRLF>
+     * @access public
+     * @return boolean True on success.
+     */
+    public function reset()
+    {
+        return $this->sendCommand('RSET', 'RSET', 250);
+    }
+
+    /**
+     * Send a command to an SMTP server and check its return code.
+     * @param string $command The command name - not sent to the server
+     * @param string $commandstring The actual command to send
+     * @param integer|array $expect One or more expected integer success codes
+     * @access protected
+     * @return boolean True on success.
+     */
+    protected function sendCommand($command, $commandstring, $expect)
+    {
+        if (!$this->connected()) {
+            $this->setError("Called $command without being connected");
+            return false;
+        }
+        //Reject line breaks in all commands
+        if (strpos($commandstring, "\n") !== false or strpos($commandstring, "\r") !== false) {
+            $this->setError("Command '$command' contained line breaks");
+            return false;
+        }
+        $this->client_send($commandstring . self::CRLF);
+
+        $this->last_reply = $this->get_lines();
+        // Fetch SMTP code and possible error code explanation
+        $matches = array();
+        if (preg_match("/^([0-9]{3})[ -](?:([0-9]\\.[0-9]\\.[0-9]) )?/", $this->last_reply, $matches)) {
+            $code = $matches[1];
+            $code_ex = (count($matches) > 2 ? $matches[2] : null);
+            // Cut off error code from each response line
+            $detail = preg_replace(
+                "/{$code}[ -]".($code_ex ? str_replace('.', '\\.', $code_ex).' ' : '')."/m",
+                '',
+                $this->last_reply
+            );
+        } else {
+            // Fall back to simple parsing if regex fails
+            $code = substr($this->last_reply, 0, 3);
+            $code_ex = null;
+            $detail = substr($this->last_reply, 4);
+        }
+
+        $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);
+
+        if (!in_array($code, (array)$expect)) {
+            $this->setError(
+                "$command command failed",
+                $detail,
+                $code,
+                $code_ex
+            );
+            $this->edebug(
+                'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply,
+                self::DEBUG_CLIENT
+            );
+            return false;
+        }
+
+        $this->setError('');
+        return true;
+    }
+
+    /**
+     * Send an SMTP SAML command.
+     * Starts a mail transaction from the email address specified in $from.
+     * Returns true if successful or false otherwise. If True
+     * the mail transaction is started and then one or more recipient
+     * commands may be called followed by a data command. This command
+     * will send the message to the users terminal if they are logged
+     * in and send them an email.
+     * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>
+     * @param string $from The address the message is from
+     * @access public
+     * @return boolean
+     */
+    public function sendAndMail($from)
+    {
+        return $this->sendCommand('SAML', "SAML FROM:$from", 250);
+    }
+
+    /**
+     * Send an SMTP VRFY command.
+     * @param string $name The name to verify
+     * @access public
+     * @return boolean
+     */
+    public function verify($name)
+    {
+        return $this->sendCommand('VRFY', "VRFY $name", array(250, 251));
+    }
+
+    /**
+     * Send an SMTP NOOP command.
+     * Used to keep keep-alives alive, doesn't actually do anything
+     * @access public
+     * @return boolean
+     */
+    public function noop()
+    {
+        return $this->sendCommand('NOOP', 'NOOP', 250);
+    }
+
+    /**
+     * Send an SMTP TURN command.
+     * This is an optional command for SMTP that this class does not support.
+     * This method is here to make the RFC821 Definition complete for this class
+     * and _may_ be implemented in future
+     * Implements from rfc 821: TURN <CRLF>
+     * @access public
+     * @return boolean
+     */
+    public function turn()
+    {
+        $this->setError('The SMTP TURN command is not implemented');
+        $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT);
+        return false;
+    }
+
+    /**
+     * Send raw data to the server.
+     * @param string $data The data to send
+     * @access public
+     * @return integer|boolean The number of bytes sent to the server or false on error
+     */
+    public function client_send($data)
+    {
+        $this->edebug("CLIENT -> SERVER: $data", self::DEBUG_CLIENT);
+        return fwrite($this->smtp_conn, $data);
+    }
+
+    /**
+     * Get the latest error.
+     * @access public
+     * @return array
+     */
+    public function getError()
+    {
+        return $this->error;
+    }
+
+    /**
+     * Get SMTP extensions available on the server
+     * @access public
+     * @return array|null
+     */
+    public function getServerExtList()
+    {
+        return $this->server_caps;
+    }
+
+    /**
+     * A multipurpose method
+     * The method works in three ways, dependent on argument value and current state
+     *   1. HELO/EHLO was not sent - returns null and set up $this->error
+     *   2. HELO was sent
+     *     $name = 'HELO': returns server name
+     *     $name = 'EHLO': returns boolean false
+     *     $name = any string: returns null and set up $this->error
+     *   3. EHLO was sent
+     *     $name = 'HELO'|'EHLO': returns server name
+     *     $name = any string: if extension $name exists, returns boolean True
+     *       or its options. Otherwise returns boolean False
+     * In other words, one can use this method to detect 3 conditions:
+     *  - null returned: handshake was not or we don't know about ext (refer to $this->error)
+     *  - false returned: the requested feature exactly not exists
+     *  - positive value returned: the requested feature exists
+     * @param string $name Name of SMTP extension or 'HELO'|'EHLO'
+     * @return mixed
+     */
+    public function getServerExt($name)
+    {
+        if (!$this->server_caps) {
+            $this->setError('No HELO/EHLO was sent');
+            return null;
+        }
+
+        // the tight logic knot ;)
+        if (!array_key_exists($name, $this->server_caps)) {
+            if ($name == 'HELO') {
+                return $this->server_caps['EHLO'];
+            }
+            if ($name == 'EHLO' || array_key_exists('EHLO', $this->server_caps)) {
+                return false;
+            }
+            $this->setError('HELO handshake was used. Client knows nothing about server extensions');
+            return null;
+        }
+
+        return $this->server_caps[$name];
+    }
+
+    /**
+     * Get the last reply from the server.
+     * @access public
+     * @return string
+     */
+    public function getLastReply()
+    {
+        return $this->last_reply;
+    }
+
+    /**
+     * Read the SMTP server's response.
+     * Either before eof or socket timeout occurs on the operation.
+     * With SMTP we can tell if we have more lines to read if the
+     * 4th character is '-' symbol. If it is a space then we don't
+     * need to read anything else.
+     * @access protected
+     * @return string
+     */
+    protected function get_lines()
+    {
+        // If the connection is bad, give up straight away
+        if (!is_resource($this->smtp_conn)) {
+            return '';
+        }
+        $data = '';
+        $endtime = 0;
+        stream_set_timeout($this->smtp_conn, $this->Timeout);
+        if ($this->Timelimit > 0) {
+            $endtime = time() + $this->Timelimit;
+        }
+        while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {
+            $str = @fgets($this->smtp_conn, 515);
+            $this->edebug("SMTP -> get_lines(): \$data is \"$data\"", self::DEBUG_LOWLEVEL);
+            $this->edebug("SMTP -> get_lines(): \$str is  \"$str\"", self::DEBUG_LOWLEVEL);
+            $data .= $str;
+            // If 4th character is a space, we are done reading, break the loop, micro-optimisation over strlen
+            if ((isset($str[3]) and $str[3] == ' ')) {
+                break;
+            }
+            // Timed-out? Log and break
+            $info = stream_get_meta_data($this->smtp_conn);
+            if ($info['timed_out']) {
+                $this->edebug(
+                    'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)',
+                    self::DEBUG_LOWLEVEL
+                );
+                break;
+            }
+            // Now check if reads took too long
+            if ($endtime and time() > $endtime) {
+                $this->edebug(
+                    'SMTP -> get_lines(): timelimit reached ('.
+                    $this->Timelimit . ' sec)',
+                    self::DEBUG_LOWLEVEL
+                );
+                break;
+            }
+        }
+        return $data;
+    }
+
+    /**
+     * Enable or disable VERP address generation.
+     * @param boolean $enabled
+     */
+    public function setVerp($enabled = false)
+    {
+        $this->do_verp = $enabled;
+    }
+
+    /**
+     * Get VERP address generation mode.
+     * @return boolean
+     */
+    public function getVerp()
+    {
+        return $this->do_verp;
+    }
+
+    /**
+     * Set error messages and codes.
+     * @param string $message The error message
+     * @param string $detail Further detail on the error
+     * @param string $smtp_code An associated SMTP error code
+     * @param string $smtp_code_ex Extended SMTP code
+     */
+    protected function setError($message, $detail = '', $smtp_code = '', $smtp_code_ex = '')
+    {
+        $this->error = array(
+            'error' => $message,
+            'detail' => $detail,
+            'smtp_code' => $smtp_code,
+            'smtp_code_ex' => $smtp_code_ex
+        );
+    }
+
+    /**
+     * Set debug output method.
+     * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it.
+     */
+    public function setDebugOutput($method = 'echo')
+    {
+        $this->Debugoutput = $method;
+    }
+
+    /**
+     * Get debug output method.
+     * @return string
+     */
+    public function getDebugOutput()
+    {
+        return $this->Debugoutput;
+    }
+
+    /**
+     * Set debug output level.
+     * @param integer $level
+     */
+    public function setDebugLevel($level = 0)
+    {
+        $this->do_debug = $level;
+    }
+
+    /**
+     * Get debug output level.
+     * @return integer
+     */
+    public function getDebugLevel()
+    {
+        return $this->do_debug;
+    }
+
+    /**
+     * Set SMTP timeout.
+     * @param integer $timeout
+     */
+    public function setTimeout($timeout = 0)
+    {
+        $this->Timeout = $timeout;
+    }
+
+    /**
+     * Get SMTP timeout.
+     * @return integer
+     */
+    public function getTimeout()
+    {
+        return $this->Timeout;
+    }
+}
+

--- /dev/null
+++ b/includes/corefunctions.php
@@ -1,1 +1,571 @@
-
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+// Validates emails
+function validEmail($str) {
+	return (bool) preg_match('/^[-_a-z0-9\'+*$^&%=~!?{}]++(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*@(?:(?![-.])[-a-z0=9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d++)?$/iD', $str);
+}
+
+// Function used to add and remove stories from category counts
+function categoryitems($catid, $value)
+{
+	//add or subtract one to the current categories
+	//find out current category's parent
+	if(is_array($catid)) $cats = $catid;
+	else $cats = array($catid);
+	$cats = array_filter($cats, "isNumber");
+	$catquery = dbquery("SELECT catid, parentcatid, leveldown FROM ".TABLEPREFIX."fanfiction_categories WHERE FIND_IN_SET(catid, '$catid') GROUP BY catid");
+	while(isset($catquery)) {
+		while($cat = dbassoc($catquery)) {
+			$pcats = array();
+			if($cat['leveldown'] > 0) $pcats[] = $cat['parentcatid'];
+			if(!in_array($cat['catid'], $cats)) $cats[] = $cat['catid'];
+		}
+		if(count($pcats) > 0) $catquery = dbquery("SELECT catid, parentcatid, leveldown FROM ".TABLEPREFIX."fanfiction_categories WHERE FIND_IN_SET(catid, '".implode($pcats)."') GROUP BY catid");
+		else unset($catquery);
+	}
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_categories SET numitems = (numitems + $value) WHERE FIND_IN_SET(catid, '".implode(",", $cats)."')");
+}
+
+// Function to recurse through categories to build a list of the category and all it's sub-categories.
+function recurseCategories($catid) {
+	global $catlist;
+	$$catid = $catlist;
+	$categorylist[] = $catid;
+	foreach($$catid as $cat => $info) {
+		if($info['pid'] == $catid) {
+			$categorylist = array_merge($categorylist, recurseCategories($cat));
+		}
+	}
+	return $categorylist;
+}
+
+// Captcha script validation
+function captcha_confirm() {
+	if(empty($_SESSION[SITEKEY.'_digit'])) return false;
+	$digit = $_SESSION[SITEKEY.'_digit'];
+	$userdigit = $_POST['userdigit'];
+	unset($_SESSION[SITEKEY.'_digit']);
+	if($digit == md5(SITEKEY.$userdigit) && $userdigit > 1) return true;
+	return false;
+}
+
+// Sanitizes user input to help prevent XSS attacks 
+function descript($text) {
+	// Convert problematic ascii characters to their true values
+	$search = array("40","41","58","65","66","67","68","69","70",
+		"71","72","73","74","75","76","77","78","79","80","81",
+		"82","83","84","85","86","87","88","89","90","97","98",
+		"99","100","101","102","103","104","105","106","107",
+		"108","109","110","111","112","113","114","115","116",
+		"117","118","119","120","121","122");
+	
+	$replace = array("(",")",":","a","b","c","d","e","f","g","h",
+		"i","j","k","l","m","n","o","p","q","r","s","t","u",
+		"v","w","x","y","z","a","b","c","d","e","f","g","h",
+		"i","j","k","l","m","n","o","p","q","r","s","t","u",
+		"v","w","x","y","z");
+
+	$entities = count($search);
+	
+	for ($i=0;$i < $entities;$i++) $text = preg_replace("#(&\#)(0*".$search[$i]."+);*#si", $replace[$i], $text);
+
+	// the following is based on code from bitflux (http://blog.bitflux.ch/wiki/)	
+	// Kill hexadecimal characters completely
+	$text = preg_replace('#(&\#x)([0-9A-F]+);*#si', "", $text);
+
+	// remove any attribute starting with "on" or xmlns
+
+	$text = preg_replace('#(<[^>]+[\\"\'\s])(onmouseover|onmousedown|onmouseup|onmouseout|onmousemove|onclick|ondblclick|onload|xmlns)[^>]*>#iU', ">", $text);
+
+	// remove javascript: and vbscript: protocol
+	
+	$text = preg_replace('#([a-z]*)=([\`\'\"]*)script:#iU', '$1=$2nojscript...', $text);
+	$text = preg_replace('#([a-z]*)=([\`\'\"]*)javascript:#iU', '$1=$2nojavascript...', $text);
+	$text = preg_replace('#([a-z]*)=([\'\"]*)vbscript:#iU', '$1=$2novbscript...', $text);
+
+	//<span style="width: expression(alert('Ping!'));"></span> (only affects ie...)
+	$text = preg_replace('#(<[^>]+)style=([\`\'\"]*).*expression\([^>]*>#iU', "$1>", $text);
+	$text = preg_replace('#(<[^>]+)style=([\`\'\"]*).*behaviour\([^>]*>#iU', "$1>", $text);
+	return $text;
+}
+
+// Call this function when the user tries to do something they shouldn't have access to.
+function accessDenied($str = ""){
+	global $tpl, $output;
+
+	if(!empty($str)) $output = write_error($str);
+	else $output = write_error(_NOTAUTHORIZED);
+	if(!empty($tpl)) {
+		$tpl->assign("output", $output);
+		$tpl->printToScreen( );
+		dbclose( );
+	}
+	else echo $output;
+	exit( );
+}
+
+// Call this function when something causes an error and the script has to die.
+function errorExit( $msg = ""){
+	global $tpl, $output;
+
+	$output .= write_error(_ERROR.(!empty($msg) ? " " : "").$msg);
+	$tpl->assign("output", $output);
+	$tpl->printToScreen( );
+	dbclose( );
+	exit( );
+}
+// The next three functions are used to calculate the series reviews and rating
+
+function storiesInSeries($thisseries) {
+	$storylist = array( );
+	if(!isNumber($thisseries)) return $storylist;
+	$serieslist = array( );
+	$stinseries = dbquery("SELECT sid, subseriesid FROM ".TABLEPREFIX."fanfiction_inseries WHERE seriesid = '$thisseries'");
+	while($st = dbassoc($stinseries)) { 
+		if(!empty($st['sid'])) $storylist[] = $st['sid'];
+		else if(!empty($st['subseriesid'])) $serieslist[] = $st['subseriesid'];
+	}
+	if($serieslist) {
+		foreach($serieslist as $s) {
+			$storylist = array_merge($storylist, storiesInSeries($s));
+		}
+	}
+	return $storylist;
+}
+function subseriesList($thisseries) {
+	$serieslist = array( );
+	if(!isNumber($thisseries)) return $serieslist;
+	$stinseries = dbquery("SELECT subseriesid FROM ".TABLEPREFIX."fanfiction_inseries WHERE seriesid = '$thisseries'");
+	while($st = dbassoc($stinseries)) {
+		$serieslist[] = $st['subseriesid']; 
+		$serieslist = array_merge($serieslist, subseriesList($st['subseriesid']));
+	}
+	return $serieslist;
+}
+
+function seriesreview($thisseries) {
+
+	if(!isNumber($thisseries)) return;
+	$storylist = storiesInSeries($thisseries);
+	$serieslist = subseriesList($thisseries);
+$newrating = dbquery("SELECT AVG(rating) as totalreviews FROM ".TABLEPREFIX."fanfiction_reviews 
+	WHERE ((item = '$thisseries' AND type = 'SE')".
+	(count($storylist) > 0 ? " OR (FIND_IN_SET(item, '".(implode(",", $storylist))."') > 0 AND type = 'ST')" : "").
+	(count($serieslist) > 0 ? " OR (FIND_IN_SET(item, '".(implode(",", $serieslist))."') > 0 AND type = 'SE')" : "").
+	") AND rating != '-1'");
+list($totalreviews) = dbrow($newrating);
+$newcount = dbquery("SELECT count(reviewid) as totalcount FROM ".TABLEPREFIX."fanfiction_reviews 
+	WHERE ((item = '$thisseries' AND type = 'SE')".
+	(count($storylist) > 0 ? " OR (FIND_IN_SET(item, '".(implode(",", $storylist))."') > 0 AND type = 'ST')" : "").
+	(count($serieslist) > 0 ? " OR (FIND_IN_SET(item, '".(implode(",", $serieslist))."') > 0 AND type = 'SE')" : "").
+	") AND review != 'No Review'");
+list($totalcount) = dbrow($newcount);
+if($totalcount) $update = dbquery("UPDATE ".TABLEPREFIX."fanfiction_series SET rating = '".round($totalreviews)."', reviews = '$totalcount' WHERE seriesid = '$thisseries'");
+$parentq = dbquery("SELECT seriesid FROM ".TABLEPREFIX."fanfiction_inseries WHERE subseriesid = '$thisseries' AND seriesid != '$thisseries'");
+while($parent2 = dbassoc($parentq)) { seriesreview($parent2['seriesid']); }
+
+}
+
+// Per a suggestion from jrabbit, we'll use this function to optimize some queries 
+function findclause($field,$set) {
+  if (empty($set)) {
+    return "1 = 0";
+  }
+  if(is_array($set)) $set = implode(",", $set);
+  if (strpos($set,',')>0) {
+    return "FIND_IN_SET($field,'$set') > 0";
+  }
+  return "$field='$set'";
+}
+
+// Added 3.3
+function nl2br2($string) {
+	$string = str_replace(array("\r\n", "\r", "\n"), "<br />", $string);
+	return $string;
+}
+
+// Formats the text of the story when displayed on screen.
+function format_story($text) {
+      $text = trim((string)$text);
+      if(strpos($text, "<br>") === false && strpos($text, "<p>") === false && strpos($text, "<br />") === false) $text = nl2br2($text);
+      if(_CHARSET != "ISO-8859-1" && _CHARSET != "US-ASCII") return stripslashes($text);
+      $badwordchars = array(chr(212), chr(213), chr(210), chr(211), chr(209), chr(208), chr(201), chr(145), chr(146), chr(147), chr(148), chr(151), chr(150), chr(133));
+      $fixedwordchars = array('&#8216;', '&#8217;', '&#8220;', '&#8221;', '&#8212;', '&#8211;', '&#8230;', '&#8216;', '&#8217;', '&#8220;', '&#8221;', '&#8212;', '&#8211;',  '&#8230;' );
+      $text = str_replace($badwordchars,$fixedwordchars,stripslashes($text));
+      return $text;
+}
+
+// Function to Spam-protect emails.  Is called for the IM fields in the user's profile.
+function format_email($text) {
+	$search = array('@', '.');
+	$replace = array(" [AT] ", " [DOT] ");
+	return str_replace($search, $replace, $text);
+}
+
+// Function to format a URL into a clickable link
+function format_link($text, $title = "", $target = 0) {
+	if(empty($title)) $title = $text;
+	if(strpos($text, "http://") === false) $text = "http://".$text;
+	$text = "<a href='$text'".($target ? " target='_blank'" : "").">$title</a>";
+	return $text;
+}
+
+// Because this is used in places other than the listings of stories, we're setting it up as a function to be called as needed.
+function title_link($stories) {
+	global $ratingslist, $ageconsent, $disablepopups;
+
+	$rating = $stories['rid'];
+	$warningtext = !empty($ratingslist[$rating]['warningtext']) ? addslashes(strip_tags($ratingslist[$rating]['warningtext'])) : "";
+		if(empty($ratingslist[$rating]['ratingwarning']))
+			$title = "<a href=\""._BASEDIR."viewstory.php?sid=".$stories['sid']."\">".$stories['title']."</a>";
+		else {
+			$warning = "";
+			$warninglevel = sprintf("%03b", $ratingslist[$rating]['ratingwarning']);
+			if($warninglevel[2] && !isset($_SESSION[SITEKEY."_warned"][$rating])) {
+				$location = "viewstory.php?sid=".$stories['sid']."&amp;warning=$rating";
+				$warning = $warningtext;
+			}
+			if($warninglevel[1] && !$ageconsent && empty($_SESSION[SITEKEY.'_ageconsent'])) {
+				$location = "viewstory.php?sid=".$stories['sid']."&amp;ageconsent=ok&amp;warning=$rating";
+				$warning = _AGECHECK." - "._AGECONSENT." ".$warningtext." -- 1";
+			}
+			if($warninglevel[0] && !isMEMBER) {
+				$location = "user.php?action=login&amp;sid=".$stories['sid'];
+				$warning = _RUSERSONLY." - $warningtext";		
+			}
+			if(!empty($warning)) {
+				$warning = preg_replace("@'@", "\'", $warning);
+				$title = "<a href=\"javascript:if(confirm('".$warning."')) location = '"._BASEDIR."$location'\">".$stories['title']."</a>";
+			}
+			else $title = "<a href=\""._BASEDIR."viewstory.php?sid=".$stories['sid']."\">".$stories['title']."</a>";
+		}
+	return $title;
+}
+
+// Same with the author list
+function author_link($stories) {
+	if(is_array($stories['coauthors'])) {
+		$authlink[] = "<a href=\""._BASEDIR."viewuser.php?uid=".$stories['uid']."\">".$stories['penname']."</a>";
+		$coauth = dbquery("SELECT "._PENNAMEFIELD." as penname, co.uid FROM ".TABLEPREFIX."fanfiction_coauthors AS co LEFT JOIN "._AUTHORTABLE." ON co.uid = "._UIDFIELD." WHERE co.sid = '".$stories['sid']."'");
+		foreach($stories['coauthors'] AS $k => $v) {
+			$authlink[] = "<a href=\""._BASEDIR."viewuser.php?uid=".$k."\">".$v."</a>";
+		}
+	}
+	return isset($authlink) ? implode(", ", $authlink) : "<a href=\""._BASEDIR."viewuser.php?uid=".$stories['uid']."\">".$stories['penname']."</a>";
+}
+
+// Used to truncate text (summaries in blocks for example) to a set length.  An improvement on the old version as this keeps words intact
+function truncate_text($str, $n = 75, $delim='...') { 
+   $len = strlen($str);
+   if($len > $n) {
+        $pos = strpos($str, " ", $n);
+	if($pos) $str = trim(substr($str, 0, $pos), "\n\t\.,"). $delim;
+  }
+  return closetags($str);
+} 
+
+// A helper function for the truncate_text function.  This will close all open tags
+function closetags($html){
+
+  $donotclose=array('br','img','input', 'hr');
+  preg_match_all("#<([a-z]+)( .*)?(?!/)>#iU",$html,$result);
+  $openedtags=$result[1];
+
+  preg_match_all("#</([a-z]+)>#iU",$html,$result);
+  $closedtags=$result[1];
+  $len_opened = count($openedtags);
+  if(count($closedtags) == $len_opened){
+	  return $html;
+  }
+
+  $openedtags = array_reverse($openedtags);
+
+  for($i=0;$i < $len_opened;$i++) {
+
+    if (!in_array($openedtags[$i],$closedtags) && !in_array($openedtags[$i], $donotclose)){
+      $html .= '</'.$openedtags[$i].'>';
+    } 
+    else {
+      unset($closedtags[array_search($openedtags[$i],$closedtags)]);
+    }
+  }
+  return $html;
+}
+
+//  Builds the naughty word list for the site's censor
+function build_word($myword) {
+	$letters =preg_split('//',$myword, -1, PREG_SPLIT_NO_EMPTY);
+	$word = "";
+	foreach($letters as $letter) { 
+		if($word != "") $word .= "\W+";
+		$word .= $letter;
+	}
+	return $word;
+
+}
+
+// Finds forbidden words in text.  Returns true if a forbidden word is found
+function find_naughty($text) {
+	global $words;
+	if(!count($words)) return false;
+	$naughty = 0;
+	for($i = 0; $i < sizeof($words); $i++) {
+		if(strpos($words[$i], "*") === false) {
+			// check for whole word
+			if(preg_match('/(\s|^)+(('.$words[$i].')|('.build_word($words[$i]).')+(s|es)?)+(\W|$)+/i', $text, $match)) {
+				echo $words[$i] ." 0=".$match[0];
+				$naughty = 1; 
+			}
+		}
+		if(strpos($words[$i], "*") !== false && strpos($words[$i], "*") == 0 && !$naughty) {
+			// remove the * from the beginning of the word
+			$word = substr($words[$i], 1, strlen($words[$i]));
+			if(strrpos($word, "*") == strlen($word) - 1) $word = substr($word, 0, strlen($word) - 1);
+			// check for whole word plus word as suffix
+			if(preg_match('/[\s|^]+\w*('.$word.'|\W'.build_word($word).')+(s|es)?(\W|$)/i', $text, $match)) $naughty = 1; 
+		}
+		if(strrpos($words[$i], "*") == strlen($words[$i]) - 1 && !$naughty) {
+			// remove the * from the end of the word
+			$word = substr($words[$i], 0, strlen($words[$i]) - 1);
+			if(strpos($word, "*") !== false && strpos($word, "*") == 0) $word = substr($word, 1, strlen($word));
+			// check for whole word plus word as prefix
+			if(preg_match('/(\s|^)('.$word.'|'.build_word($word).'\W)+\w*(s|es)?(\W|$)/i', $text, $match)) $naughty = 1; 
+		}
+		if($naughty) break;  // no sense continuing down the list and this will make it run faster
+	}
+	return $naughty;
+}
+
+// Replaces forbidden words in text.  The forbidden word is replaced with the first letter and trailing ***
+function replace_naughty($text) {
+	global $words;
+
+	if(!count($words)) return $text;
+	$i = 0;
+	for($j = 0; $j < sizeof($words); $j++) {
+		if(strpos($words[$j], "*") === false) {
+			$replace[$i] = str_pad($words[$j][0], strlen($words[$j]), "*");
+			$naughtywords[$i] = '/\b('.$words[$j].'\b)|('.build_word($words[$j]).')\b/i';
+			$i++;
+		}
+
+		if(strpos($words[$j], "*") !== false && strpos($words[$j], "*") == 0) {
+			$word = substr($words[$j], 1, strlen($words[$j]));
+			if(strrpos($word, "*") == strlen($word) - 1) $word = substr($word, 0, strlen($word) - 1);
+			$naughtywords[$i] = '/(\s|^)+(\w*)+('.$word.'|'.build_word($word).')/i';
+			$replace[$i] = "$1$2".str_pad(substr($word, 0, 1), strlen($word), "*");
+			$i++;
+		}
+		if(strrpos($words[$j], "*") == strlen($words[$j]) - 1) {
+			$word = substr($words[$j], 0, strlen($words[$j]) - 1);
+			if(strpos($word, "*") !== false && strpos($word, "*") == 0) $word = substr($word, 1, strlen($word));
+			$replace[$i] = '$1'.str_pad(substr($word, 0, 1), strlen($word), "*").'$3';
+			$naughtywords[$i] = '/(.*)('.$word.'|'.build_word($word).')(\s|\w)/i';
+			$i++;
+		}
+	}
+	$text = preg_replace($naughtywords, $replace, $text);
+	return $text;
+}
+
+// Format for messages sent back from various forms and actions 
+function write_message($str) {
+	return "<div style='text-align: center; margin: 1em;'>$str</div>";
+}
+
+// Formats error messages sent back from various forms and actions
+function write_error($str) {
+	return "<div style='text-align: center; margin: 1em;' class='errortext'>$str</div>";
+}
+
+// Checks that the given $num is actually a number.  Used to help prevent XSS attacks.
+function isNumber($num) {
+	if(empty($num)) return false;
+	if(!is_string($num)) return false;
+	return preg_match("/^[0-9]+$/", $num);
+}
+
+// May be needed for sites that have bridged the authors table
+function check_prefs($uid) {
+	$test = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_authorprefs WHERE uid = '$uid'");
+	if(dbnumrows($test)) return true;
+	else return false;
+}
+
+// Function builds the alphabet links on various pages.
+function build_alphalinks($url, $let) {
+	global $alphabet;
+
+	$alpha = "<div id=\"alphabet\">";
+	foreach( $alphabet as $link ) {
+		// Build a link that calls a function with ($link and 1 (page number) )
+		$alpha .= "<a href=\"{$url}let=$link\"".($let == $link ? " id='currentletter'" : "").">$link</a> \n";
+	}
+	$alpha .= "</div>";
+	return $alpha;
+}
+
+// Function builds the pagination links
+function build_pagelinks($url, $total, $offset = 0, $columns = 1) {
+	global $itemsperpage, $linkstyle, $linkrange;
+	$pages = "";
+	$itemsperpage = $itemsperpage * $columns;
+
+	if($itemsperpage >= $total) return;
+
+	if(empty($linkrange)) $linkrange = 4;
+
+	$totpages = floor($total/$itemsperpage) + ($total % $itemsperpage ? 1 : 0);
+	$curpage = floor($offset/$itemsperpage) + 1;
+	if(!$linkstyle) $startrange = $curpage;
+	else {
+		if($totpages <= $linkrange || $curpage == 1) $startrange = 1;
+		else if($curpage >= $totpages - floor($linkrange / 2) + 1) $startrange = $totpages - $linkrange;
+		else $startrange = $curpage - floor($linkrange / 2) > 0 ? $curpage - floor($linkrange / 2) : 1;
+	}
+	if($startrange >= $totpages - $linkrange ) $startrange = $totpages - $linkrange > 0 ? $totpages - $linkrange : 1;
+	$stoprange = $totpages > $startrange + $linkrange ? $startrange + $linkrange : $totpages + 1;
+	if($curpage > 1 && $linkstyle != 1) $pages .= "<a href='".$url."offset=".( $offset - $itemsperpage)."' id='plprev'>["._PREVIOUS."]</a> ";
+	if($startrange > 1 && $linkstyle > 0) $pages .= "<a href='".$url."offset=0'>1</a><span class='ellipses'>...</span>";
+	for($x = $startrange; $x < $stoprange; $x++) {
+		$pages .= "<a href='".$url."offset=".(($x - 1) * $itemsperpage)."'".($x == $curpage ? "id='currentpage'" : "").">".$x."</a> \n";
+	}
+	if($stoprange < $totpages && $linkstyle > 0) $pages .= "<span class='ellipses'>...</span> <a href='".$url."offset=".(($totpages - 1) * $itemsperpage)."'>$totpages</a>\n";
+	if ($curpage < $totpages && $linkstyle != 1) $pages .=  " <a href='".$url."offset=".($offset+$itemsperpage)."' id='plnext'>["._NEXT."]</a>";
+	return "<div id=\"pagelinks\">$pages</div>";
+}
+
+// Function that returns the ratings picks 
+function ratingpics($rating) {
+	global $ratings, $like, $dislike, $star, $halfstar;
+	$ratingpics = "";
+	if($ratings == "2") {
+		if($rating >= 0.5)
+			$ratingpics = ($like ? $like : "<img src=\""._BASEDIR."images/like.gif\" alt=\""._LIKED."\">");
+		else if(($rating < 0.5) && ($rating > 0))
+			$ratingpics = ($dislike ? $dislike :"<img src=\""._BASEDIR."images/dislike.gif\" alt=\""._DISLIKED."\">");
+		else $ratingpics = "";
+	}
+	if($ratings == "1") {
+		global $star, $halfstar;
+		if($rating > 0) {
+			for($x = 0; $x < ($rating / 2) - .5; $x++) {
+				$ratingpics .= ($star ? $star  : "<img src=\""._BASEDIR."images/star.gif\" alt=\"star\">");
+			}
+			if($rating % 2 != 0) $ratingpics .= ($halfstar ? $halfstar  : "<img src=\""._BASEDIR."images/starhalf.gif\" alt=\"half-star\">");
+		}
+		else $ratingpics = "";
+	}
+	if(!empty($ratingpics)) return "<span style='white-space: nowrap;'>$ratingpics</span>"; // the no-wrap style will keep the stars together
+	else return;
+}
+
+// This function builds the list of category links (including the breadcrumb depending on settings)
+function catlist($catid) {
+	global $extendcats, $catlist, $action;
+
+	if(!is_array($catid)) $catid = explode(",", $catid);
+	$categorylinks = array();
+	foreach($catid as $cat) {
+		if(empty($catlist[$cat])) continue;
+		if($extendcats) {
+			unset($link);
+			$thiscat = $cat;
+			while(isset($thiscat)) {
+				if(isset($link)) $link = " > ".$link;
+				else $link = "";
+				if($action != "printable") $link = "<a href='"._BASEDIR."browse.php?type=categories&amp;catid=$thiscat'>".$catlist[$thiscat]['name']."</a>".$link;
+				else $link = $catlist[$thiscat]['name'].$link;
+				if($catlist[$thiscat]['pid'] == -1) unset($thiscat);
+				else $thiscat = $catlist[$thiscat]['pid'];
+			}
+			$categorylinks[] = $link;
+		}
+		else $categorylinks[] = "<a href='"._BASEDIR."browse.php?type=categories&amp;catid=$cat'>".$catlist[$cat]['name']."</a>";
+	}
+	return implode(", ", $categorylinks);
+}
+
+// This function builds the list of character links
+function charlist($characters) {
+	global $charlist, $action;
+
+	if(!is_array($characters)) $characters = explode(",", $characters);
+	$charlinks = array( );
+	foreach($characters as $c) {
+		if(empty($charlist[$c]['name'])) continue;
+		if($action != "printable") $charlinks[] = "<a href='"._BASEDIR."browse.php?type=characters&amp;charid=$c'>".$charlist[$c]['name']."</a>";
+		else $charlinks[] = $charlist[$c]['name'];
+	}
+	return implode(", ", $charlinks);
+}
+
+// Most of the pages that list stories and series use this fuction.  This handles showing the series and stories and pagination of the two together when needed
+function search($storyquery, $countquery, $pagelink = "search.php?", $pagetitle = 0) {
+	global $tpl, $new, $ratingslist, $itemsperpage, $reviewsallowed, $output, $dateformat, $current, $featured, $favorites, $retired, $ageconsent, $classtypelist, $classlist, $offset, $recentdays;
+     
+	$count = dbquery($countquery);
+	list($numrows) = dbrow($count);
+	if($numrows) {
+		$tpl->assign("output", ($pagetitle ? "<div id=\"pagetitle\">$pagetitle</div>" : ""));
+		$tpl->newBlock("listings");
+		if(!$ratingslist) {
+			$ratlist = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_ratings");
+			while($rate = dbassoc($ratlist)) {
+				$ratings[$rate['rid']] = array("rating" => $rate['rating'], "ratingwarning" => $rate['ratingwarning'], "warningtext" => $rate['warningtext']);
+			}
+		}
+		$tpl->newBlock("listings");
+		$tpl->gotoBlock("listings");
+		$tpl->assign("stories",  "<div class=\"sectionheader\">"._STORIES."</div>");
+		$storyquery .= " LIMIT $offset, $itemsperpage";
+		$result3 = dbquery($storyquery);     
+		$count = 0;                     
+		while($stories = dbassoc($result3)) {       
+			$tpl->newBlock("storyblock");
+			include(_BASEDIR."includes/storyblock.php"); 
+		}
+		$tpl->gotoBlock("_ROOT");		
+	}
+	else {
+		$tpl->newBlock("listings");
+		$tpl->assign("pagelinks", write_message(_NORESULTS));
+	}
+	if($numrows > $itemsperpage) {
+		$termArray = array_merge($_GET, $_POST);
+		$terms = array();
+		foreach($termArray as $term => $value) {
+			if($term == "submit" || $term == "go" || $term == "offset" || ($term != "complete" &&empty($value))) continue;
+			$terms[] = "$term=".(is_array($value) ? implode(",", $value) : $value);
+		}
+		$terms = implode("&amp;", $terms);
+		$terms .= "&amp;";
+		$tpl->gotoBlock("listings");
+		$tpl->assign( "pagelinks", build_pagelinks($pagelink.$terms, $numrows, $offset));
+	}
+	$tpl->gotoBlock("_ROOT");
+	return $numrows;
+}
+?>

--- /dev/null
+++ b/includes/dbfunctions.php
@@ -1,1 +1,8 @@
+<?php
 
+if(function_exists("mysqli_connect")) include_once(_BASEDIR."includes/mysqli_functions.php");
+else {
+	include(_BASEDIR."languages/en.php"); // Because we haven't selected a language setting yet
+	die(_FATALERROR._NODBFUNCTIONALITY);
+}
+ 

--- /dev/null
+++ b/includes/deletefunctions.php
@@ -1,1 +1,199 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+function deleteStory($story) {
+	global $store, $logging;
+	$sid = $story['sid'];
+	if($story['validated']) {
+		$cats = explode(",", $story['catid']);
+		foreach($cats as $cat) {
+			categoryitems($cat, -1);			
+		}	
+	}
+	if($store == "files") {
+		$chapterquery = dbquery("SELECT chapid, uid FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '$sid'");
+		while($chapter = dbassoc($chapterquery)) {
+			if (file_exists(STORIESPATH . "/" . $chapter['uid'] . "/" . $chapter['chapid'] . ".txt")) {
+				unlink(STORIESPATH."/".$chapter['uid']."/".$chapter['chapid'].".txt"); 
+			}
+		}
+	}
+	if($logging) {
+		$authorquery = dbquery("SELECT "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '".$story['uid']."' LIMIT 1");
+		list($penname) = dbrow($authorquery);
+		dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_ADMIN_DEL, USERPENNAME, USERUID, $story['title'], $sid, $penname, $story['uid']))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR'].
+		"'), 'DL', " . time() . ")");
+	}
+	dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_stories WHERE sid = '$sid' LIMIT 1");
+	dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '$sid'");
+	dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_reviews WHERE item = '$sid' AND type = 'ST'");
+	dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_favorites WHERE item = '$sid' AND type = 'ST'");
+	// get the coauthors list before we delete the coauthors info.
+	$array_coauthors = array();
+	if($story['coauthors'] == 1) {
+		$coauth = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_coauthors WHERE sid = '$sid'");
+		while($c = dbassoc($coauth)) {
+			$array_coauthors[] = $c['uid'];
+			
+		}
+	}	
+	dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_coauthors WHERE sid = '$sid'");
+	// Delete story from all series it is in.
+	$serieslist = dbquery("SELECT inorder, seriesid FROM ".TABLEPREFIX."fanfiction_inseries WHERE sid = '".$story['sid']."' LIMIT 1");
+	while($series = dbassoc($serieslist)) {
+		$countquery = dbquery("SELECT count(seriesid) FROM ".TABLEPREFIX."fanfiction_inseries WHERE seriesid = '".$series['seriesid']."'");
+		list($count) = dbrow($countquery);
+		dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_inseries WHERE seriesid = '".$series['seriesid']."' AND sid = '".$story['sid']."' LIMIT 1");
+		if($series['inorder'] < $count) dbquery("UPDATE ".TABLEPREFIX."fanfiction_inseries SET inorder = (inorder - 1) WHERE seriesid = '".$series['seriesid']."' AND inorder > '".$series['inorder']."'");
+		seriesreview($series); 
+	}
+	$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'delstory'");
+	while($code = dbassoc($codequery)) {
+		eval($code['code_text']);
+	}
+	if($story['validated'] > 0) {
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET stories = stories - 1");
+		if(!empty($array_coauthors)) {
+			$array_coauthors[] = $story['uid'];
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET stories = stories - 1 WHERE FIND_IN_SET(uid, '".implode(",", $array_coauthors)."') > 0");
+		}
+		else dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET stories = stories - 1 WHERE uid = '".$story['uid']."' LIMIT 1");
+		list($chapters, $words) = dbrow(dbquery("SELECT COUNT(chapid), SUM(wordcount) FROM ".TABLEPREFIX."fanfiction_chapters WHERE validated > 0"));
+		list($authors) = dbrow(dbquery("SELECT COUNT(uid) FROM ".TABLEPREFIX."fanfiction_authorprefs WHERE stories > 0"));
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats set wordcount = '$words', chapters = '$chapters', authors = '$authors'");
+	}
+}
+
+function deleteUser($uid) {
+	global $logging;
+	
+	list($penname) = dbrow(dbquery("SELECT penname FROM ".TABLEPREFIX."fanfiction_authors WHERE uid = '".$uid."' LIMIT 1"));
+	dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_authorprefs where uid = '".$uid."'");
+	$stories = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_stories where uid = '".$uid."'");
+	$numstories = dbnumrows($stories);
+	if($numstories > 0 ) {
+		while($story = dbassoc($stories)) {
+			if($story['uid'] == $uid) {
+				if(empty($story['coauthors'])) { // No co-authors...delete the story
+					deleteStory($story);
+				}
+				else { // Co-authors found...give the story a new author.
+					$cQuery = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_coauthors WHERE sid = '".$story['sid']."' LIMIT 1");
+					$newauthor = 0; $coauthors = 0;
+					$array_coauthors = array();
+					while($cRes= dbassoc($cQuery)) {
+						if(!$newauthor) $newauthor = $cRes['uid'];
+						else $array_coauthors[] = $cRes['uid'];
+					}			
+					if(!empty($newauthor)) {
+						$coauthors = count($array_coauthors) > 0 ? 1 : 0;
+						dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET uid = '$newauthor', coauthors = '$coauthors' WHERE sid = '".$story['sid']."' LIMIT 1");
+						$chapters = dbquery("SELECT chapid FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '".$story['sid']."' AND uid = '$uid'");
+						while($chap = dbassoc($chapters)) {
+							$chapid = $chap['chapid'];
+							$storytext = "";
+							if($out = fopen (STORIESPATH."/$uid/$chapid.txt", "r"))
+							while (!feof($out)) {
+								$storytext .= fgets($out, 10000);
+							}
+							fclose($out);
+							unlink(STORIESPATH."/$uid/$chapid.txt"); 
+							if($storytext) {
+								if( !file_exists( STORIESPATH."/$newauthor/" ) ) {
+									mkdir(STORIESPATH."/$newauthor", 0755);
+									chmod(STORIESPATH."/$newauthor", 0777);
+								}
+								$handle = fopen(STORIESPATH."/$newauthor/$chapid.txt", 'w');
+								if ($handle) {
+									fwrite($handle, $storytext);
+									fclose($handle);
+								}
+								chmod(STORIESPATH."/$newauthor/$chapid.txt", 0644);
+							}
+							dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET uid = '$newauthor' WHERE chapid = '$chapid' LIMIT 1");
+						}
+					}
+					else deleteStory($story);
+				}
+			}
+		}
+	}
+	$stories = dbquery("SELECT *, COUNT(uid) AS count FROM ".TABLEPREFIX."fanfiction_coauthors WHERE uid = '$uid' GROUP BY uid");
+	while($s = dbassoc($stories)) {
+		if($s['count'] > 1) dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET coauthors = 0 WHERE sid = '".$s['sid']."'");
+	}
+	dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_coauthors WHERE uid = '$uid'");
+	$stories = dbquery("SELECT seriesid FROM ".TABLEPREFIX."fanfiction_series where uid = '".$uid."'");
+	$numstories = dbnumrows($stories);
+	while($story = dbassoc($stories)) {
+		deleteSeries($story['seriesid']);
+	}
+	dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_authorinfo WHERE uid = '".$uid."'");
+	dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '".$uid."'");
+	dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_favorites WHERE item = '".$uid."' AND type = 'AU'");
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_comments SET uid = '0' WHERE uid = '".$uid."'");
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_reviews SET uid = '0', reviewer = '$penname' WHERE uid = '".$uid."'");
+	$codeblocks = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'deluser'");
+	while($code = dbassoc($codeblocks)) {
+		eval($code['code_text']);
+	}
+	if(strpos(_AUTHORTABLE, "fanfiction_authors as author") === false) { 
+		$output = write_message(_FOREIGNAUTHORTABLE." "._FOREIGNDELETE);
+	}
+	else {
+		dbquery("DELETE FROM ".substr(_AUTHORTABLE, 0, strpos(_AUTHORTABLE, "as author"))." WHERE ".substr(_UIDFIELD, 7)." = '".$uid."'");
+		$output = write_message(_ACTIONSUCCESSFUL);
+	}
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET members = members - 1");
+	return $output;
+}
+
+function deleteSeries($seriesid) {
+	global $logging;
+
+	$seriesinfo = dbquery("SELECT title, uid FROM ".TABLEPREFIX."fanfiction_series WHERE seriesid = '$seriesid'");
+	list($title, $uid) = dbrow($seriesinfo);
+	dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_inseries WHERE seriesid = '$seriesid'");
+	// Delete series from other series where it is a sub-series
+	$serieslist = dbquery("SELECT inorder, seriesid FROM ".TABLEPREFIX."fanfiction_inseries WHERE subseriesid = '".$seriesid."' LIMIT 1");
+	while($series = dbassoc($serieslist)) {
+		$countquery = dbquery("SELECT count(seriesid) FROM ".TABLEPREFIX."fanfiction_inseries WHERE seriesid = '".$series['seriesid']."'");
+		list($count) = dbrow($countquery);
+		dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_inseries WHERE seriesid = '".$series['seriesid']."' AND subseriesid = '".$seriesid."' LIMIT 1");
+		if($series['inorder'] < $count) dbquery("UPDATE ".TABLEPREFIX."fanfiction_inseries SET inorder = (inorder - 1) WHERE seriesid = '".$series['seriesid']."' AND inorder > '".$series['inorder']."'");
+		seriesreview($series); 
+	}	
+	dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_series WHERE seriesid = '$seriesid'");
+	dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_favorites WHERE type = 'SE' AND item = '$seriesid'");
+	dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_reviews WHERE type = 'SE' AND item = '$seriesid'");
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET series = series - 1");
+	$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'deleteseries'");
+	while($code = dbassoc($codequery)) {
+			eval($code['code_text']);
+	}
+	if($logging && isADMIN) {
+		if($uid != USERUID) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_ADMIN_DEL_SERIES, USERPENNAME, USERUID, $title))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'DL', " . time() . ")");
+	}
+}
+?>

--- /dev/null
+++ b/includes/emailer.php
@@ -1,1 +1,111 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+
+function sendemail($to_name,$to_email,$from_name,$from_email,$subject,$message,$type="plain",$cc="",$bcc="") {
+                 
+	global $language, $smtp_host, $smtp_username, $smtp_password, $siteemail;     
+   
+	// Check for hackers and spammers and bad input
+	if(!isset($_SERVER['HTTP_USER_AGENT'])) return false;
+	$badStrings = array("Content-Type:", "MIME-Version:", "Content-Transfer-Encoding:", "bcc:", "cc:");
+	$checks = array($to_name, $to_email, $from_name, $from_email, $subject);
+	foreach($checks as $check) {
+		foreach($badStrings as $bad){
+			if(strpos($check, $bad) !== false) return false; // Spammer
+		}
+	}
+	unset($bad, $badStrings, $checks, $check);
+	if (!((bool) preg_match('/^[-_a-z0-9\'+*$^&%=~!?{}]++(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*+@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d++)?$/iD', $to_email))) return false; // Bad e-mail
+	if (!((bool) preg_match('/^[-_a-z0-9\'+*$^&%=~!?{}]++(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*+@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d++)?$/iD', $from_email))) {
+		echo "bad email";
+		return false; // Bad e-mail
+	}
+	if (empty($_SERVER['HTTP_USER_AGENT']) || !$_SERVER['REQUEST_METHOD'] == "POST") return false; // Spammer
+	$subject = descript(strip_tags($subject));
+	$message = descript($message);
+	// End paranoia
+ 
+	// Try to determine the right $type setting
+ 	if(strpos($message, "<br>") || strpos($message, "</p>") || strpos($message, "<br />") || strpos($message, "<br>") || strpos($message, "<a href")) $type = "html";
+	
+	require_once(_BASEDIR."includes/PHPMailerAutoload.php");
+	$mail = new PHPMailer;
+	if(file_exists(_BASEDIR."languages/mailer/phpmailer.lang-".$language.".php"))
+		$mail->SetLanguage($language, _BASEDIR."languages/mailer/");
+	else 
+		$mail->SetLanguage("en", _BASEDIR."languages/mailer/");
+
+	if(!$smtp_host) {
+		$mail->IsMail( );
+	}
+	else { 
+		$mail->IsSMTP( );
+		$mail->Host = $smtp_host;
+		$mail->SMTPAuth = true;
+		$mail->Username = $smtp_username;
+		$mail->Password = $smtp_password;
+	}
+	$mail->CharSet = _CHARSET;
+	$mail->From = $siteemail;
+	$mail->FromName = $from_name;
+	$mail->AddAddress($to_email, $to_name);
+	$mail->AddReplyTo($from_email, $from_name);
+	if($cc) {
+		$cc = explode(", ", $cc);
+		foreach ($cc as $ccaddress) {
+			$mail->AddCC($ccaddress);
+		}
+	}
+	if ($bcc) {
+		$bcc = explode(", ", $bcc);
+		foreach ($bcc as $bccaddress) {
+			$mail->AddBCC($bccaddress);
+		}
+	}
+	if ($type == "plain") {
+		$mail->IsHTML(false);
+	} else {
+		$mail->IsHTML(true);
+	}
+	
+	$mail->Subject = $subject;
+	$mail->Body = $message;
+	if(!$mail->Send()) {
+		$mail->ErrorInfo;
+		$mail->ClearAllRecipients();
+		$mail->ClearReplyTos();
+		return $mail->ErrorInfo;
+	} else {
+		$mail->ClearAllRecipients(); 
+		$mail->ClearReplyTos();
+		return true;
+	}
+
+}
+?>

--- /dev/null
+++ b/includes/get_session_vars.php
@@ -1,1 +1,69 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+// Get session variables from cookie data if not logged in.
+// To bridge to another program replace (or add to) this information with the bridge to your other script.  See examples in the includes/bridges/ folder.
+if (!empty($_COOKIE[$sitekey."_useruid"])) {
+	$userdata = dbassoc(dbquery("SELECT ap.*, "._UIDFIELD." as uid, "._PENNAMEFIELD." as penname, "._EMAILFIELD." as email, "._PASSWORDFIELD." as password FROM "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs as ap ON ap.uid = "._UIDFIELD." WHERE "._UIDFIELD." = '".$_COOKIE[$sitekey."_useruid"]."'"));
+	if($userdata && $userdata['level'] != -1 && $_COOKIE[$sitekey.'_salt'] == md5($userdata['email'] . $userdata['password'])) {
+		define("USERUID", $userdata['uid']);
+		define("USERPENNAME", $userdata['penname']);
+		// the following line fixes missing authorpref rows
+		if(empty($userdata['userskin'] )) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_authorprefs(uid, userskin, storyindex, sortby, tinyMCE) VALUES('".$userdata['uid']."', '$defaultskin', '$displayindex', '$defaultsort', '$tinyMCE')");
+		if(!isset($_SESSION[$sitekey."_skin"]) && !empty($userdata['userskin'])) $siteskin = $userdata['userskin'];
+		else if(isset($_SESSION[$sitekey."_skin"])) $siteskin = $_SESSION[$sitekey."_skin"];
+		else $siteskin = $defaultskin;
+		define("uLEVEL", $userdata['level']);
+		define("isADMIN", uLEVEL > 0 ? true : false);
+		define("isMEMBER", true);
+		if(EMPTY($_SESSION[$sitekey."_ageconsent"])) $ageconsent = $userdata['ageconsent'];
+		else $ageconsent = $_SESSION[$sitekey."_ageconsent"];
+	}
+}
+if(!empty($_SESSION[$sitekey."_useruid"]) && !defined("USERUID")) {
+	$userdata = dbassoc(dbquery("SELECT ap.*, "._UIDFIELD." as uid, "._PENNAMEFIELD." as penname, "._EMAILFIELD." as email, "._PASSWORDFIELD." as password FROM "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs as ap ON ap.uid = "._UIDFIELD." WHERE "._UIDFIELD." = '".$_SESSION[$sitekey."_useruid"]."'"));
+	if($userdata && $userdata['level'] != -1 && $_SESSION[$sitekey.'_salt'] == md5($userdata['email'] . $userdata['password'])) {
+		define("USERUID", $userdata['uid']);        
+		define("USERPENNAME", $userdata['penname']);
+		// the following line fixes missing authorpref rows
+		if(empty($userdata['userskin'] )) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_authorprefs(uid, userskin, storyindex, sortby, tinyMCE) VALUES('".$userdata['uid']."', '$defaultskin', '$displayindex', '$defaultsort', '$tinyMCE')");
+		if(!isset($_SESSION[$sitekey."_skin"]) && !empty($userdata['userskin'])) $siteskin = $userdata['userskin'];
+		else if(isset($_SESSION[$sitekey."_skin"])) $siteskin = $_SESSION[$sitekey."_skin"];
+		else $siteskin = $defaultskin;
+		define("uLEVEL", $userdata['level']);
+		define("isADMIN", uLEVEL > 0 ? true : false);
+		define("isMEMBER", true);
+		if(!isset($_SESSION[$sitekey."_ageconsent"])) $ageconsent = $userdata['ageconsent'];
+		else $ageconsent = $_SESSION[$sitekey."_ageconsent"];
+	}
+}
+if(!defined("USERUID")) define("USERUID", 0);
+if(!defined("USERPENNAME")) define("USERPENNAME", false);
+if(!defined("uLEVEL")) define("uLEVEL", 0);
+if(!defined("isMEMBER")) define("isMEMBER", false);
+if(!defined("isADMIN")) define("isADMIN", false);
+if(empty($siteskin)) $siteskin = $defaultskin;
+
+?>

--- /dev/null
+++ b/includes/index.php

--- /dev/null
+++ b/includes/javascript.js
@@ -1,1 +1,310 @@
 
+function pop(theurl, w, h, scroll)
+{
+ var the_atts = "width="+w+", height="+h+", top=20, screenY=20, left=20, screenX=20,  toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars="+scroll+", resizable=yes, copyhistory=no";
+ // open window
+ window.open(theurl,'pop',the_atts);
+}
+
+function more_info(sid) {
+   if(document.getElementById('more_' + sid).style.display == 'none') {
+       document.getElementById('more_' + sid).style.display = 'block';
+       document.getElementById('info_' + sid).style.display = 'none';
+   }
+   else {
+       document.getElementById('info_' + sid).style.display = 'block';
+       document.getElementById('more_' + sid).style.display = 'none';
+   }
+}
+
+function category(pid, catid, name, locked, order) {
+	this.pid = pid;
+	this.catid = catid;
+	this.name = name;
+	this.locked = locked;
+	this.order = order;
+}
+
+function character(charid, catid, charname) { 
+	this.charid = charid;
+	this.catid = catid;
+	this.charname = charname;
+}
+
+function resetCats(element) {
+	var selItem = document.getElementById(element).selectedIndex;
+	var selValue = document.getElementById(element).options[selItem].value;
+	var serverPage = basedir + "includes/categorylist.php";
+	myRequest = new ajaxObject(serverPage, resetCatsResponse);
+	val = "element=" + element + "&";
+	val = val + "catid="+selValue;
+	myRequest.update(val);
+}
+
+function resetCatsResponse(responseText, responseStatus) {
+	if(responseStatus == 200) {
+		categories.length = 0;
+		eval(responseText);
+		var selItem = document.getElementById(el).selectedIndex;
+		var selValue = document.getElementById(el).options[selItem].value;
+		var element = document.getElementById(el);
+		element.options.length = 0;
+		element.options[element.options.length] = new Option(lang['Back2Cats'], -1);
+		for(z = 0; z < categories.length; z++) {
+			categories[z].name = unescape(categories[z].name).replaceAll("+", " ");
+			if(categories[z].pid == selValue || categories[z].catid == selValue) 
+				element.options[element.options.length] = new Option(categories[z].name, categories[z].catid);
+		}
+		if(selValue != -1) element.options.selectedIndex = 1;
+	}
+	else {
+		alert(responseStatus + ' -- Error Processing Request');
+	}
+}
+
+function addCat(fromGroup, toGroup) {
+	var strValues = "";
+	var listLength = document.getElementById(toGroup).length;
+	var selItem = document.getElementById(fromGroup).selectedIndex;
+	var selValue = document.getElementById(fromGroup).options[selItem].value;
+	var selText = document.getElementById(fromGroup).options[selItem].text;
+	var newItem = true;
+	for(i = 0; i < categories.length; i++) {
+		categories[i].name = unescape(categories[i].name).replaceAll("+", " ");
+		if(categories[i].catid == selValue) {
+			if(categories[i].locked == 1) {
+				alert(lang['CatLocked']);
+				return false;
+			}
+		}
+	}
+	strValues = selValue;
+	for(i = 0; i < listLength; i++) {
+		strValues = strValues + "," + document.getElementById(toGroup).options[i].value;
+		if(document.getElementById(toGroup).options[i].text == selText) {
+			newItem = false;
+			break;
+		}
+	}
+	if(newItem) {
+		document.getElementById(toGroup).options[listLength] = new Option(selText, selValue);
+		document.getElementById(fromGroup).options[selItem] = null;
+		document.getElementById("catid").value = strValues;
+	}
+	buildCharacters(toGroup);
+}
+
+function browseCategories(element) {
+	var selItem = document.getElementById(element).selectedIndex;
+	var selValue = document.getElementById(element).options[selItem].value;
+	var serverPage = basedir + "includes/browsecategories.php";
+	myRequest = new ajaxObject(serverPage, browseCategoriesResponse);
+	val = "element=" + element + "&";
+	val = val + "catid="+selValue;
+	myRequest.update(val);
+}
+
+function browseCategoriesResponse(responseText, responseStatus) {
+	if(responseStatus == 200) {
+		var categories = new Array();
+		var characters = new Array();
+		eval(responseText);
+		var selItem = document.getElementById(el).selectedIndex;
+		var selValue = document.getElementById(el).options[selItem].value;
+		var element = document.getElementById(el);
+		var charlist1 = document.getElementById('charlist1');
+		var charlist2 = document.getElementById('charlist2');
+		var copyOption1 = new Array( );
+		var copyOption2 = new Array( );
+		element.options.length = 0;
+		if(selValue != -1) element.options[element.options.length] = new Option(lang['Back2Cats'], -1);
+		else element.options[element.options.length] = new Option(lang['Categories'], -1);
+		for(z = 0; z < categories.length; z++) {
+			categories[z].name = unescape(categories[z].name).replaceAll("+", " ");
+			element.options[element.options.length] = new Option(categories[z].name, categories[z].catid);
+		}
+		if(selValue != -1) element.options.selectedIndex = 1;
+		var copyOption1 = characters;
+		var copyOption2 = characters;
+	
+		for(x = 0; x < copyOption1.length; x++) {
+			for(y = 0; y < charlist1.length; y++) {
+				if(charlist1.options[y].selected == true && charlist1.options[y].value == copyOption1[x][1]) {
+					copyOption1[x][2] = false;
+					copyOption1[x][3] = true;
+				}
+				if(charlist2.options[y].selected == true && charlist1.options[y].value == copyOption2[x][1]) {
+					copyOption2[x][2] = false;
+					copyOption2[x][3] = true;
+				}
+			}
+		}
+		if(charlist1) charlist1.length = 0;
+		charlist2.length = 0;
+		if(charlist1) charlist1.options[charlist1.options.length] = new Option(lang['Characters'], '', false, false);
+		charlist2.options[charlist2.options.length] = new Option(lang['Characters'], '', false, false);
+
+		for(i = 0; i < copyOption1.length; i++) {
+			if(charlist1) charlist1.options[charlist1.options.length] = new Option(copyOption1[i][1], copyOption1[i][0], copyOption1[i][2], copyOption1[i][3]);
+			charlist2.options[charlist2.options.length] = new Option(copyOption2[i][1], copyOption2[i][0], copyOption2[i][2], copyOption2[i][3]);
+		}
+	}
+	else {
+		alert(responseStatus + ' -- Error Processing Request');
+	}	
+}	
+
+function buildCharacters(cats) {
+	if(document.form.formname.value == "admins") return;
+	var catslist = document.getElementById(cats);
+	var serverPage = basedir + "includes/characterlist.php";
+	var clist = new Array( );
+	for(z = 0; z < catslist.length; z++) {
+		clist[z] = catslist.options[z].value;
+	}
+	clist[z] = '-1';
+	myRequest = new ajaxObject(serverPage, buildCharactersResponse);
+	val = "element=" + cats + "&";
+	val = val + "catid="+clist.join(",");
+	myRequest.update(val);
+
+}
+
+String.prototype.replaceAll = function(pcFrom, pcTo){
+	var i = this.indexOf(pcFrom);
+	var c = this;
+	
+	while (i > -1){
+		c = c.replace(pcFrom, pcTo);
+		i = c.indexOf(pcFrom);
+	}
+	return c;
+}
+
+function buildCharactersResponse(responseText, responseStatus) {
+	if(responseStatus == 200) {
+		characters.length = 0;
+		eval(responseText);
+		var charid = document.form.charid;			
+		var copyOption = new Array( );
+		var a = 0;
+		for(y = 0; y < charid.length; y++) {
+			if(charid.options[y].selected == true) {
+				for(a = 0; a < characters.length; a++) {
+					if(characters[a][0] == charid.options[y].value) {
+						characters[a][2] = false;
+						characters[a][3] = true;
+					}
+				}
+			}
+		}
+		document.form.charid.length = 0;
+		for(i = 0; i < characters.length; i++) {
+			charid.options[charid.options.length] = new Option(unescape(characters[i][1]).replaceAll("+", " "), characters[i][0], characters[i][2], characters[i][3]);
+		}
+	}
+	else {
+		alert(responseStatus + ' -- Error Processing Request');
+	}
+}
+
+function removeCat( catid ) {
+	var selitem = document.getElementById(catid).selectedIndex;
+	var strValues = "";
+	document.getElementById(catid).options[selitem] = null;
+	for(i = 0; i < document.getElementById(catid).length; i++) {
+		strValues = strValues + "," + document.getElementById(catid).options[i].value;
+	}
+	document.getElementById("catid").value = strValues;
+	buildCharacters(catid);
+}
+
+function displayCatRows(catid) {
+	var serverPage = basedir + "includes/categorylist.php";
+	myRequest = new ajaxObject(serverPage, displayCatRowsResponse);
+	
+	val = "element="+catid+"&catid="+catid;
+	myRequest.update(val);
+}
+
+function displayCatRowsResponse(responseText, responseStatus) {
+	if(responseStatus == 200) {
+		categories = Array( );
+		eval(responseText);
+		if(navigator.appName.indexOf('Microsoft') > -1) var canSee = 'block';
+		else var canSee = 'table-row';
+		var start = document.images['c_' + el].src.lastIndexOf(".") - 3;
+		if(document.images['c_' + el].src.indexOf('on', start) == -1) {
+			var state = 'off';
+			tmp = document.images['c_' + el].src;
+			document.images['c_' + el].src = document.images['c_' + el].src.replace('_off', '_on');
+		}
+		else {
+			var state = 'on';
+			tmp = document.images['c_' + el].src;
+			document.images['c_' + el].src = document.images['c_' + el].src.replace('_on', '_off');
+		}
+		for(x = 0; x < categories.length; x++) {
+			if(state == "off" && x == 0) continue;
+			if(row = document.getElementById('catid_' + categories[x].catid)) {
+				if(state == 'off')
+					row.style.display = 'none';
+				else
+					row.style.display = canSee;
+			}
+		}			
+	}
+	else {
+		alert(responseStatus + ' -- Error Processing Request');
+	}
+}
+
+function setCategoryForm( chosen ) {
+	var serverPage = basedir + "includes/categorylist.php";
+	myRequest = new ajaxObject(serverPage, setCategoryFormResponse);
+	var category = chosen.options[chosen.selectedIndex].value;
+	val = "element=" + chosen.name + "&" + "catid=" + category;
+	myRequest.update(val);
+}
+
+function setCategoryFormResponse(responseText, responseStatus) {
+	if(responseStatus == 200) {
+		categories = Array( );
+		eval(responseText);
+		var selItem = document.getElementById(el).selectedIndex;
+		var selValue = document.getElementById(el).options[selItem].value;
+		var element = document.getElementById(el);
+		element.options.length = 0;
+		orderafter = document.getElementById("orderafter");
+		orderafter.options.length = 0;
+		if(selValue != -1) element.options[element.options.length] = new Option(lang['Back2Cats'], -1);
+		else element.options[element.options.length] = new Option(lang['Categories'], -1);
+		for(z = 0; z < categories.length; z++) {
+			categories[z].name = unescape(categories[z].name).replaceAll("+", " ");
+			element.options[element.options.length] = new Option(categories[z].name, categories[z].catid);
+			if(!z) continue;
+			orderafter.options[orderafter.options.length] = new Option(categories[z].name, categories[z].catid);
+		}
+		if(selValue != -1) element.options.selectedIndex = 1;
+			
+	}
+	else {
+		alert(responseStatus + " -- Error Processing Request");
+	}
+}
+
+function displayTypeOpts() {
+	var choice = document.getElementById('field_type').selectedIndex;
+	var type = document.getElementById('field_type').options[choice].value;
+	if(window.tinyMCE) tinyMCE.execCommand('mceResetDesignMode'); 
+
+	for(i = 1; i < 6; i++) {
+		if(document.getElementById('opt_' + i)) {
+			document.getElementById('opt_' + i).style.display = 'none';
+		}
+	}
+	document.getElementById('opt_' + type).style.display = 'block';
+	if(window.tinyMCE) tinyMCE.execCommand('mceResetDesignMode'); 
+}
+
+

--- /dev/null
+++ b/includes/members_list.php
@@ -1,1 +1,55 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,bridges
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+		$output .= build_alphalinks($pagelink, $let);
+		$count = dbquery($countquery);
+		list($numrows)= dbrow($count);
+		$limit = $itemsperpage *  $displaycolumns;
+		$total = ($numrows > $limit ? $limit : $numrows);
+		$listtotal = floor($total /  $displaycolumns);
+		if($total % $displaycolumns != 0) $listtotal++;
+		$colwidth = (100/ $displaycolumns) -1;
+		$count = 0;
+		$column = 1;
+		$authorquery = $authorquery. " ORDER BY "._PENNAMEFIELD." LIMIT $offset,$limit";
+		$result2 = dbquery($authorquery);
+		$output .= "<div id=\"columncontainer\"><div id=\"memberblock\">".($displaycolumns ? "<div class=\"column\">" : "");
+		while($author = dbassoc($result2)) {
+			$count++;
+			if(empty($author['stories'])) $author['stories'] = 0; // For bridges site that may not have author prefs set.
+			$output .= (isset($authorlink) ? $authorlink : "<a href=\"viewuser.php?uid=").$author['uid']."\">".stripslashes($author['penname'])."</a> [".$author['stories']."]<br />\n";
+			if( $count >= $listtotal && $column != $displaycolumns) {
+				$output .= "</div><div class=\"column\">";
+				if($total % $displaycolumns == $column) $listtotal--;
+				$column++;
+				$count = 0;
+			}
+		}
+		$output .= "</div>".($displaycolumns ? "</div>" : "")."<div class='cleaner'>&nbsp;</div></div>";
+		if ($numrows > $limit) {
+			$pagelink = $pagelink ? $pagelink : "authors.php?action=viewlist&amp;".($let ? "let={$let}&amp;" : "");
+			$output .= build_pagelinks($pagelink, $numrows, $offset, $displaycolumns);
+		}
+?>

--- /dev/null
+++ b/includes/mysqli_functions.php
@@ -1,1 +1,94 @@
+<?php
 
+// Some DB functions 
+if(!function_exists("dbconnect")) { // just in case.  Some people seemed to be having an issue and this was the easiest fix.
+
+function dbconnect($dbhost, $dbuser, $dbpass, $dbname ) {
+	$mysql_access = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
+	try
+	{
+		$mysql_access = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
+	}
+	catch (mysqli_sql_exception $e)
+	{
+		if (mysqli_connect_error())
+		{
+			include(_BASEDIR . "languages/en.php"); // Because we haven't got a language set yet.
+			die(_FATALERROR . " " . _NOTCONNECTED);
+		}
+	}
+	//mysqli_query($mysql_access, "SET SESSION sql_mode = 'NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION'");
+	mysqli_query($mysql_access, "SET SESSION sql_mode = 'NO_ENGINE_SUBSTITUTION'");
+    mysqli_query($mysql_access, "SET NAMES UTF8;");
+	return $mysql_access;
+}
+
+
+function dbquery($query) {
+	global $debug, $headerSent, $dbconnect;
+	if($debug && $headerSent) echo "<!-- $query -->\n";
+	$result = NULL;
+	try
+	{
+			$result = $dbconnect->query($query);
+	}
+	catch (mysqli_sql_exception $e)
+	{
+		if(function_exists('accessDenied')) {
+			accessDenied(_FATALERROR . (isADMIN ? "Query: " . $query . "<br />Error: (" . $dbconnect->errno . ") " . $dbconnect->error : ""));
+		}
+		else {		
+			// this is very rare case. Uncomment this if you really lost what is doing. This is before pagesetup.php, so Admin is not set
+			//	echo "Query: " . $query . "<br />Error: (" . $dbconnect->errno . ") " . $dbconnect->error  <br /> ;
+			die(" <b>A fatal MySQL error was encountered.</b><br /> Check tableprefix. ");	
+		}
+			
+	} 
+	return $result;
+}
+
+function dbnumrows($query) {
+	global $debug, $dbconnect;
+	if ($query === false && $debug) {
+		echo "<!-- dbnumrows ".$dbconnect->error." -->\n";
+	}
+	return $query->num_rows;
+}
+
+function dbassoc($query) {
+	global $debug, $dbconnect;
+	if ($query === false && $debug) {
+		echo "<!-- dbassoc ".$dbconnect->errno." -->\n";
+	}
+	return $query->fetch_assoc();
+}
+
+function dbinsertid($tablename = 0) {
+	global $dbconnect;
+	return $dbconnect->insert_id;
+}
+
+function dbrow($query) {
+	global $debug, $dbconnect;
+	if ($query === false && $debug) {
+		if($dbconnect->error) echo "<!-- dbrow ".$dbconnect->errno." -->\n";
+	}
+	return $query->fetch_row();
+}
+
+function dbclose() {
+	global $dbconnect;
+	$dbconnect->close();
+}
+
+// Used to escape text being put into the database.
+function escapestring($str) {
+	global $dbconnect;
+   if (!is_array($str)) return $dbconnect->real_escape_string($str);
+   return array_map('escapestring', $str);
+}
+
+// End DB functions
+
+}
+?>

--- /dev/null
+++ b/includes/pagesetup.php
@@ -1,1 +1,114 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+
+/* 
+This file does some of the setup of the common elements of the pages within your site. 
+It also checks the common $_GET variables and cleans them up to prevent hacking and attacks.
+*/
+
+if(!defined("_CHARSET")) exit( );
+
+$favtypes = array("SE" => "series", "ST" => "stories", "AU" =>"authors");
+$revtypes = array("SE" => "series", "ST" => "stories");
+
+$catlist = array( );
+$catresults = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_categories ORDER BY leveldown, displayorder");
+while($cat = dbassoc($catresults)) {
+	$catlist[$cat['catid']] = array("name" => stripslashes($cat['category']), "pid" => $cat['parentcatid'], "order" => $cat['displayorder'], "locked" => $cat['locked'], "leveldown" => $cat['leveldown']);
+}
+$charlist = array( );
+$result = dbquery("SELECT charname, catid, charid FROM ".TABLEPREFIX."fanfiction_characters ORDER BY charname");
+while($char = dbassoc($result)) {
+	$charlist[$char['charid']] = array("name" => stripslashes($char['charname']), "catid" => $char['catid']);
+}
+$classlist = array( );
+$classresults = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_classes ORDER BY class_name");
+while($class = dbassoc($classresults)) {
+	$classlist[$class['class_id']] = array("type" => $class['class_type'], "name" => stripslashes($class['class_name']));
+}
+$classtypelist = array( );
+$classtyperesults = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_classtypes ORDER BY classtype_name");
+while($type = dbassoc($classtyperesults)) {
+	$classtypelist[$type['classtype_id']] = array("name" => $type['classtype_name'], "title" => stripslashes($type['classtype_title']));
+}
+$ratlist = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_ratings");
+while($rate = dbassoc($ratlist)) {
+	$ratingslist[$rate['rid']] = array("name" => $rate['rating'], "ratingwarning" => $rate['ratingwarning'], "warningtext" => $rate['warningtext']);
+}
+unset($catresult, $result, $classresults, $classtyperesults, $ratlist, $type, $rate, $class, $char, $cat);
+$action = escapestring($action);
+// Set up the page template
+
+if($action != "printable") {
+	$tpl->assignInclude( "header", "./$skindir/header.tpl" );
+	$tpl->assignInclude( "footer", "./$skindir/footer.tpl" );
+}
+$tpl->prepare( );
+// End page template setup
+
+if(file_exists("$skindir/variables.php")) include("$skindir/variables.php");
+
+// If they weren't set in variables.php, set the defaults for these 
+if(!isset($up)) $up = "<img src=\"images/arrowup.gif\" border=\"0\" width=\"13\" height=\"18\" align=\"left\" alt=\""._UP."\">";
+if(!isset($down)) $down = "<img src=\"images/arrowdown.gif\" border=\"0\" width=\"13\" height=\"18\" align=\"right\" alt=\""._DOWN."\">";
+
+$linkquery = dbquery("SELECT * from ".TABLEPREFIX."fanfiction_pagelinks ORDER BY link_access ASC");
+if(!isset($current)) $current = "";
+
+while($link = dbassoc($linkquery)) {
+	if($link['link_access'] && !isMEMBER) continue;
+	if($link['link_access'] == 2 && uLEVEL < 1) continue;
+	if($link['link_name'] == "register" && isMEMBER) continue;
+	if(strpos($link['link_url'], "http://") === false && strpos($link['link_url'], "https://") === false) $link['link_url'] = _BASEDIR.$link['link_url'];
+	$tpl->assignGlobal($link['link_name'], "<a href=\"".$link['link_url']."\" title=\"".$link['link_text']."\"".($link['link_target'] ? " target=\"_blank\"" : "").(!empty($link['link_key']) ? " accesskey='".$link['link_key']."'" : "").($current == $link['link_name'] ? " id=\"current\"" : "").">".$link['link_text']."</a>");
+	$pagelinks[$link['link_name']] = array("id" => $link['link_id'], "text" => $link['link_text'], "url" => $link['link_url'], "key" => $link['link_key'], "link" => "<a href=\"".$link['link_url']."\" title=\"".$link['link_text']."\"".(!empty($link['link_key']) ? " accesskey='".$link['link_key']."'" : "").($link['link_target'] ? " target=\"_blank\"" : "").($current == $link['link_name'] ? " id=\"current\"" : "").">".$link['link_text']."</a>");
+}
+
+if($action != "printable") $tpl->newBlock("header");
+$tpl->assignGlobal("sitename", $sitename);
+$tpl->assignGlobal("slogan", $slogan);
+$tpl->assignGlobal("page_id", $current);
+$tpl->assignGlobal("basedir", _BASEDIR);
+$tpl->assignGlobal("skindir", $skindir);	
+$tpl->assignGlobal("rss", "<a href='"._BASEDIR.$pagelinks['rss']['url']."'><img src='"._BASEDIR."images/xml.gif' alt='RSS' title = 'RSS' border='0'></a>");
+if(isset($pagelinks['rss'])) $tpl->assignGlobal("columns", $displaycolumns);
+if($action != "printable") {
+	$tpl->newBlock("footer");
+	$copy = dbquery("SELECT message_text FROM ".TABLEPREFIX."fanfiction_messages WHERE message_name = 'copyright' LIMIT 1");
+	if($copy) list($copyright) = dbrow($copy);
+	$tpl->assign( "footer", $copyright);
+	$tpl->gotoBlock( "_ROOT" );
+}
+foreach($blocks as $block=>$value) {
+	if(empty($value['status']) || ($value['status'] == 2 && $current != "home")) continue;
+	if(empty($value['file'])) continue;
+	if($value['status'] && file_exists(_BASEDIR."blocks/".$value['file'])) {
+		$content = "";
+		$tpl->assignGlobal($block."_title", !empty($value['title']) ? stripslashes($value['title']) : "");
+		if(file_exists(_BASEDIR."blocks/".$value['file'])) include(_BASEDIR."blocks/".$value['file']);
+		$tpl->assignGlobal($block."_content", $content);
+	}
+}
+
+$tpl->gotoBlock( "_ROOT" );
+?>

--- /dev/null
+++ b/includes/plain.button.php
@@ -1,1 +1,45 @@
+<?php
 
+session_start();
+define("_BASEDIR", "../");
+include("../config.php");
+unset($_SESSION[$sitekey.'_digit']);
+
+$image = imagecreate(120, 30);
+
+$white    = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);
+$gray    = imagecolorallocate($image, 0xC0, 0xC0, 0xC0);
+$darkgray = imagecolorallocate($image, 0x50, 0x50, 0x50);
+
+srand((double)microtime()*1000000);
+unset($digit, $cnum);
+for ($i = 0; $i < 30; $i++) {
+  $x1 = rand(0,120);
+  $y1 = rand(0,30);
+  $x2 = rand(0,120);
+  $y2 = rand(0,30);
+  imageline($image, $x1, $y1, $x2, $y2 , $gray);  
+}
+
+for ($i = 0; $i < 5; $i++) {
+$cnum[$i] = rand(0,9);
+}
+
+
+for ($i = 0; $i < 5; $i++) {
+ $fnt = rand(3,5);
+ $x = $x + rand(12 , 20);
+ $y = rand(7 , 12); 
+ imagestring($image, $fnt, $x, $y, $cnum[$i] , $darkgray); 
+}
+
+$digit = "$cnum[0]$cnum[1]$cnum[2]$cnum[3]$cnum[4]";
+
+$_SESSION[$sitekey.'_digit'] = md5($sitekey.$digit);
+header('Content-type: image/png');
+imagepng($image);
+imagedestroy($image);
+exit( );
+?> 
+
+

--- /dev/null
+++ b/includes/queries.php
@@ -1,1 +1,19 @@
+<?php
 
+// Default query strings used throughout the script.  You may need to alter these to bridge to other scripts or databases.
+
+define ("_AUTHORPREFIX", defined("TABLEPREFIX") ? TABLEPREFIX : $tableprefix);
+
+define ("_UIDFIELD", "author.uid");  // Do not change the aliasing (the "author." part)!
+define ("_PENNAMEFIELD", "author.penname");  // Do not change the aliasing (the "author." part)!
+define ("_EMAILFIELD", "author.email");  // Do not change the aliasing (the "author." part)!
+define ("_PASSWORDFIELD", "author.password"); //  Do not change the aliasing (the "author." part)!
+define ("_AUTHORTABLE", _AUTHORPREFIX."fanfiction_authors as author"); // Do not change the aliasing (the "as author" part)!
+
+define ("_STORYQUERY",  "SELECT stories.*, "._PENNAMEFIELD." as penname, stories.date as date, stories.updated as updated FROM ("._AUTHORTABLE.", ".TABLEPREFIX."fanfiction_stories as stories) WHERE "._UIDFIELD." = stories.uid AND stories.validated > 0 ");
+define ("_STORYCOUNT", "SELECT count(sid) FROM ".TABLEPREFIX."fanfiction_stories as stories WHERE validated > 0");
+define ("_SERIESQUERY", "SELECT series.*, "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE.", ".TABLEPREFIX."fanfiction_series as series WHERE "._UIDFIELD." = series.uid ");
+define ("_SERIESCOUNT", "SELECT COUNT(seriesid) FROM ".TABLEPREFIX."fanfiction_series as series ");
+define ("_MEMBERLIST", "SELECT "._PENNAMEFIELD." as penname, "._UIDFIELD." as uid, ap.stories FROM "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs AS ap ON "._UIDFIELD." = ap.uid");
+define ("_MEMBERCOUNT", "SELECT COUNT("._UIDFIELD.") FROM "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs AS ap ON ap.uid = "._UIDFIELD);
+?>

--- /dev/null
+++ b/includes/reviewform.php
@@ -1,1 +1,56 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+if(!isset($item)) $item = "";
+if(!isset($action)) $action == "add";
+$form = "<form method=\"POST\" id=\"reviewform\" enctype=\"multipart/form-data\" action=\"reviews.php?action=".($action == "edit" ? "edit&amp;reviewid=".$review['reviewid'] : "add&amp;type=$type&amp;item=$item").(!empty($nextchapter) ? "&amp;next=$nextchapter" : "")."\">
+<div style=\"width: 350px; margin: 0 auto; text-align: left;\"><label for=\"reviewer\">"._NAME.":</label> ";
+if($action != "edit") {
+	$review = array('reviewid' => '', 'reviewer' => '', 'review' => '', 'rating' => '-1');
+	if(isMEMBER)
+		$form .= USERPENNAME." <INPUT type=\"hidden\" name=\"reviewer\" value=\"".USERPENNAME."\"><INPUT type=\"hidden\" name=\"uid\" value=\"".USERUID."\">";
+	else
+		$form .= "<INPUT name=\"reviewer\" id=\"reviewer\" size=\"30\" maxlength=\"200\">";
+}
+else $form .= $review['reviewer']."<INPUT type=\"hidden\" name=\"reviewid\" value=\"".$review['reviewid']."\">";
+$form .= "<br /><label for=\"review\">"._REVIEW.":</label><br />
+<textarea class=\"textbox\" name=\"review\" id=\"review\" cols=\"40\" rows=\"5\">".$review['review']."</textarea>";
+if($tinyMCE) 
+	$form .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('review');\" checked><label for='toggle'>"._TINYMCETOGGLE."</label></div>";
+if($ratings == "2"){
+	$form .= "<div><label for=\"rating\">"._OPINION."</label> <select id=\"rating\" name=\"rating\" class=\"textbox\">
+		<option value=\"1\"".($review['rating'] == 1 ? " selected" : "").">"._LIKED."</option><option value=\"0\"".($review['reviewid'] && !$review['rating'] ? " selected" : "").">"._DISLIKED."</option><option value=\"-1\"".($review['rating'] == -1 || $action == "add" ? " selected" : "").">"._NONE."</option></select></div>";
+}
+if($ratings == "1") {
+	$form .= "<div><label for=\"rating\">"._REVIEWRATING.":</label> <select name=\"rating\">";
+	for($x=10; $x > 0; $x--) {
+		$form .= "<option value=\"$x\"".($review['rating'] == $x ? " selected" : "").">$x</option>";
+	}
+	$form .= "<option value=\"-1\"".($review['rating'] == -1 || $action != "edit" ? " selected" : "").">"._NONE."</option></select></div>";
+}
+if(!USERUID && !empty($captcha)) $form .= "<div><span class=\"label\">"._CAPTCHANOTE."</span><input MAXLENGTH=5 SIZE=5 name=\"userdigit\" type=\"text\" value=\"\"><br /><img width=120 height=30 src=\""._BASEDIR."includes/button.php\" style=\"border: 1px solid #111;\"></div>";
+
+$form .= "<INPUT type=\"hidden\" name=\"chapid\" value=\"".(isset($chapid) ? $chapid : "")."\"><div style=\"text-align: center; margin: 1ex;\"><INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></div>";
+if(!empty($rateonly)) $form .= "<div>"._REVIEWNOTE."</div>";
+$form .= "</div></form>";
+?>

--- /dev/null
+++ b/includes/seriesblock.php
@@ -1,1 +1,88 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+	if(!isset($count)) $count = 0;
+	$adminlinks = "";
+	$tpl->newBlock("seriesblock");
+	$tpl->assign("seriesid", $stories['seriesid']);
+	$tpl->assign("author", "<a href=\""._BASEDIR."viewuser.php?uid=".$stories['uid']."\">".stripslashes($stories['penname'])."</a>");
+	$tpl->assign("title", "<a href=\""._BASEDIR."viewseries.php?seriesid=".$stories['seriesid']."\">".stripslashes($stories['title'])."</a>");
+	$tpl->assign("summary", stripslashes($stories['summary']));
+	$tpl->assign("score", ratingpics($stories['rating']));
+	$tpl->assign("numstories", $stories['numstories']);
+	if($reviewsallowed == "1") {
+		$tpl->assign("reviews", "<a href=\""._BASEDIR."reviews.php?type=SE&amp;item=".$stories['seriesid']."\">"._REVIEWS."</a>");
+		$tpl->assign("numreviews", "<a href=\""._BASEDIR."reviews.php?type=SE&amp;item=".$stories['seriesid']."\">$stories[reviews]</a>");
+	}
+	$tpl->assign("category", ($stories['catid'] ? catlist($stories['catid']) : _NONE));
+	$tpl->assign("characters", $stories['characters'] ? charlist($stories['characters']) : _NONE);
+	$allclasslist = "";
+	if($stories['classes']) {
+		unset($storyclasses);
+		foreach(explode(",", $stories['classes']) as $c) {
+			$storyclasses[$classlist["$c"]['type']][] = "<a href='browse.php?type=class&amp;type_id=".$classlist["$c"]['type']."&amp;classid=$c'>".$classlist[$c]['name']."</a>";
+		}
+	}
+	foreach($classtypelist as $num => $c) {
+		if(isset($storyclasses[$num])) {
+			$tpl->assign($c['name'], implode(", ", $storyclasses[$num]));
+			$allclasslist .= "<span class='label'>".$c['title'].": </span> ".implode(", ", $storyclasses[$num])."<br />";
+		}
+		else {
+			$tpl->assign($c['name'], _NONE);
+			$allclasslist .= "<span class='label'>".$c['title'].": </span> "._NONE."<br />";
+		}
+	}
+	if(!isset($seriesType)) $seriesType = array(_CLOSED, _MODERATED, _OPEN);			
+	$tpl->assign("open", $seriesType[$stories['isopen']]);
+	$tpl->assign("oddeven", ($count % 2 ? "odd" : "even"));
+	$parents = dbquery("SELECT s.title, s.seriesid FROM ".TABLEPREFIX."fanfiction_inseries as i, ".TABLEPREFIX."fanfiction_series as s WHERE s.seriesid = i.seriesid AND i.subseriesid = '".$stories['seriesid']."'");
+	$plinks = array( );
+	while($p = dbassoc($parents)) {
+		$plinks[] = "<a href='"._BASEDIR."viewseries.php?seriesid=".$p['seriesid']."'>".$p['title']."</a>";
+	}
+	$tpl->assign("parentseries", count($plinks) ? implode(", ", $plinks) : _NONE);
+	if(!isset($seriescode)) {
+		$seriescode = array( );
+		$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'seriesblock'");
+		while($code = dbassoc($codequery)) {
+			$seriescode[] = $code['code_text'];
+		}
+	}
+	if(count($seriescode)) foreach($seriescode as $c) { eval($c); } 
+	$tpl->assign("classifications", $allclasslist);
+	if(isMEMBER && $favorites) {
+		$addtofaves = "[<a href=\"user.php?action=favse&amp;uid=".USERUID."&amp;add=".$stories['seriesid']."\">"._ADDSERIES2FAVES."</a>]";
+		if($stories['isopen'] < 2) {
+			$addtofaves .= " [<a href=\"viewuser.php?action=favau&amp;uid=".USERUID."&amp;author=".$stories['uid']."\">"._ADDAUTHOR2FAVES."</a>]";
+		}
+		$tpl->assign("addtofaves", $addtofaves);
+	}
+	if((isADMIN && uLEVEL < 4) || (USERUID != 0 && USERUID == $stories['uid'])) {
+		$tpl->assign("adminoptions", "<div class=\"adminoptions\"><span class='label'>"._ADMINOPTIONS.":</span> [<a href=\""._BASEDIR."series.php?action=add&amp;add=stories&amp;seriesid=".$stories['seriesid']."\">"._ADD2SERIES."</a>] [<a href=\""._BASEDIR."series.php?action=edit&amp;seriesid=".$stories['seriesid']."\">"._EDIT."</a>] [<a href=\""._BASEDIR."series.php?action=delete&amp;seriesid=".$stories['seriesid']."\">"._DELETE."</a>]".(!empty($adminlinks) ? " ".$adminlinks : "")."</div>");
+	}
+	else if($stories['isopen'] == 2 && USERUID) $tpl->assign("adminoptions", "[<a href=\""._BASEDIR."series.php?action=add&amp;add=stories&amp;seriesid=".$stories['seriesid']."\">"._ADD2SERIES."</a>] ".(!empty($adminlinks) ? " ".$adminlinks : ""));
+	$tpl->assign("reportthis", "[<a href=\""._BASEDIR."contact.php?action=report&amp;url=series.php?seriesid=".$stories['seriesid']."\">"._REPORTTHIS."</a>]");
+	$count++;
+?>

--- /dev/null
+++ b/includes/seriesreviews.php
@@ -1,1 +1,78 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+/* This include recalculates the average rating and review count for a series. */
+
+$storylist = array( );
+$serieslist = array( );
+$stinseries = dbquery("SELECT sid, subseriesid FROM ".TABLEPREFIX."fanfiction_inseries WHERE seriesid = '$thisseries'");
+while($st = dbassoc($stinseries)) {
+	if($st['sid']) $storylist[] = $st['sid'];
+	else if($st['subseriesid']) $serieslist[] = $st['subseriesid'];
+}
+$newrating = dbquery("SELECT AVG(rating) as totalreviews FROM ".TABLEPREFIX."fanfiction_reviews 
+	WHERE ((item = '$thisseries' AND type = 'SE')".
+	(count($storylist) > 0 ? " OR (FIND_IN_SET(item, '".(implode(",", $storylist))."') > 0 AND type = 'ST')" : "").
+	(count($serieslist) > 0 ? " OR (FIND_IN_SET(item, '".(implode(",", $serieslist))."') > 0 AND type = 'SE')" : "").
+	") AND rating != '-1'");
+list($totalreviews) = dbrow($newrating);
+$newcount = dbquery("SELECT count(reviewid) as totalcount FROM ".TABLEPREFIX."fanfiction_reviews 
+	WHERE ((item = '$thisseries' AND type = 'SE')".
+	(count($storylist) > 0 ? " OR (FIND_IN_SET(item, '".(implode(",", $storylist))."') > 0 AND type = 'ST')" : "").
+	(count($serieslist) > 0 ? " OR (FIND_IN_SET(item, '".(implode(",", $serieslist))."') > 0 AND type = 'SE')" : "").
+	") AND review != 'No Review'");
+list($totalcount) = dbrow($newcount);
+if($totalcount) $update = dbquery("UPDATE ".TABLEPREFIX."fanfiction_series SET rating = '".round($totalreviews??0)."', reviews = '$totalcount' WHERE seriesid = '$thisseries'");
+$parentq = dbquery("SELECT seriesid FROM ".TABLEPREFIX."fanfiction_inseries WHERE subseriesid = '$thisseries' AND seriesid != '$thisseries'");
+if(dbnumrows($parentq) > 0) list($parent) = dbrow($parentq);
+else $parent = false;
+while($parent) {
+	$pstinseries = dbquery("SELECT sid, subseriesid FROM ".TABLEPREFIX."fanfiction_inseries WHERE seriesid = '$thisseries'");
+	$pstorylist = array( );
+	$pserieslist = array( );
+	while($pst = dbassoc($pstinseries)) {
+		if($pst['sid']) $pstorylist[] = $pst['sid'];
+		else if($pst['subseriesid']) $pserieslist[] = $pst['subseriesid'];
+	}
+	$pnewrating = dbquery("SELECT AVG(rating) as totalcount FROM ".TABLEPREFIX."fanfiction_reviews 
+		WHERE ((item = '$parent' AND type = 'SE')".
+		(count($pstorylist) > 0 ? " OR (FIND_IN_SET(item, '".(implode(",", $pstorylist))."') > 0 AND type = 'ST')" : "").
+		(count($pserieslist) > 0 ? " OR (FIND_IN_SET(item, '".(implode(",", $pserieslist))."') > 0 AND type = 'SE')" : "").
+		") AND rating != '-1'");
+	$pnewcount = dbquery("SELECT count(review) as totalcount FROM ".TABLEPREFIX."fanfiction_reviews 
+		WHERE ((item = '$parent' AND type = 'SE')".
+		(count($pstorylist) > 0 ? " OR (FIND_IN_SET(item, '".(implode(",", $pstorylist))."') > 0 AND type = 'ST')" : "").
+		(count($pserieslist) > 0 ? " OR (FIND_IN_SET(item, '".(implode(",", $pserieslist))."') > 0 AND type = 'SE')" : "").
+		") AND review != 'No Review'");
+	list($total) = dbrow($pnewrating);
+	list($totalcount) = dbrow($pnewcount);
+	if($total) $update = dbquery("UPDATE ".TABLEPREFIX."fanfiction_series SET rating = '".round($total??0)."', reviews = '$totalcount' WHERE seriesid = '$parent' AND rating != '-1'");
+	$parentq = dbquery("SELECT seriesid FROM ".TABLEPREFIX."fanfiction_inseries WHERE subseriesid = '$parent'");
+	if(dbnumrows($parentq)) list($parent) = dbrow($parentq);
+	else $parent = false;
+}
+?>

--- /dev/null
+++ b/includes/storyblock.php
@@ -1,1 +1,131 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+	if(!isset($count)) $count = 0;
+	$tpl->assign("sid", $stories['sid']);
+	unset($challengelinks, $challengeadmin, $serieslinks, $categorylinks, $adminlinks, $authlink);
+	if($stories['coauthors'] == 1) {
+		$array_coauthors = array();
+		$coauth = dbquery("SELECT "._PENNAMEFIELD." as penname, co.uid FROM ".TABLEPREFIX."fanfiction_coauthors AS co LEFT JOIN "._AUTHORTABLE." ON co.uid = "._UIDFIELD." WHERE co.sid = '".$stories['sid']."'");
+		while($c = dbassoc($coauth)) {
+			$array_coauthors[$c['uid']] = $c['penname'];
+		}
+		$stories['coauthors'] = $array_coauthors;
+		unset($array_coauthors);
+	}
+	else if(empty($stories['coauthors'])) $stories['coauthors'] = array( );	
+	$tpl->assign("title"   , stripslashes(title_link($stories)) );
+	$tpl->assign("author"   , author_link($stories));
+	$tpl->assign("summary", stripslashes($stories['summary']) );
+	$tpl->assign("rating"   , !empty($ratingslist) ? $ratingslist[$stories['rid']]['name'] : "");
+	$tpl->assign("score", ratingpics($stories['rating']) );
+	$tpl->assign("count", $stories['count'] ? $stories['count'] : "0");
+	$allclasslist = "";
+	$adminlinks = "";
+	$storyclasses = array( );
+ 
+	if($stories['classes'] > 0) {
+		foreach(explode(",", $stories['classes']) as $c) {
+		   if(array_key_exists($c, $classlist)) {
+			if(isset($action) && $action == "printable") { 
+				 $storyclasses[$classlist["$c"]['type']][] = $classlist[$c]['name'];
+			}
+			else {
+				$storyclasses[$classlist["$c"]['type']][] = 
+				"<a href='browse.php?type=class&amp;type_id=".$classlist["$c"]['type']."&amp;classid=$c'>".$classlist[$c]['name']."</a>";
+			}	
+		}
+		}
+	}
+	foreach($classtypelist as $num => $c) {
+		if(isset($storyclasses[$num])) {
+			$tpl->assign($c['name'], implode(", ", $storyclasses[$num]));
+			$allclasslist .= "<span class='label'>".$c['title'].": </span> ".implode(", ", $storyclasses[$num])."<br />";
+		}
+		else {
+			$tpl->assign($c['name'], _NONE);
+			$allclasslist .= "<span class='label'>".$c['title'].": </span> "._NONE."<br />";
+		}
+	}		
+	// We only want to pull this list once
+	if(!isset($storycodeblocks)) {
+		$storycodeblocks = array( );
+		$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'storyblock'");
+		while($code = dbassoc($codequery)) {
+			$storycodeblocks[] = $code['code_text'];
+		}
+	}
+	if(count($storycodeblocks)) foreach($storycodeblocks as $c) { eval($c); } 
+	$tpl->assign("classifications", $allclasslist);
+	$seriesquery = "SELECT series.* FROM ".TABLEPREFIX."fanfiction_inseries as list, ".TABLEPREFIX."fanfiction_series as series WHERE list.sid = '".$stories['sid']."' AND series.seriesid = list.seriesid";
+	$seriesresult = dbquery($seriesquery) or die(_FATALERROR."<br>Query: $seriesquery<br>Error: (". $dbconnect->errno.") ". $dbconnect->error);
+	$serieslinks = array( );
+	while($s = dbassoc($seriesresult)) {
+		if(isset($action) && $action == "printable") $serieslinks[] = stripslashes($s['title']);
+		else $serieslinks[] = "<a href=\""._BASEDIR."viewseries.php?seriesid=".$s['seriesid']."\">".stripslashes($s['title'])."</a>";
+	}
+	$tpl->assign("serieslinks", (count($serieslinks) > 0 ? implode(", ", $serieslinks) : _NONE));
+	$tpl->assign("characters", ($stories['charid'] ? charlist($stories['charid']) : _NONE));
+	
+	$tpl->assign("category",  $stories['catid'] == '-1' || !$stories['catid'] ? _ORPHAN : catlist($stories['catid']));
+	$tpl->assign("completed"   , ($stories['completed'] ? _YES : _NO) );
+	$tpl->assign("roundrobin"   , ($stories['rr'] ?  (!empty($roundrobin) ? $roundrobin : "<img src=\"images/roundrobin.gif\" alt=\""._ROUNDROBIN."\">") : "") );
+	$tpl->assign("ratingpics"   , ratingpics($stories['rating']) );
+	$tpl->assign("reviews"   , ($reviewsallowed ? "<a href=\""._BASEDIR."reviews.php?type=ST&amp;item=".$stories['sid']."\">"._REVIEWS."</a>" : "") );
+	if(isMEMBER && !empty($favorites)) 
+		$tpl->assign("addtofaves", "[<a href=\""._BASEDIR."user.php?action=favst&amp;add=1&amp;sid=".$stories['sid']."\">"._ADDSTORY2FAVES."</a>] [<a href=\""._BASEDIR."user.php?action=favau&amp;add=".$stories['uid'].(count($stories['coauthors']) ? ",".implode(",", array_keys($stories['coauthors'])) : "")."\">"._ADDAUTHOR2FAVES."</a>]");
+	
+	$numchapsquery = dbquery("SELECT count(sid) FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '".$stories['sid']."' AND validated > 0");
+	list($chapters) = dbrow($numchapsquery);
+	$tpl->assign("numchapters", $chapters );
+
+	$tpl->assign("updated"   , date("$dateformat", $stories['updated']) );
+	$tpl->assign("published"   , date("$dateformat", $stories['date']) );
+	if(!empty($recentdays)) {
+		$recent = time( ) - ($recentdays * 24 * 60 *60);
+		if($stories['updated'] > $recent) $tpl->assign("new", isset($new) ? file_exists(_BASEDIR.$new) ? "<img src='$new' alt='"._NEW."'>" : $new : _NEW);
+	}
+	$tpl->assign("wordcount"   , $stories['wordcount'] ? $stories['wordcount'] : "0" );
+	$tpl->assign("numreviews"   , ($reviewsallowed == "1" ? "<a href=\""._BASEDIR."reviews.php?type=ST&amp;item=".$stories['sid']."\">".$stories['reviews']."</a>" : "") );
+	if((isADMIN && uLEVEL < 4) || USERUID == $stories['uid'] || (is_array($stories['coauthors']) && array_key_exists(USERUID, $stories['coauthors'])))
+		$adminlinks .= "[<a href=\""._BASEDIR."stories.php?action=editstory&amp;sid=".$stories['sid'].(isADMIN ? "&amp;admin=1" : "")."\">"._EDIT."</a>] [<a href=\""._BASEDIR."stories.php?action=delete&amp;sid=".$stories['sid'].(isADMIN ? "&amp;admin=1" : "")."\">"._DELETE."</a>]";
+	global $featured;
+	if($stories['featured'] == 1) {
+		$tpl->assign("featuredstory", (isset($featured) ? $featured : "<img src=\""._BASEDIR."images/blueribbon.gif\" class=\"featured\" alt=\""._FSTORY."\">"));
+		$tpl->assign("featuredtext", _FSTORY);
+		if(isADMIN && uLEVEL < 4) $adminlinks .= " ["._FEATURED.": <a href=\""._BASEDIR."admin.php?action=featured&amp;retire=".$stories['sid']."\">"._RETIRE."</a> | <a href=\""._BASEDIR."admin.php?action=featured&amp;remove=".$stories['sid']."\">"._REMOVE."</a>]";
+	}
+	else if($stories['featured'] == 2) {
+		$tpl->assign("featuredstory", (isset($retired) ? $retired : "<img src=\""._BASEDIR."images/redribbon.gif\"align=\"left\" class=\"retired\" alt=\""._PFSTORY."\">"));
+		$tpl->assign("featuredtext", _PFSTORY);
+		if(isADMIN && uLEVEL < 4) $adminlinks .= " [<a href=\""._BASEDIR."admin.php?action=featured&amp;remove=".$stories['sid']."\">"._REMOVE."</a>]";
+	}
+	else if(isADMIN && uLEVEL < 4) $adminlinks .= " [<a href=\""._BASEDIR."admin.php?action=featured&amp;feature=".$stories['sid']."\">"._FEATURED."</a>]";
+	$tpl->assign("toc", "<a href=\""._BASEDIR."viewstory.php?sid=".$stories['sid']."&amp;index=1\">"._TOC."</a>");
+	$tpl->assign("oddeven", ($count % 2 ? "odd" : "even"));
+	$tpl->assign("reportthis", "[<a href=\""._BASEDIR."contact.php?action=report&amp;url=viewstory.php?sid=".$stories['sid']."\">"._REPORTTHIS."</a>]");
+	if(isADMIN && uLEVEL < 4) $tpl->assign("adminlinks", "<div class=\"adminoptions\"><span class='label'>"._ADMINOPTIONS.":</span> ".$adminlinks."</div>");
+	else if(isMEMBER && (USERUID == $stories['uid'] || array_key_exists(USERUID, $stories['coauthors']))) $tpl->assign("adminlinks", "<div class=\"adminoptions\"><span class='label'>"._OPTIONS.":</span> ".$adminlinks."</div>");
+	$count++;
+?>

--- /dev/null
+++ b/includes/storyform.php
@@ -1,1 +1,177 @@
+<?php
 
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+
+
+//function to build story data section of the form.
+function storyform($stories, $preview = 0){
+
+	global $admin, $allowed_tags, $multiplecats,  $roundrobins, $catlist, $coauthallowed, $tinyMCE, $action, $sid;
+
+	$classes = explode(",", $stories['classes']);
+	$charid = explode(",", $stories['charid']);
+	$catid = explode(",", $stories['catid']);
+	$title = $stories['title'];
+	$summary = $stories['summary'];
+	$storynotes = $stories['storynotes'];
+	$rr = $stories['rr'];
+	$feat = $stories['featured'];
+	$rid = $stories['rid'];
+	$complete = $stories['completed'];
+	$validated = $stories['validated'];
+	$uid = $stories['uid'];
+
+	$output = "<br /><label for=\"storytitle\">"._TITLE.":</label> ".(!$title ? "<span style=\"font-weight: bold; color: red\">*</span>" : "")."<input type=\"text\" class=\"textbox\" name=\"title\" size=\"50\"".($title? " value=\"".htmlentities($title)."\"" : "")." maxlength=\"200\" id=\"storytitle\"><br />";
+	$authorquery = dbquery("SELECT "._PENNAMEFIELD." as penname, "._UIDFIELD." as uid FROM "._AUTHORTABLE." ORDER BY "._PENNAMEFIELD);
+	if($admin) {
+		if(!isset($authors)) {
+			$authors = "";
+			while($authorresult = dbassoc($authorquery)) {	
+				$authors .= "<option value=\"$authorresult[uid]\"".($uid == $authorresult['uid'] ? " selected" : "").">$authorresult[penname]</option>";
+			}
+		}
+		$output .= "<br /><label for=\"uid\">"._AUTHOR.":</label> <select name=\"uid\" id=\"uid\">$authors</select><br /><br />";
+	}
+	if($coauthallowed) {
+	$output .= "<script language=\"javascript\" type=\"text/javascript\" src=\""._BASEDIR."includes/userselect.js\"></script>
+		<script language=\"javascript\" type=\"text/javascript\" src=\""._BASEDIR."includes/xmlhttp.js\"></script><div style=\"text-align: center;\">"._COAUTHORSEARCH."</div>";
+	$output .= "<label for='coauthorsSelect'>"._SEARCH.": <input name='coauthorsSelect' id='coauthorsSelect' size='20' type='text' class='userSelect' onkeyup='setUserSearch(\"coauthors\");' autocomplete='off'></label><br />
+<div id='coauthorsDiv' name='coauthorsDiv' style='visibility: hidden;'></div>
+<iframe id='coauthorsshim' scr='' scrolling='no' frameborder='0' class='shim'></iframe>
+<div><label for='coauthorsSelected'>"._COAUTHORS.": <br /><select name='coauthorsSelected' id='coauthorsSelected' size='8' multiple='multiple' class='multiSelect' onclick='javascript: removeMember(\"coauthors\");'>";
+	$array_couids = array() ;
+	$couids = "";
+	if(is_array($stories['coauthors']) && count($stories['coauthors'])) {
+		$coauths = dbquery("SELECT "._PENNAMEFIELD." as penname, "._UIDFIELD." as uid FROM "._AUTHORTABLE." WHERE FIND_IN_SET("._UIDFIELD.", '".implode(",", $stories['coauthors'])."') > 0");
+		while($c = dbassoc($coauths)) {
+			if($c['uid'] == $stories['uid']) continue;
+			$output .= "<option label='".$c['penname']."' value='".$c['uid']."'>".$c['penname']."</option>";
+			$array_couids[] = $c['uid'];
+		}
+		$couids = implode(",", $array_couids);
+	}
+	$output .= "</select></label>
+		<input type='hidden' name='coauthors' id='coauthors' value='$couids'></div>";
+	}
+	$output .= "<p><label for=\"summary\">"._SUMMARY.":</label> ".(!$summary ? "<span style=\"font-weight: bold; color: red\">*</span>" : "")."<br><textarea class=\"textbox\" rows=\"6\" name=\"summary\" id=\"summary\" cols=\"58\">$summary</textarea>";
+	if($tinyMCE) 
+		$output .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('summary');\" checked><label for='toggle'>"._TINYMCETOGGLE."</label></div>";
+	$output .= "</p>
+		<p><label for=\"storynotes\">"._STORYNOTES.":</label> <br /><textarea class=\"textbox\" rows=\"6\" name=\"storynotes\" id=\"storynotes\" cols=\"58\">$storynotes</textarea></p>";
+	if($tinyMCE) 
+		$output .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('storynotes');\" checked><label for='toggle'>"._TINYMCETOGGLE."</label></div>";
+	if(!$multiplecats) $output .= "<input type=\"hidden\" name=\"catid\" id=\"catid\" value=\"1\">";
+	else {
+		include("includes/categories.php");
+		$output .= "<input type=\"hidden\" name=\"formname\" value=\"stories\">";
+	}
+	$output .= "<div style='float: left; width: 100%;'>";
+	$count = 0;
+	$result4 = dbquery("SELECT charname, catid, charid FROM ".TABLEPREFIX."fanfiction_characters ORDER BY charname");
+	if(dbnumrows($result4)) {
+		$output .= "<div style=\"float: left; width: 49%;\"><label for=\"charid\">"._CHARACTERS.":</label><br><select size=\"5\"  style=\"width: 99%;\" id=\"charid\" name=\"charid[]\" multiple><option value=\"\">"._NONE."</option>";
+		while ($charresults = dbassoc($result4)) {
+			if((is_array($catid) && in_array($charresults['catid'], $catid)) || $charresults['catid'] == -1) {
+				$output .= "<option value=\"".$charresults['charid']."\"".($charid != "" && in_array(stripslashes($charresults['charid']), $charid) ? " selected" : "").">".stripslashes($charresults['charname'])."</option>";
+			}
+		}
+		$output .= "</select></div>";
+		$count++;
+	}
+	unset($result4);
+	$result = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_classtypes ORDER BY classtype_name");
+	while($type = dbassoc($result)) {
+		$result2 = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_classes WHERE class_type = '$type[classtype_id]' ORDER BY class_name");
+		$select = "";
+		while ($class = dbassoc($result2)) {
+				$select .= "<option value=\"$class[class_id]\"".(is_array($classes) && in_array($class['class_id'], $classes) ? " selected" : "").">$class[class_name]</option>";
+		}
+		$output .= "<div style=\"float: ".($count % 2 ? "right" : "left")."; width: 49%; margin-bottom: 1em;\"><label for=\"class_".$type['classtype_id']."\">$type[classtype_title]:</label><br />
+				 <select name=\"class_".$type['classtype_id']."[]\" id=\"class_".$type['classtype_id']."\"  style=\"width: 99%;\" multiple size=\"5\">$select</select></div>";
+		if($count % 2) $output .= "<div style=\"clear: both; height: 1px;\">&nbsp;</div>";
+		$count++;
+	}
+	$output .= "<div style=\"clear: both; height: 1px;\">&nbsp;</div></div>";
+	$result5 = dbquery("SELECT rid, rating FROM ".TABLEPREFIX."fanfiction_ratings");
+	$output .= "<label for=\"rid\">"._RATING.":</label>".(!$rid ? " <span style=\"font-weight: bold; color: red\">*</span>" : "")." <select size=\"1\" id=\"rid\" name=\"rid\">";
+	while ($r = dbassoc($result5)) {
+		$output .= "<option value=\"".$r['rid']."\"".($rid == $r['rid'] ? " selected" : "").">".$r['rating']."</option>";
+	} 
+	$output .= "</select>  <label for=\"complete\">"._COMPLETE.":</label> <input type=\"checkbox\" class=\"checkbox\" id=\"complete\" name=\"complete\" value=\"1\"".($complete == 1 ? " checked" : "") .">";
+	if($roundrobins) $output .= " <label for=\"rr\">  "._ROUNDROBIN.":</label>
+  			<input type=\"checkbox\" class=\"checkbox\" name=\"rr\" id=\"rr\"value=\"1\"".($rr == 1 ? "checked" : "").">";
+	 if(isADMIN && uLEVEL < 4) $output .= "<br /><label for=\"feature\">"._FEATURED.":</label> <select class=\"textbox\" id=\"feature\" name=\"feature\">
+				<option value=\"1\"".($feat == 1 ? " selected" : "").">"._ACTIVE."</option>
+				<option value=\"2\"".($feat == 2 ? " selected" : "").">"._RETIRED."</option>
+				<option value=\"0\"".(!$feat ? " selected" : "").">"._NO."</option>
+			</select> 
+			<label for=\"validated\">"._VALIDATED.":</label> <select class=\"textbox\" id=\"validated\" name=\"validated\">
+				<option value=\"2\"".($validated == 2? " selected" : "").">"._STORY."</option>
+				<option value=\"1\"".($validated  == 1? " selected" : "").">"._CHAPTER."</option>
+				<option value=\"0\"".(!$validated ? " selected" : "").">"._NO."</option>
+			</select>";
+	$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'storyform'");
+	while($code = dbassoc($codequery)) {
+		eval($code['code_text']);
+	}
+	return $output;
+}
+// end storyform
+
+// function to build chapter info section of the form.
+function chapterform($inorder, $notes, $endnotes, $storytext, $chaptertitle, $uid = 0) {
+	global $admin, $tinyMCE, $action, $preview;
+	$inorder++;
+	$default = _CHAPTER." ". $inorder;
+	if($chaptertitle != "") $default = $chaptertitle;
+	if($tinyMCE && strpos($storytext, "<br>") === false && strpos($storytext, "<p>") === false && strpos($storytext, "<br />") === false) $storytext = nl2br($storytext);
+	$output = "";
+	if($admin && ($action == "newchapter" || $action == "editchapter")) {
+		$authorquery = dbquery("SELECT "._PENNAMEFIELD." as penname, "._UIDFIELD." as uid FROM "._AUTHORTABLE." ORDER BY penname");
+		$output .= "<label for=\"uid\">"._AUTHOR.":</label> <select name=\"uid\" id=\"uid\">";
+			while($authorresult = dbassoc($authorquery)) {	
+				$output .= "<option value=\"$authorresult[uid]\"".($uid == $authorresult['uid']? " selected" : "").">$authorresult[penname]</option>";
+			}
+		$output .= "</select><br />";
+	}
+	$output .= "<p><label for=\"chaptertitle\">"._CHAPTERTITLE.":</label> <input type=\"text\" class=\"textbox\" id=\"chaptertitle\" maxlength=\"200\" name=\"chaptertitle\" size=\"50\" value=\"".htmlentities($default)."\"> </p>
+		<p>"._ALLOWEDTAGS."</p>
+		<div><label for=\"notes\">"._CHAPTERNOTES.":</label><br /><textarea class=\"textbox\" rows=\"5\" id=\"notes\" name=\"notes\" cols=\"58\">$notes</textarea></div>";
+	if($tinyMCE) 
+		$output .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('notes');\" checked><label for='toggle'>"._TINYMCETOGGLE."</label></div>";
+	$output .= "<div><label for=\"storytext\">"._STORYTEXTTEXT.":</label>".(!$storytext ? "<span style=\"font-weight: bold; color: red\">*</span>" : "")."<br><textarea class=\"textbox\" rows=\"15\" id=\"storytext\" name=\"storytext\" cols=\"58\">".$storytext."</textarea></div>";
+	if($tinyMCE) 
+		$output .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('storytext');\" checked><label for='toggle'>"._TINYMCETOGGLE."</label></div>";
+	$output .= "<p><strong>"._OR."</strong> </p>
+		<p><label for=\"storyfile\">"._STORYTEXTFILE.":</label> <INPUT type=\"file\" id=\"storyfile\" class=\"textbox\" name=\"storyfile\" onClick=\"this.form.storytext.disabled=true\"> </p>
+		<div><label for=\"notes\">"._ENDNOTES.":</label><br><textarea class=\"textbox\" rows=\"5\" id=\"endnotes\" name=\"endnotes\" cols=\"58\">$endnotes</textarea></div>";
+	if($tinyMCE) 
+		$output .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('endnotes');\" checked><label for='toggle'>"._TINYMCETOGGLE."</label></div>";
+	return $output;
+}
+// end chapterform
+?>

--- /dev/null
+++ b/includes/upload_class.php
@@ -1,1 +1,236 @@
-
+<?php 
+/*
+Easy PHP Upload - version 2.31
+A easy to use class for your (multiple) file uploads
+
+Copyright (c) 2004 - 2006, Olaf Lederer
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+    * 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.
+    * Neither the name of the finalwebsites.com nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 COPYRIGHT OWNER OR CONTRIBUTORS 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.
+
+______________________________________________________________________
+available at http://www.finalwebsites.com/snippets.php
+Comments & suggestions: http://www.webdigity.com/index.php/board,73.0.html,ref.olaf
+*/
+
+/* Modified for use with eFiction.  Now uses eFiction language files for translation. */
+ 
+class file_upload {
+
+    var $the_file;
+	var $the_temp_file;
+    var $upload_dir;
+	var $replace;
+	var $do_filename_check;
+	var $max_length_filename = 100;
+    var $extensions;
+	var $ext_string;
+	var $language;
+	var $http_error;
+	var $rename_file; // if this var is true the file copy get a new name
+	var $file_copy; // the new name
+	var $message = array();
+	var $create_directory = true;
+	
+	function file_upload() {
+		$this->language = "en"; // choice of en, nl, es
+		$this->rename_file = false;
+		$this->ext_string = "";
+	}
+	function show_error_string() {
+		$msg_string = "";
+		foreach ($this->message as $value) {
+			$msg_string .= $value."<br />\n";
+		}
+		return $msg_string;
+	}
+	function set_file_name($new_name = "") { // this "conversion" is used for unique/new filenames 
+		if ($this->rename_file) {
+			if ($this->the_file == "") return;
+			$name = ($new_name == "") ? strtotime("now") : $new_name;
+			sleep(3);
+			$name = $name.$this->get_extension($this->the_file);
+		} else {
+			$name = str_replace(" ", "_", $this->the_file); // space will result in problems on linux systems
+		}
+		return $name;
+	}
+	function upload($to_name = "") {
+		$new_name = $this->set_file_name($to_name);
+		if ($this->check_file_name($new_name)) {
+			if ($this->validateExtension()) {
+				if (is_uploaded_file($this->the_temp_file)) {
+					$this->file_copy = $new_name;
+					if ($this->move_upload($this->the_temp_file, $this->file_copy)) {
+						$this->message[] = $this->error_text($this->http_error);
+						if ($this->rename_file) $this->message[] = $this->error_text(16);
+						return true;
+					}
+				} else {
+					$this->message[] = $this->error_text($this->http_error);
+					return false;
+				}
+			} else {
+				$this->show_extensions();
+				$this->message[] = $this->error_text(11);
+				return false;
+			}
+		} else {
+			return false;
+		}
+	}
+	function check_file_name($the_name) {
+		if ($the_name != "") {
+			if (strlen($the_name) > $this->max_length_filename) {
+				$this->message[] = $this->error_text(13);
+				return false;
+			} else {
+				if ($this->do_filename_check == "y") {
+					if (preg_match("/^[a-z0-9_]*\.(.){1,5}$/i", $the_name)) {
+						return true;
+					} else {
+						$this->message[] = $this->error_text(12);
+						return false;
+					}
+				} else {
+					return true;
+				}
+			}
+		} else {
+			$this->message[] = $this->error_text(10);
+			return false;
+		}
+	}
+	function get_extension($from_file) {
+		$ext = strtolower(strrchr($from_file,"."));
+		return $ext;
+	}
+	function validateExtension() {
+		$extension = $this->get_extension($this->the_file);
+		$ext_array = $this->extensions;
+		if (in_array($extension, $ext_array)) { 
+			// check mime type hier too against allowed/restricted mime types (boolean check mimetype)
+			return true;
+		} else {
+			return false;
+		}
+	}
+	// this method is only used for detailed error reporting
+	function show_extensions() {
+		$this->ext_string = implode(" ", $this->extensions);
+	}
+	function move_upload($tmp_file, $new_file) {
+		if ($this->existing_file($new_file)) {
+			$newfile = $this->upload_dir.$new_file;
+			if ($this->check_dir($this->upload_dir)) {
+				if (move_uploaded_file($tmp_file, $newfile)) {
+					umask(0);
+					chmod($newfile , 0644);
+					return true;
+				} else {
+					return false;
+				}
+			} else {
+				$this->message[] = $this->error_text(14);
+				return false;
+			}
+		} else {
+			$this->message[] = $this->error_text(15);
+			return false;
+		}
+	}
+	function check_dir($directory) {
+		if (!is_dir($directory)) {
+			if ($this->create_directory) {
+				umask(0);
+				mkdir($directory, 0777);
+				return true;
+			} else {
+				return false;
+			}
+		} else {
+			return true;
+		}
+	}
+	function existing_file($file_name) {
+		if ($this->replace == "y") {
+			return true;
+		} else {
+			if (file_exists($this->upload_dir.$file_name)) {
+				return false;
+			} else {
+				return true;
+			}
+		}
+	}
+	function get_uploaded_file_info($name) {
+		$str = "File name: ".basename($name)."\n";
+		$str .= "File size: ".filesize($name)." bytes\n";
+		if (function_exists("mime_content_type")) {
+			$str .= "Mime type: ".mime_content_type($name)."\n";
+		}
+		if ($img_dim = getimagesize($name)) {
+			$str .= "Image dimensions: x = ".$img_dim[0]."px, y = ".$img_dim[1]."px\n";
+		}
+		return $str;
+	}
+	// this method was first located inside the foto_upload extension
+	function del_temp_file($file) {
+		$delete = @unlink($file); 
+		clearstatcache();
+		if (@file_exists($file)) { 
+			$filesys = str_replace("/","\\",$file); 
+			$delete = @system("del $filesys");
+			clearstatcache();
+			if (@file_exists($file)) { 
+				$delete = @chmod ($file, 0644); 
+				$delete = @unlink($file); 
+				$delete = @system("del $filesys");
+			}
+		}
+	}
+	// this function creates a file field and if $show_alternate is true it will show a text field if the given file already exists
+	// there is also a submit button to remove the text field value 
+	function create_file_field($element, $label = "", $length = 25, $show_replace = true, $replace_label = "Replace old file?", $file_path = "", $file_name = "", $show_alternate = false, $alt_length = 30, $alt_btn_label = "Delete image") {
+		$field = ($label != "") ? "<label>".$label."</label>\n" : "";
+		$file_field = "<input type=\"file\" name=\"".$element."\" size=\"".$length."\" />\n";
+		$file_field .= ($show_replace) ? "<span>".$replace_label."</span><input type=\"checkbox\" name=\"replace\" value=\"y\" />" : "";
+		if ($file_name != "" && $show_alternate) {
+			$field .= "<input type=\"text\" name=\"".$element."\" size=\"".$alt_length."\" value=\"".$file_name."\" readonly=\"readonly\"";
+			$field .= (!@file_exists($file_path.$file_name)) ? " title=\"".sprintf($this->error_text(17), $file_name)."\" />\n" : " />\n";
+			$field .= "<input type=\"checkbox\" name=\"del_img\" value=\"y\" /><span>".$alt_btn_label."</span>\n";
+		} else {
+			$field .= $file_field;
+		} 
+		return $field;
+	}
+	// some error (HTTP)reporting, change the messages or remove options if you like.
+	function error_text($err_num) {
+		switch ($this->language) {
+			default:
+			// start http errors
+			$error[0] = sprintf(_UPLOADSUCCESS, $this->the_file);
+			$error[1] = _MAXFSSERVER;
+			$error[2] = _MAXFSFORM;
+			$error[3] = _PARTIALUPLOAD;
+			$error[4] = _NOFILESELECTED;
+			// end  http errors
+			$error[10] = _SELECTFILE;
+			$error[11] = _ALLOWEDEXT."<strong>".$this->ext_string."</strong>";
+			$error[12] = _INVALIDNAME;
+			$error[13] = sprintf(_MAXFILENAME, $this->max_length_filename);
+			$error[14] = _NODIRECTORY;
+			$error[15] = sprintf(_ALREADYEXISTS, $this->the_file);
+			$error[16] = sprintf(_RENAMEDTO, $this->file_copy);
+			$error[17] = _FILENOTEXISTS;
+		}
+		return $error[$err_num];
+	}
+}
+?>

--- /dev/null
+++ b/includes/userlist.php
@@ -1,1 +1,32 @@
+<?php
+ini_set('display_errors', 0);
+ini_set('display_startup_errors', 0);
+error_reporting(-1);
 
+define("_BASEDIR", "../");
+define("_CHARSET", "utf-8");
+
+include("../config.php");
+include("../includes/dbfunctions.php");
+list($tableprefix, $language) = dbrow(dbquery("SELECT tableprefix, language FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '$sitekey'"));
+define("TABLEPREFIX", $tableprefix);
+if(file_exists(_BASEDIR."languages/{$language}.php")) include (_BASEDIR."languages/{$language}.php");
+else include (_BASEDIR."languages/en.php");
+include("../includes/queries.php");
+
+header("Content-Type: text/html; charset="._CHARSET);
+
+$users = dbquery("SELECT "._UIDFIELD." as uid, "._PENNAMEFIELD." as username FROM "._AUTHORTABLE." WHERE LOWER(".
+	_PENNAMEFIELD.") LIKE \"".escapestring($_GET['str'])."%\" ORDER BY username ASC limit 10");
+echo "var element = '".$_GET['element']."';\n";
+while($u = dbassoc($users)) {
+	$userlist[$u['uid']] = $u['username'];
+}
+if(count($userlist) > 0) {
+	$x = 0;
+	foreach($userlist as $k => $v) {
+		echo "userList[$x] =  new Array('$k','$v');\n";
+		$x++;
+	}
+}
+?>

--- /dev/null
+++ b/includes/userselect.js
@@ -1,1 +1,172 @@
+var secs = 10;
+var timerID = null;
+var timerRunning = false;
+var timedElement = null;
+var lastQuery = null;
+var THROTTLE_PERIOD = 1000;
 
+function findPos(obj) {
+	var curleft = 0; var curtop = 0;
+	if(obj.offsetParent) {
+		while(obj.offsetParent) {
+			curleft += obj.offsetLeft;
+			curtop += obj.offsetTop;
+			obj = obj.offsetParent;	
+		}
+	}
+	else{
+		if(obj.x) curleft += obj.x;
+		if(obj.y) curtop = obj.y;
+	}
+	return Array(curleft, curtop);
+}
+
+function setUserSearch(element) {
+	timedElement = element;
+	timerID = setTimeout('getUsers();', THROTTLE_PERIOD);
+}
+
+function getUsers() {
+	if(timedElement != null) {
+		str = document.getElementById(timedElement + "Select").value;
+		if(str != "" && str != lastQuery) {
+			var serverPage = "includes/userlist.php";
+			myRequest = new ajaxObject(serverPage, setUsers);
+			val = "element=" + timedElement + "&";
+			val = val + "str="+str;
+			myRequest.update(val);
+			lastQuery = str;
+			clearTimeout(timerID);
+		}
+		else timerID = setTimeout('getUsers();', THROTTLE_PERIOD);
+	}
+	else timerID = setTimeout('getUsers();', THROTTLE_PERIOD);
+}
+
+function setUsers(responseText, responseStatus) {
+	if(responseStatus == 200) {
+		var element;
+		var userList = new Array( );
+		eval(responseText);
+		var input = document.getElementById(element+"Select");
+		var div = document.getElementById(element+"Div");
+
+		// remove the old names first.	
+		while(div.firstChild) {
+			div.removeChild(div.firstChild);
+		}
+		if(userList.length == 0) return;
+		posObj = findPos(input);
+		var list = document.createElement('div');
+		list.className = "ajaxOptList";
+		list.setAttribute("id", element+"Names");
+		list.onblur = removeList;
+		for(x = 0; x < userList.length; x++) {
+			var opt = document.createElement('div');
+			opt.appendChild(document.createTextNode(userList[x][1]));
+			opt.setAttribute("id", element + "__" + userList[x][0]);
+			opt.className = "ajaxListOpt";
+			opt.onmouseover = ajaxOptOver;
+			opt.onmouseout = ajaxOptOut;
+			opt.onclick = setUser;
+			list.appendChild(opt);
+		}
+		div.appendChild(list);
+		var shim = document.getElementById(element+"shim");
+		shim.style.height = list.offsetHeight + "px";
+		shim.style.width = list.offsetWidth + "px";
+		listPos = findPos(document.getElementById(element + "Names"));
+		shim.style.left = posObj[0] + "px";
+		shim.style.top = posObj[1] + "px";
+		shim.style.zIndex = 100;
+		shim.style.display = "block";
+		list.style.top = (posObj[1] + 23) + "px";
+		list.style.left = posObj[0] + "px";
+		div.style.visibility = "visible";
+		secs = 10;
+		removeList();
+	}
+	else {
+		alert(responseStatus + ' -- Error Processing Request');
+	}
+}
+
+function removeList() {
+	if(secs == 0 && timerRunning == true) {
+		clearTimeout(timerID);
+		timerRunning = false;
+		document.getElementById(timedElement + "Div").style.visibility = "hidden";
+	}
+	else {
+		self.status = secs;
+		secs = secs - 1;
+		timerRunning = true;
+		timerID = self.setTimeout("removeList( )", 5000);
+	}
+}
+function ajaxOptOver( ) {
+	this.className = "ajaxListOptOver";
+}
+function ajaxOptOut( ) {
+	this.className = "ajaxListOpt";
+}
+
+function setUser() {
+	var list = this.parentNode;
+	var div = list.parentNode;
+	div.style.height = "0px";
+	div.style.width = "0px";
+	div.style.visibility = "hidden";
+	var info = this.id;
+	var split = info.split("__");	
+	var shim = document.getElementById(split[0] + "shim");
+	shim.style.visiblity = "hidden";
+	shim.style.zIndex = -1;
+	var hidden = document.getElementById(split[0]);
+	var selected = document.getElementById(split[0] + "Selected");
+	if(selected) {
+		var selectedList = new Array( );
+		var newItem = true;
+		for(i = 0; i < selected.length; i++) {
+			selectedList.push(selected.options[i].value);
+			if(selected.options[i].text == this.firstChild.nodeValue) {
+				newItem = false;
+				break;
+			}
+		}
+		if(newItem) {
+			selectedList.push(split[1]);
+			selected.options[selected.length] = new Option(this.firstChild.nodeValue, split[1]);
+			hidden.value = selectedList.join( );
+		}	
+	}
+	else {
+		hidden.value = split[1];
+		var input = document.getElementById(split[0] + "Select");	
+		input.value = this.innerHTML;
+		div.removeChild(list);
+	}
+	lastQuery = document.getElementById(split[0] + "Select").value;
+	clearTimeout(timerID);
+	timerID = setTimeout("getUsers( )", 1000);
+}
+
+function removeMember(element) {
+	var hidden = document.getElementById(element);
+	var selected = document.getElementById(element + "Selected");
+	var newOpts = new Array( );
+	var y = 0;
+	for(x = 0; x < selected.length; x++) {
+		if(selected.options[x].selected == false) {
+			newOpts[y] = Array(selected.options[x].text, selected.options[x].value);
+			y++;
+		}
+	}
+	selected.options.length = 0; // clear the whole list;
+	var newIDs = new Array( );
+	for(x = 0; x < newOpts.length; x++) {
+		newIDs[x] = newOpts[x][1];
+		selected.options[selected.length] = new Option(newOpts[x][0], newOpts[x][1]);
+	}
+	hidden.value = newIDs.join( );
+}

--- /dev/null
+++ b/includes/xmlhttp.js
@@ -1,1 +1,46 @@
-
+function ajaxObject(url, callbackFunction) {
+  var that=this;      
+  this.updating = false;
+  this.abort = function() {
+    if (that.updating) {
+      that.updating=false;
+      that.AJAX.abort();
+      that.AJAX=null;
+    }
+  }
+  this.update = function(passData,postMethod) { 
+    if (that.updating) { return false; }
+    that.AJAX = null;                          
+    if (window.XMLHttpRequest) {              
+      that.AJAX=new XMLHttpRequest();              
+    } else {                                  
+      that.AJAX=new ActiveXObject("Microsoft.XMLHTTP");
+    }                                             
+    if (that.AJAX==null) {                             
+      return false;                               
+    } else {
+      that.AJAX.onreadystatechange = function() {  
+        if (that.AJAX.readyState==4) {             
+          that.updating=false;                
+          that.callback(that.AJAX.responseText,that.AJAX.status,that.AJAX.responseXML);        
+          that.AJAX=null;                                         
+        }                                                      
+      }                                                        
+      that.updating = new Date();                              
+      if (/post/i.test(postMethod)) {
+        var uri=urlCall+'?'+that.updating.getTime();
+        that.AJAX.open("POST", uri, true);
+        that.AJAX.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
+        that.AJAX.setRequestHeader("Content-Length", passData.length);
+        that.AJAX.send(passData);
+      } else {
+        var uri=urlCall+'?'+passData+'&timestamp='+(that.updating.getTime()); 
+        that.AJAX.open("GET", uri, true);                             
+        that.AJAX.send(null);                                         
+      }              
+      return true;                                             
+    }                                                                           
+  }
+  var urlCall = url;        
+  this.callback = callbackFunction || function () { };
+}

file:b/index.php (new)
--- /dev/null
+++ b/index.php
@@ -1,1 +1,40 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+$current = "home";
+
+include ("header.php");
+
+//make a new TemplatePower object
+
+if(file_exists("$skindir/index.tpl")) $tpl = new TemplatePower( "$skindir/index.tpl" );
+else $tpl = new TemplatePower("default_tpls/index.tpl");
+//let TemplatePower do its thing, parsing etc.
+
+include("includes/pagesetup.php");
+$query = dbquery("SELECT message_text FROM ".TABLEPREFIX."fanfiction_messages WHERE message_name = 'welcome'");
+list($welcome) = dbrow($query);
+$tpl->assign("welcome", stripslashes($welcome));
+
+$tpl->printToScreen();
+dbclose( );
+?>

file:b/install/index.php (new)
--- /dev/null
+++ b/install/index.php

--- /dev/null
+++ b/install/install.php
@@ -1,1 +1,1053 @@
-
+<?php
+// ----------------------------------------------------------------------
+// Updated June 2014
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+
+function random_char($string)
+{
+	$length = strlen($string);
+	$position = mt_rand(0, $length - 1);
+	return $string[$position];
+}
+
+function random_string($charset_string, $length)
+{
+	$return_string = random_char($charset_string);
+	for ($x = 1; $x < $length; $x++)
+		$return_string .= random_char($charset_string);
+	return $return_string;
+}
+
+$randomcharset = '23456789' . 'abcdefghijkmnpqrstuvwxyz' . 'ABCDEFGHJKLMNPQRSTUVWXYZ';
+
+
+// Strip out slashes if magic quotes isn't on.
+if (ini_get("magic_quotes_gpc"))
+{
+	foreach ($_POST as $var => $val)
+	{
+		$val = is_array($val) ? array_map('stripslashes', $val) : stripslashes($val);
+	}
+	foreach ($_GET as $var => $val)
+	{
+		$val = is_array($val) ? array_map('stripslashes', $val) : stripslashes($val);
+	}
+	foreach ($_COOKIE as $var => $val)
+	{
+		$val = is_array($val) ? array_map('stripslashes', $val) : stripslashes($val);
+	}
+}
+
+define("_BASEDIR", "../");
+define("_CHARSET", "utf-8");
+Header('Cache-Control: private, no-cache, must-revalidate, max_age=0, post-check=0, pre-check=0');
+header("Pragma: no-cache");
+header("Expires: 0");
+
+$output = "";
+$language = "";
+
+include("../includes/class.TemplatePower.inc.php");
+
+/* PHP 8 fix - other way is separated LANs to smaller files */
+$allowed_tags = '';
+$recentdays = 7;
+$sitename = "";  // this breaks stuff in PHP 8.2 
+$url = "";
+$multiplecats = '';
+$minwords = '';
+$maxwords = '';
+$action = '';
+$pwdsetting = '';
+$imagewidth = '';
+$imageheight = '';
+$version = '';
+$user = array();
+$user['penname'] = '';
+$user['email'] = '';
+$penname = '';
+
+if (!isset($_GET['step']) || $_GET['step'] == 2)
+{
+	include("../languages/en.php");
+	include("../languages/en_admin.php");
+	include("languages/en.php");
+}
+else if (isset($_REQUEST['language']))
+{
+	$language = $_REQUEST['language'];
+	if (file_exists("../languages/" . $language . ".php")) include("../languages/" . $language . ".php");
+	else include("../languages/en.php");
+	if (file_exists("../languages/" . $language . "_admin.php")) include("../languages/" . $language . "_admin.php");
+	else include("../languages/en_admin.php");
+	if (file_exists("languages/" . $language . ".php")) include("languages/" . $language . ".php");
+	else include("languages/en.php");
+}
+else
+{
+	include("../config.php");
+	$dbconnect = dbconnect($dbhost, $dbuser, $dbpass, $dbname);
+	$settings = dbquery("SELECT tableprefix, language FROM " . $settingsprefix . "fanfiction_settings WHERE sitekey = '" . $sitekey . "'");
+	list($tableprefix, $language) = dbrow($settings);
+
+	define("TABLEPREFIX", $tableprefix);
+	define("SITEKEY", $sitekey);
+	if (file_exists("../languages/" . $language . ".php")) include("../languages/" . $language . ".php");
+	else include("../languages/en.php");
+	if (file_exists("../languages/" . $language . "_admin.php")) include("../languages/" . $language . "_admin.php");
+	else include("../languages/en_admin.php");
+	if (file_exists("languages/" . $language . ".php")) include("languages/" . $language . ".php");
+	else include("languages/en.php");
+}
+include(_BASEDIR . "includes/corefunctions.php");
+
+//  So I don't have to keep updating the version number in 3 different files.
+include("../version.php");
+
+//make a new TemplatePower object
+echo "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">
+<html><head><title>eFiction {$version} Install</title>
+<style>
+LABEL { float: left; display: block; width: 45%; text-align: right; padding-right: 10px; clear: left;}
+.row { float: left; width: 99%; }
+#settingsform FORM { width: 80%; margin; 0 auto; }
+#settingsform LABEL { float: left; display: block; width: 30%; text-align: right; padding-right: 10px; clear: left; }
+#settingsform .fieldset SPAN { float: left; display: block; width: 30%; text-align: right; padding-right: 10px; clear: left;}
+#settingsform .fieldset LABEL { float: none; width: auto; display: inline; text-align: left; clear: none; }
+#settingsform .tinytoggle { text-align: center; }
+#settingsform .tinytoggle LABEL { float: none; display: inline; width: auto; text-align: center; padding: 0; clear: none; }
+#settingsform #submit { display: block; margin: 1ex auto; }
+a.pophelp{
+    position: relative; /* this is the key*/
+    z-index:24;
+    vertical-align: super;
+    text-decoration: none;
+}
+
+a.pophelp:hover{z-index:100; border: none; text-decoration: none;}
+
+a.pophelp span{display: none; position: absolute; text-decoration: none;}
+
+a.pophelp:hover span{ /*the span will display just on :hover state*/
+    display:block;
+    position: absolute;
+    top: 0; left: 8em; width: 225px;
+    border:1px solid #000;
+    background-color:#CCC; color:#000;
+    text-decoration: none;
+    text-align: left;
+    padding: 5px;
+    font-weight: normal;
+}
+.required { color: red; }
+</style>
+<link rel=\"stylesheet\" type=\"text/css\" href='../default_tpls/style.css'></head>";
+
+$tpl = new TemplatePower("../default_tpls/default.tpl");
+$tpl->assignInclude("header", "./../default_tpls/header.tpl");
+$tpl->assignInclude("footer", "./../default_tpls/footer.tpl");
+$tpl->prepare();
+$tpl->newBlock("header");
+$tpl->assign("sitename", "eFiction $version Install");
+$tpl->gotoBlock("_ROOT");
+$tpl->newBlock("footer");
+$tpl->assign("footer", "eFiction $version &copy; 2007. <a href='http://efiction.org/'>http://efiction.org/</a>");
+$tpl->gotoBlock("_ROOT");
+
+if (!isset($_GET['step']))  $_GET['step'] = 0;
+switch ($_GET['step'])
+{
+	case "9":
+		if (isset($_POST['submit']))
+		{
+			$penname = descript($_POST['newpenname']);
+			if ((!$_POST['email']) && !isADMIN) $fail .= "<div style='text-align: center;'>" . _EMAILREQUIRED . " " . _TRYAGAIN . "</div>";
+			if ($penname && !preg_match("!^[a-z0-9_ ]{3,30}$!i", $penname)) $fail = "<div style='text-align: center;'>" . _BADUSERNAME . " " . _TRYAGAIN . "</div>";
+			if (!preg_match("/^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9.-]+$/", $_POST['email'])) $fail = "<div style='text-align: center;'>" . _INVALIDEMAIL . " " . _TRYAGAIN . "</div>";
+			if ($_POST['password'] == $_POST['password2']) $encryptpassword = md5($_POST['password']);
+			else $fail =  write_message(_PASSWORDTWICE);
+			if (!isset($fail))
+			{
+				$result = dbquery("INSERT INTO " . $tableprefix . "fanfiction_authors(`penname`, `email`, `password`, `date`) VALUES('$penname', '" . $_POST['email'] . "', '$encryptpassword', '" . time() . "')");
+				define("USERUID", dbinsertid());
+				$skinquery = dbquery("SELECT skin FROM " . $settingsprefix . "fanfiction_settings WHERE sitekey = '" . SITEKEY . "'");
+				list($skin) = dbrow($skinquery);
+				$result2 = dbquery("INSERT INTO " . $tableprefix . "fanfiction_authorprefs(`uid`, `userskin`, `level`) VALUES('" . USERUID . "', '$skin', '1')");
+				if ($result && $result2) $output .= write_message(_ACTIONSUCCESSFUL . "<br /><br />Installation complete!  <a href='../user.php?action=login'>Log in</a> to your site and go to the Admin area to configure your archive. <strong>Note:</strong> Please delete the install/ folder!");
+			}
+			else $output .= $fail;
+		}
+		else
+		{
+			$output .= "<div id='pagetitle'>" . _ADMINACCT . "</div><form method=\"POST\" class='tblborder' style='margin: 1em auto; width: 400px;' enctype=\"multipart/form-data\" action=\"install.php?step=9\">
+			<div class='row'><label for='newpenname'>" . _PENNAME . ":</label> 
+			<input name=\"newpenname\" type=\"text\" class=\"textbox\" maxlength=\"200\" value=\"" . $user['penname'] . "\"></div>
+		 	<div class='row'><label for='email'>" . _EMAIL . ":</label> <INPUT  type=\"text\" class=\"textbox=\" name=\"email\" value=\"" . $user['email'] .
+				"\" maxlength=\"200\"></div>
+			<div class='row'><label for='password'>" . _PASSWORD . ":</label>  <INPUT name=\"password\" class=\"textbox\" value=\"\" type=\"password\"></div> 
+			<div class='row'><label for='password2'>" . _PASSWORD2 . ":</label> <INPUT name=\"password2\" class=\"textbox=\" value=\"\" type=\"password\"></div>
+			<div style='text-align: center;'><INPUT type=\"submit\"class=\"button\" name=\"submit\" value=\"submit\"></div></form>";
+		}
+		break;
+
+	case "8":
+		$output .= "<div id='pagetitle'>" . _AUTHORFIELDS . "</div>";
+		if (isset($_GET['install']))
+		{
+			if ($_GET['install'] == "automatic")
+			{
+				$fields[] = array('4', 'lj', 'Live Journal', 'http://{info}.livejournal.com', '', '', '0');
+				$fields[] = array('1', 'website', 'Web Site', '', '', '', '1');
+				$fields[] = array('5', 'AOL', 'AIM', '', '$output .= "<div><label for=\'AOL\'>".$field[\'field_title\'].":</label><INPUT type=\'text\' class=\'textbox\'  name=\'af_".$field[\'field_name\']."\' maxlength=\'40\' value=\'".(!empty($user[\'af_\'.$field[\'field_id\']]) ? $user[\'af_\'.$field[\'field_id\']] : "")."\' size=\'20\'></div>";', '$thisfield = "<img src=\"http://big.oscar.aol.com/".$field[\'info\']."?on_url=$url/images/aim.gif&off_url=$url/images/aim.gif\"> <a href=\"aim:goim?{aol}ScreenName=".$field[\'info\']."\">".format_email($field[\'info\'])."</a>";', '1');
+				$fields[] = array('5', 'ICQ', 'ICQ', '', '$output .= "<div><label for=\'AOL\'>".$field[\'field_title\'].":</label><INPUT type=\'text\' class=\'textbox\'  name=\'af_".$field[\'field_name\']."\' maxlength=\'40\' value=\'".(!empty($user[\'af_\'.$field[\'field_id\']]) ? $user[\'af_\'.$field[\'field_id\']] : "")."\' size=\'20\'></div>";', '$thisfield = "<img src=\"http://status.icq.com/online.gif?icq=".$field[\'info\']."&img=5\"> ".$field[\'info\'];', '1');
+				$fields[] = array('5', 'MSN', 'MSN IM', '', '$output .= "<div><label for=\'AOL\'>".$field[\'field_title\'].":</label><INPUT type=\'text\' class=\'textbox\'  name=\'af_".$field[\'field_name\']."\' maxlength=\'40\' value=\'".(!empty($user[\'af_\'.$field[\'field_id\']]) ? $user[\'af_\'.$field[\'field_id\']] : "")."\' size=\'20\'></div>";', '$thisfield = "<img src=\"images/msntalk.gif\" alt=\""._MSN."\"> ".format_email($field[\'info\']);', '1');
+				$fields[] = array('5', 'Yahoo', 'Yahoo IM', '', '$output .= "<div><label for=\'AOL\'>".$field[\'field_title\'].":</label><INPUT type=\'text\' class=\'textbox\'  name=\'af_".$field[\'field_name\']."\' maxlength=\'40\' value=\'".(!empty($user[\'af_\'.$field[\'field_id\']]) ? $user[\'af_\'.$field[\'field_id\']] : "")."\' size=\'20\'></div>";', '$thisfield = "<a href=\"http://edit.yahoo.com/config/send_webmesg?.target=".$field[\'info\']."&.src=pg\"><img border=\'0\' src=\"http://opi.yahoo.com/online?u=".$field[\'info\']."&m=g&t=1\"> ".format_email($field[\'info\'])."</a>";', '1');
+				$fields[] = array('4', 'da', 'Deviant Art', 'http://{info}.deviantart.com', '', '', '0');
+				$fields[] = array('3', 'betareader', 'Beta-reader', '', '', '', '1');
+				$fields[] = array('4', 'dj', 'DeadJournal', 'http://{info}.deadjournal.com/', '', '', '0');
+				$fields[] = array('4', 'xanga', 'Xanga', 'http://www.xanga.com/{info}', '', '', '0');
+				$fields[] = array('2', 'gender', 'Gender', 'male|#|female|#|undisclosed', '', '', 0);
+				$fields[] = array('4', 'myspace', 'MySpace', 'http://www.myspace.com/{info}', '', '', '0');
+
+				$output .= "<table class='tblborder' style='margin: 1em auto; padding: 1em;' cellpadding='5'><tr><th>" . _FIELD . "</th><th>" . _RESULT . "</th></tr>";
+				foreach ($fields as $field)
+				{
+					$f = dbquery("INSERT INTO `" . $tableprefix . "fanfiction_authorfields` (`field_type`, `field_name`, `field_title`, `field_options`, `field_code_in`, `field_code_out`, `field_on`) VALUES('" . $field[0] . "', '" . $field[1] . "','" . $field[2] . "','" . escapestring($field[3]) . "','" . escapestring($field[4]) . "','" . escapestring($field[5]) . "','" . $field[6] . "');");
+					$output .= "<tr><td>" . $field[2] . "</td><td align='center'>" . ($f ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				}
+				$output .= "</table>";
+				$output .= write_message(_FIELDAUTOFAIL . "<br /><br /> <a href='install.php?step=9'>" . _CONTINUE . "</a>");
+			}
+			else
+			{
+				$output .= write_message(_FIELDMANUAL . "<br /><br /><a href='install.php?step=9'>" . _CONTINUE . "</a>");
+			}
+		}
+		else $output .= write_message(_FIELDDATAINFO . "<br /><br /><a href='install.php?step=8&amp;install=automatic'>" . _AUTO . "</a> " . _OR . " <a href='install.php?step=8&amp;install=manual'>" . _MANUAL2 . "</a>");
+		break;
+	case "7":
+		$output .= "<div id='pagetitle'>" . _MESSAGEDATA . "</div>";
+		if (isset($_GET['install']))
+		{
+			if ($_GET['install'] == "automatic")
+			{
+				$output .= "<table class='tblborder' style='margin: 1em auto; padding: 1em;' cellpadding='5'><tr><th>" . _MESSAGE . "</th><th>" . _RESULT . "</th></tr>";
+				$msg = dbquery("INSERT INTO `" . $tableprefix . "fanfiction_messages` VALUES (1, 'welcome', '', 'This is your welcome message. It appears on the index page. Include it in your .tpl files with {welcome}.');");
+				$output .= "<tr><td>Welcome</td><td align='center'>" . ($msg ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$msg = dbquery("INSERT INTO `" . $tableprefix . "fanfiction_messages` VALUES (2, 'copyright', '', 'This is your sample copyright footer.  Include it in your footer.tpl with <b>{footer}</b><br />\r\n<u>Disclaimer:</u>  All publicly recognizable characters, settings, etc. are the property of their respective owners.  The original characters and plot are the property of the author.  No money is being made from this work.  No copyright infringement is intended.\r\n');");
+				$output .= "<tr><td>Copyright</td><td align='center'>" . ($msg ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$msg = dbquery("INSERT INTO `" . $tableprefix . "fanfiction_messages` VALUES (3, 'help', 'Help', '<h3>FAQ</h3><p><strong>I forgot my password!&nbsp; What do I do now?</strong></p><p>To recover a lost password, <a href=\"user.php?action=lostpassword\">click here</a> and enter the e-mail address with which you registered.&nbsp; Your password will be sent to you shortly.</p><p><strong>What kinds of stories are allowed?</strong></p><p>See our <a href=\"submission.php\">Submission Rules.</a></p><p><strong>How do I contact the site administrators?</strong></p><p>You can e-mail us via our <a href=\"contact.php\">contact form.</a></p><p><strong>How do I submit stories?</strong></p><p>If you have not already done so, please <a href=\"user.php?action=newaccount\">register for an account</a>. Once you\'ve logged in, click on <a href=\"user.php\">Account Information</a> and choose <a href=\"stories.php?action=newstory\">Add Story</a>.&nbsp; The form presented there will allow you to submit your story.</p><p><strong>What are the ratings used on the site?</strong></p><p>We use the ratings system from <a href=\"http://www.fictionratings.com/\">www.fictionratings.com</a>.</p><p><strong>What are the story classifications?</strong></p><p>Stories are classified by categories, genres, and warnings.</p>');");
+				$output .= "<tr><td>Help</td><td align='center'>" . ($msg ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$msg = dbquery("INSERT INTO `" . $tableprefix . "fanfiction_messages` VALUES (4, 'nothankyou', 'Submission Rejection', 'Your recent submission of \"{storytitle} : {chaptertitle}\" to {sitename} did not meet our requirements for submission.  Please review our {rules}.<br /><br />\r\n\r\n{adminname}');");
+				$output .= "<tr><td>Rejection Letter</td><td align='center'>" . ($msg ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$msg = dbquery("INSERT INTO `" . $tableprefix . "fanfiction_messages` VALUES (5, 'printercopyright', '', '<u>Disclaimer:</u> All publicly recognizable characters and settings are the property of their respective owners. The original characters and plot are the property of the author. No money is being made from this work. No copyright infringement is intended.');");
+				$output .= "<tr><td>Printable Copyright</td><td align='center'>" . ($msg ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$msg = dbquery("INSERT INTO `" . $tableprefix . "fanfiction_messages` VALUES (6, 'rules', 'Submission Rules', '<p align=\"center\"><strong>Submission Rules</strong></p>\r\n<ol>\r\n  <li>All submissions must be accompanied by a complete disclaimer. If a \r\n  suitable disclaimer is not included, the site administrators reserve the right \r\n  to add a disclaimer.&nbsp; Repeat offenders may be subject to further action \r\n  up to and including removal of stories and account.\r\n<div class=\"tblborder\" style=\"width: 400px; margin: 1em auto;\">\r\n<div style=\"background: #000; color: #FFF; padding: 5px; text-align: center; font-weight: bold;\">Sample Disclaimer</div>\r\n<div class=\"tblborder\" style=\"padding: 5px;\"><span style=\"text-decoration: underline;\">Disclaimer:</span>  All publicly recognizable characters, settings, etc. are the property of their respective owners.  The original characters and plot are the property of the author.&nbsp; \r\n        The author is in no way associated with the owners, creators, or producers of any media franchise.&nbsp;  No copyright infringement is intended.</div>\r\n  </div>\r\n  </li>\r\n  <li>Stories must be submitted to the proper category. &nbsp;If there is an appropriate sub-category, <strong>DO NOT</strong> add your story to the main category.&nbsp; The submission \r\n  form allows you to choose multiple categories for your story, and we worked very hard to add that functionality for you.&nbsp;&nbsp; <u><strong>So please \r\n  do NOT add your story multiple times!</strong></u></li>\r\n  <li>Titles and summaries must be kid friendly.&nbsp; No exceptions.&nbsp; </li>\r\n  <li>&quot;Please read&quot;, &quot;Untitled&quot;, etc. are not acceptable titles or summaries.</li>\r\n  <li>A number of authors have requested that fans refrain from writing fan \r\n  fiction based on their work.&nbsp; Therefore submissions will not be \r\n  accepted based on the works of P.N. Elrod, Raymond Feist, Terry Goodkind, \r\n  Laurell K. Hamilton, Anne McCaffrey, Robin McKinley, Irene Radford, Anne Rice, \r\n  and Nora Roberts/J.D. Robb.&nbsp; </li>\r\n  <li>Actor/actress stories are not permitted...not even if they\'re visiting an \r\n  alternate reality.</li>\r\n  <li>Correct grammar and spelling are expected of all stories submitted to this \r\n  site.&nbsp; The site administrators are not grammar Nazis.&nbsp; However, the \r\n  site administrators reserve the right to request corrections in submissions \r\n  with a multitude of grammar and/or spelling errors.&nbsp; If such a request is \r\n  ignored, the story will be deleted.</li>\r\n  <li>All stories must be rated correctly and have the appropriate warnings.&nbsp; \r\n  All adult rated stories are expected to have warnings.&nbsp; After all, they \r\n  wouldn\'t have that rating if there wasn\'t something to be warned about!&nbsp; The site administrators recognize \r\n  that there is an audience for these stories, but please respect those who do \r\n  not wish to read them by labeling them appropriately.&nbsp;\r\n  <u><strong>Please note: Stories containing adults having sex with minors are strictly forbidden.</strong></u>&nbsp; </li>\r\n  <li>Stories with multiple chapters should be archived as such and <span style=\"font-weight: bold; text-decoration: underline;\">NEVER</span> as \r\n  separate stories.&nbsp; Upload the first chapter of your story, then go to <a href=\"stories.php?action=viewstories\">Manage Stories</a> in \r\nyour account to add additional chapters.  If you have trouble with this, please contact the site administrator or ask a \r\n  friend to help you.</li>\r\n  <li>As much as possible, spoiler warnings are expected on all stories.  For categories with serialized content, such as series of books or television series, \r\n  spoilers are <strong>mandatory</strong> for the current season and/or most recent part.  An appropriate spoiler warning to place in your summary would be: Spoilers for <u>Star Trek II: The Wrath of Khan.</u> \r\n  <strong>DO NOT</strong> do anything like this: <u>Spoilers for the one where Spock dies.</u></li>\r\n</ol>\r\n  <p>Submissions found to be in violation of these rules may be removed and the \r\n  author\'s account suspended at the discretion of the site administrators and/or \r\n  moderators.&nbsp; The site administrators reserve the right to modify these \r\n  rules as needed.</p>');");
+				$output .= "<tr><td>Submission Rules</td><td align='center'>" . ($msg ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$msg = dbquery("INSERT INTO `" . $tableprefix . "fanfiction_messages` VALUES (7, 'thankyou', '{sitename} Submission Acceptance', 'Thanks for your submission.');");
+				$output .= "<tr><td>Acceptance Letter</td><td align='center'>" . ($msg ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$msg = dbquery("INSERT INTO `" . $tableprefix . "fanfiction_messages` VALUES (8, 'tos', 'Terms of Service', 'This is the Terms of Service for your site.  It will be displayed when a new member registers to the site.');");
+				$output .= "<tr><td>Terms of Service</td><td align='center'>" . ($msg ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$msg = dbquery("INSERT INTO `" . $tableprefix . "fanfiction_messages` VALUES (9, 'maintenance', 'Site Maintenance', '<p style=\"text-align: center;\">This site is currently undergoing maintenance.  Please check back soon.  Thank you.</p>');");
+				$output .= "<tr><td>Site Maintenance</td><td align='center'>" . ($msg ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$output .= "</table>";
+				$output .= write_message(_MESSAGEAUTOFAILUPGRADE . "<br /><br /> <a href='install.php?step=8'>" . _CONTINUE . "</a>");
+			}
+			else
+			{
+				$output .= write_message(_MESSAGEMANUAL . "<br /><br /><a href='install.php?step=8'>" . _CONTINUE . "</a>");
+			}
+		}
+		else $output .= write_message(_MESSAGEDATANEW . "<br /><br /><a href='install.php?step=7&amp;install=automatic'>" . _AUTO . "</a> " . _OR . " <a href='install.php?step=7&amp;install=manual'>" . _MANUAL2 . "</a>");
+
+		break;
+	case "6":
+		$output .= "<div id='pagetitle'>" . _BLOCKDATA . "</div>";
+		if (isset($_GET['install']))
+		{
+			if ($_GET['install'] == "automatic")
+			{
+				$blocklist = array(
+					array("categories", "Categories", "categories/categories.php", "1", ""),
+					array("featured", "Featured Stories", "featured/featured.php", "1", ""),
+					array("info", "Site Info", "info/info.php", "2", ""),
+					array("login", "Log In", "login/login.php", "1", ""),
+					array("menu", "Main Menu", "menu/menu.php", "1", ""),
+					array("random", "Random Story", "random/random.php", "2", ""),
+					array("recent", "Most Recent", "recent/recent.php", "2", "a:1:{s:3:\"num\";s:1:\"1\";}"),
+					array("skinchange", "Skin Change", "skinchange/skinchange.php", "1", ""),
+					array("news", "Site News", "news/news.php", "1", "a:1:{s:3:\"num\";s:1:\"1\";}")
+				);
+				$output .= "<table class='tblborder' style='margin: 1em auto; padding: 1em;' cellpadding='5'><tr><th>" . _BLOCK . "</th><th>" . _RESULT . "</th></tr>";
+				foreach ($blocklist as $block)
+				{
+					$b = dbquery("INSERT INTO `" . $tableprefix . "fanfiction_blocks` (`block_name`, `block_title`, `block_file`, `block_status`, `block_variables`) VALUES('" . $block[0] . "', '" . $block[1] . "', '" . $block[2] . "', '" . $block[3] . "', '" . escapestring($block[4]) . "');");
+					$output .= "<tr><td>" . $block[1] . "</td><td align='center'>" . ($b ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				}
+				$output .= "</table>";
+				$output .= write_message(_BLOCKDATAFAILUPGRADE . "<br /><br /><a href='install.php?step=7'>" . _CONTINUE . "</a>");
+			}
+			else
+			{
+				$output .= write_message(_BLOCKDATAMANUAL . "<br /><br /><a href='install.php?step=6'>" . _CONTINUE . "</a>");
+			}
+		}
+		else $output .= write_message(_BLOCKDATANEW . "<br /><br /><a href='install.php?step=6&amp;install=automatic'>" . _AUTO . "</a> " . _OR . " <a href='install.php?step=6&amp;install=manual'>" . _MANUAL2 . "</a>");
+		break;
+	case "5":
+		$output .= "<div id='pagetitle'>" . _LINKDATA . "</div>";
+		if (isset($_GET['install']))
+		{
+			if ($_GET['install'] == "automatic")
+			{
+				$pagelist = array(
+					array("home", "Home", "index.php", "0", "0"),
+					array("recent", "Most Recent", "browse.php?type=recent", "0", "0"),
+					array("login", "Login", "user.php?action=login", "0", "0"),
+					array("adminarea", "Admin", "admin.php", "0", "2"),
+					array("logout", "Logout", "user.php?action=logout", "0", "1"),
+					array("featured", "Featured Stories", "browse.php?type=featured", "0", "0"),
+					array("catslink", "Categories", "browse.php?type=categories", "0", "0"),
+					array("members", "Members", "authors.php?action=list", "0", "0"),
+					array("authors", "Authors", "authors.php?list=authors", "0", "0"),
+					array("help", "Help", "viewpage.php?page=help", "0", "0"),
+					array("search", "Search", "search.php", "0", "0"),
+					array("series", "Series", "browse.php?type=series", "0", "0"),
+					array("tens", "Top Tens", "toplists.php", "0", "0"),
+					array("challenges", "Challenges", "modules/challenges/challenges.php", "0", "0"),
+					array("contactus", "Contact Us", "contact.php", "0", "0"),
+					array("rules", "Rules", "viewpage.php?page=rules", "0", "0"),
+					array("tos", "Terms of Service", "viewpage.php?page=tos", "0", "0"),
+					array("rss", "<img src=\'images/xml.gif\' alt=\'RSS\' border=\'0\'>", "rss.php", "0", "0"),
+					array("login", "Account Info", "user.php", "0", "1"),
+					array("titles", "Titles", "browse.php?type=titles", "0", "0"),
+					array("register", "Register", "user.php?action=register", "0", "0"),
+					array("lostpassword", "Lost Password", "user.php?action=lostpassword", "0", "0"),
+					array("newsarchive", "News Archive", "news.php", "0", "0"),
+					array("browse", "Browse", "browse.php", "0", "0"),
+					array("charslink", "Characters", "browse.php?type=characters", "0", "0"),
+					array("ratings", "Ratings", "browse.php?type=ratings", "0", "0"),
+				);
+				$output .= "<table class='tblborder' style='margin: 1em auto; padding: 1em;' cellpadding='5'><tr><th>" . _PAGE . "</th><th>" . _RESULT . "</th></tr>";
+				foreach ($pagelist as $page)
+				{
+					$pages = dbquery("INSERT INTO `" . $tableprefix . "fanfiction_pagelinks` (`link_name`, `link_text`, `link_url`, `link_target`, `link_access`) VALUES ('" . $page[0] . "', '" . $page[1] . "', '" . $page[2] . "', '" . $page[3] . "', '" . $page[4] . "');");
+					$output .= "<tr><td>" . stripslashes($page[1]) . "</td><td align='center'>" . ($pages ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				}
+
+				$output .= "</table>";
+				$output .= write_message(_LINKAUTOFAIL . "<br /><br /> <a href='install.php?step=6'>" . _CONTINUE . "</a>");
+			}
+			else
+			{
+				$output .= write_message(_LINKMANUAL . "<br /><br /><a href='install.php?step=5'>" . _CONTINUE . "</a>");
+			}
+		}
+		else $output .= write_message(_LINKDATAINFO . "<br /><br />" . _LINKSETUP . " <a href='install.php?step=5&amp;install=automatic'>" . _AUTO . "</a> " . _OR . " <a href='install.php?step=5&amp;install=manual'>" . _MANUAL2 . "</a>");
+		break;
+	case "4":
+		$output .= "<div id='pagetitle'>" . _PANELDATA . "</div>";
+		if (isset($_GET['install']))
+		{
+			if ($_GET['install'] == "automatic")
+			{
+
+				$panellist = array(
+					array("submitted", "Submissions", "", "3", "5", "0", "A"),
+					array("versioncheck", "Version Check", "", "3", "7", "0", "A"),
+					array("newstory", "Add New Story", "stories.php?action=newstory&admin=1", "3", "3", "0", "A"),
+					array("addseries", "Add New Series", "series.php?action=add", "3", "3", "0", "A"),
+					array("news", "News", "", "3", "5", "0", "A"),
+					array("featured", "Featured Stories", "", "3", "5", "0", "A"),
+					array("characters", "Characters", "", "2", "2", "0", "A"),
+					array("ratings", "Ratings", "", "2", "3", "0", "A"),
+					array("members", "Members", "", "2", "5", "0", "A"),
+					array("mailusers", "Mail Users", "", "2", "6", "0", "A"),
+					array("settings", "Settings", "", "1", "2", "0", "A"),
+					array("blocks", "Blocks", "", "1", "3", "0", "A"),
+					array("censor", "Censor", "", "1", "0", "1", "A"),
+					array("admins", "Admins", "", "1", "6", "0", "A"),
+					array("classifications", "Classifications", "", "2", "4", "0", "A"),
+					array("categories", "Categories", "", "2", "1", "0", "A"),
+					array("custpages", "Custom Pages", "", "1", "4", "0", "A"),
+					array("validate", "Validate Submission", "", "3", "0", "1", "A"),
+					array("yesletter", "Validation Letter", "", "3", "0", "1", "A"),
+					array("noletter", "Rejection Letter", "", "3", "0", "1", "A"),
+					array("links", "Page Links", "", "1", "5", "0", "A"),
+					array("messages", "Message Settings", "", "2", "0", "1", "A"),
+					array("login", "Login", "", "0", "0", "1", "U"),
+					array("logout", "Logout", "", "1", "5", "0", "U"),
+					array("revreceived", "Reviews Received", "", "1", "0", "1", "U"),
+					array("editprefs", "Edit Preferences", "", "1", "2", "0", "U"),
+					array("lostpassword", "Lost Password", "", "0", "0", "1", "U"),
+					array("editbio", "Edit Bio", "", "1", "1", "0", "U"),
+					array("register", "Register", "", "0", "0", "1", "U"),
+					array("manageimages", "Manage Images", "", "1", "5", "0", "S"),
+					array("revres", "Review Response", "", "1", "0", "1", "U"),
+					array("stats", "View Your Statistics", "", "1", "3", "0", "U"),
+					array("newstory", "Add New Story", "stories.php?action=newstory", "1", "1", "0", "S"),
+					array("newseries", "Add New Series", "series.php?action=add", "1", "3", "0", "S"),
+					array("managestories", "Manage Stories", "stories.php?action=viewstories", "1", "2", "0", "S"),
+					array("manageseries", "Manage Series", "series.php?action=manage", "1", "4", "0", "S"),
+					array("reviewsby", "Your Reviews", "", "1", "0", "1", "U"),
+					array("storiesby", "Stories by {author}", "", "0", "1", "0", "P"),
+					array("seriesby", "Series by {author}", "", "0", "2", "0", "P"),
+					array("reviewsby", "Reviews by {author}", "", "0", "3", "0", "P"),
+					array("categories", "Categories", "", "0", "1", "0", "B"),
+					array("characters", "Characters", "", "0", "2", "0", "B"),
+					array("ratings", "Ratings", "", "0", "3", "0", "B"),
+					array("titles", "Titles", "", "0", "5", "0", "B"),
+					array("class", "Classes", "", "0", "0", "1", "B"),
+					array("recent", "Most Recent", "", "0", "0", "1", "B"),
+					array("featured", "Featured Stories", "", "0", "0", "1", "B"),
+					array("panels", "Panels", "", "1", "1", "0", "A"),
+					array("phpinfo", "PHP Info", "", "1", "7", "0", "A"),
+					array("contact", "Contact", "", "0", "0", "1", "P"),
+					array("series", "Series", "", "0", "4", "0", "B"),
+					array("viewlog", "Action Log", "", "1", "8", "0", "A"),
+					array("shortstories", "10 Shortest Stories", "toplists/default.php", "0", "6", "0", "L"),
+					array("longstories", "10 Longest Stories", "toplists/default.php", "0", "5", "0", "L"),
+					array("largeseries", "10 Largest Series", "toplists/default.php", "0", "1", "0", "L"),
+					array("smallseries", "10 Smallest Series", "toplists/default.php", "0", "2", "0", "L"),
+					array("reviewedseries", "10 Most Reviewed Series", "toplists/default.php", "0", "4", "0", "L"),
+					array("prolificauthors", "10 Most Prolific Authors", "toplists/default.php", "0", "10", "0", "L"),
+					array("prolificreviewers", "10 Most Prolific Reviewers", "toplists/default.php", "0", "12", "0", "L"),
+					array("reviewedstories", "10 Most Reviewed Stories", "toplists/default.php", "0", "8", "0", "L"),
+					array("readstories", "10 Most Read Stories", "toplists/default.php", "0", "9", "0", "L"),
+					array("manfavs", "Manage Favorites", "", "1", "2", "0", "F"),
+					array("favstories", "10 Most Favorite Stories", "toplists/default.php", "0", "7", "0", "L"),
+					array("favauthors", "10 Most Favorite Authors", "toplists/default.php", "0", "11", "0", "L"),
+					array("favseries", "10 Most Favorite Series", "toplists/default.php", "0", "3", "0", "L"),
+					array("favst", "Favorite Stories", "", "0", "0", "1", "F"),
+					array("favse", "Favorite Series", "", "0", "0", "1", "F"),
+					array("favau", "Favorite Authors", "", "0", "0", "1", "F"),
+					array("favst", "Favorite Stories", "", "0", "0", "1", "U"),
+					array("favse", "Favorite Series", "", "0", "0", "1", "U"),
+					array("favau", "Favorite Authors", "", "0", "0", "1", "U"),
+					array("favlist", "{author}\'s Favorites", "viewuser.php?action=manfavs", "0", "5", "0", "F"),
+					array("skins", "Skins", "", "3", "6", "0", "A"),
+					array("authorfields", "Profile Information", "", "1", "9", "0", "A"),
+					array("maintenance", "Archive Maintenance", "", "1", "10", "0", "A"),
+					array("manual", "Admin Manual", "", "3", "6", "0", "A"),
+					array('modules', 'Modules', '', 1, "11", 0, 'A')
+				);
+				$output .= "<table class='tblborder' style='margin: 1em auto; padding: 1em;' cellpadding='5'><tr><th>Panel</th><th>" . _RESULT . "</th></tr>";
+				foreach ($panellist as $panel)
+				{
+					unset($panels);
+					$panels = dbquery("INSERT INTO `" . $tableprefix . "fanfiction_panels` (`panel_name`, `panel_title`, `panel_url`, `panel_level`, `panel_order`, `panel_hidden`, `panel_type`) VALUES ('" . $panel[0] . "', '" . $panel[1] . "', '" . $panel[2] . "', '" . $panel[3] . "', '" . $panel[4] . "', '" . $panel[5] . "', '" . $panel[6] . "');");
+					$output .= "<tr><td>" . stripslashes($panel[1]) . "</td><td align='center'>" . ($panels ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				}
+				$output .= "</table>";
+				$output .= write_message(_PANELAUTOFAIL . "<br /><br /><a href='install.php?step=5'>" . _CONTINUE . "</a>");
+			}
+			else
+			{
+				$output .= write_message(_PANELMANUAL . "<br /><br /><a href='install.php?step=5'>" . _CONTINUE . "</a>");
+			}
+		}
+		else $output .= write_message(_PANELDATAINFO . "<br /><br />" . _PANELSETUP . " <a href='install.php?step=4&amp;install=automatic'>" . _AUTO . "</a> " . _OR . " <a href='install.php?step=4&amp;install=manual'>" . _MANUAL2 . "</a>");
+		break;
+	case "3":
+		$output .= "<div id='pagetitle'>" . _INSTALLTABLES . "</div>";
+		if (isset($_GET['install']))
+		{
+			if ($_GET['install'] == "automatic")
+			{
+				$output .= "<table class='tblborder' style='margin: 1em auto; padding: 1em;' cellpadding='5'><tr><th>Table</th><th>" . _RESULT . "</th></tr>";
+				$authorfields = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_authorfields` (
+  `field_id` int(11) NOT NULL AUTO_INCREMENT,
+  `field_type` tinyint(4) NOT NULL default '0',
+  `field_name` varchar(30) NOT NULL default ' ',
+  `field_title` varchar(255) NOT NULL default ' ',
+  `field_options` text,
+  `field_code_in` text,
+  `field_code_out` text,
+  `field_on` tinyint(1) NOT NULL default '0',
+  PRIMARY KEY  (`field_id`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_authorfields</td><td align='center'>" . ($authorfields ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$authorinfo = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_authorinfo` (
+  `uid` int(11) NOT NULL default '0',
+  `field` int(11) NOT NULL default '0',
+  `info` varchar(255) NOT NULL default ' ',
+  PRIMARY KEY  (`uid`,`field`),
+  KEY `uid` (`uid`)) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_authorinfo</td><td align='center'>" . ($authorinfo ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$authorprefs = dbquery("
+CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_authorprefs` (
+  `uid` int(11) NOT NULL default '0',
+  `newreviews` tinyint(1) NOT NULL default '0',
+  `newrespond` tinyint(1) NOT NULL default '0',
+  `ageconsent` tinyint(1) NOT NULL default '0',
+  `alertson` tinyint(1) NOT NULL default '0',
+  `tinyMCE` tinyint(1) NOT NULL default '0',
+  `sortby` tinyint(1) NOT NULL default '0',
+  `storyindex` tinyint(1) NOT NULL default '0',
+  `validated` tinyint(1) NOT NULL default '0',
+  `userskin` varchar(60) NOT NULL default 'default',
+  `level` tinyint(1) NOT NULL default '0',
+  `categories` varchar(200) NOT NULL default '0',
+  `contact` tinyint(1) NOT NULL default '0',
+  `stories` int(11) NOT NULL default '0',
+  PRIMARY KEY  (`uid`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_authorprefs</td><td align='center'>" . ($authorprefs ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$authors = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_authors` (
+  `uid` int(11) NOT NULL auto_increment,
+  `penname` varchar(200) NOT NULL default '',
+  `realname` varchar(200) NOT NULL default '',
+  `email` varchar(200) NOT NULL default '',
+  `bio` text NULL,
+  `image` varchar(200) NOT NULL default '',
+  `date`int(10) unsigned NOT NULL default '0',
+  `admincreated` char(1) NOT NULL default '0',
+  `password` varchar(40) NOT NULL default '0',
+  PRIMARY KEY  (`uid`),
+  KEY `penname` (`penname`),
+  KEY `admincreated` (`admincreated`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_authors</td><td align='center'>" . ($authors ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$blocks = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_blocks` (
+  `block_id` int(11) NOT NULL auto_increment,
+  `block_name` varchar(30) NOT NULL default '',
+  `block_title` varchar(150) NOT NULL default '',
+  `block_file` varchar(200) NOT NULL default '',
+  `block_status` tinyint(1) NOT NULL default '0',
+  `block_variables` text NOT NULL,
+  PRIMARY KEY  (`block_id`),
+  KEY `block_name` (`block_name`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_blocks</td><td align='center'>" . ($blocks ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$categories = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_categories` (
+  `catid` int(11) NOT NULL auto_increment,
+  `parentcatid` int(11) NOT NULL default '-1',
+  `category` varchar(60) NOT NULL default '',
+  `description` text NOT NULL,
+  `image` varchar(100) NOT NULL default '',
+  `locked` char(1) NOT NULL default '0',
+  `leveldown` tinyint(4) NOT NULL default '0',
+  `displayorder` int(11) NOT NULL default '0',
+  `numitems` int(11) NOT NULL default '0',
+  PRIMARY KEY  (`catid`),
+  KEY `byparent` (`parentcatid`,`displayorder`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_categories</td><td align='center'>" . ($categories ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$chapters = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_chapters` (
+  `chapid` int(11) NOT NULL auto_increment,
+  `title` varchar(250) NOT NULL default '',
+  `inorder` int(11) NOT NULL default '0',
+  `notes` text NULL,
+  `storytext` text NULL,
+  `endnotes` text NULL,
+  `validated` char(1) NOT NULL default '0',
+  `wordcount` int(11) NOT NULL default '0',
+  `rating` tinyint(4) NOT NULL default '0',
+  `reviews` smallint(6) NOT NULL default '0',
+  `sid` int(11) NOT NULL default '0',
+  `uid` int(11) NOT NULL default '0',
+  `count` int(11) NOT NULL default '0',
+  PRIMARY KEY  (`chapid`),
+  KEY `sid` (`sid`),
+  KEY `uid` (`uid`),
+  KEY `inorder` (`inorder`),
+  KEY `title` (`title`),
+  KEY `validated` (`validated`),
+  KEY `forstoryblock` (`sid`,`validated`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_chapters</td><td align='center'>" . ($chapters ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$characters = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_characters` (
+  `charid` int(11) NOT NULL auto_increment,
+  `catid` int(11) NOT NULL default '0',
+  `charname` varchar(60) NOT NULL default '',
+  `bio` text NOT NULL,
+  `image` varchar(200) NOT NULL default '',
+  PRIMARY KEY  (`charid`),
+  KEY `catid` (`catid`),
+  KEY `charname` (`charname`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_characters</td><td align='center'>" . ($characters ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$classes = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_classes` (
+  `class_id` int(11) NOT NULL auto_increment,
+  `class_type` int(11) NOT NULL default '0',
+  `class_name` varchar(100) NOT NULL default '',
+  PRIMARY KEY  (`class_id`),
+  KEY `byname` (`class_type`,`class_name`,`class_id`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_classes</td><td align='center'>" . ($classes ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$classtypes = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_classtypes` (
+  `classtype_id` int(11) NOT NULL auto_increment,
+  `classtype_name` varchar(50) NOT NULL default '',
+  `classtype_title` varchar(50) NOT NULL default '',
+  PRIMARY KEY  (`classtype_id`),
+  UNIQUE KEY `classtype_name` (`classtype_name`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_classtypes</td><td align='center'>" . ($classtypes ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$coauthors = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_coauthors` (
+  `sid` int(11) NOT NULL default '0',
+  `uid` int(11) NOT NULL default '0',
+  PRIMARY KEY  (`sid`,`uid`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_coauthors</td><td align='center'>" . ($coauthors ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$codeblocks = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_codeblocks` (
+  `code_id` int(11) NOT NULL auto_increment,
+  `code_text` text NOT NULL,
+  `code_type` varchar(20) default NULL,
+  `code_module` varchar(60) default NULL,
+  PRIMARY KEY  (`code_id`),
+  KEY `code_type` (`code_type`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_codeblocks</td><td align='center'>" . ($codeblocks ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$comments = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_comments` (
+  `cid` int(11) NOT NULL auto_increment,
+  `nid` int(11) NOT NULL default '0',
+  `uid` int(11) NOT NULL default '0',
+  `comment` text NOT NULL,
+  `time` int(10) unsigned NOT NULL default '0',
+  PRIMARY KEY  (`cid`),
+  KEY `commentlist` (`nid`,`time`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_comments</td><td align='center'>" . ($comments ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$favorites = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_favorites` (
+  `uid` int(11) NOT NULL default '0',
+  `item` int(11) NOT NULL default '0',
+  `type` char(2) NOT NULL default '',
+  `comments` text NOT NULL,
+  UNIQUE KEY `byitem` (`item`,`type`,`uid`),
+  UNIQUE KEY `byuid` (`uid`,`type`,`item`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_favorites</td><td align='center'>" . ($favorites ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$inseries = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_inseries` (
+  `seriesid` int(11) NOT NULL default '0',
+  `sid` int(11) NOT NULL default '0',
+  `subseriesid` int(11) NOT NULL default '0',
+  `confirmed` int(11) NOT NULL default '0',
+  `inorder` int(11) NOT NULL default '0',
+  PRIMARY KEY  (`sid`,`seriesid`, `subseriesid`),
+  KEY `seriesid` (`seriesid`,`inorder`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_inseries</td><td align='center'>" . ($inseries ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$logs = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_log` (
+  `log_id` int(11) NOT NULL auto_increment,
+  `log_action` varchar(255) default NULL,
+  `log_uid` int(11) NOT NULL,
+  `log_ip` int(11) UNSIGNED default NULL,
+  `log_timestamp` int(10) unsigned NOT NULL default '0',
+  `log_type` varchar(2) NOT NULL,
+  PRIMARY KEY  (`log_id`)
+) ENGINE=MyISAM");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_log</td><td align='center'>" . ($logs ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$messages = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_messages` (
+  `message_id` int(11) NOT NULL auto_increment,
+  `message_name` varchar(50) NOT NULL default '',
+  `message_title` varchar(200) NOT NULL default '',
+  `message_text` text NOT NULL,
+  PRIMARY KEY  (`message_id`),
+  KEY `message_name` (`message_name`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_messages</td><td align='center'>" . ($messages ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$modules = dbquery("
+CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_modules` (
+  `id` int(11) NOT NULL auto_increment,
+  `name` varchar(100) NOT NULL default 'Test Module',
+  `version` varchar(10) NOT NULL default '1.0',
+  PRIMARY KEY  (`id`),
+  KEY `name_version` (`name`,`version`)
+)");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_modules</td><td align='center'>" . ($modules ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$news = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_news` (
+  `nid` int(11) NOT NULL auto_increment,
+  `author` varchar(60) NOT NULL default '',
+  `title` varchar(255) NOT NULL default '',
+  `story` text NOT NULL,
+  `time` int(10) unsigned NOT NULL default '0',
+  `comments` INT NOT NULL DEFAULT '0',
+  PRIMARY KEY  (`nid`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_news</td><td align='center'>" . ($news ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$pagelinks = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_pagelinks` (
+  `link_id` int(11) NOT NULL auto_increment,
+  `link_name` varchar(50) NOT NULL default '',
+  `link_text` varchar(100) NOT NULL default '',
+  `link_key` CHAR( 1 ) NULL,
+  `link_url` varchar(250) NOT NULL default '',
+  `link_target` char(1) NOT NULL default '0',
+  `link_access` tinyint(4) NOT NULL default '0',
+  PRIMARY KEY  (`link_id`),
+  KEY `link_name` (`link_name`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_pagelinks</td><td align='center'>" . ($pagelinks ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$panels = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_panels` (
+  `panel_id` int(11) NOT NULL auto_increment,
+  `panel_name` varchar(50) NOT NULL default 'unknown',
+  `panel_title` varchar(100) NOT NULL default 'Unnamed Panel',
+  `panel_url` varchar(100) default NULL,
+  `panel_level` tinyint(4) NOT NULL default '3',
+  `panel_order` tinyint(4) NOT NULL default '0',
+  `panel_hidden` tinyint(1) NOT NULL default '0',
+  `panel_type` varchar(20) NOT NULL default 'A',
+  PRIMARY KEY  (`panel_id`),
+  KEY `panel_type` (`panel_type`,`panel_name`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_panels</td><td align='center'>" . ($panels ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$ratings = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_ratings` (
+  `rid` int(11) NOT NULL auto_increment,
+  `rating` varchar(60) NOT NULL default '',
+  `ratingwarning` char(1) NOT NULL default '0',
+  `warningtext` text NOT NULL,
+  PRIMARY KEY  (`rid`),
+  KEY `rating` (`rating`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_ratings</td><td align='center'>" . ($ratings ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$reviews = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_reviews` (
+  `reviewid` int(11) NOT NULL auto_increment,
+  `item` int(11) NOT NULL default '0',
+  `chapid` int(11) NOT NULL default '0',
+  `reviewer` varchar(60) NOT NULL default '0',
+  `uid` int(11) NOT NULL default '0',
+  `review` text NOT NULL,
+  `date`int(10) unsigned NOT NULL default '0',
+  `rating` int(11) NOT NULL default '0',
+  `respond` char(1) NOT NULL default '0',
+  `type` char(2) NOT NULL default '',
+  PRIMARY KEY  (`reviewid`),
+  KEY `chapid` (`chapid`),
+  KEY `rating` (`rating`),
+  KEY `respond` (`respond`),
+  KEY `avgrating` (`type`,`item`,`rating`),
+  KEY `bychapter` (`chapid`,`rating`),
+  KEY `byuid` (`uid`,`item`,`type`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_reviews</td><td align='center'>" . ($reviews ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$series = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_series` (
+  `seriesid` int(11) NOT NULL auto_increment,
+  `title` varchar(200) NOT NULL default '',
+  `summary` text NOT NULL,
+  `uid` int(11) NOT NULL default '0',
+  `isopen` tinyint(4) NOT NULL default '0',
+  `catid` varchar(200) NOT NULL default '0',
+  `rating` tinyint(4) NOT NULL default '0',
+  `classes` varchar(200) NOT NULL default '',
+  `characters` varchar(250) NOT NULL default '',
+  `reviews` smallint(6) NOT NULL default '0',
+  `numstories` INT NOT NULL DEFAULT '0',
+  `challenges` varchar(200) NOT NULL default '',
+  PRIMARY KEY  (`seriesid`),
+  KEY `catid` (`catid`),
+  KEY `characters` (`characters`),
+  KEY `classes` (`classes`),
+  KEY `owner` (`uid`,`title`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_series</td><td align='center'>" . ($series ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$stats = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_stats` (
+  `sitekey` varchar(50) NOT NULL default '0',
+  `stories` int(11) NOT NULL default '0',
+  `chapters` int(11) NOT NULL default '0',
+  `series` int(11) NOT NULL default '0',
+  `reviews` int(11) NOT NULL default '0',
+  `wordcount` int(11) NOT NULL default '0',
+  `authors` int(11) NOT NULL default '0',
+  `members` int(11) NOT NULL default '0',
+  `reviewers` int(11) NOT NULL default '0',
+  `newestmember` int(11) NOT NULL default '0'
+) ENGINE=MyISAM");
+				dbquery("INSERT INTO " . $tableprefix . "fanfiction_stats(`sitekey`, `newestmember`) VALUES('" . SITEKEY . "', '1')");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_stats</td><td align='center'>" . ($stats ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$stories = dbquery("CREATE TABLE IF NOT EXISTS `" . $tableprefix . "fanfiction_stories` (
+  `sid` int(11) NOT NULL auto_increment,
+  `title` varchar(200) NOT NULL default 'Untitled',
+  `summary` text NULL,
+  `storynotes` text NULL,
+  `catid` varchar(100) NOT NULL default '0',
+  `classes` varchar(200) NOT NULL default '0',
+  `charid` varchar(250) NOT NULL default '0',
+  `rid` varchar(25) NOT NULL default '0',
+  `date` int(10) unsigned NOT NULL default '0',
+  `updated` int(10) unsigned NOT NULL default '0',
+  `uid` int(11) NOT NULL default '0',
+  `coauthors` tinyint(1) NOT NULL default '0',
+  `featured` char(1) NOT NULL default '0',
+  `validated` char(1) NOT NULL default '0',
+  `completed` char(1) NOT NULL default '0',
+  `rr` char(1) NOT NULL default '0',
+  `wordcount` int(11) NOT NULL default '0',
+  `rating` tinyint(4) NOT NULL default '0',
+  `reviews` smallint(6) NOT NULL default '0',
+  `count` int(11) NOT NULL default '0',
+  PRIMARY KEY  (`sid`),
+  KEY `title` (`title`),
+  KEY `catid` (`catid`),
+  KEY `charid` (`charid`),
+  KEY `rid` (`rid`),
+  KEY `uid` (`uid`),
+  KEY `featured` (`featured`),
+  KEY `completed` (`completed`),
+  KEY `rr` (`rr`),
+  KEY `validateduid` (`validated`,`uid`),
+  KEY `recent` (`updated`,`validated`)
+) ENGINE=MyISAM;");
+				$output .= "<tr><td>" . $tableprefix . "fanfiction_stories</td><td align='center'>" . ($stories ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") . "</td></tr>";
+				$output .= "</table>";
+				$output .= write_message(_TABLEFAILED . "<br /><br /><a href='install.php?step=4'>" . _CONTINUE . "</a>");
+			}
+			else if ($_GET['install'] == "manual")
+			{
+				$output .= write_message(_TABLESMANUAL . "<br /><br /><a href='install.php?step=3'>" . _CONTINUE . "</a>");
+			}
+		}
+		else
+		{
+
+			$output .= write_message(_TABLESINSTALL . "<br /><br /><a href='install.php?step=3&amp;install=automatic'>" . _AUTO . "</a> " . _OR . " <a href='install.php?step=3&amp;install=manual'>" . _MANUAL2 . "</a>");
+		}
+
+		break;
+
+	case "2";
+		include("../config.php");
+		if (dbnumrows(dbquery("SHOW TABLES LIKE '" . $settingsprefix . "fanfiction_settings'")))
+		{
+			include("../config.php");
+			$dbconnect = dbconnect($dbhost, $dbuser, $dbpass, $dbname);
+			$settings = dbquery("SELECT tableprefix, language FROM " . $settingsprefix . "fanfiction_settings WHERE sitekey = '" . $sitekey . "'");
+			list($tableprefix, $language) = dbrow($settings);
+
+			if ($tableprefix == '') $tableprefix = $settingsprefix;
+
+			define("TABLEPREFIX", $tableprefix);
+			define("SITEKEY", $sitekey);
+
+			$sect = isset($_GET['sect']) ? $_GET['sect'] : "main";
+			$settingsresults = dbquery("SELECT * FROM " . $settingsprefix . "fanfiction_settings WHERE sitekey = '" . SITEKEY . "'");
+			if (dbnumrows($settingsresults) == 0)
+			{
+				dbquery("INSERT INTO " . $settingsprefix . "fanfiction_settings (`sitekey`) VALUES('" . SITEKEY . "');");
+				$settingsresults = dbquery("SELECT * FROM " . $settingsprefix . "fanfiction_settings WHERE sitekey = '" . SITEKEY . "'");
+			}
+			$settings = dbassoc($settingsresults);
+			foreach ($settings as $var => $val)
+			{
+				$$var = $val;
+			}
+			if ($sect == "submissions")
+			{
+				if (isset($_POST['submit']))
+				{
+					$storiespath = descript($_POST['newstoriespath']);
+					if (!file_exists($storiespath) && !file_exists("../" . $storiespath))
+					{
+						if (!strrchr($storiespath, "/") && !strrchr($storiespath, "\\")) $storiespath = "../$storiespath";
+						mkdir("$storiespath", 0755);
+						@chmod("$storiespath", 0777);
+						if (substr(sprintf('%o', @fileperms("../" . $storiespath)), -4) != "0777") $output .= write_message(_STORIESPATHNOTWRITABLE);
+					}
+				}
+			}
+			if ($sect == "email" && isset($_POST['submit']))
+			{
+				$output .= "<div id=\"pagetitle\">" . _SETTINGS . "</div>";
+				$smtp_host = $_POST['newsmtp_host'];
+				$smtp_username = $_POST['newsmtp_username'];
+				$smtp_password = $_POST['newsmtp_password'];
+				$result = dbquery("UPDATE " . $settingsprefix . "fanfiction_settings SET smtp_host = '$smtp_host', smtp_username = '$smtp_username', smtp_password = '$smtp_password' WHERE sitekey = '" . SITEKEY . "'");
+				if ($result)
+				{
+					$output .= write_message(_ACTIONSUCCESSFUL);
+					$output .= write_message("<a href='install.php?step=3'>" . _CONTINUE . "</a>");
+				}
+				else include("../admin/settings.php");
+			}
+			else include("../admin/settings.php");
+		}
+		else
+		{
+			if (isset($_GET['install']))
+			{
+				if ($_GET['install'] == "automatic")
+				{
+
+					$settings = dbquery("CREATE TABLE IF NOT EXISTS `" . $settingsprefix . "fanfiction_settings` (
+  `sitekey` varchar(50) NOT NULL default '1',
+  `sitename` varchar(200) NOT NULL default 'Your Site',
+  `slogan` varchar(200) NOT NULL default 'It''s a cool site!',
+  `url` varchar(200) NOT NULL default 'http://www.yoursite.com',
+  `siteemail` varchar(200) NOT NULL default 'you@yoursite.com',
+  `tableprefix` varchar(50) NOT NULL default '',
+  `skin` varchar(50) NOT NULL default 'default',
+  `hiddenskins` varchar(255) default '',
+  `language` varchar(10) NOT NULL default 'en',
+  `submissionsoff` tinyint(1) NOT NULL default '0',
+  `storiespath` varchar(20) NOT NULL default 'stories',
+  `store` varchar(5) NOT NULL default 'files',
+  `autovalidate` tinyint(1) NOT NULL default '0',
+  `coauthallowed` int(1) NOT NULL default '0',
+  `maxwords` int(11) NOT NULL default '0',
+  `minwords` int(11) NOT NULL default '0',
+  `imageupload` tinyint(1) NOT NULL default '0',
+  `imageheight` int(11) NOT NULL default '200',
+  `imagewidth` int(11) NOT NULL default '200',
+  `roundrobins` tinyint(1) NOT NULL default '0',
+  `allowseries` tinyint(4) NOT NULL default '2',
+  `tinyMCE` tinyint(1) NOT NULL default '0',
+  `allowed_tags` varchar(200) NOT NULL default '<b><i><u><center><hr><p><br /><br><blockquote><ol><ul><li><img><strong><em>',
+  `favorites` tinyint(1) NOT NULL default '0',
+  `multiplecats` tinyint(1) NOT NULL default '0',
+  `newscomments` tinyint(1) NOT NULL default '0',
+  `logging` tinyint(1) NOT NULL default '0',
+  `maintenance` tinyint(1) NOT NULL default '0',
+  `debug` tinyint(1) NOT NULL default '0',
+  `captcha` tinyint(1) NOT NULL default '0',
+  `dateformat` varchar(20) NOT NULL default 'd/m/y',
+  `timeformat` varchar(20) NOT NULL default '- h:i a',
+  `recentdays` tinyint(2) NOT NULL default '7',
+  `displaycolumns` tinyint(1) NOT NULL default '1',
+  `itemsperpage` tinyint(2) NOT NULL default '25',
+  `extendcats` tinyint(1) NOT NULL default '0',
+  `displayindex` tinyint(1) NOT NULL default '0',
+  `defaultsort` tinyint(1) NOT NULL default '0',
+  `displayprofile` tinyint(1) NOT NULL default '0',
+  `linkstyle` tinyint(1) NOT NULL default '0',
+  `linkrange` tinyint(2) NOT NULL default '5',
+  `reviewsallowed` tinyint(1) NOT NULL default '0',
+  `ratings` tinyint(1) NOT NULL default '0',
+  `anonreviews` tinyint(1) NOT NULL default '0',
+  `revdelete` tinyint(1) NOT NULL default '0',
+  `rateonly` tinyint(1) NOT NULL default '0',
+  `pwdsetting` tinyint(1) NOT NULL default '0',
+  `alertson` tinyint(1) NOT NULL default '0',
+  `disablepopups` tinyint(1) NOT NULL default '0',
+  `agestatement` tinyint(1) NOT NULL default '0',
+  `words` text,
+  `version` varchar(10) NOT NULL default '" . $version . "',
+  `smtp_host` varchar(200) default NULL,
+  `smtp_username` varchar(50) default NULL,
+  `smtp_password` varchar(50) default NULL,
+  PRIMARY KEY  (`sitekey`)
+) ENGINE=MyISAM;");
+					if ($settings) $output .= write_message("<img src=\"../images/check.gif\"> " . _SETTINGSTABLESUCCESS . " <br /><a href='install.php?step=2'>" . _CONTINUE . "</a>");
+					else $output .= write_message(_SETTINGSTABLEAUTOFAIL . "<br /><br /> <a href='install.php?step=2'>" . _CONTINUE . "</a>");
+				}
+				else
+				{
+					$output .= write_message(_SETTINGSTABLEMANUAL . "<br /><br /><a href='install.php?step=2'>" . _CONTINUE . "</a>");
+				}
+			}
+			else
+			{
+
+				$test = dbquery("SHOW TABLES");
+				if (!$test) $output .= write_message(_CONFIGFAILED);
+				else $output .= write_message(_SETTINGSTABLESETUP . " <a href='install.php?step=2&amp;install=automatic'>" . _AUTO . "</a> " . _OR . " <a href='install.php?step=2&amp;install=manual'>" . _MANUAL2 . "</a>");
+			}
+		}
+		break;
+	default:
+		$output .= "<div id='pagetitle'>" . _CONFIGDATA . "</div>";
+		if (isset($_POST['submit']))
+		{
+			$dbhost = descript($_POST['dbhost']);
+			$dbname = descript($_POST['dbname']);
+			$dbuser = descript($_POST['dbuser']);
+			$dbpass = descript($_POST['dbpass']);
+			$language = $_POST['language'];
+			$sitekey = descript($_POST['sitekey']);
+			$settingsprefix = descript($_POST['settingsprefix']);
+			$mysqli_access = mysqli_connect($dbhost, $dbuser, $dbpass);
+			if (!$mysqli_access)
+			{
+				$output .= write_message(_CONFIGFAILED);
+			}
+		}
+		if (isset($_POST['submit']) && $mysqli_access)
+		{
+			$handle = fopen("../config.php", 'w');
+			if (!$handle)
+			{
+				@chmod("../config.php", 0666);
+				$handle = fopen("../config.php", 'w');
+			}
+			if ($handle)
+			{
+				$dbhost = descript($_POST['dbhost']);
+				$dbname = descript($_POST['dbname']);
+				$dbuser = descript($_POST['dbuser']);
+				$dbpass = descript($_POST['dbpass']);
+				$sitekey = descript($_POST['sitekey']);
+				if (empty($sitekey)) $sitekey = random_string($randomcharset, 10);
+				$language = $_POST['language'];
+				$settingsprefix = descript($_POST['settingsprefix']);
+				$text = "<?php 
+\$dbhost = \"$dbhost\";
+\$dbname = \"$dbname\";
+\$dbuser= \"$dbuser\";
+\$dbpass = \"$dbpass\";
+\$sitekey = \"$sitekey\";
+\$settingsprefix = \"$settingsprefix\";
+
+include_once(\"includes/dbfunctions.php\");
+if(!empty(\$sitekey)) \$dbconnect = dbconnect(\$dbhost, \$dbuser,\$dbpass, \$dbname);
+
+?>";
+				fwrite($handle, $text);
+				fclose($handle);
+				@chmod("../config.php", 0644);
+				$output .= write_message(_CONFIGSUCCESS . "<br /><br /><a href='install.php?step=2&amp;language=$language'>" . _CONTINUE . "</a>");
+			}
+			else $output .= write_message(_ERROR_CONFIGWRITE);
+		}
+		else
+		{
+			if (file_exists("../config.php") && !isset($mysqli_access)) include("../config.php");
+			if (isset($tinyMCE)) $output .= write_message(_CONFIG2DETECTED);
+			else if (isset($sitename) && $sitename) $output .= write_message(_CONFIG1DETECTED);
+			else
+			{
+				$output .=
+					"<form method='POST' enctype='multipart/form-data' action='install.php?step=1' class='tblborder' style='width: 350px; margin: 1em auto;'>
+						<div><label for='dbhost'>" . _DBHOST . "</label><input type='text'  name='dbhost' id='dbhost'" . (!empty($dbhost) ? "value='$dbhost'" : "value='localhost'") . "> <A HREF=\"#\" class=\"pophelp\">[?]<span>" . _HELP_DBHOST . "</span></A></div>
+						<div><label for='dbname'>" . _DBNAME . "</label><input type='text' name='dbname' id='dbname'" . (!empty($dbname) ? "value='$dbname'" : "") . "> <A HREF=\"#\" class=\"pophelp\">[?]<span>" . _HELP_DBNAME . "</span></A></div>
+						<div><label for='dbuser'>" . _DBUSER . "</label><input type='text' name='dbuser' id='dbuser'" . (!empty($dbuser) ? "value='$dbuser'" : "") . "> <A HREF=\"#\" class=\"pophelp\">[?]<span>" . _HELP_DBUSER . "</span></A></div>
+						<div><label for='dbpass'>" . _DBPASS . "</label><input type='password' name='dbpass' id='dbpass'" . (!empty($dbpass) ? "value='$dbpass'" : "") . "> <A HREF=\"#\" class=\"pophelp\">[?]<span>" . _HELP_DBPASS . "</span></A></div>
+						<div><label for='sitekey'>" . _SITEKEY . "</label><input type='text' name='sitekey' value='" . (!empty($sitekey) ? $sitekey : random_string($randomcharset, 10)) . "' id='sitekey'> <A HREF=\"#\" class=\"pophelp\">[?]<span>" . _HELP_INSTALL_SITEKEY . "</span></A></div>
+						<div><label for=\"language\">" . _LANGUAGE . ":</label> <select name=\"language\">";
+				$directory = opendir("../languages");
+				while ($filename = readdir($directory))
+				{
+					if ($filename == "." || $filename == ".." || substr($filename, 2) == "_admin.php") continue;
+					$output .= "<option value=\"" . substr($filename, 0, 2) . "\"" .
+						($language == substr($filename, 0, strpos($filename, ".php")) ? " selected" : "") . ">
+					" . substr($filename, 0, strpos($filename, ".php")) . "</option>";
+				}
+				closedir($directory);
+				$output .=
+					"</select> <A HREF=\"#\" class=\"pophelp\">[?]<span>" . _HELP_LANGUAGE . "</span></A></div>
+						<label for='settingsprefix'>" . _SETTINGSPREFIX . "</label><input type='text' name='settingsprefix' id='settingsprefix'" . (isset($settingsprefix) ? "value='$settingsprefix'" : "") . "> <A HREF=\"#\" class=\"pophelp\">[?]<span>" . _HELP_SETTINGSPREFIX . "</span></A><br />
+						<div style='text-align: center; margin: 1em;'><INPUT type=\"submit\"class=\"button\" name=\"submit\" value=\"submit\"></div>
+					</form>";
+			}
+		}
+}
+$tpl->assign("output", $output);
+
+$tpl->printToScreen();
+if (isset($_GET['step']) && $_GET['step'] > 2) dbclose();
+

--- /dev/null
+++ b/install/languages/de.php
@@ -1,1 +1,196 @@
+<?php
 
+


+"tos" => "Nutzungsbestimmungen");
+
+define("_ALTER11CHARACTERS", "Bearbeite Tabelle fanfiction_characters");
+define("_ALTER11CATEGORIES", "Bearbeite Tabelle fanfiction_categories");
+define("_ALTER11RATINGS", "Bearbeite rating-Tabelle.");
+define("_DONE", "Erledigt!");

+define("_CONFIG_WRITTEN", "Konfigurationsdatei wurde geschrieben.");
+define("_MANUAL2", "Manuell");
+define("_ADMINACCT", "Admin-Account einrichten");
+define("_AUTO", "Automatisch");
+define("_PAGE", "Seite");
+define("_BLOCK", "Block");
+define("_MESSAGE", "Meldung");
+define("_RESULT", "Ergebnis");
+define("_FIELD", "Feld");



+define("_FIELDMANUAL", "Bitte jetzt die Felddaten manuell mit Hilfe der .sql-Dateien im docs-Ordner installieren.");
+define("_FIELDAUTOFAIL", "Falls ein Feld nicht installiert werden konnte, installiere es bitte manuell mit Hilfe der authorfields.sql im Docs-Ordner.");

+define("_AUTHORUPDATEINFO", "In diesem Schritt werden die Tabellen fanfiction_authorprefs und fanfiction_authorinfo mit Informationen aus der Autoren-Tabelle versorgt.");
+define("_AUTHORRESULT", "Autoren-Einstellungen verschoben.");

+define("_BLOCKDATA", "Blockdaten installieren");


+define("_BLOCKDATAFAILUPGRADE", "Falls ein Block nicht installiert werden konnte, benutze die blocks.sql im docs-Ordner, um die fehlenden Informationen manuell zu installieren.");
+define("_BLOCKDATAMANUAL", "Bitte jetzt Die Blockdaten mit Hilfe der blocks.sql im Docs-Ordner manuell installieren.");


+define("_CHALLENGEUPDATE", "Challenge-Daten aktualisieren");


+define("_CONFIG1DETECTED", "eFiction 1.1 Konfigurationsdatei gefunden.<br /><a href='upgrade11.php'>Weiter mit Upgrade.</a>");
+define("_CONFIG2DETECTED", "eFiction 2.0 Konfigurationsdatei gefunden.<br /><a href='upgrade20.php'>Weiter mit Upgrade.</a>");
+define("_CONFIGFAILED", "Konnte nicht zur Datenbank verbinden. Die von dir angegebenen Informationen scheinen falsch zu sein. Bitte versuche es erneut.");
+define("_CONFIGDATA", "Setup der Konfigurationsdatei");
+define("_CONFIGSUCCESS", "Konfigurationsdatei wurde geschrieben.");
+define("_CONTINUE", "Weiter");
+define("_DBHOST", "Datenbank-Host:");
+define("_DBNAME", "Datenbankname:");
+define("_DBUSER", "Datenbankbenutzer:");
+define("_DBPASS", "Datenbankpasswort:");




+define("_FAVUPDATE", "AAktualisiere Favoritentabelle");
+define("_FAVUPDATEINFO", "In diesem Schritt werden die Favoriten-Informationen in die neue Favoritentabelle verschoben und die alten favstor-, favseries- und favauth-Tabellen entfernt.");
+define("_FAVUPDATEINFO11", "In diesem Schritt werden die Favoriten-Informationen in die neue Tabelle verschoben und die alten favstor- und favauth-Tabellen entfernt.");






+define("_INSTALLTABLES", "Tabellen installieren");


+define("_LINKMANUAL", "Bitte die Daten mit Hilfe der pagelinks.sql im Ordner Docs jetzt manuell installieren.");

+define("_LINKAUTOFAIL", "Falls ein Link nicht installiert werden konnte, benutze jetzt bitte die pagelinks.sql aus dem Docs-Ordner, um die Informationen manuell zu installieren.");

+define("_MESSAGEMANUAL", "Bitte jetzt die Meldungen aus der messages.sql im Docs-Ordner installieren.");



+define("_MISCDBUPDATE", "Verschiedene Datenbank-Updates");

+define("_MISCDBUPDATEMANUAL", "Du kannst jetzt die Informationen aus der Datei docs/upgrade11_step18.sql benutzen, um die Tabellen manuell zu bearbeiten.");
+define("_MOVECLASSES", "Genres und Warnings verschieben");

+define("_MOVECLASSFAIL", "Falls eine der Warnings oder Genres nicht verschoben werden konnte, tue dies bitte jetzt manuell.");
+define("_NEWSUPDATE", "News-Kommentare aktualisieren");

+define("_NEWSUPDATERESULT", "News-Kommentare aktualisiert.");
+define("_NEWTABLESSETUP", "Wie sollen die neuen Tabellen installiert werden?");
+define("_NEWTABLESMANUAL", "Bitte installiere die Tabellen jetzt mit Hilfe der upgrade20_step4.sql im Docs-Ordner manuell.");
+define("_NEWTABLEAUTOFAIL", "Falls eine Tabelle nicht installiert werden konnte, benutze bitte jetzt die upgrade20_step4.sql im Docs-Ordner, um sie manuell zu installieren.");
+define("_NEWTABLEAUTOFAIL11", "Falls eine Tabelle nicht installiert werden konnte, benutze bitte jetzt die upgrade11_step4.sql im Docs-Ordner, um sie manuell zu installieren.");
+define("_PANELDATA", "Panel-Daten installieren");


+define("_PANELMANUAL", "Bitte jetzt die Paneldaten mit Hilfe der panels.sql im Docs-Ordner manuell installieren.");
+define("_PANELAUTOFAIL", "Falls ein Panel nicht installiert werden konnte, installiere es bitte mit Hilfe der Datei panels.sql im Docs-Ordner manuell.");
+define("_REVIEWUPDATE", "Review-Tabelle und Daten aktualisieren");








+define("_REVIEWUPDATE2", "Set item to seriesid and type to 'SE' for all series reviews.");
+define("_REVIEWUPDATE3", "Alle beantworteten Reviews als beantwortet markieren.");
+define("_REVIEWUPDATEINFO", "In diesem Schritt wird die Review-Tabelle bearbeitet und die Reviews in das neue Format konvertiert.");
+define("_SERIESREVIEWS", "Serien-Reviews aktualisieren");
+define("_SERIESREVIEWSINFO", "In diesem Schritt werden die Serien-Reviews und Bewertungen aktualisiert, um die Reviews und Bewertungen zu beinhalteten Geschichten und Serien einzubeziehen.");

+define("_SETTINGSTABLE", "Settings-Tabelle erstellen"); // Added 01/15/07
+define("_SETTINGSTABLEMANUAL", "Bitte jetzt die Settings-tabelle mit Hilfe der tables.sql im Docs-Ordner manuell installieren.");


+define("_SETTINGSTABLESUCCESS", "Settings-Tabelle erfolgreich erstellt!");
+define("_SETTINGSTABLEAUTOFAIL", "Die automatische Erstellung der Settings-Tabelle ist fehlgeschlagen! Bitte erstelle sie manuell.");
+define("_SITESETTINGSMOVED", "Die Seiteneinstellungen wurden in die Settings-Tabelle verschoben.");



+define("_STORIESUPDATED", "Die Geschichten wurden aktualisiert.");
+define("_TABLESMANUAL", "Bitte jetzt die Tabellen aus dem Docs-Ordner manuell installieren.");
+define("_TABLESINSTALL", "Datenbanktabellen installieren.");
+define("_TABLEFAILED", "Falls eine der Tabellen nicht installiert werden konnte, installiere sie jetzt bitte manuell mit Hilfe der tables.sql im Ordner Docs.");
+define("_UPDATECATORDER", "Kategorie-Anordnung aktualisieren");
+define("_UPDATECATORDERINFO", "<strong>Hinweis:</strong> Dies hat keinen Einfluss auf die Anzeige der Kategorien am Bildschirm, sondern aktualisiert lediglich die Anhordnung in der Datenbank.");
+define("_UPDATESTORIES", "Geschichten- und Serieninformationen aktualisieren");
+define("_UPDATESTORIES11", "Geschichten aktualisieren");
+define("_UPDATESTORIES11INFO", "In diesem Schritt werden deine Geschichten aktualisiert und einige der Felder in der Tabelle bearbeitet. Dieser Vorgang wird in Stapeln von je 200 Aktionen abgearbeitet, die Bearbeitung der Tabelle zum Schluss.");
+define("_UPDATESTORIESINFO", "In diesem Schritt werden die Daten deiner Geschichten aktualisiert. Die Namen von Genres, Charakteren und Warnings werden in ID-Nummern umgewandelt. Dieser Vorgang wird in Stapeln von je 200 Geschichten abgearbeitet.");
+define("_UPDATESTORIESTABLE", "Geschichten- und Serientabellen aktualisieren");

+define("_UPDATESTORIESTABLEMANUAL", "Bitte jetzt die Tabellen manuell mit Hilfe der upgrade20_step10.sql im Docs-Ordner aktualisieren.");
+define("_UPDATESTORIESTABLE11", "Geschichtentabelle aktualisieren");

+define("UPDATESTORIESTABLEMANUAL11", "Bitte jetzt die Geschichtentabelle mit Hilfe der Datei upgrade11_step12.sql im Docs-Ordner aktualisieren.");

+<ul style='text-align: left !important; width: 60%; margin: 1em auto;'>
+<li>Ordner messages/</li>
+<li>dbconfig.php sowie den Ordner der Datenbankkonfigurationsdatei </li>
+<li>blocks_config.php</li>
+<li>categories.php (Wird durch browse.php verarbeitet)</li>
+<li>formselect.js</li>
+<li>func.naughty.php</li>
+<li>func.pagemenu.php</li>
+<li>func.ratingpics.php</li>
+<li>functions.php</li>
+<li>func.reviewform.php</li>
+<li>help.php (Ist jetzt in der Datenbank gespeichert)</li>
+<li>javascript.js (eine neue Version befindet sich im Ordner includes)</li>
+<li>Ordner lib/ </li>
+<li>members_list.php (Eine neue Version befindet sich im Ordner includes)</li>
+<li>naughtywords.php</li>
+<li>seriesblock.php (Eine neue Version befindet sich im Ordner includes)</li>
+<li>storyblock.php (Eine neue Version befindet sich im Ordner includes)</li>
+<li>submission.php (Ist jetzt in der Datenbank gespeichert)</li>
+<li>timefunctions.php</li>
+<li>titles.php (Wird durch browse.php verarbeitet)</li>
+<li>tos.php (Ist jetzt in Datenbank gespeichert)</li>
+<li><strong> Ordner install</strong></li>
+</ul>


+

+<ul style='text-align: left !important; width: 60%; margin: 1em auto;'>
+<li>adminfunctions.php</li>
+<li>adminheader.php</li>
+<li>adminnews.php</li>
+<li>adminstories.php</li>
+<li>adminusers.php</li>
+<li>blocks.php</li>
+<li>categories.php (Wird durch browse.php verarbeitet)</li>
+<li>functions.php</li>
+<li>help.php (Ist jetzt in der Datenbank gespeichert)</li>
+<li>javascript.js (Eine neue Version befindet sich im Ordner includes)</li>
+<li>langadmin.php</li>
+<li>languser.php</li>
+<li>Ordner lib/</li>
+<li>phpinfo.php <strong>(Stellt ein Sicherheitsrisiko dar!)</strong></li>
+<li>storyblock.php (Eine neue version befindet sich im Ordner includes)</li>
+<li>timefunctions.php</li>
+<li>titles.php (Wird durch browse.php verarbeitet)</li>
+<li>Ordner install/ <strong>(Stellt ein Sicherheitsrisiko dar!)</strong></li>
+<li>Dein Ordner mit dbconfig.php</li>





+define("_HELP_DBUSER", "Dies ist der Benutzer mit Zugriff auf die Datenbank.");
+define("_HELP_DBPASS", "Dies ist das Passwort des Datenbankbenutzers.");


+
+//  Missing LANs - fatal error  
+define("_EMAILREQUIRED", "Email is required");
+define("_BADSITEKEY", "Wrong Sitekey");
+

--- /dev/null
+++ b/install/languages/en.php
@@ -1,1 +1,203 @@
-
+<?php
+include(_BASEDIR."version.php");
+
+$defaulttitles = array("welcome" => "Welcome", "copyright" => "Copyright Footer", "printercopyright" => "Printer Friendly Copyright", 
+"help" => "Help", "rules" => "{sitename} Submission Rules", "thankyou" => "{sitename} Acceptance Letter", "nothankyou" => "Rejection Letter", 
+"tos" => "Terms of Service");
+
+define("_ALTER11CHARACTERS", "Altering fanfiction_characters table");
+define("_ALTER11CATEGORIES", "Altering fanfiction_categories table");
+define("_ALTER11RATINGS", "Altering ratings table.");
+define("_DONE", "Done!");
+define("_ERROR_CONFIGWRITE", "ERROR! Could not open config.php for writing.");
+define("_CONFIG_WRITTEN", "Configuration file written.");
+define("_MANUAL2", "manual");
+define("_ADMINACCT", "Set-up Admin Account");
+define("_AUTO", "automatic");
+define("_PAGE", "Page");
+define("_BLOCK", "Block");
+define("_MESSAGE", "Message");
+define("_RESULT", "Result");
+define("_FIELD", "Field");
+define("_AUTHORFIELDS", "Install Author Profile Fields");
+define("_FIELDDATAINFO", "This step installs the default field options for the profile pages.  You can add, edit, or delete fields from the admin panel.");
+define("_FIELDUPDATE", "If you have already added additional fields other than the ones listed above to your site, you may wish to manually add those fields to the database in the fanfiction_authorfields table before continuing.  The next step will move the data from the authors table to the new format.  Also make sure your name for the field and the name given by the update script match.");
+define("_FIELDMANUAL", "Manually install the default field data provided in authorfields.sql in the docs/ folder.");
+define("_FIELDAUTOFAIL", "If a field failed to install, please manually install it using the information in authorfields.sql in the docs/ folder now.");
+define("_AUTHORUPDATE", "Populate Author Preferences Table");
+define("_AUTHORUPDATEINFO", "This step populates the fanfiction_authorprefs and fanfiction_authorinfo tables with information from the authors table.");
+define("_AUTHORRESULT", "Author preferences moved.");
+define("_AUTHORDROPRESULT", "Columns dropped from authors table.");
+define("_BLOCKDATA", "Install Block Data");
+define("_BLOCKDATAUPGRADE", "This step will move your block data from 2.0 into the database. You may change these settings at any time 
+			using the Block admin interface in your admin area.");
+define("_BLOCKDATANEW", "This step will install the default block data. You may change these settings at any time using the Block admin interface in your admin area.");
+define("_BLOCKDATAFAILUPGRADE", "If a block failed to install, please use the default data for blocks provided in the information in blocks.sql file in the docs/ folder to install it manually now.");
+define("_BLOCKDATAMANUAL", "Manually install the default data for the blocks provided in the information in tables.sql found in the docs/ folder now.");
+define("_CHALLENGESALTER", "Added column 'responses' to stories table.");
+define("_CHALLENGESETTING", "Added column 'anonchallenges' to settings table.");
+define("_CHALLENGEUPDATE", "Update Challenge Data");
+define("_CHALLENGEUPDATEINFO", "This step updates the challenges table to add a new column for responses, and updates the data to include a count of responses and switches the character info to the charid values.");
+define("_CHALLENGESEMPTY", "No challenges found.  The new challenges module will not be installed.  If you wish to use challenges in the future, install the module using the install.php file in the modules/challenges/ folder.");
+define("_CONFIG1DETECTED", "eFiction 1.1 config file detected.<br /><a href='upgrade11.php'>Continue with upgrade.</a>");
+define("_CONFIG2DETECTED", "eFiction 2.0 config file detected.<br /><a href='upgrade20.php'>Continue with upgrade.</a>");
+define("_CONFIGFAILED", "Cannot connect to the database.  The information you supplied appears to be incorrect.  Please try again.");
+define("_CONFIGDATA", "Configuration File Setup");
+define("_CONFIGSUCCESS", "Configuration file written.");
+define("_DBHOST", "Database Host:");
+define("_DBNAME", "Database Name:");
+define("_DBUSER", "Database User:");
+define("_DBPASS", "Database Password:");
+define("_DROPGENRES", "Drop genres table");
+define("_DROPWARNINGS", "Drop warnings table");
+define("_DROPGWSTORIES", "Dropped 'wid' and 'gid' from stories table.");
+define("_DROPGWSERIES", "Dropped 'wid' and 'gid' from series table.");
+define("_FAVUPDATE", "Update Favorites Table");
+define("_FAVUPDATEINFO", "This step moves the favorites information into the new favorites table and removes the old favstor, favseries, and favauth tables.");
+define("_FAVUPDATEINFO11", "This step moves the favorites information into the new favorites table and removes the old favstor and favauth tables.");
+define("_FAV1", "Favorite stories information moved.");
+define("_FAV2", "Favorite series information moved.");
+define("_FAV3", "Favorite authors information moved.");
+define("_FAV4", "Table favstor dropped.");
+define("_FAV5", "Table favseries dropped.");
+define("_FAV6", "Table favauth dropped.");
+define("_INSTALLTABLES", "Install Tables");
+define("_LINKDATA", "Install Navigation Link Data");
+define("_LINKDATAINFO", "This step will install the default navigation link data. You may change these settings at any time 
+			using the Page Links admin interface in your admin area.");
+define("_LINKMANUAL", "Manually install the default data for the navigation links provided in the information in pagelinks.sql found in the docs/ folder now.");
+define("_LINKSETUP", "How do you want to install the page links data?");
+define("_LINKAUTOFAIL", "If a link failed to install, please use the default data for pagelinks provided in the information in pagelinks.sql file in the docs/ folder to install it manually now.");
+define("_MESSAGEDATA", "Message Data");
+define("_MESSAGEMANUAL", "Manually install the messages from the messages.sql file found in the docs/ folder now.");
+define("_MESSAGEDATAUPGRADE", "This step will move the default messages for your site into the database. You may change these texts at any time using the Settings admin interface in your admin area.");
+define("_MESSAGEDATANEW", "This step will install the default messages for your site. You may change these texts at any time using the Settings admin interface in your admin area.");
+define("_MESSAGEAUTOFAILUPGRADE", "If one of the default messages failed to install, you may use the default data for messages provided in the information in messages.sql file in the docs/ folder to install it manually now or add it through the admin panel later.");
+define("_MISCDBUPDATE", "Misc. Database Updates");
+define("_MISCDBUPDATEINFO", "This step will alter fields in several tables to keep the database smaller.  How do you wish to proceed?");
+define("_MISCDBUPDATEMANUAL", "You may manually alter your database now using the information in docs/upgrade11_step18.sql.");
+define("_MOVECLASSES", "Move Genres and Warnings");
+define("_MOVECLASSESINFO", "This step moves your genres and warnings information into the the new classes tables.");
+define("_MOVECLASSFAIL", "If any of the genres or warnings failed to be moved, manually insert them now.");
+define("_NEWSUPDATE", "Update News Comments");
+define("_NEWSUPDATEINFO", "This step change the uname field in the comments table to be uid and populates it with the uid of the person rather than penname.");
+define("_NEWSUPDATERESULT", "News comments updated.");
+define("_NEWTABLESSETUP", "How do you want to install the new tables?");
+define("_NEWTABLESMANUAL", "Manually install the tables from the upgrade20_step4.sql file found in the docs/ folder now.");
+define("_NEWTABLEAUTOFAIL", "If a table failed to install, please use the upgrade20_step4.sql file in the docs/ folder to install it manually now.");
+define("_NEWTABLEAUTOFAIL11", "If a table failed to install, please use the upgrade11_step4.sql file in the docs/ folder to install it manually now.");
+define("_OPTIMIZEDB", "Optimize Database");
+define("_OPTIMIZEINFO", "This step will optimize the database through the removal of some indexes on the tables and the addition of a number of new ones. How do you want to optimize the database?");
+define("_OPTIMIZEMANUAL", "Manually optimize the database now using the optimize.sql found in the docs/ folder now.");
+
+define("_PANELDATA", "Install Panel Data");
+define("_PANELDATAINFO", "This step will install the default configuration of panels for the admin area, user account area, top 10 lists
+			 and user profile page.	You may change these settings at any time using the panels admin interface in your admin area.");
+define("_PANELSETUP", "How do you want to install the panel data?");
+define("_PANELMANUAL", "Manually install the default data for panels provided in the information in panels.sql found in the docs/ folder now.");
+define("_PANELAUTOFAIL", "If a panel failed to install, please use the default data for panels provided in the information in panels.sql file in the docs/ folder to install it manually now.");
+define("_REVIEWUPDATE", "Update Reviews Table and Data");
+define("_REVIEWALTER1", "Column 'sid' changed to 'item'");
+define("_REVIEWALTER2", "Added column 'type'");
+define("_REVIEWALTER3", "Column 'member' changed to 'uid'");
+define("_REVIEWALTER4", "Drop column 'seriesid'");
+define("_REVIEWALTER5", "Add column 'respond'");
+define("_REVIEWALTER6", "Column 'sid' changed to 'chapid'");
+define("_REVIEWALTER7", "Column 'psid' changed to 'item'");
+define("_REVIEWUPDATE1", "Set type to 'ST' for all story reviews.");
+define("_REVIEWUPDATE2", "Set item to seriesid and type to 'SE' for all series reviews.");
+define("_REVIEWUPDATE3", "Mark all reviews with author's responses as responded to.");
+define("_REVIEWUPDATEINFO", "This step will alter the reviews table then convert all reviews in the table to the new format.");
+define("_SERIESREVIEWS", "Update Series Review");
+define("_SERIESREVIEWSINFO", "This step updates the series reviews and ratings to include the reviews and ratings of included stories and series.");
+define("_SETTINGSPREFIX", "Settings Table Prefix:");
+define("_SETTINGSTABLE", "Create Settings Table"); // Added 01/15/07
+define("_SETTINGSTABLEMANUAL", "Manually install the settings table from the tables.sql file found in the docs/ folder now.");
+define("_SETTINGSTABLEMANUALUP", "Manually install the settings table from the settingstable.sql file found in the docs/ folder now.");
+define("_SETTINGSTABLENOTE", "You may set a prefix for your settings table different from the other tables in your eFiction install.  This will allow you to share the settings table between multiple installs of eFiction in the same database.");
+define("_SETTINGSTABLESETUP", "How do you want to install the settings table?");
+define("_SETTINGSTABLESUCCESS", "Settings table created successfully!");
+define("_SETTINGSTABLEAUTOFAIL", "Automatic creation of settings table failed!  Please create this table manually.");
+define("_SITESETTINGSMOVED", "Site settings have been moved to settings table.");
+define("_SITEKEYNOTE", "You may use the randomly generated key or choose one of your own.");
+define("_SKINWARNING", "<strong>Note:</strong>  eFiction ".$version." will require you to make some updates to your skins.  You are <strong>highly</strong> encouraged to choose one of the skins included in the download as default until you can upgrade your skins.");
+define("_STORIESPATHNOTWRITABLE", "The folder in which you wish to store your stories may not be writable!  You must CHMOD this folder to 777 (on some systems 755) to be able to write stories to the folder!");
+define("_STORIESUPDATED", "The stories have been updated.");
+define("_TABLESMANUAL", "Manually install the tables found in the docs/ folder now.");
+define("_TABLESINSTALL", "Install the database tables.");
+define("_TABLEFAILED", "If a table failed to install, please use the tables.sql file in the docs/ folder to install it manually now.");
+define("_UPDATECATORDER", "Update Categories Order");
+define("_UPDATECATORDERINFO", "<strong>Note:</strong> This will <u>NOT</u> affect how your categories are displayed on screen, merely how that information is stored in the database.");
+define("_UPDATESTORIES", "Update Story and Series Information");
+define("_UPDATESTORIES11", "Update Stories");
+define("_UPDATESTORIES11INFO", "This step will update the data for your stories and alter some of the fields in the table.  This will be done in batches of 200 with the database alterations done at the end.");
+define("_UPDATESTORIESINFO", "This step will update the data for your stories converting the names of genres, warnings, characters, and ratings to id numbers.  This will be done in batches of 200 stories.");
+define("_UPDATESTORIESTABLE", "Update Stories and Series Tables");
+define("_UPDATESTORIESTABLEINFO", "This step will create the classes column in your stories and series tables. How do you want to proceed?");
+define("_UPDATESTORIESTABLEMANUAL", "Manually update your stories table from the upgrade20_step10.sql file in the docs/ folder now.");
+define("_UPDATESTORIESTABLE11", "Update Stories Table");
+define("_UPDATESTORIESTABLEINFO11", "This step will modify the stories table to conform to eFiction ".$version.".  How do you want to proceed?");
+define("UPDATESTORIESTABLEMANUAL11", "Manually update your stories table from the upgrade11_step12.sql file in the docs/ folder now.");
+define("_UPGRADEEND","You may now delete the following files and directories:<br />
+<ul style='text-align: left !important; width: 60%; margin: 1em auto;'>
+<li>messages/ folder</li>
+<li>your databasepath folder and dbconfig.php file</li>
+<li>blocks_config.php</li>
+<li>categories.php (handled through browse.php)</li>
+<li>formselect.js</li>
+<li>func.naughty.php</li>
+<li>func.pagemenu.php</li>
+<li>func.ratingpics.php</li>
+<li>functions.php</li>
+<li>func.reviewform.php</li>
+<li>help.php (saved in the database now)</li>
+<li>javascript.js (A new version has been placed in the includes/ folder)</li>
+<li>lib/ folder</li>
+<li>members_list.php (A new version has been placed in the includes/ folder)</li>
+<li>naughtywords.php</li>
+<li>seriesblock.php (A new version has been placed in the includes/ folder)</li>
+<li>storyblock.php (A new version has been placed in the includes/ folder)</li>
+<li>submission.php (saved in the database now)</li>
+<li>timefunctions.php</li>
+<li>titles.php (handled through browse.php)</li>
+<li>tos.php (saved in the database now)</li>
+<li><strong>install/ folder</strong></li>
+</ul>
+<p>You are also encouraged to CHMOD config.php to 644 as a security measure.</p>
+<p><a href='../index.php'>Return to your Site.</a></p");
+
+define("_UPGRADE11END", "You may now delete the following files and directories:<br />
+<ul style='text-align: left !important; width: 60%; margin: 1em auto;'>
+<li>adminfunctions.php</li>
+<li>adminheader.php</li>
+<li>adminnews.php</li>
+<li>adminstories.php</li>
+<li>adminusers.php</li>
+<li>blocks.php</li>
+<li>categories.php (handled through browse.php)</li>
+<li>functions.php</li>
+<li>help.php (saved in the database now)</li>
+<li>javascript.js (A new version has been placed in the includes/ folder)</li>
+<li>langadmin.php</li>
+<li>languser.php</li>
+<li>lib/ folder</li>
+<li>phpinfo.php <strong>(Poses a security risk!)</strong></li>
+<li>storyblock.php (A new version has been placed in the includes/ folder)</li>
+<li>timefunctions.php</li>
+<li>titles.php (handled through browse.php)</li>
+<li>install/ folder<strong>(Poses a security risk!)</strong></li>
+<li>your databasepath folder and dbconfig.php file</li>
+</ul><p><a href='../index.php'>Return to your Site.</a></p>
+<p>You are also encouraged to CHMOD config.php to 644 as a security measure.</p>
+<p><a href='../index.php'>Return to your Site.</a></p>");
+define("_HELP_DBHOST", "The host server for your mySQL database.  Generally 'localhost' is the most likely setting unless your web host has informed you differently.");
+define("_HELP_DBNAME", "This should be the name of your database.  You should have already created the database before starting this install.  You will most likely create your database through your web host's control panel.");
+define("_HELP_DBUSER", "This is the user you (or your webhost) assigned to the database when it was created.");
+define("_HELP_DBPASS", "This is the password for the database user.");
+define("_HELP_INSTALL_SITEKEY", "The sitekey will be used to access the settings for your site.  It is also used to prevent crossed member logins when two or more sites are installed on the same domain.  You <strong>must</strong> have a <strong>unique</strong> sitekey for each eFiction site!  If you leave this blank, the script will randomly generate another one for you.");
+define("_HELP_SETTINGSPREFIX", "This allows you to define a separate prefix for the settings table.  This allows you to share the settings table among more than one eFiction site in the same database.");
+
+//  Missing LANs - fatal error  
+define("_EMAILREQUIRED", "Email is required");
+define("_BADSITEKEY", "Wrong Sitekey");
+

--- /dev/null
+++ b/install/languages/index.php

file:b/languages/en.php (new)
--- /dev/null
+++ b/languages/en.php
@@ -1,1 +1,447 @@
-
+<?php
+ 
+if(!isset($action) OR is_null($action)) $action = "";
+
+
+// Defines the doc type.  Most people will not need to change this.
+define ("_DOCTYPE", "<!doctype html>");
+
+// Your alphabet list.  If you need other than single characters be sure to enclose the character entity in quotes.  For example: "&#338;"
+define ("_OTHER", "Other");
+$alphabet = array( 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', _OTHER );
+
+// General...used in many pages.
+
+
+define ("_ACTIONSUCCESSFUL", "The action was successful.");
+define ("_ACTIONCANCELLED", "The requested action was cancelled.");
+define ("_ACTIVE", "Active");
+define ("_ADD", "Add");
+define ("_ADDAUTHOR2FAVES", "Add Author to Favorites");
+define ("_ADDSTORY2FAVES", "Add Story to Favorites");
+define ("_ADDTOFAVORITES", "Add to Favorites");
+define ("_ADMINOPTIONS", "Admin Options");
+define ("_AGECHECK", "Age Consent Required");
+define ("_AGECONSENT", "I am of the age of consent in my locale to view materials with adult content.&nbsp; I realize that by agreeing, the normal warnings for stories with adult content will be by-passed.");
+define ("_ALL", "All");
+define ("_ALLOWEDTAGS", "<span style=\"font-weight: bold; text-decoration: underline;\">Note:</span> Allowed HTML tags are: ".htmlentities(preg_replace("/></", "> <", $allowed_tags)));
+define ("_ALLSTORIES", "All Stories");
+define ("_ALPHA", "Alphabetically");
+define ("_ANONYMOUS", "Anonymous");
+define ("_AUTHORSNOTES", "Author's Notes");
+define ("_BACK2ACCT", "Back to <a href=\"user.php\">your account</a> area.");
+define ("_BACK2ADMIN", "Back to <a href=\"admin.php\">Admin</a> area.");
+define ("_BACK2CATS", "Back to Main Categories");
+define ("_BACK2PREVIOUS", "Back to Previous.");
+define ("_BACK2STORY", "<a href='viewstory.php?sid=%s'>Back to story.</a>");
+define ("_BACK2SERIES", "<a href='series.php?seriesid=%s'>Back to series.</a>");
+define ("_BACK2REVIEWS", "<a href='reviews.php?%s'>Back to reviews.</a>");
+define ("_BY", "by");
+define ("_CAPTCHAFAIL", "The security code you entered did not match.  Please <a href=\"javascript: history.back(1)\">try again.</a>");
+define ("_CAPTCHANOTE", "Enter the security code shown below:");
+define ("_CATEGORIES", "Categories");
+define ("_CATEGORY", "Category");
+define ("_CATLOCKED", "This category is locked.");
+define ("_CATOPTIONS", "Category Options");
+define ("_CLEAR", "Clear");
+define ("_CHAPTER", "Chapter");
+define ("_CHAPTERS", "Chapters");
+define ("_CHARACTERS", "Characters");
+define ("_CHOOSECAT", "Choose a Category");
+define ("_CONFIRMDELETE", "Are you sure you want to delete this?");
+define ("_COAUTHORSEARCH", "Type in the first few letters of the person's penname.  The first ten matches will appear in a list.  Click on the person's name to select them as a co-author.");
+define ("_DELETE", "Delete");
+define ("_DISLIKE", "dislike");
+define ("_DOWN", "down arrow");
+define ("_EDIT", "Edit");
+define ("_EDITFAVORITES", "Edit Favorites");
+define ("_EMAIL", "E-mail");
+define ("_EMAILFAILED", "The email could not be sent.  Please <a href='"._BASEDIR."contact.php'>contact the administrator</a> to report this problem.");
+define ("_ERROR", "<strong>Error!</strong>We encountered an error.  Please go back and try again.");
+define ("_FATALERROR", "<b>A fatal MySQL error was encountered.</b><br />");
+define ("_FSTORY", "Feature");
+define ("_GO", "Go");
+define ("_HALFSTAR", "half-star");
+define ("_JAVASCRIPTOFF", "You must have javascript enabled for this form to work properly."); // Modified for version 3.0
+define ("_LIKE", "like");
+define ("_LOGIN", "Log In");
+define ("_PLEASELOGIN", "Please login to access this feature.");
+define ("_MEMBER", "Member");
+define ("_MEMBERS", "Members");
+define ("_MOSTRECENT", "Most Recent");
+define ("_MOVE", "Move");
+define ("_MOVETOP", "Move to Top"); // Really only used in the admin files, but we need it in the header.
+define ("_MULTIPLECATEGORIES", 
+"<span style=\"text-decoration: underline; font-weight: bold;\">Note:</span> You may select multiple categories.  
+<u>Please be aware that when you select a category in the drop-down menu below, the options in the list will change to display that category's sub-categories.</u>
+ Press the 'Select >' button to add it to your choices. You may clear your selections at any time using the 'Clear' button.");
+define ("_MULTIPLESELECT", "Hold the CTRL key to make multiple selections.");
+define ("_NAME", "Name");
+define ("_NAUGHTYWORDS", "You have triggered our bad language filters.  We require that all content not behind an age verification warning be suitable for all audiences.  This includes titles, summaries, and names (for anonymous reviews, challenges, etc.). Please <a href=\"javascript: history.back(1)\">try again.</a>");
+define ("_NEXT", "Next");
+define ("_NEW", "New!");
+define ("_NO", "No");
+define ("_NODBFUNCTIONALITY", "It appears no applicable database functionality for PHP has not been enabled in the php configuration for this website.  Please consult the PHP documentation or ask your hosting provider.");
+define ("_NOMAILSENT", "We encountered an error.  No e-mail was sent.");
+define ("_NONE", "None");
+define ("_NOSKIN", "The skin you selected in your user profile seems to be missing.  The site's default skin will be used instead. Please edit your profile to choose another skin.");
+define ("_NORESULTS", "No results found.");
+define ("_NOTAUTHORIZED", "You are not authorized to access that function.");
+define ("_NOTCONNECTED", "ERROR: Failed to connect to the database!");
+define ("_OPTIONS", "Options");
+define ("_OR", "or");
+define ("_ORPHAN", "Orphan");
+define ("_OTHERRESULTS", "Other Results");
+define ("_PENNAME", "Penname");
+define ("_PFSTORY", "Past Featured Story");
+define ("_POSSIBLEHACK", "A hacking attempt has been detected.");
+define ("_PREVIEW", "Preview");
+define ("_PREVIOUS", "Previous");
+define ("_PRINTER", "Printer");
+define ("_ORDER", "Order");
+define ("_RATING", "Rating");
+define ("_RATINGS", "Ratings");
+define ("_REMOVE", "Remove");
+define ("_REQUIREDINFO", "Some of the required information is missing.  Please check your input.");
+define ("_REVIEW", "Review");
+define ("_REVIEWNOTE", "<span style=\"text-decoration: underline; font-weight: bold;\">Note:</span> You may submit either a rating or a review or both.");
+define ("_REVIEWRATING", _RATING);
+define ("_REVIEWS", "Reviews");
+define ("_RETIRE", "Retire");
+define ("_RETIRED", "Retired");
+define ("_RUSERSONLY", "Registered Users Only");
+define ("_SELECT", "Select");
+define ("_SELECTCATS", "Selected Categories");
+define ("_SERIES", "Series");
+define ("_SORT", "Sort");
+define ("_STAR", "star"); 
+define ("_STORIES", "Stories");
+define ("_STORY", "Story");
+define ("_SUBMIT", "Submit");
+define ("_SUMMARY", "Summary");
+define ("_TEXT", "Text");
+define ("_TINYMCETOGGLE", "Use tinyMCE");
+define ("_TITLE", "Title");
+define ("_TOC", "Table of Contents");
+define ("_TOPLEVEL", "Top Level Category"); // Really only used in the admin, but needs to load with the header.
+define ("_UP", "up arrow");
+define ("_WIP", "Work in Progress Only"); // Added 01/12/07
+define ("_YES", "Yes");
+
+// Login
+
+define ("_REMEMBERME", "Remember Me");
+define ("_MEMBERLOGIN", "Member Login");
+
+// Browse
+define ("_BROWSE", "Browse");
+define ("_RECENTSTORIES", "Stories updated in the last ".$recentdays." days.");
+define ("_EMAILSENT", "Your e-mail has been sent.");
+define ("_TITLES", "Titles");
+// Contact Us
+define ("_YOUREMAIL", "Your E-mail");
+define ("_CONTACTUS", "Contact Us");
+
+// Members/Authors page
+define ("_AUTHORS" , "Authors");
+define ("_BETAS", "Beta-readers");
+define ("_ALLMEMBERS", "All Members");
+define ("_SITEADMINS", "Site Admins");
+
+// News
+define ("_COMMENTS", "Comments");
+define ("_NEWS", "News");
+
+// Reviews
+define ("_ALREADYRESPONDED", "You have already responded to that review!");
+define ("_BACKTOSTORY", "Back to story.");
+define ("_DELETEREVIEW", "Delete Review");
+define ("_DISLIKED", "Disliked");
+define ("_LIKED", "Liked");
+define ("_MISSINGINFO", "You must supply either a review or rating.");
+define ("_MISSINGINFO2", "Rating a story without writing a review is not allowed.  You must write a review.");
+define ("_OPINION", "Opinion");
+define ("_RESPECTNOTE", " Please be respectful and polite when contacting an author.");
+define ("_RESPOND", "Respond");
+define ("_REVEMAIL1", "New Review at $sitename for ");
+define ("_REVEMAIL2", "Hello,
+  You have received a new review at $sitename.\r\n You can view your new review at <a href='$url/reviews.php?%1\$s'>$url/reviews.php?%1\$s</a>.
+If you no longer wish to receive e-mails such as this, please go to <a href='$url/user.php'>your account</a>\r\n
+on $sitename, and edit your profile."); // Modified 11-12-05
+define ("_REVIEWSFOR", "Reviews For");
+define ("_REVTHANKYOU", "Thank you for your review!");
+define ("_SIGNED", "Signed");
+define ("_VIEWALLREVIEWS", "View All Reviews");
+
+// Search
+
+define ("_10LISTS", "Top Ten Lists");
+define ("_10LARGESERIES", "Ten Largest Series");
+define ("_10SMALLSERIES", "Ten Smallest Series");
+define ("_10REVIEWEDSERIES", "Ten Most Reviewed Series");
+define ("_10FAVSERIES", "Ten Favorite Series");
+define ("_10SHORTSTORY", "Ten Shortest Stories");
+define ("_10LONGSTORY", "Ten Longest Stories");
+define ("_10REVIEWEDSTORY", "Ten Most Reviewed Stories");
+define ("_10FAVSTORY", "Ten Favorite Stories");
+define ("_10FAVAUTHOR", "Ten Favorite Authors");
+define ("_10PROLIFICAUTHOR", "Ten Most Prolific Authors");
+define ("_10PROLIFICREVIEWER", "Ten Most Prolific Reviewers");
+define ("_ADVANCED", "Advanced Search");
+define ("_COMPLETEONLY", "Completed Only");
+define ("_EXCLUDE", "to Exclude");
+define ("_FULLTEXT", "Full Text");
+define ("_INCLUDE", "to Include");
+define ("_RESULTS", "Search Results");
+define ("_SEARCHTERM", "Search term");
+define ("_SEARCHTERMTOOSHORT", "Your search term was too short.  Your search term must be a minimum of three characters long. <a href='search.php'>Try again.</a>");
+define ("_SIMPLE", "Simple Search");
+define ("_WORDCOUNT", "Word count");
+define ("_SEARCH", "Search");
+
+// Series
+define ("_ADD2SERIES", "Add to Series");
+define ("_ADDSERIES", "Add New Series");
+define ("_ADDSERIES2FAVES", "Add Series to Favorites");
+define ("_BACKTOSERIES", "Back to the Series"); // Added 11-06-05
+define ("_CHOOSEAUTHOR", "Choose another author");
+define ("_CLOSED", "Closed"); // Added 02-10-07
+define ("_CONFIRMREMOVE", "Are you sure you want to remove this from the series?"); // Added 12-22-05
+define ("_DELETESERIES", "Delete Series");
+define ("_EDITSERIES", "Edit Series");
+define ("_MANAGESERIES", "Manage Series");
+define ("_MODERATED", "Moderated"); // Added 02-10-07
+define ("_OPEN", "Open");
+define ("_OPENNOTE", "<span style=\"font-weight: bold; text-decoration: underline;\">Note:</span>  An open series is a shared universe (sometimes called a sandbox) in which other authors may add to the series.  
+By marking your series as open, <u>other authors will be able to add to the series.</u>  A moderated series will allow other authors to add to the series, but those entries must be approved by the series owner. 
+Only the series owner (and the site admins) may add to a closed series.");
+define ("_REMOVEFROM", "Remove From Series");
+define ("_SERIESNOTE", "<span style=\"font-weight: bold; text-decoration: underline;\">Note:</span>  You will choose the stories to add to your series on the next page.");
+define ("_SERIESNOTE2", "<span style=\"font-weight: bold; text-decoration: underline;\">Note:</span>  You will set the order of your stories and subseries on the next page.");
+define ("_SERIESTYPE", "Series Type"); // Added 02-10-07
+define ("_SERIESTITLEREQUIRED", "A title for the series is required!");
+define ("_NEWSERIESITEMS", "New items have been submitted to your series, %1\$s, at $sitename.  To validate these additions log in to your account.");
+define ("_SERIESITEMSSUBS", "New items for %1\$s at $sitename");
+
+// Stories
+
+define ("_ADDNEWCHAPTER", "Add New Chapter");
+define ("_ADDNEWSTORY", "Add New Story");
+define ("_ADDSTORY", "Add Story");
+define ("_AUTHOR", "Author");
+define ("_AUTHORALERTNOTE", "One of your favorite authors at $sitename has posted a new story.<br><br>%1\$s "._BY." %2\$s<br><br>%3\$s<br><br><a href=\"$url/viewstory.php?sid=%4\$d\">$url/viewstory.php?sid=%4\$d</a>If you no longer wish to receive e-mails such as this, please go to <a href='$url/user.php'>your account</a>\r\n
+on $sitename, and edit your profile.");  // Modified 2-3-10 to add reminder for turning off alerts
+define ("_CHAPTERNOTES", "Chapter Notes");
+define ("_CHAPTERTITLE", "Chapter Title");
+define ("_COAUTHORS", "Co-Authors");
+define ("_COMPLETE", "Complete");
+define ("_CURRENT", "Current");
+define ("_DELETECHAPTERTITLE", "Delete Chapter");
+define ("_DELETESTORY", "Are you sure you want to delete this story? All chapters beneath it will be deleted as well!");
+define ("_DELETESTORYTITLE", "Delete Story");
+define ("_EDITCHAPTER", "Edit Chapter");
+define ("_EDITSTORY", "Edit Story");
+define ("_ENDNOTES", "End Notes");
+define ("_FEATURED", "Featured");
+define ("_HIDECHAPTERS", "Hide Chapters");
+define ("_INVALIDUPLOAD", "Invalid Upload!  File uploads must be in plain text or html format.");
+define ("_LOCKED", "This category is locked.");
+define ("_MANAGESTORIES", "Manage Stories");
+define ("_MISSINGFIELDS", "Some of the required information is missing.  Please check your input.  Required fields are title, summary, ".($multiplecats ? strtolower(_CATEGORIES.", ") : "")."rating, and story text."); // Modified 11/06/05 - If categories are turned off don't show category as required field. :)
+define ("_NEWSTORYAT", "New Story at ");
+define ("_NEWSTORYAT2", "A new story has been submitted to the validation queue at $sitename.<br><br> %1\$s by %2\$s<br><br>%3\$s\n\nIf you no longer wish to receive e-mails such as this, please go to <a href='$url/user.php'>your account</a>\r\n
+on $sitename, and edit your profile.");  // Modified 2-3-10 to add reminder for turning off alerts
+define ("_NOSTORYTEXT", "You must include the text of your story either as an upload or as input into the textarea.");
+define ("_READS", "Read Count");
+define ("_ROUNDROBIN", "Round robin");
+define ("_STORYADDED", "Your story has been added. If the admin is reviewing submissions, then it will appear to the public after they have okayed it. In the meantime, you can always edit the story in your account area.");
+define ("_STORYALERT", "Update to favorites at $sitename");
+define ("_STORYALERTNOTE", "%1\$s by %2\$s, one of your favorite stories at $sitename, has been updated.<br><br><a href=\"$url/viewstory.php?sid=%3\$d&amp;chapter=%4\$d\">$url/viewstory.php?sid=%3\$d&amp;chapter=%4\$d</a>\n\nIf you no longer wish to receive e-mails such as this, please go to <a href='$url/user.php'>your account</a>\r\n
+on $sitename, and edit your profile."); // Modified 2-3-10 to add reminder for turning off alerts
+define ("_STORYNOTES", "Story Notes");
+define ("_STORYTEXTTEXT", "Story Text (text)");
+define ("_STORYTEXTFILE", "Story Text (file)");
+define ("_STORYUPDATED", "The story has been updated.");
+define ("_VALIDATED", "Validated");
+define ("_VIEWCHAPTERS", "View Chapters");
+define ("_WORDCOUNTFAILED", "Your story failed to meet the required minimum or maximum word count for story submission on this site.  Each chapter must be".($minwords ? " no less than ".$minwords : "").($maxwords ? ($minwords ? " and" : "")." no more than $maxwords " : "")." words long.");
+
+
+// User
+
+define ("_USERACCOUNT", "Member Account");
+
+// User --  Edit prefs
+define ("_ALERTSON2", "Contact when favorites are updated.");
+define ("_BETANOTE", "I would like to volunteer to be a beta-reader for others.");
+define ("_CONTACTREVIEWS", "Contact for new reviews");
+define ("_CONTACTRESPOND", "Contact when author responds to review");
+define ("_DEFAULTSORT", "Default Story Sort");
+define ("_DISPLAYINDEX", "Display table of contents for stories.");
+define ("_EDITPREFS", "Edit Preferences");
+define ("_REQUIREDFIELDS", "Indicates required fields.");
+define ("_SKIN", "Skin");
+define ("_USETINYMCE", "Use tinyMCE WYSWYG editor");
+
+// User - Edit Bio/Registration (default)
+define ("_AOL", "AOL IM");
+define ("_BADEMAIL", "That address doesn't appear to be in our database. Please <a href=\"user.php?action=lostpassword\">try again.</a>");
+define ("_BADUSERNAME", "Sorry! Usernames can only contain letters, numbers, underscores, hyphens, or spaces, and must be between 3 and 20 characters long.");
+define ("_BIO", "Bio");
+define ("_EDITPERSONAL", "Edit Personal Information");
+define ("_EMAILINUSE", "This email address has already been used to sign up for an account. If you've lost your password, please generate a new one by using the <a href=\"user.php?action=lostpassword\">lost password</a> feature.");
+define ("_ICQ", "ICQ");
+define ("_INVALIDEMAIL", "The e-mail address you supplied is an invalid format.");
+define ("_NEWACCOUNT", "New Account");
+define ("_NEWPEN", "%1\$s ( %2\$d ) changed penname %3\$s ( %4\$d ) to %5\$s.");
+define ("_MSN", "MSN IM");
+define ("_PASSWORD", "Password");
+define ("_PASSWORD2", "Confirm Password");
+define ("_PASSWORDTWICE", "You must enter your new password twice. Please <a href=\"user.php?action=".$action."\">try again</a>.");
+define ("_PWDREQUIRED", "A password is required to access this function.");
+define ("_PENEMAILREQUIRED", "You must fill out the penname and email fields. Please <a href=\"user.php?action=newaccount\">try again</a>.");
+define ("_PENNAMEINUSE", "This penname is already in use.");
+define ("_REALNAME", "Real name");
+define ("_REGISTER", "Register");
+define ("_REGLOG", "%1\$s (%2\$d) registered from IP address %3\$s.");
+define ("_SIGNUPSUBJECT", "Welcome to $sitename");
+define ("_SIGNUPMESSAGE", "Hello, you or someone using your email has signed you up at $sitename. Your login and password are below:\n\n");
+define ("_SIGNUPTHANKS", "Thank you for signing up! You will receive ".(!$pwdsetting ? "your temporary password" : "a confirmation")." at the e-mail address you provided.");
+define ("_SIGNUPWARNING",  "It is recommended that you log in and change the password to something easier for you to remember.");
+define ("_TRYAGAIN", "Please try again.");
+define ("_WEBSITE", "Website");
+define ("_YAHOO", "Yahoo IM");
+
+// User - Image Management
+
+define ("_ALLOWEDEXT","Only files with the following extensions are allowed: ");
+define ("_ALREADYEXISTS", "Uploading <strong>%s...Error!</strong> Sorry, a file with this name already exists.");
+define ("_BADFILENAMES", "You have tried to upload the following files with invalid characters inside the filename.");
+define ("_FILENAME", "Filename");
+define ("_FILENOTEXISTS", "The file <strong>%s</strong> does not exist.");
+define ("_IMAGE", "Image");
+define ("_IMAGECODE", "HTML code to use image in story");
+define ("_IMAGETOOBIG", "This image is too big. Images may only be $imagewidth wide by $imageheight high. Please <a href=\"user.php?action=manageimages&upload=upload\">try again</a>.");
+define ("_INVALIDNAME", "Sorry, the filename contains invalid characters. Use only alphanumerical chars and separate parts of the name (if needed) with an underscore. <br>A valid filename ends with one dot followed by the extension.");
+define ("_MANAGEIMAGES", "Manage Images");
+define ("_MAXFILENAME", "The filename exceeds the maximum length of %s characters.");
+define ("_MAXFSSERVER", "The uploaded file exceeds the max. upload filesize directive in the server configuration.");
+define ("_MAXFSFORM", "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form.");
+define ("_NODIRECTORY", "Sorry, the upload directory doesn't exist!");
+define ("_NOFILESSELECTED", "Select at least on file.");
+define ("_NOFILESELECTED", "No file was uploaded.");
+define ("_PARTIALUPLOAD", "The uploaded file was only partially uploaded");
+define ("_RENAMEDTO", "The uploaded file was renamed to <b>%s</b>.");
+define ("_SELECTFILE", "Please select a file for upload.");
+define ("_UPLOADIMAGE", "Upload New Images");
+define ("_UPLOADSUCCESS", "<strong>%s</strong> successfully uploaded!");
+define ("_VIEW", "View");
+define ("_WRONGEXT", "You have tried to upload %1\$d files with a bad extension, the following extensions are allowed: <strong>%2\$s</strong>");
+
+// User - Lost password
+
+define ("_ENTEREMAIL", "Enter your e-mail address");
+define ("_LOSTPASSWORD", "Lost password");
+define ("_NEWPWDSUB", "New Password for $sitename");
+define ("_NEWPWDMSG", "Hello, you appear to have requested a new password for $sitename. Your new password is:\n\nPassword: %s\n\nIt is recommended that you log in and change the password to something easier for you to remember.");
+define ("_PASSWORDSENT", "A new password has been sent to your e-mail address.");
+
+// User - Stats
+
+define ("_AUTHOROF", "Author of:");
+define ("_FAVOF", "Favorite author of");
+define ("_FAVORITE", "Favorite");
+define ("_MANAGEREVIEWS", "Manage Your Reviews");
+define ("_STATSFOR", "Statistics for ");
+define ("_UNRESPONDED", "Unresponded");
+define ("_YOURFAVORITES", "Your Favorites");
+define ("_YOURSTATS", "Your Statistics");
+define ("_YOURREVIEWS", "Your Reviews");
+
+// User - Manage Favorites
+
+define ("_MANAGEFAVORITES", "Manage Favorites");
+define ("_REMOVEFAV", "Remove Favorite");
+
+// User - Login
+
+define ("_WRONGPASSWORD", "That password doesn't match the one in our database. Please <a href=\"user.php?action=login\">try again</a> or retrieve a <a href=\"user.php?action=lostpassword\">new password</a> if you can't remember yours.");
+define ("_ACCOUNTLOCKED", "This account has been locked by the adminstrators of this site.  Please <a href='contact.php'>contact</a> the site adminstrators for more information.");
+define ("_NOSUCHACCOUNT", "There is no such account on our website."); // Added 6-18-2008
+
+// User - Review Response
+define("_AUTHORSRESPONSE", "Author's Response");
+define ("_RESPONSESUBJECT", "Author Response to Your Review at $sitename");
+define ("_RESPONSETEXT", "{penname} has responded to your review.\r\n\r\nYou can see the response at <a href=\"".$url."/reviews.php?reviewid={review}\">".$url."/reviews.php?reviewid={review}</a>");
+
+// View story
+
+define ("_ACCESSDENIED", "Access denied. This story has not been validated by the adminstrators of this site.");
+define ("_ARCHIVEDAT", "This story archived at");
+define ("_BACK2INDEX", "Back to index");
+define ("_CONTINUE", "Continue");
+define ("_CONTRIBUTE2RR", "Contribute to Round Robin");
+define ("_INVALIDSTORY", "That story does not exist on this archive.  You may <a href='search.php'>search</a> for it or return to <a href='index.php'>the home page.</a>");
+define ("_LOGINTOREVIEW", "You must %1\$s (%2\$s) to review.");
+define ("_SUBMITREVIEW", "Submit a Review");
+define ("_TEXTSIZE", "Text Size");
+
+// View User
+
+define ("_ADMINISTRATOR", "Administrator");
+define ("_CONTACT", "Contact");
+define ("_CONTACTAUTHOR", "Contact Author:");
+define ("_EDITADMIN", "Edit Admin Privileges");
+define ("_FAVORITEAUTHORS", "Favorite Authors"); // Added for 3.0
+define ("_FAVORITESERIES", "Favorite Series"); // Added for 3.0
+define ("_FAVORITESTORIES", "Favorite Stories"); // Added for 3.0
+define ("_FAVORITESOF", "Favorites of "); // Added for 3.0
+define ("_LOCKMEM", "Lock Account");
+define ("_MAKEADMIN", "Make User an Admin");
+define ("_REVOKEADMIN", "Revoke Admin Privileges");
+define ("_REVOKEVAL", "Revoke Validation");
+define ("_REVIEWSBY", "Reviews by ");
+define ("_SERIESBY", "Series by ");
+define ("_SITESIG", "This message was sent to you from $sitename located at <a href='$url'>$url</a>.");
+define ("_SITESIG2", "This message was sent to you by %s from $sitename located at <a href='$url'>$url</a>.");
+define ("_STORIESBY", "Stories by");
+define ("_SUBJECT", "Subject");
+define ("_UNLOCKMEM", "Unlock Account");
+define ("_VALIDATE", "Validate");
+
+// Tooltip help for various items.  
+define ("_HELP_NEWREV", "Check this box if you wish to receive an e-mail notice each time you get a new review.");
+define ("_HELP_NEWRESP", "Check this box if you wish to receive an e-mail notice each time an author resonds to your review.");
+define ("_HELP_FAVALERT", "Check this box if you wish to receive an e-mail notice each time one of your favorite stories is updated or when one of your favorites author's publishes a new story.");
+define ("_HELP_BETA", "Check this box if you are willing to have other author's contact you to read their stories before they are published and provide the feedback and help the author requests.");
+define ("_HELP_TOC", "Check this box if you wish to see the story index first rather than the first chapter of the story on multi-chapters.");
+define ("_HELP_TINYMCE", "Check this box if you wish to use the tinyMCE editor when entering content in forms.  You will have the option to toggle the editor on/off if need be.");
+define ("_HELP_AGE", "By agreeing, you are confirming you are above the age of majority in your locality and that you wish to view the adult oriented material on this site.");
+define ("_HELP_DEFAULTSORT", "Select the order in which to sort stories by default.  Your choices are Alphabetically or Most Recent (newest to oldest).");
+define ("_HELP_SKIN", "Choose the appearance of the site.");
+
+// Log strings
+define ("_LOG_ADMIN_DEL", "<a href='viewuser.php?uid=%2\$d'>%1\$s</a> deleted <a href='viewstory.php?sid=%4\$d'>%3\$s</a> by <a href='viewuser.php?uid=%6\$d'>%5\$s</a>.");
+define ("_LOG_ADMIN_EDIT", "<a href='viewuser.php?uid=%2\$d'>%1\$s</a> edited <a href='viewstory.php?sid=%4\$d'>%3\$s</a> by <a href='viewuser.php?uid=%6\$d'>%5\$s</a>.");
+define ("_LOG_ADMIN_DEL_CHAPTER", "<a href='viewuser.php?uid=%2\$d'>%1\$s</a> deleted <a href='viewstory.php?sid=%4\$d'>%3\$s</a> by <a href='viewuser.php?uid=%6\$d'>%5\$s</a>, chapter %7\$d");
+define ("_LOG_ADMIN_EDIT_CHAPTER", "<a href='viewuser.php?uid=%2\$d'>%1\$s</a> edited <a href='viewstory.php?sid=%4\$d'>%3\$s</a> by <a href='viewuser.php?uid=%6\$d'>%5\$s</a>, chapter %7\$d");
+define ("_LOG_ADMIN_EDIT_AUTHOR", "<a href='viewuser.php?uid=%2\$d'>%1\$s</a> changed the author of <a href='viewstory.php?sid=%4\$d'>%3\$s</a> by <a href='viewuser.php?uid=%8\$7'>%5\$s</a> to <a href='viewuser.php?uid=%6\$d'>%5\$s</a>.");
+define ("_LOG_ADMIN_DEL_SERIES", "<a href='viewuser.php?uid=%2\$d'>%1\$s</a> deleted the series '%3\$s'.");
+define ("_LOG_ADMIN_EDIT_SERIES", "<a href='viewuser.php?uid=%2\$d'>%1\$s</a> edited the series '<a href='viewseries.php?seriesid=%4\$d'>%3\$s</a>'.");
+define ("_LOG_ADMIN_DEL_FROM_SERIES", "<a href='viewuser.php?uid=%2\$d'>%1\$s</a> deleted <a href='viewstory.php?sid=%4\$d'>%3\$s</a> by <a href='viewuser.php?uid=%6\$d'>%5\$s</a> from '<a href='viewseries.php?seriesid=%8\$d'>%7\$s</a>.'");
+define ("_LOG_BAD_LOGIN", "<a href='viewuser.php?uid=%2\$d'>%1\$s</a> entered a wrong password trying to log in.");
+define ("_LOG_LOST_PASSWORD", "<a href='viewuser.php?uid=%2\$d'>%1\$s</a> requested a new password.  Password sent: %3\$s.");
+define ("_LOG_ADMIN_REG", "%1\$s (%2\$d) was registered by %3\$s (%4\$d) from IP address %5\$s.");
+define ("_LOG_REGISTER", "%1\$s (%2\$d) registered from IP address %3\$s.");
+define ("_LOG_REVIEW", "%1\$s wrote '%2\$s' as a review for '%3\$s'.");
+define ("_LOG_EDIT_REVIEW", "<a href='viewuser.php?uid=%2\$d'>%1\$s</a> edited <a href='reviews.php?reviewid=%4\$d'>a review</a> for '%3\$s'.");
+
+// Report Types
+
+define ("_REPORT", "Report");
+define ("_MISSING", "Missing Information");
+define ("_RULESVIOLATION", "Violation of Rules");
+define ("_BUGREPORT", "Bug Report");
+define ("_REPORTTHIS", "Report This");
+
+?>

--- /dev/null
+++ b/languages/en_admin.php
@@ -1,1 +1,372 @@
-
+<?php
+
+define ("_ACTION", "Action");
+define ("_ADDADMIN", "Add New Admin");
+define ("_ADDAUTHOR", "Add New Author");
+define ("_ADMINCATNOTE", "By selecting categories to oversee you are limiting your admins to administering <strong>just</strong> those categories.  Selecting a category does not include it's sub-categories!  Leave this section empty to administer all categories.");
+define ("_ADDCUSTPAGE", "Add New Custom Page");
+define ("_ADDFIELD", "Add Profile Field");
+define ("_ADDNEWCHARS", "Add New Characters");
+define ("_ADDNEWCLASSTYPE", "Add New Classification Type");
+define ("_ADDNEWCLASSES", "Add New Classifications");
+define ("_ADDNEWFIELD", "Add new profile field");
+define ("_ADDNEWLINK", "Add New Link"); 
+define ("_ADDNEWPANEL", "Add New Panel");
+define ("_ADDNEWS", "Add New News Item");
+define ("_ADDPANEL", "Add Panel"); 
+define ("_ADDRAT", "Add New Rating");
+define ("_ALREADYUPDATED", "This update has already been completed.  No further action is needed.");
+define ("_ADMINDELETE", "Admin Deletes");
+define ("_ADMINEDIT", "Admin Edits");
+define ("_ADMINEMAIL", "Admin E-mail");
+define ("_ADMIN", "Admin");
+define ("_ADMINS", "Admins");
+define ("_AGESTATEMENT", "Age statement in user profile");
+define ("_ALERTSON", "Alerts on");
+define ("_ALLOWRATEONLY", "Allow Ratings Only");
+define ("_ALLOWRR", "Allow round robins");
+define ("_ALLOWSERIES", "Allow Series");
+define ("_ALLREV", "All Reviews");
+define ("_ALREADYINSTALLED", "That module is already installed.");
+define ("_ANONREV", "Anonymous Reviews");
+define ("_ANONREVIEWS", "Allow anonymous reviews");
+define ("_ARCHIVEMAINT", "Archive Maintentance");
+define ("_AUTHORRELEASED", "The author has been removed from the admin created list, and an e-mail has been sent to them with their temporary password. <br /><br /><a href=\"admin.php?action=members\">Back to Members Maintenance</a>");
+define ("_AUTHORSONLY", "Authors Only");
+define ("_AUTHORVALIDATED", "The author has been validated.");
+define ("_AUTOVALIDATE", "Automatically validate all stories");
+define ("_BACKUP", "Backup Database");
+define ("_BADLOGIN", "Bad Logins");
+define ("_BADVARNAME", "Name variables must include alpha-numeric, -, and - characters only.");
+define ("_BLOCKTYPE", "Block style");
+define ("_BOTHLINKSTYLE", "Both");
+define ("_CAPTCHA", "Use captcha verification");
+define ("_CATCOUNTSUPDATED", "Category counts updated.");
+define ("_CATERROR", "The category cannot be a sub-category of itself.");
+define ("_CATLEVEL", "Subcategory of");
+define ("_CATORDER", "Fix Category Order");
+define ("_CATOVERSEE", "Categories to oversee");
+define ("_CATNAME", "Category Name");
+define ("_CENSOR", "Language Censor");
+define ("_CENSORDIRS", 
+"The list of words below will be forbidden words.  They will be disallowed entirely in names and titles.  
+They will be replaced with the first letter and trailing asterisks, a****,  in summaries and the text of reviews.  Seperate each word with a comma.  
+Placing an asterisk before and/or after the word will act as a wildcard making the censor look for the entire word plus 
+the word used as a suffix and/or prefix.  For example, 'frog' will only find 'frog', '*frog' will find 'bullfrog' and 'frog' but not 
+'froglegs', 'frog*' will find both 'frog' and 'froglegs' but not 'bullfrog', '*frog*' will find 'frog', 'bullfrog', and 'froglegs.'  
+To disable the censor simply leave the list of words empty.");
+define ("_CHANGELOG", "Change Log");
+define ("_CHARACTER", "Character");
+define ("_CHOOSECATNOTE", "Choose a category to view the characters for that category.");
+define ("_CLASS", "Classification");
+define ("_CLASSTYPES", "Classification Types"); 
+define ("_CLASSLISTNOTE", "Click on the classification type to add items to it.");
+define ("_CLASSNOTE", 
+"The name you assign to your classification will be the {name} variable for you to use in your skins.  
+The title will be what is displayed in the forms as the title. 
+<p><strong>Note:</strong> The name for your classification should contain letters, numbers, and the underscore character ONLY.</p>");
+define ("_COAUTHALLOW", "Co-authors allowed");
+define ("_COLUMNS", "Number of Columns");
+define ("_CONFIRMINSTALL", "Are you sure you want to install this module?");
+define ("_CONFIRMUNINSTALL", "Are you sure you want to uninstall this module?");
+define ("_CONFIRMUPDATE", "Are you sure you want to update?  You are encouraged to back up your database before proceeding with this operation.");
+define ("_CONFIRMUNLOCK", "Are you sure you want to unlock this account?");
+define ("_CONFIRMAUTHORRELEASE", "Are you sure you want to release this author?");
+define ("_CONFIRMADMINREVOKE", "Are you sure you want to revoke this admin's privileges?");
+define ("_CONFIRMVALREVOKE", "Are you sure you want to revoke this author's validation?");
+define ("_CONFIRMVALIDATE", "Are you sure you want to validate this author?");
+define ("_COPYRIGHT", "Copyright Footer");
+define ("_COUNTCATS", "Fix Category Counts");
+define ("_CURRENTVERSION", "The current version of eFiction is ");
+define ("_CUSTPAGENOTE", 
+"The name you assign to your custom page will be the {NAME_link} variable for you to use in your skins. The script will append \"_link\" to the name to help prevent naming conflicts with other variables. The title will be the title of the page. 
+For the URL of your custom page, you may use either viewpage.php?id=ID or viewpage.php?page=NAME where ID is the ID number of the page or NAME is the name of the page. <p><strong>Note:</strong> The name for your page should contain letters, numbers, and the underscore character ONLY.</p>");
+define ("_CUSTPAGES", "Custom Pages"); 
+define ("_DATE", "Date");
+define ("_DATEFORMAT", "Date Format");
+define ("_DEBUG", "Display Debug Information");
+define ("_DEFAULTSKIN", "Default Skin");
+define ("_DELETEUSER", "Delete Member Account");
+define ("_DESC", "Description");
+define ("_DISPLAYPROFILE", "Display Profile"); 
+define ("_DISPLAYSETTINGS", "Display Settings"); 
+define ("_EDITCAT", "Edit Category");
+define ("_EDITCHAR", "Edit Character");
+define ("_EDITFIELD", "Edit Profile Field");
+define ("_EDITRAT", "Edit Rating");
+define ("_EDITNEWS", "Edit News");
+define ("_EDITPANEL", "Edit Panel");
+define ("_EMAILSETTINGS", "E-mail Settings");
+define ("_EMAILWARNING", "Please be warned: using this form will send out an e-mail to every person who matches the criteria you select. Because the script uses PHP's mail() function to do this, it could cause substantial server load if you are sending to more than 1000 site members.");
+define ("_EXTENDCATS", "Display category path in listings");
+define ("_FAVORITES", "Allow Favorites");
+define ("_FAVOR", "Favorites");
+define ("_FEATUREDNOTE", "<b>Note:</b> To retire a featured story click on the <strong>"._RETIRE."</strong> link.  To make a retired featured story current again, click on the <strong>"._CURRENT."</strong> link.  Clicking on <strong>"._REMOVE."</strong> removes the featured status entirely."); 
+define ("_FEATUREDSTORIES", "Featured Stories");
+define ("_FIELDURL", "URL");
+define ("_FIELDSELECT", "Select box");
+define ("_FIELDYESNO", "Yes/No");
+define ("_FIELDIDURL", "ID with URL");
+define ("_FIELDCODEIN", "Custom Form Code");
+define ("_FIELDCODEOUT", "Custom Profile Code");
+define ("_FIELDCUSTOM", "Custom Code");
+define ("_FIELDON", "Field enabled");
+define ("_FILES", "Files");
+define ("_FIRSTLAST", "First and Last Pages");
+define ("_FOREIGNAUTHORTABLE", "You appear to be using a non-eFiction author table.");
+define ("_FOREIGNDELETE", " All content within eFiction for this member has been deleted.  To delete the member's account please use the appropriate function in the other application.");
+define ("_FUNCTIONDISABLED", "That function is disabled while the script is bridged.");
+define ("_HIDDEN", "Hidden");
+define ("_HIDDENSKINS", "Hidden Skins");
+define ("_HIDDENNOTE", "Click on the checkbox next to the name of the skin in the form above then click 'Submit' to hide it from non-admins.");
+define ("_HOWSTORE", "Stories saved in");
+define ("_ID", "ID"); // Added to 3.0 for displaying ID numbers in admin panels
+define ("_IMAGEUPLOAD", "Allow image uploads?");
+define ("_IMAGESIZE", "Maximum image size");
+define ("_INACTIVE", "Inactive");
+define ("_INDEXONLY", "Index Only");
+define ("_INITIALIZE", "Initialize Block");
+define ("_INPUTBYADMIN", "Authors Input by Admins");
+define ("_IP", "IP Address");
+define ("_INSTALLMODULE", "Install this module");
+define ("_LANGUAGE", "Language");
+define ("_LEVEL", "Level");
+define ("_LIKESYS", "Like/Dislike"); // Changed to avoid conflict with user _LIKE declaration
+define ("_LINKACCESS", "Link Access Level"); 
+define ("_LINKKEY", "Link Access Key");
+define ("_LINKRANGE", "Size of Range for Page Links");
+define ("_LINKS", "Links");  
+define ("_LINKSTYLE", "Style of page links");
+define ("_LINKTEXT", "Text of Link");
+define ("_LOCKCONFIRM", "Are you sure you want to lock this member's account?");
+define ("_LOCKMEMLIST", "Locked Members");
+define ("_LOCKMEMBERS", "Click on a member's name to lock their account.");
+define ("_LOGGING", "Turn on action log");
+define ("_MAILUSERS", "Mail Users");
+define ("_MAINSETTINGS", "Site Information");
+define ("_MAINTENANCE", "Maintenance");
+define ("_MANUAL", "Admin Manual");
+define ("_MAX", "Maximum");
+define ("_MAXHEIGHT", "Max image height");
+define ("_MAXWIDTH", "Max image width");
+define ("_MAXMINWORDS", "Chapter word count limits");
+define ("_MAXMINNOTE", "<strong>Note:</strong> To impose no limits, leave blank or enter 0.  Suggested limits are a minimum of 100 words and a maximum of 16000.");
+define ("_MEMLOCK", "Lock/Ban Member");
+define ("_MESSAGESENT", "Messages sent: "); 
+define ("_MESSAGESETTINGS", "Message Settings");
+define ("_MIN", "Minimum");
+define ("_MODNOTINSTALLED", "This module is not installed.");
+define ("_MORETHANONE", "More than one");
+define ("_MYSQL", "mySQL");
+define ("_NAMECONVENTIONS", 
+"<strong>Note:</strong> Names will be used in variables within the script and in your skin template files.  
+Therefore, you should use letters and numbers ONLY.  <span style=\"text-decoration: underline;\">No spaces or punctuation marks!</span>");
+define ("_NATPL", "Not applicable.  Use .tpl selected.");
+define ("_NEWCAT", "New Category");
+define ("_NEWCHAR", "New Character");
+define ("_NEWITEM", "New Item");
+define ("_NEWMAIN", "Add New Top Level Category");
+define ("_NEWRAT", "New Rating");
+define ("_NEWREG", "New Registrations");
+define ("_NEWSCOMMENTS", "Turn on News Comments");
+define ("_NEWWINDOW", "New Window");
+define ("_NEXTPREV", "Next and Previous Links");
+define ("_NOLETTER", "Rejection Letter");
+define ("_NONVALMEMBERS", "Non-validated Members");
+define ("_NOPANELS", "No admin panels found!"); 
+define ("_NOFIELDTYPE", "No field type set.");
+define ("_NOSUBS", "Turn off unsolicited submissions");
+define ("_NOTAUTHORIZEDADMIN", "Your admin privileges do not authorize you to access this function.");
+define ("_NOTHANKYOU", "Rejection letter (default)");
+define ("_NUMCATS", "Number of categories");
+define ("_NUMCHARS", "Number of Characters");
+define ("_NUMITEMS", "Default items per page");
+define ("_OFF", "Off");
+define ("_ON", "On");
+define ("_ONLYONE", "Only one");
+define ("_ONREVIEWS", "Turn on reviews");
+define ("_OPTIMIZE", "Optimize Database Tables");
+define ("_ORDERAFTER", "Place in Order After");
+define ("_PANELORDER", "Fix Panel Order");
+define ("_PANELS", "Panels"); 
+define ("_PANELURL", "URL to Panel");
+define ("_PRINTERCOPYRIGHT", "Print Copyright Notice"); 
+define ("_PROFILE", "Member Profile");
+define ("_PURGELOG", "Purge the log");
+define ("_PWDSETTING", "Password at Registration");
+define ("_QUEUECOUNT", "There are %d chapters waiting to be validated."); // Added for 3.0
+define ("_RANDOM", "randomly generated");
+define ("_RECALCREVIEWS", "Recalculate Reviews");
+define ("_RECALCSTORIES", "Recalculate Stories");
+define ("_RECENTDAYS", "Number of days to limit "._MOSTRECENT);
+define ("_RELEASEAUTHORS", "Click on the author's name to release the author.");
+define ("_RELEASED", "Author Released");
+define ("_RELEASEMESSAGE", "Hello, the admins of $sitename have opened your account so that you may add/edit/delete your own stories. Your new password for the penname '%s' is %s.  It is recommended that you go to <a href='$url/user.php'>your account</a> and change the password to something easier for you to remember.");
+define ("_REVDELETE", "Authors may delete reviews");
+define ("_REVIEWSETTINGS", "Review Settings"); 
+define ("_RULES", "Rules");
+define ("_RUNNINGVERSION", "You are currently running eFiction version ".$version.".");
+define ("_SAMEWINDOW", "Same Window");
+define ("_SECURITYDELETE", "You have not deleted the install folder! Please do so immediately to prevent a security breach.");
+define ("_SELF", "member selected");
+define ("_SELECTONE", "Select One");
+define ("_SETTINGS", "Settings");
+define ("_SITEINFO", "Site Information"); 
+define ("_SITEKEY", "Site Key");  
+define ("_SITEKEYCHANGED", "<strong>WARNING!</strong> You have chosen to change your sitekey.  Unless you change the information in your config.php to match your site will cease to function!");
+define ("_SITEKEYREQUIRED", "A sitekey is required!");
+define ("_SITENAME", "Sitename");
+define ("_SITESETTINGS", "Site Settings"); 
+define ("_SITESLOGAN", "Site Slogan");
+define ("_SITEURL", "Site URL");
+define ("_SITEWIDE", "Sitewide");
+define ("_SMTPHOST", "SMTP Host");
+define ("_SMTPOFF", "Leave empty if sendmail is enabled.");
+define ("_SMTPPASS", "SMTP Password");
+define ("_SMTPUSER", "SMTP Username");
+define ("_STARS", "Stars");
+define ("_STATS", "Re-calculate Site Statistics");
+define ("_STATUS", "Status");
+define ("_STORIESPATH", "Stories Path");
+define ("_STORYINDEX", "Use Story Index");
+define ("_STORYVALIDATED", "The story has been validated.");
+define ("_SUBCATEGORY", "Sub-category");
+define ("_SUBMISSIONSETTINGS", "Submission Settings");
+define ("_SUBMISSIONS", "Submissions");
+define ("_SUBMITTED", "View Submitted");
+define ("_TABLEPREFIX", "Table Prefix");
+define ("_TAGS", "Allowed Tags");
+define ("_TARGET", "Link Target");
+define ("_THANKYOU", "Acceptance letter (default)");
+define ("_TIMEFORMAT", "Time format");
+define ("_TINYMCE", "TinyMCE Configuration");
+define ("_TINYMCENOTE", 
+"<b>Note:</b> If tinyMCE is enabled, tinyMCE's cleanup function will run <strong>before</strong>
+ tags are stripped using the allowed tags below.  This means, for instance, that &lt;b&gt; tags will be converted to &lt;strong&gt; tags.  
+See TinyMCE's documentation for information on how it cleans input.");
+define ("_TYPE", "Type"); 
+define ("_UNINSTALLMODULE", "Uninstall this module");
+define ("_UNLOCK", "Unlock Account");
+define ("_UNLOCKMEMBERS", "Unlocked Members");
+define ("_UPDATE", "Run Update");
+define ("_UPDATEVERSION", "You need to update.");
+define ("_UPTODATE", "You are up to date.");
+define ("_URL", "Link URL");
+define ("_USERPOPS", "Warning pop-ups only once");
+define ("_USERSETTINGS", "User Settings"); 
+define ("_VALMEMBERS", "Validated Members");
+define ("_VALIDATESTORY", "Validate Story");
+define ("_VIEWALL", "View All");
+define ("_VIEWLOG", "View Action Log");
+define ("_VIEWMYCATS", "View My Categories");
+define ("_VIEWSUBMITTED", "View Submissions");
+define ("_VERSION", "Version");
+define ("_VERSIONCHECK", "Version Check");
+define ("_VERSIONNOTALLOWED", "Version check will not run on your server. To receive email updates, you may register for our forums and subscribe to <a href=\"http://www.efiction.org/forums/index.php?board=37.0\">this forum</a>.");
+define ("_WARNING", "Warning");
+define ("_WARNINGPOP", "Warning Pop-up");
+define ("_WARNINGTEXT", "Warning text");
+define ("_WELCOME", "Welcome message");
+define ("_WHATRATINGS", "Ratings system");
+define ("_YESLETTER", "Acceptance Letter");
+
+// Blocks
+define("_DEFAULT", "Default");
+define("_FORMAT", "Format");
+define("_USETPL", "Use .tpl");
+define("_TEMPLATE", "Template");
+define("_NA-TPL", "Not Available. Layout defined in .tpl file.");
+define("_SUMLENGTH", "Length of Summary");
+define("_STRIPTAGS", "Strip all tags");
+define("_ALLOWTAGS", "Allow tags");
+define("_SUMNOTE", "Default is 75 characters.");
+
+define ("_HELP_ADLEVEL", "This setting defines the admin's level of access.  Level 1 is Super Administer with access to everything.  Level 4 is an authorized author for archives with submissions turned off.");
+define ("_HELP_ALLOWSERIES", "This setting determines who, if anyone, may add series to the site.  You may choose to allow all members to add series or only authors.  If you set this to "._NO." only admins will be able to add series.");
+define ("_HELP_CONTACTSUB", "Check this box to be contacted for new submissions.");
+define ("_HELP_NUMCHARS", "Select the number of characters you wish to add to this category.");
+define ("_HELP_CHARS", "Enter the name of the character then a description of the character if you wish.  The character's description will appear at the top of the character's page when you browse for stories by character.");
+define ("_HELP_RATING", "Ratings are intended to be used to show for what audience the story is appropriate.  A rating is required for every story, so you have to input at least one.");
+define ("_HELP_RATINGWARNING", "When this box is checked, a warning will pop-up when someone clicks on the story.  This is often used to warn for material some may find objectionable or disturbing.");
+define ("_HELP_RATINGCONSENT", "If you want people to confirm they are the age of consent (either through a pop-up or within their profile) before viewing stories with this rating check here.  This can be in conjunction with the registered users only setting below or independent of it.  For instance, you may want stories for mature audiences (blood and violence) to be for all registered users but require age consent in addition for sexually explicit materials.  So the permissions options are: everyone, age-consent required, registration-required, age-consent and registration-required.");
+define ("_HELP_RATINGUSERS", "If you want only registered users to be able to view stories with this rating check this box.  This can be in conjunction with the check for age consent or not.  For instance, you may want stories for mature audiences (blood and violence) to be for all registered users but require age consent in addition for sexually explicit materials.  So the permissions options are: everyone, age-consent required, registration-required, age-consent and registration-required.");
+define ("_HELP_RATINGWARNTEXT", "Set the specific text of your warning here.  Default text for age consent and registered users will be placed in front of this warning if those options are checked.");
+define ("_HELP_SITEKEY", "Each eFiction site requires a sitekey under which the site's settings will be stored.  The sitekey also prevents data from two eFiction sites on the same domain from getting crossed.");
+define ("_HELP_SITENAME", "The name of your eFiction site.  It will appear in the title of your pages and in e-mails sent from the site.");
+define ("_HELP_SLOGAN", "Your site's slogan. It will appear in the title of your pages.");
+define ("_HELP_URL", "The URL for your website.  This url <strong>must</strong> be set to your eFiction site and not any 'main' site if such exists. It is used in emails sent from the site to form hyperlinks to pages within the site.");
+define ("_HELP_TABLEPREFIX", "By using a table prefix in conjunction with sitekeys, it is possible to run multiple instances of eFiction using one database.  This setting should be set at installation when the tables are created.");
+define ("_HELP_SITEEMAIL", "The e-mail addressed used by the site to send e-mails through the site's contact forms and various e-mail alert options.");
+define ("_HELP_SITESKIN", "The site's skin defines the look of the site.  The script comes with several default skins which you are free to modify or you can create your own.");
+define ("_HELP_LANGUAGE", "The language the site will be displayed in.  The language files are found in the languages/ folder.  You may create your own translations through these files.");
+define ("_HELP_SUBSOFF", "When this is set to 'off' only admins will be able to submit items to the archive.  The submission options will not appear in the member's area.");
+define ("_HELP_AUTOVALIDATE", "Setting this to 'no' forces new stories from into a queue for the site's admins to approve.  You can 'validate' specific authors to allow them to by-pass this validation.  When this setting is set to 'yes', all stories are automatically accepted into the archive.");
+define ("_HELP_COAUTHORS", "By selecting 'yes' you are allowing authors to have co-authors for their stories.");
+define ("_HELP_ROUNDROBINS", "Round robins are stories in which an author posts the beginning of the story then other authors are encouraged to add to it.  If you don't want this type of story, turn this setting off.");
+define ("_HELP_STORE", "This setting defines how the text of your stories is stored either in the database or in files on the server.  You are <strong>strongly</strong> encouraged not to change this setting after installation or you will lose access to all previously entered stories!");
+define ("_HELP_STORIESPATH", "If you choose to store your stories' text on the server in files, this will be the path to the folder in which they're stored.  Again, you are <strong>strongly</strong> encouraged to not change this setting after installation.");
+define ("_HELP_MINMAXWORDS", "You may set a minimum and/or maximum word count for chapters.  Leave blank or enter 0 to impose no limits.  These limits are only in effect for the story text NOT summaries, personal bios, reviews, etc.  If you are storing your text in the database it might be wise to impose a maximum of 16,000 words.");
+define ("_HELP_ALLOWEDTAGS", "List the tags you wish to allow in form input throughout the site.");
+define ("_HELP_FAVORITES", "Allow members to list their favorite stories, series, and authors within their profile.");
+define ("_HELP_NUMCATS", "If you have only one category, you should set this to 'only one'.  Doing so will create shortcuts in a few areas where of the site where category selection is required when there is more than one category.");
+define ("_HELP_NEWSCOMMENTS", "Defines whether or not members can make comments on news stories.");
+define ("_HELP_DATEFORMAT", "Sets the date format to be used throughout the site.  You may select one of the formats in the list or define a custom format using PHP's date( ) format options.");
+define ("_HELP_TIMEFORMAT", "Sets the time format to be used on news items.  The time format selected will be placed after the dateformat selected in the option above.  As with the date format, you may select on of the formats in the list or define your own custom format.");
+define ("_HELP_EXTENDCATS", "By selecting 'yes', the breadcrumb path to the selected category will be shown in story listings.  Choosing 'no' will show only the category and not it's parent categories.");
+define ("_HELP_COLUMNS", "Defines how many columns the site will use when displaying categories and author names.");
+define ("_HELP_IMAGEUPLOAD", "Defines whether or not members may upload images to be used in their story and profile. <strong>Note:</strong> You must define a stories folder and CHMOD it to 777 for this option to work.");
+define ("_HELP_IMAGESIZE", "Defines the maximum height and width for image uploads.");
+define ("_HELP_ITEMSPERPAGE", "Defines how many items will be displayed per page for pagination purposes.");
+define ("_HELP_RECENTDAYS", "Sets the number of days to limit the stories listed in the 'Most Recent' page.  Leave this blank to have no limit.");
+define ("_HELP_DISPLAYINDEX", "Defines whether or not the story index (table of contents) is displayed by default in multi-chapter stories.");
+define ("_HELP_DISPLAYPROFILE", "Select 'yes' if you wish for the member's profile to be displayed at all times on the viewuser page.");
+define ("_HELP_REVIEWSON", "Defines whether or not the reviews system is turned on.");
+define ("_HELP_ANONREVIEWS", "If you have elected to turn on reviews, this determines whether or not anonymous reviews (from people not logged in) wll be allowed.");
+define ("_HELP_REVDELETE", "If reviews are turned on, this defines which reviews (if any) authors are allowed to delete themselves.");
+define ("_HELP_RATINGS", "Defines the rating system in place in your archive.  Your choices are no ratings, like/dislike, or 5 star ratings.  You are <strong>strongly</strong> encouraged to not change this after installation or your ratings as changing from one system to the other will mess up existing ratings.");
+define ("_HELP_RATEONLY", "Defines whether or not reviewers may post a rating for the story (if ratings are on) without posting a review.");
+define ("_HELP_ALERTSON", "This defines whether or not the author/story update alerts system is turned on.  If it is turned on, members will have an option in their preferences to receive e-mail alerts when their favorite authors and stories are updated.");
+define ("_HELP_AGECONSENT", "This setting determines if an age consent statement will appear in the member preference form.  If a member has confirmed their age in the preferences, it will allow them to by-pass the warning pop-ups for stories with age consent ratings.");
+define ("_HELP_POPUPS", "This setting lets you allow visitors to receive the warning pop-ups only once.  Logged in members who have confirmed the age consent statement in their profile by-pass the warnings altogether");
+define ("_HELP_PWD", "Sets the mode for password generation when new members sign up.  The default is randomly generated paswords sent via e-mail to the user.  You may also allow new membes to choose their own inital password.");
+define ("_HELP_STATS", "Click here to re-calculate the site statistics.");
+define ("_HELP_SMTPHOST", "The URL of your SMTP server.  Leave this setting blank to use sendmail instead.");
+define ("_HELP_SMTPUSER", "The user name to use with the SMTP server.");
+define ("_HELP_SMTPPWD", "The password for the SMTP user name set above.");
+define ("_HELP_PANELS", "Several pages within eFiction use panels to dynamically add to their options and features including this Admin area.  Select the panel type to re-arrange the order of the panels for that type.");
+define ("_HELP_CATLEVEL", "Choose where within the category tree you want this category to fall.  Choose '"._TOPLEVEL."' if you wish this category to be placed at the top of the tree.  Otherwise, choose the category you wish this category placed under.");
+define ("_HELP_ORDERAFTER", "Choose the category you want this category placed <strong>after</strong> in the list of categories.");
+define ("_HELP_CATNAME", "The name of the category as it will be displayed on your site.");
+define ("_HELP_CATDESC", "A brief description of the category.  This is not required.");
+define ("_HELP_LOCKED", "New stories cannot be added to locked categories.");
+define ("_HELP_CATIMAGE", "The category image is not required.  It is a graphic representing the category and should be placed in the images folder of your skin.  The script will correct for missing images.");
+define ("_HELP_CATCOUNTS", "Click here to fix the story counts for each category.");
+define ("_HELP_LOGGING", "This defines whether or not certain actions will be logged on the site.  Among the actions logged are registrations, change of penname, admin edits, admin deletes, and rejection of stories.");
+define ("_HELP_MAINTENANCE", "This setting defines whether or not the site is in maintenance mode.  In maintenance mode only admins may access the site.");
+define ("_HELP_FIELDCODEIN", "This code will be used in the edit bio/registration form to build the form element.");
+define ("_HELP_FIELDCODEOUT", "This code will be used in the profile.php page to display the information back out.");
+define ("_HELP_FIELDIDURL", "Enter the URL pattern to be used with this ID, using {info} in place of the ID.  For example, http://{info}.livejournal.com.");
+define ("_HELP_FIELDSELECT", "Enter the options for the select list.  One per line.");
+define ("_HELP_FIELDTYPE", "Choose the type of field this will be.");
+define ("_HELP_LINKSTYLE", "The format in which the pagination links at the bottom of multi-page results will apppear.");
+define ("_HELP_LINKRANGE", "The number of pages to display at one time in the pagination links at the bottom of multi-page results.");
+define ("_HELP_DEBUG", "Set this to yes, to display information that will help you debug problems on your site.");
+define ("_HELP_RECALCREVIEWS", "Click here to fix the count and ratings for reviews.");
+define ("_HELP_OPTIMIZE", "Click here to optimize your database tables.  You should perform this maintenance periodically to improve site performance.");
+define ("_HELP_BACKUP", "Click here to backup your database tables.  You should perform this maintenance periodically to protect your site data.");
+define ("_HELP_CAPTCHA", "This setting lets you use a captcha image on registration and anonymous submissions such as reviews.  Your web server must have GD support enabled for the image to display.");
+define ("_HELP_UPDATE", "After uploading eFiction script updates to your archive, click here to update the database.");
+define ("_HELP_CATORDER", "This option will fix errors in the numbering of the category order saved in the database.  This will <strong>not</strong> change the order of your categories only correct errors in the database numbering.");
+define ("_HELP_PANELORDER", "This option will fix errors in the numbering of the panel order saved in the database.  This will <strong>not</strong> change the order of your panels only correct errors in the database numbering.");
+define ("_HELP_RECALCSTORIES", "Click here to fix the story count for authors.");
+
+// Log strings
+
+define ("_LOG_VALIDATE_STORY", "<a href='viewuser.php?uid=%2\$d'>%1\$s</a> validated <a href='viewstory.php?sid=%4\$d'>%3\$s</a> by <a href='viewuser.php?uid=%6\$d'>%5\$s</a>.");
+define ("_LOG_VALIDATE_CHAPTER", "<a href='viewuser.php?uid=%2\$d'>%1\$s</a> validated <a href='viewstory.php?sid=%4\$d'>%3\$s</a> (chapter %7\$d) by <a href='viewuser.php?uid=%6\$d'>%5\$s</a>.");
+define ("_LOG_REJECTION", "<a href='viewuser.php?uid=%2\$d'>%1\$s</a> rejected <a href='viewstory.php?sid=%4\$d'>%3\$s</a> (chapter %7\$d). The rejection letter sent was as follows:<br /><br />%8\$s");
+define ("_LOG_RECALCREVIEWS", "<a href='viewuser.php?uid=%2\$d'>%1\$s</a> recalculated the reviews.");
+define ("_LOG_CATCOUNTS", "<a href='viewuser.php?uid=%2\$d'>%1\$s</a> recalculated the category counts.");
+define ("_LOG_OPTIMIZE", "<a href='viewuser.php?uid=%2\$d'>%1\$s</a> optimized the database tables.");
+define ("_LOG_BACKUP", "<a href='viewuser.php?uid=%2\$d'>%1\$s</a> backed up the database tables.");
+?>

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-am.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Armenian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Hrayr Grigoryan <hrayr@bits.am>
+ */
+ 
+$PHPMAILER_LANG['authenticate']         = 'SMTP -ի սխալ: չհաջողվեց ստուգել իսկությունը.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP -ի սխալ: չհաջողվեց կապ հաստատել SMTP սերվերի հետ.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP -ի սխալ: տվյալները ընդունված չեն.';
+$PHPMAILER_LANG['empty_message']        = 'Հաղորդագրությունը դատարկ է';
+$PHPMAILER_LANG['encoding']             = 'Կոդավորման անհայտ տեսակ: ';
+$PHPMAILER_LANG['execute']              = 'Չհաջողվեց իրականացնել հրամանը: ';
+$PHPMAILER_LANG['file_access']          = 'Ֆայլը հասանելի չէ: ';
+$PHPMAILER_LANG['file_open']            = 'Ֆայլի սխալ: ֆայլը չհաջողվեց բացել: ';
+$PHPMAILER_LANG['from_failed']          = 'Ուղարկողի հետևյալ հասցեն սխալ է: ';
+$PHPMAILER_LANG['instantiate']          = 'Հնարավոր չէ կանչել mail ֆունկցիան.';
+$PHPMAILER_LANG['invalid_address']      = 'Հասցեն սխալ է: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' փոստային սերվերի հետ չի աշխատում.';
+$PHPMAILER_LANG['provide_address']      = 'Անհրաժեշտ է տրամադրել գոնե մեկ ստացողի e-mail հասցե.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP -ի սխալ: չի հաջողվել ուղարկել հետևյալ ստացողների հասցեներին: ';
+$PHPMAILER_LANG['signing']              = 'Ստորագրման սխալ: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP -ի connect() ֆունկցիան չի հաջողվել';
+$PHPMAILER_LANG['smtp_error']           = 'SMTP սերվերի սխալ: ';
+$PHPMAILER_LANG['variable_set']         = 'Չի հաջողվում ստեղծել կամ վերափոխել փոփոխականը: ';
+$PHPMAILER_LANG['extension_missing']    = 'Հավելվածը բացակայում է: ';
 

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-ar.php
@@ -1,1 +1,28 @@
+<?php
+/**
+ * Arabic PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author bahjat al mostafa <bahjat983@hotmail.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'خطأ SMTP : لا يمكن تأكيد الهوية.';
+$PHPMAILER_LANG['connect_host']         = 'خطأ SMTP: لا يمكن الاتصال بالخادم SMTP.';
+$PHPMAILER_LANG['data_not_accepted']    = 'خطأ SMTP: لم يتم قبول المعلومات .';
+$PHPMAILER_LANG['empty_message']        = 'نص الرسالة فارغ';
+$PHPMAILER_LANG['encoding']             = 'ترميز غير معروف: ';
+$PHPMAILER_LANG['execute']              = 'لا يمكن تنفيذ : ';
+$PHPMAILER_LANG['file_access']          = 'لا يمكن الوصول للملف: ';
+$PHPMAILER_LANG['file_open']            = 'خطأ في الملف: لا يمكن فتحه: ';
+$PHPMAILER_LANG['from_failed']          = 'خطأ على مستوى عنوان المرسل : ';
+$PHPMAILER_LANG['instantiate']          = 'لا يمكن توفير خدمة البريد.';
+$PHPMAILER_LANG['invalid_address']      = 'الإرسال غير ممكن لأن عنوان البريد الإلكتروني غير صالح: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' برنامج الإرسال غير مدعوم.';
+$PHPMAILER_LANG['provide_address']      = 'يجب توفير عنوان البريد الإلكتروني لمستلم واحد على الأقل.';
+$PHPMAILER_LANG['recipients_failed']    = 'خطأ SMTP: الأخطاء التالية ' .
+                                          'فشل في الارسال لكل من : ';
+$PHPMAILER_LANG['signing']              = 'خطأ في التوقيع: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() غير ممكن.';
+$PHPMAILER_LANG['smtp_error']           = 'خطأ على مستوى الخادم SMTP: ';
+$PHPMAILER_LANG['variable_set']         = 'لا يمكن تعيين أو إعادة تعيين متغير: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-az.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Azerbaijani PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author @mirjalal
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP xətası: Giriş uğursuz oldu.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP xətası: SMTP serverinə qoşulma uğursuz oldu.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP xətası: Verilənlər qəbul edilməyib.';
+$PHPMAILER_LANG['empty_message']        = 'Boş mesaj göndərilə bilməz.';
+$PHPMAILER_LANG['encoding']             = 'Qeyri-müəyyən kodlaşdırma: ';
+$PHPMAILER_LANG['execute']              = 'Əmr yerinə yetirilmədi: ';
+$PHPMAILER_LANG['file_access']          = 'Fayla giriş yoxdur: ';
+$PHPMAILER_LANG['file_open']            = 'Fayl xətası: Fayl açıla bilmədi: ';
+$PHPMAILER_LANG['from_failed']          = 'Göstərilən poçtlara göndərmə uğursuz oldu: ';
+$PHPMAILER_LANG['instantiate']          = 'Mail funksiyası işə salına bilmədi.';
+$PHPMAILER_LANG['invalid_address']      = 'Düzgün olmayan e-mail adresi: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' - e-mail kitabxanası dəstəklənmir.';
+$PHPMAILER_LANG['provide_address']      = 'Ən azı bir e-mail adresi daxil edilməlidir.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP xətası: Aşağıdakı ünvanlar üzrə alıcılara göndərmə uğursuzdur: ';
+$PHPMAILER_LANG['signing']              = 'İmzalama xətası: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP serverinə qoşulma uğursuz oldu.';
+$PHPMAILER_LANG['smtp_error']           = 'SMTP serveri xətası: ';
+$PHPMAILER_LANG['variable_set']         = 'Dəyişənin quraşdırılması uğursuz oldu: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-be.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Belarusian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Aleksander Maksymiuk <info@setpro.pl>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'Памылка SMTP: памылка ідэнтыфікацыі.';
+$PHPMAILER_LANG['connect_host']         = 'Памылка SMTP: нельга ўстанавіць сувязь з SMTP-серверам.';
+$PHPMAILER_LANG['data_not_accepted']    = 'Памылка SMTP: звесткі непрынятыя.';
+$PHPMAILER_LANG['empty_message']        = 'Пустое паведамленне.';
+$PHPMAILER_LANG['encoding']             = 'Невядомая кадыроўка тэксту: ';
+$PHPMAILER_LANG['execute']              = 'Нельга выканаць каманду: ';
+$PHPMAILER_LANG['file_access']          = 'Няма доступу да файла: ';
+$PHPMAILER_LANG['file_open']            = 'Нельга адкрыць файл: ';
+$PHPMAILER_LANG['from_failed']          = 'Няправільны адрас адпраўніка: ';
+$PHPMAILER_LANG['instantiate']          = 'Нельга прымяніць функцыю mail().';
+$PHPMAILER_LANG['invalid_address']      = 'Нельга даслаць паведамленне, няправільны email атрымальніка: ';
+$PHPMAILER_LANG['provide_address']      = 'Запоўніце, калі ласка, правільны email атрымальніка.';
+$PHPMAILER_LANG['mailer_not_supported'] = ' - паштовы сервер не падтрымліваецца.';
+$PHPMAILER_LANG['recipients_failed']    = 'Памылка SMTP: няправільныя атрымальнікі: ';
+$PHPMAILER_LANG['signing']              = 'Памылка подпісу паведамлення: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'Памылка сувязі з SMTP-серверам.';
+$PHPMAILER_LANG['smtp_error']           = 'Памылка SMTP: ';
+$PHPMAILER_LANG['variable_set']         = 'Нельга ўстанавіць або перамяніць значэнне пераменнай: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-bg.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Bulgarian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Mikhail Kyosev <mialygk@gmail.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP грешка: Не може да се удостовери пред сървъра.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP грешка: Не може да се свърже с SMTP хоста.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP грешка: данните не са приети.';
+$PHPMAILER_LANG['empty_message']        = 'Съдържанието на съобщението е празно';
+$PHPMAILER_LANG['encoding']             = 'Неизвестно кодиране: ';
+$PHPMAILER_LANG['execute']              = 'Не може да се изпълни: ';
+$PHPMAILER_LANG['file_access']          = 'Няма достъп до файл: ';
+$PHPMAILER_LANG['file_open']            = 'Файлова грешка: Не може да се отвори файл: ';
+$PHPMAILER_LANG['from_failed']          = 'Следните адреси за подател са невалидни: ';
+$PHPMAILER_LANG['instantiate']          = 'Не може да се инстанцира функцията mail.';
+$PHPMAILER_LANG['invalid_address']      = 'Невалиден адрес: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' - пощенски сървър не се поддържа.';
+$PHPMAILER_LANG['provide_address']      = 'Трябва да предоставите поне един email адрес за получател.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP грешка: Следните адреси за Получател са невалидни: ';
+$PHPMAILER_LANG['signing']              = 'Грешка при подписване: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP провален connect().';
+$PHPMAILER_LANG['smtp_error']           = 'SMTP сървърна грешка: ';
+$PHPMAILER_LANG['variable_set']         = 'Не може да се установи или възстанови променлива: ';
+$PHPMAILER_LANG['extension_missing']    = 'Липсва разширение: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-br.php
@@ -1,1 +1,29 @@
+<?php
+/**
+ * Brazilian Portuguese PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Paulo Henrique Garcia <paulo@controllerweb.com.br>
+ * @author Lucas Guimarães <lucas@lucasguimaraes.com>
+ * @author Phelipe Alves <phelipealvesdesouza@gmail.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'Erro de SMTP: Não foi possível autenticar.';
+$PHPMAILER_LANG['connect_host']         = 'Erro de SMTP: Não foi possível conectar com o servidor SMTP.';
+$PHPMAILER_LANG['data_not_accepted']    = 'Erro de SMTP: Dados rejeitados.';
+$PHPMAILER_LANG['empty_message']        = 'Corpo da mensagem vazio';
+$PHPMAILER_LANG['encoding']             = 'Codificação desconhecida: ';
+$PHPMAILER_LANG['execute']              = 'Não foi possível executar: ';
+$PHPMAILER_LANG['file_access']          = 'Não foi possível acessar o arquivo: ';
+$PHPMAILER_LANG['file_open']            = 'Erro de Arquivo: Não foi possível abrir o arquivo: ';
+$PHPMAILER_LANG['from_failed']          = 'Os endereços dos remententes a seguir falharam: ';
+$PHPMAILER_LANG['instantiate']          = 'Não foi possível iniciar uma instância da função mail.';
+$PHPMAILER_LANG['invalid_address']      = 'Não enviando, endereço de e-mail inválido: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mailer não é suportado.';
+$PHPMAILER_LANG['provide_address']      = 'Você deve fornecer pelo menos um endereço de destinatário de e-mail.';
+$PHPMAILER_LANG['recipients_failed']    = 'Erro de SMTP: Os endereços de destinatário a seguir falharam: ';
+$PHPMAILER_LANG['signing']              = 'Erro ao assinar: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() falhou.';
+$PHPMAILER_LANG['smtp_error']           = 'Erro de servidor SMTP: ';
+$PHPMAILER_LANG['variable_set']         = 'Não foi possível definir ou resetar a variável: ';
+$PHPMAILER_LANG['extension_missing']    = 'Extensão ausente: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-ca.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Catalan PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Ivan <web AT microstudi DOT com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'Error SMTP: No s’ha pogut autenticar.';
+$PHPMAILER_LANG['connect_host']         = 'Error SMTP: No es pot connectar al servidor SMTP.';
+$PHPMAILER_LANG['data_not_accepted']    = 'Error SMTP: Dades no acceptades.';
+$PHPMAILER_LANG['empty_message']        = 'El cos del missatge està buit.';
+$PHPMAILER_LANG['encoding']             = 'Codificació desconeguda: ';
+$PHPMAILER_LANG['execute']              = 'No es pot executar: ';
+$PHPMAILER_LANG['file_access']          = 'No es pot accedir a l’arxiu: ';
+$PHPMAILER_LANG['file_open']            = 'Error d’Arxiu: No es pot obrir l’arxiu: ';
+$PHPMAILER_LANG['from_failed']          = 'La(s) següent(s) adreces de remitent han fallat: ';
+$PHPMAILER_LANG['instantiate']          = 'No s’ha pogut crear una instància de la funció Mail.';
+$PHPMAILER_LANG['invalid_address']      = 'Adreça d’email invalida: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mailer no està suportat';
+$PHPMAILER_LANG['provide_address']      = 'S’ha de proveir almenys una adreça d’email com a destinatari.';
+$PHPMAILER_LANG['recipients_failed']    = 'Error SMTP: Els següents destinataris han fallat: ';
+$PHPMAILER_LANG['signing']              = 'Error al signar: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'Ha fallat el SMTP Connect().';
+$PHPMAILER_LANG['smtp_error']           = 'Error del servidor SMTP: ';
+$PHPMAILER_LANG['variable_set']         = 'No s’ha pogut establir o restablir la variable: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-ch.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Chinese PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author LiuXin <http://www.80x86.cn/blog/>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP 错误:身份验证失败。';
+$PHPMAILER_LANG['connect_host']         = 'SMTP 错误: 不能连接SMTP主机。';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP 错误: 数据不可接受。';
+//$PHPMAILER_LANG['empty_message']        = 'Message body empty';
+$PHPMAILER_LANG['encoding']             = '未知编码:';
+$PHPMAILER_LANG['execute']              = '不能执行: ';
+$PHPMAILER_LANG['file_access']          = '不能访问文件:';
+$PHPMAILER_LANG['file_open']            = '文件错误:不能打开文件:';
+$PHPMAILER_LANG['from_failed']          = '下面的发送地址邮件发送失败了: ';
+$PHPMAILER_LANG['instantiate']          = '不能实现mail方法。';
+//$PHPMAILER_LANG['invalid_address']      = 'Invalid address: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' 您所选择的发送邮件的方法并不支持。';
+$PHPMAILER_LANG['provide_address']      = '您必须提供至少一个 收信人的email地址。';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP 错误: 下面的 收件人失败了: ';
+//$PHPMAILER_LANG['signing']              = 'Signing Error: ';
+//$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() failed.';
+//$PHPMAILER_LANG['smtp_error']           = 'SMTP server error: ';
+//$PHPMAILER_LANG['variable_set']         = 'Cannot set or reset variable: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-cz.php
@@ -1,1 +1,26 @@
+<?php
+/**
+ * Czech PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'Chyba SMTP: Autentizace selhala.';
+$PHPMAILER_LANG['connect_host']         = 'Chyba SMTP: Nelze navázat spojení se SMTP serverem.';
+$PHPMAILER_LANG['data_not_accepted']    = 'Chyba SMTP: Data nebyla přijata.';
+$PHPMAILER_LANG['empty_message']        = 'Prázdné tělo zprávy';
+$PHPMAILER_LANG['encoding']             = 'Neznámé kódování: ';
+$PHPMAILER_LANG['execute']              = 'Nelze provést: ';
+$PHPMAILER_LANG['file_access']          = 'Nelze získat přístup k souboru: ';
+$PHPMAILER_LANG['file_open']            = 'Chyba souboru: Nelze otevřít soubor pro čtení: ';
+$PHPMAILER_LANG['from_failed']          = 'Následující adresa odesílatele je nesprávná: ';
+$PHPMAILER_LANG['instantiate']          = 'Nelze vytvořit instanci emailové funkce.';
+$PHPMAILER_LANG['invalid_address']      = 'Neplatná adresa: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mailer není podporován.';
+$PHPMAILER_LANG['provide_address']      = 'Musíte zadat alespoň jednu emailovou adresu příjemce.';
+$PHPMAILER_LANG['recipients_failed']    = 'Chyba SMTP: Následující adresy příjemců nejsou správně: ';
+$PHPMAILER_LANG['signing']              = 'Chyba přihlašování: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() selhal.';
+$PHPMAILER_LANG['smtp_error']           = 'Chyba SMTP serveru: ';
+$PHPMAILER_LANG['variable_set']         = 'Nelze nastavit nebo změnit proměnnou: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-de.php
@@ -1,1 +1,26 @@
+<?php
+/**
+ * German PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP Fehler: Authentifizierung fehlgeschlagen.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP Fehler: Konnte keine Verbindung zum SMTP-Host herstellen.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP Fehler: Daten werden nicht akzeptiert.';
+$PHPMAILER_LANG['empty_message']        = 'E-Mail Inhalt ist leer.';
+$PHPMAILER_LANG['encoding']             = 'Unbekanntes Encoding-Format: ';
+$PHPMAILER_LANG['execute']              = 'Konnte folgenden Befehl nicht ausführen: ';
+$PHPMAILER_LANG['file_access']          = 'Zugriff auf folgende Datei fehlgeschlagen: ';
+$PHPMAILER_LANG['file_open']            = 'Datei Fehler: konnte folgende Datei nicht öffnen: ';
+$PHPMAILER_LANG['from_failed']          = 'Die folgende Absenderadresse ist nicht korrekt: ';
+$PHPMAILER_LANG['instantiate']          = 'Mail Funktion konnte nicht initialisiert werden.';
+$PHPMAILER_LANG['invalid_address']      = 'E-Mail wird nicht gesendet, die Adresse ist ungültig: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mailer wird nicht unterstützt.';
+$PHPMAILER_LANG['provide_address']      = 'Bitte geben Sie mindestens eine Empfänger E-Mailadresse an.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP Fehler: Die folgenden Empfänger sind nicht korrekt: ';
+$PHPMAILER_LANG['signing']              = 'Fehler beim Signieren: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'Verbindung zu SMTP Server fehlgeschlagen.';
+$PHPMAILER_LANG['smtp_error']           = 'Fehler vom SMTP Server: ';
+$PHPMAILER_LANG['variable_set']         = 'Kann Variable nicht setzen oder zurücksetzen: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-dk.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Danish PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Mikael Stokkebro <info@stokkebro.dk>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP fejl: Kunne ikke logge på.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP fejl: Kunne ikke tilslutte SMTP serveren.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP fejl: Data kunne ikke accepteres.';
+//$PHPMAILER_LANG['empty_message']        = 'Message body empty';
+$PHPMAILER_LANG['encoding']             = 'Ukendt encode-format: ';
+$PHPMAILER_LANG['execute']              = 'Kunne ikke køre: ';
+$PHPMAILER_LANG['file_access']          = 'Ingen adgang til fil: ';
+$PHPMAILER_LANG['file_open']            = 'Fil fejl: Kunne ikke åbne filen: ';
+$PHPMAILER_LANG['from_failed']          = 'Følgende afsenderadresse er forkert: ';
+$PHPMAILER_LANG['instantiate']          = 'Kunne ikke initialisere email funktionen.';
+//$PHPMAILER_LANG['invalid_address']        = 'Invalid address: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mailer understøttes ikke.';
+$PHPMAILER_LANG['provide_address']      = 'Du skal indtaste mindst en modtagers emailadresse.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP fejl: Følgende modtagere er forkerte: ';
+//$PHPMAILER_LANG['signing']              = 'Signing Error: ';
+//$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() failed.';
+//$PHPMAILER_LANG['smtp_error']           = 'SMTP server error: ';
+//$PHPMAILER_LANG['variable_set']         = 'Cannot set or reset variable: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-el.php
@@ -1,1 +1,26 @@
+<?php
+/**
+ * Greek PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP Σφάλμα: Αδυναμία πιστοποίησης (authentication).';
+$PHPMAILER_LANG['connect_host']         = 'SMTP Σφάλμα: Αδυναμία σύνδεσης στον SMTP-Host.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP Σφάλμα: Τα δεδομένα δεν έγιναν αποδεκτά.';
+$PHPMAILER_LANG['empty_message']        = 'Το E-Mail δεν έχει περιεχόμενο .';
+$PHPMAILER_LANG['encoding']             = 'Αγνωστο Encoding-Format: ';
+$PHPMAILER_LANG['execute']              = 'Αδυναμία εκτέλεσης ακόλουθης εντολής: ';
+$PHPMAILER_LANG['file_access']          = 'Αδυναμία προσπέλασης του αρχείου: ';
+$PHPMAILER_LANG['file_open']            = 'Σφάλμα Αρχείου: Δεν είναι δυνατό το άνοιγμα του ακόλουθου αρχείου: ';
+$PHPMAILER_LANG['from_failed']          = 'Η παρακάτω διεύθυνση αποστολέα δεν είναι σωστή: ';
+$PHPMAILER_LANG['instantiate']          = 'Αδυναμία εκκίνησης Mail function.';
+$PHPMAILER_LANG['invalid_address']      = 'Το μήνυμα δεν εστάλη, η διεύθυνση δεν είναι έγκυρη: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mailer δεν υποστηρίζεται.';
+$PHPMAILER_LANG['provide_address']      = 'Παρακαλούμε δώστε τουλάχιστον μια e-mail διεύθυνση παραλήπτη.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP Σφάλμα: Οι παρακάτω διευθύνσεις παραλήπτη δεν είναι έγκυρες: ';
+$PHPMAILER_LANG['signing']              = 'Σφάλμα υπογραφής: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'Αποτυχία σύνδεσης στον SMTP Server.';
+$PHPMAILER_LANG['smtp_error']           = 'Σφάλμα από τον SMTP Server: ';
+$PHPMAILER_LANG['variable_set']         = 'Αδυναμία ορισμού ή αρχικοποίησης μεταβλητής: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-eo.php
@@ -1,1 +1,26 @@
+<?php
+/**
+ * Esperanto PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'Eraro de servilo SMTP : aŭtentigo malsukcesis.';
+$PHPMAILER_LANG['connect_host']         = 'Eraro de servilo SMTP : konektado al servilo malsukcesis.';
+$PHPMAILER_LANG['data_not_accepted']    = 'Eraro de servilo SMTP : neĝustaj datumoj.';
+$PHPMAILER_LANG['empty_message']        = 'Teksto de mesaĝo mankas.';
+$PHPMAILER_LANG['encoding']             = 'Nekonata kodoprezento: ';
+$PHPMAILER_LANG['execute']              = 'Lanĉi rulumadon ne eblis: ';
+$PHPMAILER_LANG['file_access']          = 'Aliro al dosiero ne sukcesis: ';
+$PHPMAILER_LANG['file_open']            = 'Eraro de dosiero: malfermo neeblas: ';
+$PHPMAILER_LANG['from_failed']          = 'Jena adreso de sendinto malsukcesis: ';
+$PHPMAILER_LANG['instantiate']          = 'Genero de retmesaĝa funkcio neeblis.';
+$PHPMAILER_LANG['invalid_address']      = 'Retadreso ne validas: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mesaĝilo ne subtenata.';
+$PHPMAILER_LANG['provide_address']      = 'Vi devas tajpi almenaŭ unu recevontan retadreson.';
+$PHPMAILER_LANG['recipients_failed']    = 'Eraro de servilo SMTP : la jenaj poŝtrecivuloj kaŭzis eraron: ';
+$PHPMAILER_LANG['signing']              = 'Eraro de subskribo: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP konektado malsukcesis.';
+$PHPMAILER_LANG['smtp_error']           = 'Eraro de servilo SMTP : ';
+$PHPMAILER_LANG['variable_set']         = 'Variablo ne pravalorizeblas aŭ ne repravalorizeblas: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-es.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Spanish PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Matt Sturdy <matt.sturdy@gmail.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'Error SMTP: Imposible autentificar.';
+$PHPMAILER_LANG['connect_host']         = 'Error SMTP: Imposible conectar al servidor SMTP.';
+$PHPMAILER_LANG['data_not_accepted']    = 'Error SMTP: Datos no aceptados.';
+$PHPMAILER_LANG['empty_message']        = 'El cuerpo del mensaje está vacío';
+$PHPMAILER_LANG['encoding']             = 'Codificación desconocida: ';
+$PHPMAILER_LANG['execute']              = 'Imposible ejecutar: ';
+$PHPMAILER_LANG['file_access']          = 'Imposible acceder al archivo: ';
+$PHPMAILER_LANG['file_open']            = 'Error de Archivo: Imposible abrir el archivo: ';
+$PHPMAILER_LANG['from_failed']          = 'La(s) siguiente(s) direcciones de remitente fallaron: ';
+$PHPMAILER_LANG['instantiate']          = 'Imposible crear una instancia de la función Mail.';
+$PHPMAILER_LANG['invalid_address']      = 'Imposible enviar: dirección de email inválido: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mailer no está soportado.';
+$PHPMAILER_LANG['provide_address']      = 'Debe proporcionar al menos una dirección de email de destino.';
+$PHPMAILER_LANG['recipients_failed']    = 'Error SMTP: Los siguientes destinos fallaron: ';
+$PHPMAILER_LANG['signing']              = 'Error al firmar: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() falló.';
+$PHPMAILER_LANG['smtp_error']           = 'Error del servidor SMTP: ';
+$PHPMAILER_LANG['variable_set']         = 'No se pudo configurar la variable: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-et.php
@@ -1,1 +1,28 @@
+<?php
+/**
+ * Estonian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Indrek Päri
+ * @author Elan Ruusamäe <glen@delfi.ee>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP Viga: Autoriseerimise viga.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP Viga: Ei õnnestunud luua ühendust SMTP serveriga.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP Viga: Vigased andmed.';
+$PHPMAILER_LANG['empty_message']        = 'Tühi kirja sisu';
+$PHPMAILER_LANG["encoding"]             = 'Tundmatu kodeering: ';
+$PHPMAILER_LANG['execute']              = 'Tegevus ebaõnnestus: ';
+$PHPMAILER_LANG['file_access']          = 'Pole piisavalt õiguseid järgneva faili avamiseks: ';
+$PHPMAILER_LANG['file_open']            = 'Faili Viga: Faili avamine ebaõnnestus: ';
+$PHPMAILER_LANG['from_failed']          = 'Järgnev saatja e-posti aadress on vigane: ';
+$PHPMAILER_LANG['instantiate']          = 'mail funktiooni käivitamine ebaõnnestus.';
+$PHPMAILER_LANG['invalid_address']      = 'Saatmine peatatud, e-posti address vigane: ';
+$PHPMAILER_LANG['provide_address']      = 'Te peate määrama vähemalt ühe saaja e-posti aadressi.';
+$PHPMAILER_LANG['mailer_not_supported'] = ' maileri tugi puudub.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP Viga: Järgnevate saajate e-posti aadressid on vigased: ';
+$PHPMAILER_LANG["signing"]              = 'Viga allkirjastamisel: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() ebaõnnestus.';
+$PHPMAILER_LANG['smtp_error']           = 'SMTP serveri viga: ';
+$PHPMAILER_LANG['variable_set']         = 'Ei õnnestunud määrata või lähtestada muutujat: ';
+$PHPMAILER_LANG['extension_missing']    = 'Nõutud laiendus on puudu: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-fa.php
@@ -1,1 +1,28 @@
+<?php
+/**
+ * Persian/Farsi PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Ali Jazayeri <jaza.ali@gmail.com>
+ * @author Mohammad Hossein Mojtahedi <mhm5000@gmail.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'خطای SMTP: احراز هویت با شکست مواجه شد.';
+$PHPMAILER_LANG['connect_host']         = 'خطای SMTP: اتصال به سرور SMTP برقرار نشد.';
+$PHPMAILER_LANG['data_not_accepted']    = 'خطای SMTP: داده‌ها نا‌درست هستند.';
+$PHPMAILER_LANG['empty_message']        = 'بخش متن پیام خالی است.';
+$PHPMAILER_LANG['encoding']             = 'کد‌گذاری نا‌شناخته: ';
+$PHPMAILER_LANG['execute']              = 'امکان اجرا وجود ندارد: ';
+$PHPMAILER_LANG['file_access']          = 'امکان دسترسی به فایل وجود ندارد: ';
+$PHPMAILER_LANG['file_open']            = 'خطای File: امکان بازکردن فایل وجود ندارد: ';
+$PHPMAILER_LANG['from_failed']          = 'آدرس فرستنده اشتباه است: ';
+$PHPMAILER_LANG['instantiate']          = 'امکان معرفی تابع ایمیل وجود ندارد.';
+$PHPMAILER_LANG['invalid_address']      = 'آدرس ایمیل معتبر نیست: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mailer پشتیبانی نمی‌شود.';
+$PHPMAILER_LANG['provide_address']      = 'باید حداقل یک آدرس گیرنده وارد کنید.';
+$PHPMAILER_LANG['recipients_failed']    = 'خطای SMTP: ارسال به آدرس گیرنده با خطا مواجه شد: ';
+$PHPMAILER_LANG['signing']              = 'خطا در امضا: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'خطا در اتصال به SMTP.';
+$PHPMAILER_LANG['smtp_error']           = 'خطا در SMTP Server: ';
+$PHPMAILER_LANG['variable_set']         = 'امکان ارسال یا ارسال مجدد متغیر‌ها وجود ندارد: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-fi.php
@@ -1,1 +1,28 @@
+<?php
+/**
+ * Finnish PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Jyry Kuukanen
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP-virhe: käyttäjätunnistus epäonnistui.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP-virhe: yhteys palvelimeen ei onnistu.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP-virhe: data on virheellinen.';
+//$PHPMAILER_LANG['empty_message']        = 'Message body empty';
+$PHPMAILER_LANG['encoding']             = 'Tuntematon koodaustyyppi: ';
+$PHPMAILER_LANG['execute']              = 'Suoritus epäonnistui: ';
+$PHPMAILER_LANG['file_access']          = 'Seuraavaan tiedostoon ei ole oikeuksia: ';
+$PHPMAILER_LANG['file_open']            = 'Tiedostovirhe: Ei voida avata tiedostoa: ';
+$PHPMAILER_LANG['from_failed']          = 'Seuraava lähettäjän osoite on virheellinen: ';
+$PHPMAILER_LANG['instantiate']          = 'mail-funktion luonti epäonnistui.';
+//$PHPMAILER_LANG['invalid_address']      = 'Invalid address: ';
+$PHPMAILER_LANG['mailer_not_supported'] = 'postivälitintyyppiä ei tueta.';
+$PHPMAILER_LANG['provide_address']      = 'Aseta vähintään yksi vastaanottajan sähk&ouml;postiosoite.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP-virhe: seuraava vastaanottaja osoite on virheellinen.';
+$PHPMAILER_LANG['encoding']             = 'Tuntematon koodaustyyppi: ';
+//$PHPMAILER_LANG['signing']              = 'Signing Error: ';
+//$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() failed.';
+//$PHPMAILER_LANG['smtp_error']           = 'SMTP server error: ';
+//$PHPMAILER_LANG['variable_set']         = 'Cannot set or reset variable: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-fo.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Faroese PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Dávur Sørensen <http://www.profo-webdesign.dk>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP feilur: Kundi ikki góðkenna.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP feilur: Kundi ikki knýta samband við SMTP vert.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP feilur: Data ikki góðkent.';
+//$PHPMAILER_LANG['empty_message']        = 'Message body empty';
+$PHPMAILER_LANG['encoding']             = 'Ókend encoding: ';
+$PHPMAILER_LANG['execute']              = 'Kundi ikki útføra: ';
+$PHPMAILER_LANG['file_access']          = 'Kundi ikki tilganga fílu: ';
+$PHPMAILER_LANG['file_open']            = 'Fílu feilur: Kundi ikki opna fílu: ';
+$PHPMAILER_LANG['from_failed']          = 'fylgjandi Frá/From adressa miseydnaðist: ';
+$PHPMAILER_LANG['instantiate']          = 'Kuni ikki instantiera mail funktión.';
+//$PHPMAILER_LANG['invalid_address']      = 'Invalid address: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' er ikki supporterað.';
+$PHPMAILER_LANG['provide_address']      = 'Tú skal uppgeva minst móttakara-emailadressu(r).';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP Feilur: Fylgjandi móttakarar miseydnaðust: ';
+//$PHPMAILER_LANG['signing']              = 'Signing Error: ';
+//$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() failed.';
+//$PHPMAILER_LANG['smtp_error']           = 'SMTP server error: ';
+//$PHPMAILER_LANG['variable_set']         = 'Cannot set or reset variable: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-fr.php
@@ -1,1 +1,30 @@
+<?php
+/**
+ * French PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * Some French punctuation requires a thin non-breaking space (U+202F) character before it,
+ * for example before a colon or exclamation mark.
+ * There is one of these characters between these quotes: " "
+ * @link http://unicode.org/udhr/n/notes_fra.html
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'Erreur SMTP : échec de l\'authentification.';
+$PHPMAILER_LANG['connect_host']         = 'Erreur SMTP : impossible de se connecter au serveur SMTP.';
+$PHPMAILER_LANG['data_not_accepted']    = 'Erreur SMTP : données incorrectes.';
+$PHPMAILER_LANG['empty_message']        = 'Corps du message vide.';
+$PHPMAILER_LANG['encoding']             = 'Encodage inconnu : ';
+$PHPMAILER_LANG['execute']              = 'Impossible de lancer l\'exécution : ';
+$PHPMAILER_LANG['file_access']          = 'Impossible d\'accéder au fichier : ';
+$PHPMAILER_LANG['file_open']            = 'Ouverture du fichier impossible : ';
+$PHPMAILER_LANG['from_failed']          = 'L\'adresse d\'expéditeur suivante a échoué : ';
+$PHPMAILER_LANG['instantiate']          = 'Impossible d\'instancier la fonction mail.';
+$PHPMAILER_LANG['invalid_address']      = 'L\'adresse courriel n\'est pas valide : ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' client de messagerie non supporté.';
+$PHPMAILER_LANG['provide_address']      = 'Vous devez fournir au moins une adresse de destinataire.';
+$PHPMAILER_LANG['recipients_failed']    = 'Erreur SMTP : les destinataires suivants sont en erreur : ';
+$PHPMAILER_LANG['signing']              = 'Erreur de signature : ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'Échec de la connexion SMTP.';
+$PHPMAILER_LANG['smtp_error']           = 'Erreur du serveur SMTP : ';
+$PHPMAILER_LANG['variable_set']         = 'Impossible d\'initialiser ou de réinitialiser une variable : ';
+$PHPMAILER_LANG['extension_missing']    = 'Extension manquante : ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-gl.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Galician PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author by Donato Rouco <donatorouco@gmail.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'Erro SMTP: Non puido ser autentificado.';
+$PHPMAILER_LANG['connect_host']         = 'Erro SMTP: Non puido conectar co servidor SMTP.';
+$PHPMAILER_LANG['data_not_accepted']    = 'Erro SMTP: Datos non aceptados.';
+$PHPMAILER_LANG['empty_message']        = 'Corpo da mensaxe vacía';
+$PHPMAILER_LANG['encoding']             = 'Codificación descoñecida: ';
+$PHPMAILER_LANG['execute']              = 'Non puido ser executado: ';
+$PHPMAILER_LANG['file_access']          = 'Nob puido acceder ó arquivo: ';
+$PHPMAILER_LANG['file_open']            = 'Erro de Arquivo: No puido abrir o arquivo: ';
+$PHPMAILER_LANG['from_failed']          = 'A(s) seguinte(s) dirección(s) de remitente(s) deron erro: ';
+$PHPMAILER_LANG['instantiate']          = 'Non puido crear unha instancia da función Mail.';
+$PHPMAILER_LANG['invalid_address']      = 'Non puido envia-lo correo: dirección de email inválida: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mailer non está soportado.';
+$PHPMAILER_LANG['provide_address']      = 'Debe engadir polo menos unha dirección de email coma destino.';
+$PHPMAILER_LANG['recipients_failed']    = 'Erro SMTP: Os seguintes destinos fallaron: ';
+$PHPMAILER_LANG['signing']              = 'Erro ó firmar: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() fallou.';
+$PHPMAILER_LANG['smtp_error']           = 'Erro do servidor SMTP: ';
+$PHPMAILER_LANG['variable_set']         = 'Non puidemos axustar ou reaxustar a variábel: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-he.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Hebrew PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Ronny Sherer <ronny@hoojima.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'שגיאת SMTP: פעולת האימות נכשלה.';
+$PHPMAILER_LANG['connect_host']         = 'שגיאת SMTP: לא הצלחתי להתחבר לשרת SMTP.';
+$PHPMAILER_LANG['data_not_accepted']    = 'שגיאת SMTP: מידע לא התקבל.';
+$PHPMAILER_LANG['empty_message']        = 'גוף ההודעה ריק';
+$PHPMAILER_LANG['invalid_address']      = 'כתובת שגויה: ';
+$PHPMAILER_LANG['encoding']             = 'קידוד לא מוכר: ';
+$PHPMAILER_LANG['execute']              = 'לא הצלחתי להפעיל את: ';
+$PHPMAILER_LANG['file_access']          = 'לא ניתן לגשת לקובץ: ';
+$PHPMAILER_LANG['file_open']            = 'שגיאת קובץ: לא ניתן לגשת לקובץ: ';
+$PHPMAILER_LANG['from_failed']          = 'כתובות הנמענים הבאות נכשלו: ';
+$PHPMAILER_LANG['instantiate']          = 'לא הצלחתי להפעיל את פונקציית המייל.';
+$PHPMAILER_LANG['mailer_not_supported'] = ' אינה נתמכת.';
+$PHPMAILER_LANG['provide_address']      = 'חובה לספק לפחות כתובת אחת של מקבל המייל.';
+$PHPMAILER_LANG['recipients_failed']    = 'שגיאת SMTP: הנמענים הבאים נכשלו: ';
+$PHPMAILER_LANG['signing']              = 'שגיאת חתימה: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() failed.';
+$PHPMAILER_LANG['smtp_error']           = 'שגיאת שרת SMTP: ';
+$PHPMAILER_LANG['variable_set']         = 'לא ניתן לקבוע או לשנות את המשתנה: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-hr.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Croatian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Hrvoj3e <hrvoj3e@gmail.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP Greška: Neuspjela autentikacija.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP Greška: Ne mogu se spojiti na SMTP poslužitelj.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP Greška: Podatci nisu prihvaćeni.';
+$PHPMAILER_LANG['empty_message']        = 'Sadržaj poruke je prazan.';
+$PHPMAILER_LANG['encoding']             = 'Nepoznati encoding: ';
+$PHPMAILER_LANG['execute']              = 'Nije moguće izvršiti naredbu: ';
+$PHPMAILER_LANG['file_access']          = 'Nije moguće pristupiti datoteci: ';
+$PHPMAILER_LANG['file_open']            = 'Nije moguće otvoriti datoteku: ';
+$PHPMAILER_LANG['from_failed']          = 'SMTP Greška: Slanje s navedenih e-mail adresa nije uspjelo: ';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP Greška: Slanje na navedenih e-mail adresa nije uspjelo: ';
+$PHPMAILER_LANG['instantiate']          = 'Ne mogu pokrenuti mail funkcionalnost.';
+$PHPMAILER_LANG['invalid_address']      = 'E-mail nije poslan. Neispravna e-mail adresa: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mailer nije podržan.';
+$PHPMAILER_LANG['provide_address']      = 'Definirajte barem jednu adresu primatelja.';
+$PHPMAILER_LANG['signing']              = 'Greška prilikom prijave: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'Spajanje na SMTP poslužitelj nije uspjelo.';
+$PHPMAILER_LANG['smtp_error']           = 'Greška SMTP poslužitelja: ';
+$PHPMAILER_LANG['variable_set']         = 'Ne mogu postaviti varijablu niti ju vratiti nazad: ';
+$PHPMAILER_LANG['extension_missing']    = 'Nedostaje proširenje: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-hu.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Hungarian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author @dominicus-75
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP hiba: az azonosítás sikertelen.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP hiba: nem lehet kapcsolódni az SMTP-szerverhez.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP hiba: adatok visszautasítva.';
+$PHPMAILER_LANG['empty_message']        = 'Üres az üzenettörzs.';
+$PHPMAILER_LANG['encoding']             = 'Ismeretlen kódolás: ';
+$PHPMAILER_LANG['execute']              = 'Nem lehet végrehajtani: ';
+$PHPMAILER_LANG['file_access']          = 'A következő fájl nem elérhető: ';
+$PHPMAILER_LANG['file_open']            = 'Fájl hiba: a következő fájlt nem lehet megnyitni: ';
+$PHPMAILER_LANG['from_failed']          = 'A feladóként megadott következő cím hibás: ';
+$PHPMAILER_LANG['instantiate']          = 'A PHP mail() függvényt nem sikerült végrehajtani.';
+$PHPMAILER_LANG['invalid_address']      = 'Érvénytelen cím: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' a mailer-osztály nem támogatott.';
+$PHPMAILER_LANG['provide_address']      = 'Legalább egy címzettet fel kell tüntetni.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP hiba: a címzettként megadott következő címek hibásak: ';
+$PHPMAILER_LANG['signing']              = 'Hibás aláírás: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'Hiba az SMTP-kapcsolatban.';
+$PHPMAILER_LANG['smtp_error']           = 'SMTP-szerver hiba: ';
+$PHPMAILER_LANG['variable_set']         = 'A következő változók beállítása nem sikerült: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-id.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Indonesian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Cecep Prawiro <cecep.prawiro@gmail.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'Kesalahan SMTP: Tidak dapat mengautentikasi.';
+$PHPMAILER_LANG['connect_host']         = 'Kesalahan SMTP: Tidak dapat terhubung ke host SMTP.';
+$PHPMAILER_LANG['data_not_accepted']    = 'Kesalahan SMTP: Data tidak diterima peladen.';
+$PHPMAILER_LANG['empty_message']        = 'Isi pesan kosong';
+$PHPMAILER_LANG['encoding']             = 'Pengkodean karakter tidak dikenali: ';
+$PHPMAILER_LANG['execute']              = 'Tidak dapat menjalankan proses : ';
+$PHPMAILER_LANG['file_access']          = 'Tidak dapat mengakses berkas : ';
+$PHPMAILER_LANG['file_open']            = 'Kesalahan File: Berkas tidak bisa dibuka : ';
+$PHPMAILER_LANG['from_failed']          = 'Alamat pengirim berikut mengakibatkan error : ';
+$PHPMAILER_LANG['instantiate']          = 'Tidak dapat menginisialisasi fungsi email';
+$PHPMAILER_LANG['invalid_address']      = 'Gagal terkirim, alamat email tidak valid : ';
+$PHPMAILER_LANG['provide_address']      = 'Harus disediakan minimal satu alamat tujuan';
+$PHPMAILER_LANG['mailer_not_supported'] = 'Mailer tidak didukung';
+$PHPMAILER_LANG['recipients_failed']    = 'Kesalahan SMTP: Alamat tujuan berikut menghasilkan error : ';
+$PHPMAILER_LANG['signing']              = 'Kesalahan dalam tanda tangan : ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() gagal.';
+$PHPMAILER_LANG['smtp_error']           = 'Kesalahan peladen SMTP : ';
+$PHPMAILER_LANG['variable_set']         = 'Tidak berhasil mengatur atau mengatur ulang variable : ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-it.php
@@ -1,1 +1,28 @@
+<?php
+/**
+ * Italian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Ilias Bartolini <brain79@inwind.it>
+ * @author Stefano Sabatini <sabas88@gmail.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP Error: Impossibile autenticarsi.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP Error: Impossibile connettersi all\'host SMTP.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP Error: Dati non accettati dal server.';
+$PHPMAILER_LANG['empty_message']        = 'Il corpo del messaggio è vuoto';
+$PHPMAILER_LANG['encoding']             = 'Codifica dei caratteri sconosciuta: ';
+$PHPMAILER_LANG['execute']              = 'Impossibile eseguire l\'operazione: ';
+$PHPMAILER_LANG['file_access']          = 'Impossibile accedere al file: ';
+$PHPMAILER_LANG['file_open']            = 'File Error: Impossibile aprire il file: ';
+$PHPMAILER_LANG['from_failed']          = 'I seguenti indirizzi mittenti hanno generato errore: ';
+$PHPMAILER_LANG['instantiate']          = 'Impossibile istanziare la funzione mail';
+$PHPMAILER_LANG['invalid_address']      = 'Impossibile inviare, l\'indirizzo email non è valido: ';
+$PHPMAILER_LANG['provide_address']      = 'Deve essere fornito almeno un indirizzo ricevente';
+$PHPMAILER_LANG['mailer_not_supported'] = 'Mailer non supportato';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP Error: I seguenti indirizzi destinatari hanno generato un errore: ';
+$PHPMAILER_LANG['signing']              = 'Errore nella firma: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() fallita.';
+$PHPMAILER_LANG['smtp_error']           = 'Errore del server SMTP: ';
+$PHPMAILER_LANG['variable_set']         = 'Impossibile impostare o resettare la variabile: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-ja.php
@@ -1,1 +1,28 @@
+<?php
+/**
+ * Japanese PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Mitsuhiro Yoshida <http://mitstek.com/>
+ * @author Yoshi Sakai <http://bluemooninc.jp/>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTPエラー: 認証できませんでした。';
+$PHPMAILER_LANG['connect_host']         = 'SMTPエラー: SMTPホストに接続できませんでした。';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTPエラー: データが受け付けられませんでした。';
+//$PHPMAILER_LANG['empty_message']        = 'Message body empty';
+$PHPMAILER_LANG['encoding']             = '不明なエンコーディング: ';
+$PHPMAILER_LANG['execute']              = '実行できませんでした: ';
+$PHPMAILER_LANG['file_access']          = 'ファイルにアクセスできません: ';
+$PHPMAILER_LANG['file_open']            = 'ファイルエラー: ファイルを開けません: ';
+$PHPMAILER_LANG['from_failed']          = 'Fromアドレスを登録する際にエラーが発生しました: ';
+$PHPMAILER_LANG['instantiate']          = 'メール関数が正常に動作しませんでした。';
+//$PHPMAILER_LANG['invalid_address']      = 'Invalid address: ';
+$PHPMAILER_LANG['provide_address']      = '少なくとも1つメールアドレスを 指定する必要があります。';
+$PHPMAILER_LANG['mailer_not_supported'] = ' メーラーがサポートされていません。';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTPエラー: 次の受信者アドレスに 間違いがあります: ';
+//$PHPMAILER_LANG['signing']              = 'Signing Error: ';
+//$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() failed.';
+//$PHPMAILER_LANG['smtp_error']           = 'SMTP server error: ';
+//$PHPMAILER_LANG['variable_set']         = 'Cannot set or reset variable: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-ka.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Georgian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Avtandil Kikabidze aka LONGMAN <akalongman@gmail.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP შეცდომა: ავტორიზაცია შეუძლებელია.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP შეცდომა: SMTP სერვერთან დაკავშირება შეუძლებელია.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP შეცდომა: მონაცემები არ იქნა მიღებული.';
+$PHPMAILER_LANG['encoding']             = 'კოდირების უცნობი ტიპი: ';
+$PHPMAILER_LANG['execute']              = 'შეუძლებელია შემდეგი ბრძანების შესრულება: ';
+$PHPMAILER_LANG['file_access']          = 'შეუძლებელია წვდომა ფაილთან: ';
+$PHPMAILER_LANG['file_open']            = 'ფაილური სისტემის შეცდომა: არ იხსნება ფაილი: ';
+$PHPMAILER_LANG['from_failed']          = 'გამგზავნის არასწორი მისამართი: ';
+$PHPMAILER_LANG['instantiate']          = 'mail ფუნქციის გაშვება ვერ ხერხდება.';
+$PHPMAILER_LANG['provide_address']      = 'გთხოვთ მიუთითოთ ერთი ადრესატის e-mail მისამართი მაინც.';
+$PHPMAILER_LANG['mailer_not_supported'] = ' - საფოსტო სერვერის მხარდაჭერა არ არის.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP შეცდომა: შემდეგ მისამართებზე გაგზავნა ვერ მოხერხდა: ';
+$PHPMAILER_LANG['empty_message']        = 'შეტყობინება ცარიელია';
+$PHPMAILER_LANG['invalid_address']      = 'არ გაიგზავნა, e-mail მისამართის არასწორი ფორმატი: ';
+$PHPMAILER_LANG['signing']              = 'ხელმოწერის შეცდომა: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'შეცდომა SMTP სერვერთან დაკავშირებისას';
+$PHPMAILER_LANG['smtp_error']           = 'SMTP სერვერის შეცდომა: ';
+$PHPMAILER_LANG['variable_set']         = 'შეუძლებელია შემდეგი ცვლადის შექმნა ან შეცვლა: ';
+$PHPMAILER_LANG['extension_missing']    = 'ბიბლიოთეკა არ არსებობს: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-ko.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Korean PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author ChalkPE <amato0617@gmail.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP 오류: 인증할 수 없습니다.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP 오류: SMTP 호스트에 접속할 수 없습니다.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP 오류: 데이터가 받아들여지지 않았습니다.';
+$PHPMAILER_LANG['empty_message']        = '메세지 내용이 없습니다';
+$PHPMAILER_LANG['encoding']             = '알 수 없는 인코딩: ';
+$PHPMAILER_LANG['execute']              = '실행 불가: ';
+$PHPMAILER_LANG['file_access']          = '파일 접근 불가: ';
+$PHPMAILER_LANG['file_open']            = '파일 오류: 파일을 열 수 없습니다: ';
+$PHPMAILER_LANG['from_failed']          = '다음 From 주소에서 오류가 발생했습니다: ';
+$PHPMAILER_LANG['instantiate']          = 'mail 함수를 인스턴스화할 수 없습니다';
+$PHPMAILER_LANG['invalid_address']      = '잘못된 주소: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' 메일러는 지원되지 않습니다.';
+$PHPMAILER_LANG['provide_address']      = '적어도 한 개 이상의 수신자 메일 주소를 제공해야 합니다.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP 오류: 다음 수신자에서 오류가 발생했습니다: ';
+$PHPMAILER_LANG['signing']              = '서명 오류: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP 연결을 실패하였습니다.';
+$PHPMAILER_LANG['smtp_error']           = 'SMTP 서버 오류: ';
+$PHPMAILER_LANG['variable_set']         = '변수 설정 및 초기화 불가: ';
+$PHPMAILER_LANG['extension_missing']    = '확장자 없음: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-lt.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Lithuanian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Dainius Kaupaitis <dk@sum.lt>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP klaida: autentifikacija nepavyko.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP klaida: nepavyksta prisijungti prie SMTP stoties.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP klaida: duomenys nepriimti.';
+$PHPMAILER_LANG['empty_message']        = 'Laiško turinys tuščias';
+$PHPMAILER_LANG['encoding']             = 'Neatpažinta koduotė: ';
+$PHPMAILER_LANG['execute']              = 'Nepavyko įvykdyti komandos: ';
+$PHPMAILER_LANG['file_access']          = 'Byla nepasiekiama: ';
+$PHPMAILER_LANG['file_open']            = 'Bylos klaida: Nepavyksta atidaryti: ';
+$PHPMAILER_LANG['from_failed']          = 'Neteisingas siuntėjo adresas: ';
+$PHPMAILER_LANG['instantiate']          = 'Nepavyko paleisti mail funkcijos.';
+$PHPMAILER_LANG['invalid_address']      = 'Neteisingas adresas: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' pašto stotis nepalaikoma.';
+$PHPMAILER_LANG['provide_address']      = 'Nurodykite bent vieną gavėjo adresą.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP klaida: nepavyko išsiųsti šiems gavėjams: ';
+$PHPMAILER_LANG['signing']              = 'Prisijungimo klaida: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP susijungimo klaida';
+$PHPMAILER_LANG['smtp_error']           = 'SMTP stoties klaida: ';
+$PHPMAILER_LANG['variable_set']         = 'Nepavyko priskirti reikšmės kintamajam: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-lv.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Latvian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Eduards M. <e@npd.lv>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP kļūda: Autorizācija neizdevās.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP Kļūda: Nevar izveidot savienojumu ar SMTP serveri.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP Kļūda: Nepieņem informāciju.';
+$PHPMAILER_LANG['empty_message']        = 'Ziņojuma teksts ir tukšs';
+$PHPMAILER_LANG['encoding']             = 'Neatpazīts kodējums: ';
+$PHPMAILER_LANG['execute']              = 'Neizdevās izpildīt komandu: ';
+$PHPMAILER_LANG['file_access']          = 'Fails nav pieejams: ';
+$PHPMAILER_LANG['file_open']            = 'Faila kļūda: Nevar atvērt failu: ';
+$PHPMAILER_LANG['from_failed']          = 'Nepareiza sūtītāja adrese: ';
+$PHPMAILER_LANG['instantiate']          = 'Nevar palaist sūtīšanas funkciju.';
+$PHPMAILER_LANG['invalid_address']      = 'Nepareiza adrese: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' sūtītājs netiek atbalstīts.';
+$PHPMAILER_LANG['provide_address']      = 'Lūdzu, norādiet vismaz vienu adresātu.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP kļūda: neizdevās nosūtīt šādiem saņēmējiem: ';
+$PHPMAILER_LANG['signing']              = 'Autorizācijas kļūda: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP savienojuma kļūda';
+$PHPMAILER_LANG['smtp_error']           = 'SMTP servera kļūda: ';
+$PHPMAILER_LANG['variable_set']         = 'Nevar piešķirt mainīgā vērtību: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-ms.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Malaysian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Nawawi Jamili <nawawi@rutweb.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'Ralat SMTP: Tidak dapat pengesahan.';
+$PHPMAILER_LANG['connect_host']         = 'Ralat SMTP: Tidak dapat menghubungi hos pelayan SMTP.';
+$PHPMAILER_LANG['data_not_accepted']    = 'Ralat SMTP: Data tidak diterima oleh pelayan.';
+$PHPMAILER_LANG['empty_message']        = 'Tiada isi untuk mesej';
+$PHPMAILER_LANG['encoding']             = 'Pengekodan tidak diketahui: ';
+$PHPMAILER_LANG['execute']              = 'Tidak dapat melaksanakan: ';
+$PHPMAILER_LANG['file_access']          = 'Tidak dapat mengakses fail: ';
+$PHPMAILER_LANG['file_open']            = 'Ralat Fail: Tidak dapat membuka fail: ';
+$PHPMAILER_LANG['from_failed']          = 'Berikut merupakan ralat dari alamat e-mel: ';
+$PHPMAILER_LANG['instantiate']          = 'Tidak dapat memberi contoh fungsi e-mel.';
+$PHPMAILER_LANG['invalid_address']      = 'Alamat emel tidak sah: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' jenis penghantar emel tidak disokong.';
+$PHPMAILER_LANG['provide_address']      = 'Anda perlu menyediakan sekurang-kurangnya satu alamat e-mel penerima.';
+$PHPMAILER_LANG['recipients_failed']    = 'Ralat SMTP: Penerima e-mel berikut telah gagal: ';
+$PHPMAILER_LANG['signing']              = 'Ralat pada tanda tangan: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() telah gagal.';
+$PHPMAILER_LANG['smtp_error']           = 'Ralat pada pelayan SMTP: ';
+$PHPMAILER_LANG['variable_set']         = 'Tidak boleh menetapkan atau menetapkan semula pembolehubah: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-nl.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Dutch PHPMailer language file: refer to class.phpmailer.php for definitive list.
+ * @package PHPMailer
+ * @author Tuxion <team@tuxion.nl>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP-fout: authenticatie mislukt.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP-fout: kon niet verbinden met SMTP-host.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP-fout: data niet geaccepteerd.';
+$PHPMAILER_LANG['empty_message']        = 'Berichttekst is leeg';
+$PHPMAILER_LANG['encoding']             = 'Onbekende codering: ';
+$PHPMAILER_LANG['execute']              = 'Kon niet uitvoeren: ';
+$PHPMAILER_LANG['file_access']          = 'Kreeg geen toegang tot bestand: ';
+$PHPMAILER_LANG['file_open']            = 'Bestandsfout: kon bestand niet openen: ';
+$PHPMAILER_LANG['from_failed']          = 'Het volgende afzendersadres is mislukt: ';
+$PHPMAILER_LANG['instantiate']          = 'Kon mailfunctie niet initialiseren.';
+$PHPMAILER_LANG['invalid_address']      = 'Ongeldig adres: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mailer wordt niet ondersteund.';
+$PHPMAILER_LANG['provide_address']      = 'Er moet minstens één ontvanger worden opgegeven.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP-fout: de volgende ontvangers zijn mislukt: ';
+$PHPMAILER_LANG['signing']              = 'Signeerfout: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Verbinding mislukt.';
+$PHPMAILER_LANG['smtp_error']           = 'SMTP-serverfout: ';
+$PHPMAILER_LANG['variable_set']         = 'Kan de volgende variabele niet instellen of resetten: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-no.php
@@ -1,1 +1,26 @@
+<?php
+/**
+ * Norwegian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP Feil: Kunne ikke autentisere.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP Feil: Kunne ikke koble til SMTP tjener.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP Feil: Data ble ikke akseptert.';
+$PHPMAILER_LANG['empty_message']        = 'Meldingsinnholdet er tomt';
+$PHPMAILER_LANG['encoding']             = 'Ukjent tegnkoding: ';
+$PHPMAILER_LANG['execute']              = 'Kunne ikke utføre: ';
+$PHPMAILER_LANG['file_access']          = 'Får ikke tilgang til filen: ';
+$PHPMAILER_LANG['file_open']            = 'Fil feil: Kunne ikke åpne filen: ';
+$PHPMAILER_LANG['from_failed']          = 'Følgende avsenderadresse feilet: ';
+$PHPMAILER_LANG['instantiate']          = 'Kunne ikke initialisere mailfunksjonen.';
+$PHPMAILER_LANG['invalid_address']      = 'Meldingen ble ikke sendt, følgende adresse er ugyldig: ';
+$PHPMAILER_LANG['provide_address']      = 'Du må angi minst en mottakeradresse.';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mailer er ikke supportert.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP Feil: Følgende mottagere feilet: ';
+$PHPMAILER_LANG['signing']              = 'Signeringsfeil: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() feilet.';
+$PHPMAILER_LANG['smtp_error']           = 'SMTP-serverfeil: ';
+$PHPMAILER_LANG['variable_set']         = 'Kan ikke sette eller resette variabelen: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-pl.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Polish PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'Błąd SMTP: Nie można przeprowadzić uwierzytelnienia.';
+$PHPMAILER_LANG['connect_host']         = 'Błąd SMTP: Nie można połączyć się z wybranym hostem.';
+$PHPMAILER_LANG['data_not_accepted']    = 'Błąd SMTP: Dane nie zostały przyjęte.';
+$PHPMAILER_LANG['empty_message']        = 'Wiadomość jest pusta.';
+$PHPMAILER_LANG['encoding']             = 'Nieznany sposób kodowania znaków: ';
+$PHPMAILER_LANG['execute']              = 'Nie można uruchomić: ';
+$PHPMAILER_LANG['file_access']          = 'Brak dostępu do pliku: ';
+$PHPMAILER_LANG['file_open']            = 'Nie można otworzyć pliku: ';
+$PHPMAILER_LANG['from_failed']          = 'Następujący adres Nadawcy jest nieprawidłowy: ';
+$PHPMAILER_LANG['instantiate']          = 'Nie można wywołać funkcji mail(). Sprawdź konfigurację serwera.';
+$PHPMAILER_LANG['invalid_address']      = 'Nie można wysłać wiadomości, '.
+    'następujący adres Odbiorcy jest nieprawidłowy: ';
+$PHPMAILER_LANG['provide_address']      = 'Należy podać prawidłowy adres email Odbiorcy.';
+$PHPMAILER_LANG['mailer_not_supported'] = 'Wybrana metoda wysyłki wiadomości nie jest obsługiwana.';
+$PHPMAILER_LANG['recipients_failed']    = 'Błąd SMTP: Następujący odbiorcy są nieprawidłowi: ';
+$PHPMAILER_LANG['signing']              = 'Błąd podpisywania wiadomości: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() zakończone niepowodzeniem.';
+$PHPMAILER_LANG['smtp_error']           = 'Błąd SMTP: ';
+$PHPMAILER_LANG['variable_set']         = 'Nie można ustawić lub zmodyfikować zmiennej: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-pt.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Portuguese (European) PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Jonadabe <jonadabe@hotmail.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'Erro do SMTP: Não foi possível realizar a autenticação.';
+$PHPMAILER_LANG['connect_host']         = 'Erro do SMTP: Não foi possível realizar ligação com o servidor SMTP.';
+$PHPMAILER_LANG['data_not_accepted']    = 'Erro do SMTP: Os dados foram rejeitados.';
+$PHPMAILER_LANG['empty_message']        = 'A mensagem no e-mail está vazia.';
+$PHPMAILER_LANG['encoding']             = 'Codificação desconhecida: ';
+$PHPMAILER_LANG['execute']              = 'Não foi possível executar: ';
+$PHPMAILER_LANG['file_access']          = 'Não foi possível aceder o ficheiro: ';
+$PHPMAILER_LANG['file_open']            = 'Abertura do ficheiro: Não foi possível abrir o ficheiro: ';
+$PHPMAILER_LANG['from_failed']          = 'Ocorreram falhas nos endereços dos seguintes remententes: ';
+$PHPMAILER_LANG['instantiate']          = 'Não foi possível iniciar uma instância da função mail.';
+$PHPMAILER_LANG['invalid_address']      = 'Não foi enviado nenhum e-mail para o endereço de e-mail inválido: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mailer não é suportado.';
+$PHPMAILER_LANG['provide_address']      = 'Tem de fornecer pelo menos um endereço como destinatário do e-mail.';
+$PHPMAILER_LANG['recipients_failed']    = 'Erro do SMTP: O endereço do seguinte destinatário falhou: ';
+$PHPMAILER_LANG['signing']              = 'Erro ao assinar: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() falhou.';
+$PHPMAILER_LANG['smtp_error']           = 'Erro de servidor SMTP: ';
+$PHPMAILER_LANG['variable_set']         = 'Não foi possível definir ou redefinir a variável: ';
+$PHPMAILER_LANG['extension_missing']    = 'Extensão em falta: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-ro.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Romanian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Catalin Constantin <catalin@dazoot.ro>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'Eroare SMTP: Nu a functionat autentificarea.';
+$PHPMAILER_LANG['connect_host']         = 'Eroare SMTP: Nu m-am putut conecta la adresa SMTP.';
+$PHPMAILER_LANG['data_not_accepted']    = 'Eroare SMTP: Continutul mailului nu a fost acceptat.';
+$PHPMAILER_LANG['empty_message']        = 'Mesajul este gol.';
+$PHPMAILER_LANG['encoding']             = 'Encodare necunoscuta: ';
+$PHPMAILER_LANG['execute']              = 'Nu pot executa:  ';
+$PHPMAILER_LANG['file_access']          = 'Nu pot accesa fisierul: ';
+$PHPMAILER_LANG['file_open']            = 'Eroare de fisier: Nu pot deschide fisierul: ';
+$PHPMAILER_LANG['from_failed']          = 'Urmatoarele adrese From au dat eroare: ';
+$PHPMAILER_LANG['instantiate']          = 'Nu am putut instantia functia mail.';
+$PHPMAILER_LANG['invalid_address']      = 'Adresa de email nu este valida: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mailer nu este suportat.';
+$PHPMAILER_LANG['provide_address']      = 'Trebuie sa adaugati cel putin un recipient (adresa de mail).';
+$PHPMAILER_LANG['recipients_failed']    = 'Eroare SMTP: Urmatoarele adrese de mail au dat eroare: ';
+$PHPMAILER_LANG['signing']              = 'A aparut o problema la semnarea emailului. ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'Conectarea la serverul SMTP a esuat.';
+$PHPMAILER_LANG['smtp_error']           = 'A aparut o eroare la serverul SMTP. ';
+$PHPMAILER_LANG['variable_set']         = 'Nu se poate seta/reseta variabila. ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-ru.php
@@ -1,1 +1,28 @@
+<?php
+/**
+ * Russian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Alexey Chumakov <alex@chumakov.ru>
+ * @author Foster Snowhill <i18n@forstwoof.ru>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'Ошибка SMTP: ошибка авторизации.';
+$PHPMAILER_LANG['connect_host']         = 'Ошибка SMTP: не удается подключиться к серверу SMTP.';
+$PHPMAILER_LANG['data_not_accepted']    = 'Ошибка SMTP: данные не приняты.';
+$PHPMAILER_LANG['encoding']             = 'Неизвестный вид кодировки: ';
+$PHPMAILER_LANG['execute']              = 'Невозможно выполнить команду: ';
+$PHPMAILER_LANG['file_access']          = 'Нет доступа к файлу: ';
+$PHPMAILER_LANG['file_open']            = 'Файловая ошибка: не удается открыть файл: ';
+$PHPMAILER_LANG['from_failed']          = 'Неверный адрес отправителя: ';
+$PHPMAILER_LANG['instantiate']          = 'Невозможно запустить функцию mail.';
+$PHPMAILER_LANG['provide_address']      = 'Пожалуйста, введите хотя бы один адрес e-mail получателя.';
+$PHPMAILER_LANG['mailer_not_supported'] = ' — почтовый сервер не поддерживается.';
+$PHPMAILER_LANG['recipients_failed']    = 'Ошибка SMTP: отправка по следующим адресам получателей не удалась: ';
+$PHPMAILER_LANG['empty_message']        = 'Пустое тело сообщения';
+$PHPMAILER_LANG['invalid_address']      = 'Не отослано, неправильный формат email адреса: ';
+$PHPMAILER_LANG['signing']              = 'Ошибка подписывания: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'Ошибка соединения с SMTP-сервером';
+$PHPMAILER_LANG['smtp_error']           = 'Ошибка SMTP-сервера: ';
+$PHPMAILER_LANG['variable_set']         = 'Невозможно установить или переустановить переменную: ';
+$PHPMAILER_LANG['extension_missing']    = 'Расширение отсутствует: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-se.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Swedish PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Johan Linnér <johan@linner.biz>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP fel: Kunde inte autentisera.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP fel: Kunde inte ansluta till SMTP-server.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP fel: Data accepterades inte.';
+//$PHPMAILER_LANG['empty_message']        = 'Message body empty';
+$PHPMAILER_LANG['encoding']             = 'Okänt encode-format: ';
+$PHPMAILER_LANG['execute']              = 'Kunde inte köra: ';
+$PHPMAILER_LANG['file_access']          = 'Ingen åtkomst till fil: ';
+$PHPMAILER_LANG['file_open']            = 'Fil fel: Kunde inte öppna fil: ';
+$PHPMAILER_LANG['from_failed']          = 'Följande avsändaradress är felaktig: ';
+$PHPMAILER_LANG['instantiate']          = 'Kunde inte initiera e-postfunktion.';
+//$PHPMAILER_LANG['invalid_address']      = 'Invalid address: ';
+$PHPMAILER_LANG['provide_address']      = 'Du måste ange minst en mottagares e-postadress.';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mailer stöds inte.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP fel: Följande mottagare är felaktig: ';
+//$PHPMAILER_LANG['signing']              = 'Signing Error: ';
+//$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() failed.';
+//$PHPMAILER_LANG['smtp_error']           = 'SMTP server error: ';
+//$PHPMAILER_LANG['variable_set']         = 'Cannot set or reset variable: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-si.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Sinhala PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Senasum Rajapalsha <senasum@live.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP fodihls: l%shd lrúh fkdyl .';
+$PHPMAILER_LANG['connect_host']         = 'SMTP fodihls: iïnkao l, fkdyl.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP fodihls: o;a; Ndr .; fkdyl.';
+$PHPMAILER_LANG['empty_message']        = 'ysia mksúvhls';
+$PHPMAILER_LANG['encoding']             = 'iqrlaYs; njg m;a lrï: ';
+$PHPMAILER_LANG['execute']              = 'l%shd lrúh fkdyl: ';
+$PHPMAILER_LANG['file_access']          = 'f.dkqj fj; ,.d úh fkdyl: ';
+$PHPMAILER_LANG['file_open']            = 'f.dkqj újD; fkdfj: ';
+$PHPMAILER_LANG['from_failed']          = 'f*d¾uh jrÈh: ';
+$PHPMAILER_LANG['instantiate']          = 'jyd l, hq;= fj.';
+$PHPMAILER_LANG['invalid_address']      = 'smskh jrÈh: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mksúv lre fkd.,mS.';
+$PHPMAILER_LANG['provide_address']      = ',smskh w;=,a lrkak.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP fodihls: mksúvh ,.d l, fkdyl: ';
+$PHPMAILER_LANG['signing']              = 'w;=,a úh fkdyl: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP iïnkao l, fkdyl.';
+$PHPMAILER_LANG['smtp_error']           = 'SMTP fodihls:: ';
+$PHPMAILER_LANG['variable_set']         = 'úp,h ilia lr fkdu;: ';
+$PHPMAILER_LANG['extension_missing']    = 'l%shd lrúh fkdyl: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-sk.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Slovak PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Michal Tinka <michaltinka@gmail.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP Error: Chyba autentifikácie.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP Error: Nebolo možné nadviazať spojenie so SMTP serverom.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP Error: Dáta neboli prijaté';
+$PHPMAILER_LANG['empty_message']        = 'Prázdne telo správy.';
+$PHPMAILER_LANG['encoding']             = 'Neznáme kódovanie: ';
+$PHPMAILER_LANG['execute']              = 'Nedá sa vykonať: ';
+$PHPMAILER_LANG['file_access']          = 'Súbor nebol nájdený: ';
+$PHPMAILER_LANG['file_open']            = 'File Error: Súbor sa otvoriť pre čítanie: ';
+$PHPMAILER_LANG['from_failed']          = 'Následujúca adresa From je nesprávna: ';
+$PHPMAILER_LANG['instantiate']          = 'Nedá sa vytvoriť inštancia emailovej funkcie.';
+$PHPMAILER_LANG['invalid_address']      = 'Neodoslané, emailová adresa je nesprávna: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' emailový klient nieje podporovaný.';
+$PHPMAILER_LANG['provide_address']      = 'Musíte zadať aspoň jednu emailovú adresu príjemcu.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP Error: Adresy príjemcov niesu správne ';
+$PHPMAILER_LANG['signing']              = 'Chyba prihlasovania: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP Connect() zlyhalo.';
+$PHPMAILER_LANG['smtp_error']           = 'SMTP chyba serveru: ';
+$PHPMAILER_LANG['variable_set']         = 'Nemožno nastaviť alebo resetovať premennú: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-sl.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Slovene PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Klemen Tušar <techouse@gmail.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP napaka: Avtentikacija ni uspela.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP napaka: Ne morem vzpostaviti povezave s SMTP gostiteljem.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP napaka: Strežnik zavrača podatke.';
+$PHPMAILER_LANG['empty_message']        = 'E-poštno sporočilo nima vsebine.';
+$PHPMAILER_LANG['encoding']             = 'Nepoznan tip kodiranja: ';
+$PHPMAILER_LANG['execute']              = 'Operacija ni uspela: ';
+$PHPMAILER_LANG['file_access']          = 'Nimam dostopa do datoteke: ';
+$PHPMAILER_LANG['file_open']            = 'Ne morem odpreti datoteke: ';
+$PHPMAILER_LANG['from_failed']          = 'Neveljaven e-naslov pošiljatelja: ';
+$PHPMAILER_LANG['instantiate']          = 'Ne morem inicializirati mail funkcije.';
+$PHPMAILER_LANG['invalid_address']      = 'E-poštno sporočilo ni bilo poslano. E-naslov je neveljaven: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' mailer ni podprt.';
+$PHPMAILER_LANG['provide_address']      = 'Prosim vnesite vsaj enega naslovnika.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP napaka: Sledeči naslovniki so neveljavni: ';
+$PHPMAILER_LANG['signing']              = 'Napaka pri podpisovanju: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'Ne morem vzpostaviti povezave s SMTP strežnikom.';
+$PHPMAILER_LANG['smtp_error']           = 'Napaka SMTP strežnika: ';
+$PHPMAILER_LANG['variable_set']         = 'Ne morem nastaviti oz. ponastaviti spremenljivke: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-sr.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Serbian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Александар Јевремовић <ajevremovic@gmail.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP грешка: аутентификација није успела.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP грешка: није могуће повезивање са SMTP сервером.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP грешка: подаци нису прихваћени.';
+$PHPMAILER_LANG['empty_message']        = 'Садржај поруке је празан.';
+$PHPMAILER_LANG['encoding']             = 'Непознато кодовање: ';
+$PHPMAILER_LANG['execute']              = 'Није могуће извршити наредбу: ';
+$PHPMAILER_LANG['file_access']          = 'Није могуће приступити датотеци: ';
+$PHPMAILER_LANG['file_open']            = 'Није могуће отворити датотеку: ';
+$PHPMAILER_LANG['from_failed']          = 'SMTP грешка: слање са следећих адреса није успело: ';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP грешка: слање на следеће адресе није успело: ';
+$PHPMAILER_LANG['instantiate']          = 'Није могуће покренути mail функцију.';
+$PHPMAILER_LANG['invalid_address']      = 'Порука није послата због неисправне адресе: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' мејлер није подржан.';
+$PHPMAILER_LANG['provide_address']      = 'Потребно је задати најмање једну адресу.';
+$PHPMAILER_LANG['signing']              = 'Грешка приликом пријављивања: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'Повезивање са SMTP сервером није успело.';
+$PHPMAILER_LANG['smtp_error']           = 'Грешка SMTP сервера: ';
+$PHPMAILER_LANG['variable_set']         = 'Није могуће задати променљиву, нити је вратити уназад: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-tr.php
@@ -1,1 +1,30 @@
+<?php
+/**
+ * Turkish PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Elçin Özel
+ * @author Can Yılmaz
+ * @author Mehmet Benlioğlu
+ * @author @yasinaydin
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP Hatası: Oturum açılamadı.';
+$PHPMAILER_LANG['connect_host']         = 'SMTP Hatası: SMTP sunucusuna bağlanılamadı.';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP Hatası: Veri kabul edilmedi.';
+$PHPMAILER_LANG['empty_message']        = 'Mesajın içeriği boş';
+$PHPMAILER_LANG['encoding']             = 'Bilinmeyen karakter kodlama: ';
+$PHPMAILER_LANG['execute']              = 'Çalıştırılamadı: ';
+$PHPMAILER_LANG['file_access']          = 'Dosyaya erişilemedi: ';
+$PHPMAILER_LANG['file_open']            = 'Dosya Hatası: Dosya açılamadı: ';
+$PHPMAILER_LANG['from_failed']          = 'Belirtilen adreslere gönderme başarısız: ';
+$PHPMAILER_LANG['instantiate']          = 'Örnek e-posta fonksiyonu oluşturulamadı.';
+$PHPMAILER_LANG['invalid_address']      = 'Geçersiz e-posta adresi: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' e-posta kütüphanesi desteklenmiyor.';
+$PHPMAILER_LANG['provide_address']      = 'En az bir alıcı e-posta adresi belirtmelisiniz.';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP Hatası: Belirtilen alıcılara ulaşılamadı: ';
+$PHPMAILER_LANG['signing']              = 'İmzalama hatası: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP connect() fonksiyonu başarısız.';
+$PHPMAILER_LANG['smtp_error']           = 'SMTP sunucu hatası: ';
+$PHPMAILER_LANG['variable_set']         = 'Değişken ayarlanamadı ya da sıfırlanamadı: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-uk.php
@@ -1,1 +1,28 @@
+<?php
+/**
+ * Ukrainian PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author Yuriy Rudyy <yrudyy@prs.net.ua>
+ * @fixed by Boris Yurchenko <boris@yurchenko.pp.ua>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'Помилка SMTP: помилка авторизації.';
+$PHPMAILER_LANG['connect_host']         = 'Помилка SMTP: не вдається під\'єднатися до серверу SMTP.';
+$PHPMAILER_LANG['data_not_accepted']    = 'Помилка SMTP: дані не прийняті.';
+$PHPMAILER_LANG['encoding']             = 'Невідомий тип кодування: ';
+$PHPMAILER_LANG['execute']              = 'Неможливо виконати команду: ';
+$PHPMAILER_LANG['file_access']          = 'Немає доступу до файлу: ';
+$PHPMAILER_LANG['file_open']            = 'Помилка файлової системи: не вдається відкрити файл: ';
+$PHPMAILER_LANG['from_failed']          = 'Невірна адреса відправника: ';
+$PHPMAILER_LANG['instantiate']          = 'Неможливо запустити функцію mail.';
+$PHPMAILER_LANG['provide_address']      = 'Будь-ласка, введіть хоча б одну адресу e-mail отримувача.';
+$PHPMAILER_LANG['mailer_not_supported'] = ' - поштовий сервер не підтримується.';
+$PHPMAILER_LANG['recipients_failed']    = 'Помилка SMTP: відправлення наступним отримувачам не вдалося: ';
+$PHPMAILER_LANG['empty_message']        = 'Пусте тіло повідомлення';
+$PHPMAILER_LANG['invalid_address']      = 'Не відправлено, невірний формат адреси e-mail: ';
+$PHPMAILER_LANG['signing']              = 'Помилка підпису: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'Помилка з\'єднання із SMTP-сервером';
+$PHPMAILER_LANG['smtp_error']           = 'Помилка SMTP-сервера: ';
+$PHPMAILER_LANG['variable_set']         = 'Неможливо встановити або перевстановити змінну: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-vi.php
@@ -1,1 +1,27 @@
+<?php
+/**
+ * Vietnamese (Tiếng Việt) PHPMailer language file: refer to English translation for definitive list.
+ * @package PHPMailer
+ * @author VINADES.,JSC <contact@vinades.vn>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'Lỗi SMTP: Không thể xác thực.';
+$PHPMAILER_LANG['connect_host']         = 'Lỗi SMTP: Không thể kết nối máy chủ SMTP.';
+$PHPMAILER_LANG['data_not_accepted']    = 'Lỗi SMTP: Dữ liệu không được chấp nhận.';
+$PHPMAILER_LANG['empty_message']        = 'Không có nội dung';
+$PHPMAILER_LANG['encoding']             = 'Mã hóa không xác định: ';
+$PHPMAILER_LANG['execute']              = 'Không thực hiện được: ';
+$PHPMAILER_LANG['file_access']          = 'Không thể truy cập tệp tin ';
+$PHPMAILER_LANG['file_open']            = 'Lỗi Tập tin: Không thể mở tệp tin: ';
+$PHPMAILER_LANG['from_failed']          = 'Lỗi địa chỉ gửi đi: ';
+$PHPMAILER_LANG['instantiate']          = 'Không dùng được các hàm gửi thư.';
+$PHPMAILER_LANG['invalid_address']      = 'Đại chỉ emai không đúng: ';
+$PHPMAILER_LANG['mailer_not_supported'] = ' trình gửi thư không được hỗ trợ.';
+$PHPMAILER_LANG['provide_address']      = 'Bạn phải cung cấp ít nhất một địa chỉ người nhận.';
+$PHPMAILER_LANG['recipients_failed']    = 'Lỗi SMTP: lỗi địa chỉ người nhận: ';
+$PHPMAILER_LANG['signing']              = 'Lỗi đăng nhập: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'Lỗi kết nối với SMTP';
+$PHPMAILER_LANG['smtp_error']           = 'Lỗi máy chủ smtp ';
+$PHPMAILER_LANG['variable_set']         = 'Không thể thiết lập hoặc thiết lập lại biến: ';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-zh.php
@@ -1,1 +1,29 @@
+<?php
+/**
+ * Traditional Chinese PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author liqwei <liqwei@liqwei.com>
+ * @author Peter Dave Hello <@PeterDaveHello/>
+ * @author Jason Chiang <xcojad@gmail.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP 錯誤:登入失敗。';
+$PHPMAILER_LANG['connect_host']         = 'SMTP 錯誤:無法連線到 SMTP 主機。';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP 錯誤:無法接受的資料。';
+$PHPMAILER_LANG['empty_message']        = '郵件內容為空';
+$PHPMAILER_LANG['encoding']             = '未知編碼: ';
+$PHPMAILER_LANG['execute']              = '無法執行:';
+$PHPMAILER_LANG['file_access']          = '無法存取檔案:';
+$PHPMAILER_LANG['file_open']            = '檔案錯誤:無法開啟檔案:';
+$PHPMAILER_LANG['from_failed']          = '發送地址錯誤:';
+$PHPMAILER_LANG['instantiate']          = '未知函數呼叫。';
+$PHPMAILER_LANG['invalid_address']      = '因為電子郵件地址無效,無法傳送: ';
+$PHPMAILER_LANG['mailer_not_supported'] = '不支援的發信客戶端。';
+$PHPMAILER_LANG['provide_address']      = '必須提供至少一個收件人地址。';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP 錯誤:以下收件人地址錯誤:';
+$PHPMAILER_LANG['signing']              = '電子簽章錯誤: ';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP 連線失敗';
+$PHPMAILER_LANG['smtp_error']           = 'SMTP 伺服器錯誤: ';
+$PHPMAILER_LANG['variable_set']         = '無法設定或重設變數: ';
+$PHPMAILER_LANG['extension_missing']    = '遺失模組 Extension: ';
+

--- /dev/null
+++ b/languages/mailer/phpmailer.lang-zh_cn.php
@@ -1,1 +1,28 @@
+<?php
+/**
+ * Simplified Chinese PHPMailer language file: refer to English translation for definitive list
+ * @package PHPMailer
+ * @author liqwei <liqwei@liqwei.com>
+ * @author young <masxy@foxmail.com>
+ */
 
+$PHPMAILER_LANG['authenticate']         = 'SMTP 错误:登录失败。';
+$PHPMAILER_LANG['connect_host']         = 'SMTP 错误:无法连接到 SMTP 主机。';
+$PHPMAILER_LANG['data_not_accepted']    = 'SMTP 错误:数据不被接受。';
+$PHPMAILER_LANG['empty_message']        = '邮件正文为空。';
+$PHPMAILER_LANG['encoding']             = '未知编码: ';
+$PHPMAILER_LANG['execute']              = '无法执行:';
+$PHPMAILER_LANG['file_access']          = '无法访问文件:';
+$PHPMAILER_LANG['file_open']            = '文件错误:无法打开文件:';
+$PHPMAILER_LANG['from_failed']          = '发送地址错误:';
+$PHPMAILER_LANG['instantiate']          = '未知函数调用。';
+$PHPMAILER_LANG['invalid_address']      = '发送失败,电子邮箱地址是无效的:';
+$PHPMAILER_LANG['mailer_not_supported'] = '发信客户端不被支持。';
+$PHPMAILER_LANG['provide_address']      = '必须提供至少一个收件人地址。';
+$PHPMAILER_LANG['recipients_failed']    = 'SMTP 错误:收件人地址错误:';
+$PHPMAILER_LANG['signing']              = '登录失败:';
+$PHPMAILER_LANG['smtp_connect_failed']  = 'SMTP服务器连接失败。';
+$PHPMAILER_LANG['smtp_error']           = 'SMTP服务器出错: ';
+$PHPMAILER_LANG['variable_set']         = '无法设置或重置变量:';
+//$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
+

file:b/maintenance.php (new)
--- /dev/null
+++ b/maintenance.php
@@ -1,1 +1,38 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+$current = "maintenance";
+
+include("header.php");
+
+if(file_exists("$skindir/default.tpl")) $tpl = new TemplatePower( "$skindir/default.tpl" );
+else $tpl = new TemplatePower("default_tpls/default.tpl");
+
+include("includes/pagesetup.php");
+$page = dbquery("SELECT message_title, message_text FROM ".TABLEPREFIX."fanfiction_messages WHERE message_name = 'maintenance' LIMIT 1");
+if(dbnumrows($page)) list($title, $text) = dbrow($page);
+else $text = write_message(_ERROR);
+$output = "<div id='pagetitle'>$title</div>\n\n$text";
+$tpl->assign("output", $output);
+$tpl->printToScreen();
+dbclose( );
+?>

--- /dev/null
+++ b/modules/betareader/README.txt
@@ -1,1 +1,37 @@
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Also Like Module developed for eFiction 3.0
+// // http://efiction.hugosnebula.com/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+This little module will let you add an option to the members list page to 
+display a list of the betareaders on your site.  It's designed to work with
+the default beta-reader field.  If you've installed a custom betareader 
+module make sure the name of the field is "betareader" and that it's a 
+yes/no field.  Otherwise, this module won't work.
+
+To install this module:
+
+1. Upload the entire betareader folder to the the modules folder within your 
+eFiction installation.
+
+2. Go to Admin->Modules and select "Install this Module" in the menu.
+
+To uninsall this module:
+
+1. Go to Admin->Modules and select "Uninstall this Module" in the menu.
+

--- /dev/null
+++ b/modules/betareader/changelog.txt
@@ -1,1 +1,3 @@
+05/31/08
 
+- Removed erroneous language file calls.

--- /dev/null
+++ b/modules/betareader/install.php
@@ -1,1 +1,51 @@
-
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Also Like Module developed for eFiction 3.0
+// // http://efiction.hugosnebula.com/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+$current = "adminarea";
+include ("../../header.php");
+                                      
+//make a new TemplatePower object
+if(file_exists( "$skindir/default.tpl")) $tpl = new TemplatePower("$skindir/default.tpl" );
+else $tpl = new TemplatePower(_BASEDIR."default_tpls/default.tpl");
+$tpl->assignInclude( "header", "$skindir/header.tpl" );
+$tpl->assignInclude( "footer", "$skindir/footer.tpl" );
+include(_BASEDIR."includes/pagesetup.php");
+include_once(_BASEDIR."languages/".$language."_admin.php");
+if(!isADMIN) accessDenied( );       
+$confirm = isset($_GET['confirm']) ? $_GET['confirm'] : false;
+if($confirm == "yes") {
+	list($installed) = dbrow(dbquery("SELECT COUNT(code_module) FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_module = 'betareader'"));
+	if(!$installed) {
+		dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_codeblocks` (`code_text`, `code_type`, `code_module`) VALUES ( 'include(_BASEDIR.\"modules/betareader/members.php\");', 'membersList', 'betareader');");
+		include("version.php");
+		dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_modules`(`version`, `name`) VALUES('$moduleVersion', '$moduleName')");
+		dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_codeblocks` (`code_text`, `code_type`, `code_module`) VALUES ( 'include(_BASEDIR.\"modules/betareader/stats.php\");', 'sitestats', 'betareader');");
+	    }
+	$output = write_message(_ACTIONSUCCESSFUL);
+}
+else if($confirm == "no") {
+	$output = write_message(_ACTIONCANCELLED);
+}
+else {
+	$output = write_message(_CONFIRMINSTALL."<br /><a href='install.php?confirm=yes'>"._YES."</a> "._OR." <a href='install.php?confirm=no'>"._NO."</a>");
+}
+$tpl->assign("output", $output);
+$tpl->printToScreen( );
+?>

--- /dev/null
+++ b/modules/betareader/members.php
@@ -1,1 +1,11 @@
+<?php 
+if(!defined("_CHARSET")) exit( );
+list($field_id, $field_title) = dbrow(dbquery("SELECT field_id, field_title FROM ".TABLEPREFIX."fanfiction_authorfields WHERE field_name = 'betareader'"));
+$listOpts .= "<option value=\"authors.php?".($let ? "let=$let&amp;" : "")."list=beta\"".($list == "beta" ? " selected" : "").">$field_title</option>";
+if($list == "beta") {
+	$countquery = "SELECT COUNT(DISTINCT ai.uid) FROM ".TABLEPREFIX."fanfiction_authorinfo as ai, "._AUTHORTABLE." WHERE ai.field = '$field_id' AND ai.info = '"._YES."' AND "._UIDFIELD." = ai.uid".(isset($letter) ? " AND $letter" : "");
+	$authorquery = "SELECT ap.stories as stories, "._PENNAMEFIELD." as penname, "._UIDFIELD." as uid FROM ".TABLEPREFIX."fanfiction_authorinfo as ai, "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs AS ap ON "._UIDFIELD." = ap.uid WHERE ai.field = '$field_id' AND ai.info = '"._YES."' AND "._UIDFIELD." = ai.uid ".(isset($letter) ? " AND $letter" : "")." GROUP BY "._UIDFIELD;
+	$pagetitle .= $field_title;
+}
 
+?>

--- /dev/null
+++ b/modules/betareader/stats.php
@@ -1,1 +1,37 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+
+if(!defined("_CHARSET")) exit( );
+
+list($field_id, $field_title) = dbrow(dbquery("SELECT field_id, field_title FROM ".TABLEPREFIX."fanfiction_authorfields WHERE field_name = 'betareader'"));
+$query = dbquery("SELECT count(uid) FROM ".TABLEPREFIX."fanfiction_authorinfo WHERE field = '$field_id' AND info = '"._YES."'");
+list($count) = dbrow($query);
+if(!empty($blocks['info']['style']) && $blocks['info']['style'] == 2) {
+	$tpl->assignGlobal("totalbetas", $count);
+}
+else if(!empty($blocks['info']['style']) && $blocks["info"]["style"] == 1) {
+	$content = preg_replace("@\{totalbetas\}@", $count, $content);
+}
+else $content .= "<div><span class='label'>".$field_title.": </span>".$count."</div>";
+?>

--- /dev/null
+++ b/modules/betareader/uninstall.php
@@ -1,1 +1,49 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Also Like Module developed for eFiction 3.0
+// // http://efiction.hugosnebula.com/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+$current = "adminarea";
+include ("../../header.php");
 
+//make a new TemplatePower object
+if(file_exists( "$skindir/default.tpl")) $tpl = new TemplatePower("$skindir/default.tpl" );
+else $tpl = new TemplatePower(_BASEDIR."default_tpls/default.tpl");
+$tpl->assignInclude( "header", "$skindir/header.tpl" );
+$tpl->assignInclude( "footer", "$skindir/footer.tpl" );
+include(_BASEDIR."includes/pagesetup.php");
+include_once(_BASEDIR."languages/".$language."_admin.php");
+if(!isADMIN) accessDenied( );
+$confirm = isset($_GET['confirm']) ? $_GET['confirm'] : false;
+if($confirm == "yes") {
+	include("version.php");
+	dbquery("DELETE FROM `".TABLEPREFIX."fanfiction_modules` WHERE name = '$moduleName'");	
+	dbquery("DELETE FROM `".TABLEPREFIX."fanfiction_codeblocks` WHERE code_module = 'betareader'");	
+	$output = write_message(_ACTIONSUCCESSFUL);
+}
+else if($confirm == "no") {
+	$output = write_message(_ACTIONCANCELLED);
+}
+else {
+	$modquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_module = 'betareader'");
+	if(dbnumrows($modquery)) $output = write_message(_CONFIRMUNINSTALL."<a href='uninstall.php?confirm=yes'>"._YES."</a> "._OR." <a href='uninstall.php?confirm=no'>"._NO."</a>");
+	else $output .= write_message(_MODNOTINSTALLED);
+}
+$tpl->assign("output", $output);
+$tpl->printToScreen( );
+?>

--- /dev/null
+++ b/modules/betareader/update.php
@@ -1,1 +1,58 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+$current = "betareader";
+include ("../../header.php");
+
+//make a new TemplatePower object
+if(file_exists( "$skindir/default.tpl")) $tpl = new TemplatePower("$skindir/default.tpl" );
+else $tpl = new TemplatePower(_BASEDIR."default_tpls/default.tpl");
+$tpl->assignInclude( "header", "$skindir/header.tpl" );
+$tpl->assignInclude( "footer", "$skindir/footer.tpl" );
+include(_BASEDIR."includes/pagesetup.php");
+if(file_exists(_BASEDIR."languages/".$language."_admin.php")) include_once(_BASEDIR."languages/".$language."_admin.php");
+else include_once(_BASEDIR."languages/en_admin.php");
+if(file_exists(_BASEDIR."languages/".$language.".php")) include_once(_BASEDIR."languages/".$language.".php");
+else include_once(_BASEDIR."languages/en.php");
+if(!isADMIN) accessDenied( );
+$confirm = isset($_GET['confirm']) ? $_GET['confirm'] : false;
+include("version.php");
+list($currentVersion) = dbrow(dbquery("SELECT version FROM ".TABLEPREFIX."fanfiction_modules WHERE name = '$moduleName' LIMIT 1"));
+$installed = dbnumrows(dbquery("SELECT COUNT(code_module) FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_module = 'betareader'"));
+if(empty($currentVersion) || $currentVersion < "1.4" || !$installed) {
+if($confirm == "yes") {
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_modules SET version = '1.4' WHERE name = '$moduleName' LIMIT 1");
+	if($currentVersion < "1.2") dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_codeblocks` (`code_text`, `code_type`, `code_module`) VALUES ( 'include(_BASEDIR.\"modules/betareader/stats.php\");', 'sitestats', 'betareader');");
+	$output = write_message(_ACTIONSUCCESSFUL);
+}
+else if($confirm == "no") {
+	$output = write_message(_ACTIONCANCELLED);
+}
+else {
+	$output = write_message(_CONFIRMUPDATE."<br /><a href='update.php?confirm=yes'>"._YES."</a> "._OR." <a href='update.php?confirm=no'>"._NO."</a>");
+}
+}
+else $output .= write_message(_ALREADYUPDATED);
+$tpl->assign("output", $output);
+$tpl->printToScreen( );
+?>

--- /dev/null
+++ b/modules/betareader/version.php
@@ -1,1 +1,18 @@
+<?php
+/*
+This file will be called by admin/modules.php and update.php to determine if 
+the module version in the database is the current version of the module.  
+The version number in this file will be the current version.
+*/
 
+if(!defined("_CHARSET")) exit( );
+
+$moduleVersion = "1.4";
+$moduleName = "Beta-Reader List";
+
+$moduleDescription = "This tiny module adds a beta-reader option to the members page. Requires 3.1.";
+$moduleAuthor = "Tammy Keefer";
+$moduleAuthorEmail = "efiction@hugosnebula.com";
+$moduleWebsite = "http://efiction.hugosnebula.com";
+
+?>

--- /dev/null
+++ b/modules/challenges/admin.php
@@ -1,1 +1,61 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+$current = "challenges";
+if(isset($_GET['action']) && ($_GET['action'] == "add" || $_GET['action'] == "edit")) $displayform = 1;
 
+if(file_exists(_BASEDIR."languages/{$language}_admin.php")) include_once(_BASEDIR."languages/{$language}_admin.php");
+else include_once(_BASEDIR."languages/en_admin.php");
+if(file_exists(_BASEDIR."modules/challenges/languages/{$language}.php")) include_once(_BASEDIR."modules/challenges/languages/{$language}.php");
+else include_once(_BASEDIR."modules/challenges/languages/en.php");
+$output = "<div id='pagetitle'>"._CHALLENGEADMIN."</div>";
+if(!isADMIN) accessDenied( );
+if(isset($_GET['task']) && $_GET['task'] == "recalc") {
+	$challenges = dbquery("SELECT chalid, characters FROM ".TABLEPREFIX."fanfiction_challenges");
+	while($c = dbassoc($challenges)) {
+		unset($newchars, $count, $count1, $count2);
+		$stories = dbquery("SELECT COUNT(sid) AS count FROM ".TABLEPREFIX."fanfiction_stories WHERE FIND_IN_SET('".$c['chalid']."', challenges) > 0");
+		list($count1) = dbrow($stories);
+		$series = dbquery("SELECT COUNT(seriesid) FROM ".TABLEPREFIX."fanfiction_series WHERE FIND_IN_SET('".$c['chalid']."', challenges) > 0");
+		list($count2) = dbrow($series);
+		$count = $count1 + $count2;
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_challenges SET  responses = '$count' WHERE chalid = $c[chalid]");
+	}
+	$output .= write_message(_ACTIONSUCCESSFUL);
+}
+if(isset($_POST['submit'])) {
+	$anonchallenges = $_POST['anonchallenges'] == 1 ? 1 : 0;
+	$result = dbquery("UPDATE ".$settingsprefix."fanfiction_settings SET anonchallenges = '$anonchallenges' WHERE sitekey = '".SITEKEY."'");
+	if($result) $output .= write_message(_ACTIONSUCCESSFUL);
+	else $output .= write_error(_ERROR);
+}
+else {
+	$output .= "<div  id=\"settingsform\"><form method=\"POST\" style=\"margin: 1em auto;\" enctype=\"multipart/form-data\" action=\"admin.php?action=modules&amp;admin=true&amp;module=challenges\">";
+	$output .= "<label for=\"anonchallenges\">"._ANONCHALLENGES.": </label><select name=\"anonchallenges\">
+				<option value=\"1\"".($anonchallenges == "1" ? " selected" : "").">"._YES."</option>
+				<option value=\"0\"".($anonchallenges == "0" ? " selected" : "").">"._NO."</option>
+			</select><br />";
+	$output .= "<div id='submitdiv'><INPUT type=\"submit\" id=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></div></form></form></div>";
+	$output .= write_message("<a href='admin.php?action=modules&amp;admin=true&amp;module=challenges&amp;task=recalc'>"._RECALCCHAL."</a>");
+}
+?>
+

--- /dev/null
+++ b/modules/challenges/adminfunctions.php
@@ -1,1 +1,45 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+
+if(!defined("_CHARSET")) exit( );
+
+// Delete characters
+if($action == "characters") {
+	$chalquery = dbquery("SELECT characters, chalid FROM ".TABLEPREFIX."fanfiction_challenges WHERE FIND_IN_SET('$charid', characters) > 0");
+	while($chal = dbassoc($chalquery)) {
+		$newcharlist = array_diff(explode(",", $chal['characters']), array($charid));
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_challenges SET characters = '".($newcharlist ? implode(",", $newcharlist) : "")."' WHERE chalid = '$chal[chalid]'");
+	}
+}
+
+// Delete categories 
+if($action == "categories") {
+	$chalquery = dbquery("SELECT catid, chalid FROM ".TABLEPREFIX."fanfiction_challenges WHERE FIND_IN_SET('$catid', catid) > 0");
+	while($chal = dbassoc($chalquery)) {
+		$newcatlist = array_diff(explode(",", $chal['catid']), array($catid));
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_challenges SET catid = '".($newcatlist ? implode(",", $newcatlist) : "")."' WHERE chalid = '$chal[chalid]'");
+	}
+}
+
+?>

--- /dev/null
+++ b/modules/challenges/authorof.php
@@ -1,1 +1,35 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+
+if(!defined("_CHARSET")) exit( );
+
+if(file_exists(_BASEDIR."modules/challenges/languages/{$language}.php")) 
+include_once(_BASEDIR."modules/challenges/languages/{$language}.php"); 
+else include_once(_BASEDIR."modules/challenges/languages/en.php");
+
+$challengequery = dbquery("SELECT count(chalid) FROM ".TABLEPREFIX."fanfiction_challenges WHERE uid = $uid");
+list($challengecount) = dbrow($challengequery);
+$authorof[] = "<a href='".$thislink."action=challengesby'>$challengecount "._CHALLENGES."</a>";
+
+?>

--- /dev/null
+++ b/modules/challenges/browse.php
@@ -1,1 +1,108 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+if(file_exists(_BASEDIR."modules/challenges/languages/{$language}.php")) include_once(_BASEDIR."modules/challenges/languages/{$language}.php");
+else include_once(_BASEDIR."modules/challenges/languages/en.php");
+
+	$output .= "<div id='pagetitle'>"._CHALLENGES."</div><div class=\"respond\"><a href=\"modules/challenges/challenges.php?action=add\">"._ISSUECHALLENGE."</a></div>".build_alphalinks("browse.php?type=challenges&amp;", $let);
+	$numrows = 0;
+	$chalquery = array( );
+	if(!empty($charid)) {
+		$chars = array( );
+		foreach($charid as $c) {
+			$chars[] = "FIND_IN_SET('$c', characters) > 0";
+		}
+		$chalquery[] = implode(" OR ", $chars);
+	}
+	if(isset($catid) && count($catid) > 0) {
+		$categories = array( );
+		// Get the recursive list.
+		foreach($catid as $cat) {
+			if($cat == "false" || empty($cat)) continue;
+			$categories = array_merge($categories, recurseCategories($cat));
+		}
+		// Now format the SQL
+		$cats = array( );
+		foreach($categories as $cat) {
+			$cats[] = "FIND_IN_SET($cat, catid) > 0 ";
+		}
+		// Now implode the SQL list
+		if(!empty($cats)) $chalquery[] = "(".implode(" OR ", $cats).")";
+	}
+	if(isset($authors)) $chalquery[] = "FIND_IN_SET(uid, '".implode(",",$authors)."') > 0";
+	if(isset($summary)) $chalquery[] = "summary LIKE '%".$summary."%'";
+	if(isset($title)) $chalquery[] = "summary LIKE '%".$title."%'";
+	if($let == _OTHER) {
+		$chalquery[] = "chal.title REGEXP '^[^a-z]'";
+	}
+	else if(!empty($let)) {
+		$chalquery[] = "chal.title LIKE '$let%'";
+	}
+	$chalquery = count($chalquery) > 0 ? " WHERE ".implode(" AND ", $chalquery) : "";
+
+
+	$count = dbquery("SELECT count(chalid) FROM ".TABLEPREFIX."fanfiction_challenges as chal $chalquery");
+	$query = "SELECT chal.* FROM ".TABLEPREFIX."fanfiction_challenges as chal $chalquery ORDER BY chalid DESC LIMIT $offset, $itemsperpage";
+
+	list($numrows) = dbrow($count);
+	if($numrows > 0) {
+
+		if(file_exists(_BASEDIR."$skindir/challenges.tpl")) $challenges = new TemplatePower(_BASEDIR."$skindir/challenges.tpl");
+		else $challenges = new TemplatePower(_BASEDIR."modules/challenges/default_tpls/challenges.tpl");
+		$challenges->prepare( );
+		$result = dbquery($query);
+		$count = 0;
+		while($challenge = dbassoc($result)) {
+			$challenges->newBlock("challenge");
+			if(isADMIN || (USERUID != 0 && USERUID == $challenge['uid'])) $challenges->assign("adminoptions", "<div class=\"adminoptions\"><span class='label'>".(isADMIN ? _ADMINOPTIONS : _OPTIONS).":</span> [<a href=\"modules/challenges/challenges.php?action=edit&amp;chalid=".$challenge['chalid']."\">"._EDIT."</a>] [<a href=\"modules/challenges/challenges.php?action=delete&amp;chalid=".$challenge['chalid']."\">"._DELETE."</a>]</div>");
+			$challenges->assign("author", ($challenge['uid'] ? "<a href=\""._BASEDIR."viewuser.php?uid=".$challenge['uid']."\">".$challenge['challenger']."</a>" : $challenge['challenger']));
+			$challenges->assign("title", "<a href=\"modules/challenges/challenges.php?chalid=".$challenge['chalid']."\">".stripslashes($challenge['title'])."</a>");
+			$challenges->assign("numresponses", "<a href=\"modules/challenges/challenges.php?chalid=".$challenge['chalid']."\">".$challenge['responses']."</a>");
+			$challenges->assign("responses", "<a href=\"modules/challenges/challenges.php?chalid=".$challenge['chalid']."\">"._RESPONSES."</a>");
+			$challenges->assign("summary", stripslashes($challenge['summary']));
+			$challenges->assign("characters", $challenge['characters'] ? charlist($challenge['characters']) : _NONE);
+			$challenges->assign("category"   , ($challenge['catid'] > 0 ? catlist($challenge['catid']) : _NONE) );
+			if(isMEMBER) $challenges->assign("respond", "<div class=\"respond\"><a href=\"modules/challenges/challenges.php?action=respond&amp;chalid=".$challenge['chalid']."\">"._RESPOND2CHALLENGE."</a></div>");
+			$challenges->assign("reportthis", "[<a href=\""._BASEDIR."contact.php?action=report&amp;url=modules/challenges/challenges.php?chalid=".$challenge['chalid']."\">"._REPORTTHIS."</a>]");
+			$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'challengeblock'");
+			while($code = dbassoc($codequery)) {
+				eval($code['code_text']);
+			}
+			$count++;
+			$challenges->assign("skindir", $skindir);
+			$challenges->assign("oddeven", ($count % 2 ? "odd" : "even"));
+		}
+		$tpl->newBlock("listings");
+		$tpl->assign("pagelinks", $challenges->getOutputContent( ));
+		$tpl->gotoBlock("_ROOT");
+		$tpl->newBlock("listings");
+		if($numrows > $itemsperpage) {
+			$url = "browse.php?$terms".(!empty($let) ? "&amp;let={$let}" : '')."&amp;";
+			$tpl->assign("pagelinks", build_pagelinks($url, $numrows, $offset));
+		}
+		$disablesorts = array("classes", "ratings", "complete", "sorts");
+	}
+	else $output .= write_message(_NORESULTS);
+	unset($cats, $chars);
+?>

--- /dev/null
+++ b/modules/challenges/challenges.php
@@ -1,1 +1,331 @@
-
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+$current = "challenges";
+if(isset($_GET['action']) && ($_GET['action'] == "add" || $_GET['action'] == "edit")) $displayform = 1;
+include ("../../header.php");
+
+//make a new TemplatePower object
+if(file_exists( "$skindir/default.tpl")) $tpl = new TemplatePower("$skindir/default.tpl" );
+else $tpl = new TemplatePower(_BASEDIR."default_tpls/default.tpl");
+if(file_exists("$skindir/listings.tpl")) $tpl->assignInclude( "listings", "$skindir/listings.tpl" );
+else $tpl->assignInclude( "listings", _BASEDIR."default_tpls/listings.tpl" );
+$tpl->assignInclude( "header", "$skindir/header.tpl" );
+$tpl->assignInclude( "footer", "$skindir/footer.tpl" );
+include(_BASEDIR."includes/pagesetup.php");
+
+$chalid = isset($_GET['chalid']) ? $_GET['chalid'] : false;
+if($chalid && !isNumber($chalid)) unset($chalid, $action);
+
+// security check
+	$admin = 0;
+	if(!isset($anonchallenges)) accessDenied( );
+	if(($action && ($action != "add" || !$anonchallenges)) && !isMEMBER) accessDenied( );
+	if(isADMIN && uLEVEL < 3) $admin = 1;
+	if(isADMIN && uLEVEL == 3) {
+		if(isset($chalid)) {
+			$challenge = dbquery("SELECT uid, catid from ".TABLEPREFIX."fanfiction_challenges WHERE chalid='$chalid' LIMIT 1");
+			list($chaluid, $catid) = dbrow($challenge);
+			if(uLEVEL == 3 && $admincats != 0) {
+				$seriescats = explode(",", $catid);
+				$adcats = explode(",", $admincats);
+				foreach($seriescats as $cat) {
+					if(in_array($cat, $adcats)) $admin = 1;
+				}
+			}
+			if($chaluid != USERUID &&  $admin != 1 && uLEVEL > 2) accessDenied( );
+		}
+	}
+
+// end security check
+
+if($action == "remove") {
+	if(!$chalid || (empty($seriesid) && empty($sid))) {
+		$output .= write_error(_ERROR);
+	}
+	else {
+		$output .= "<div id='pagetitle'>"._CHALLENGES."</div>";
+		if(isset($seriesid)) {
+			$chalinfo =dbquery("SELECT challenges FROM ".TABLEPREFIX."fanfiction_series WHERE seriesid = '$seriesid'");
+			list($challenges) = dbrow($chalinfo);
+			$challenges = explode(",", $challenges);
+			$result = dbquery("UPDATE ".TABLEPREFIX."fanfiction_series SET challenges = '".array_diff($challenges, explode(",", $chalid))."' WHERE seriesid = '$seriesid'");
+		}
+		else {
+			$chalinfo = dbquery("SELECT challenges FROM ".TABLEPREFIX."fanfiction_stories WHERE sid = '$sid'");
+			list($challenges) = dbrow($chalinfo);
+			$challenges = explode(",", $challenges);
+			$result = dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET challenges = '".implode(",", array_diff($challenges, explode(",", $chalid)))."' WHERE sid = '$sid'");
+		}
+		if($result) dbquery("UPDATE ".TABLEPREFIX."fanfiction_challenges SET responses = responses - 1 WHERE chalid = '$chalid'");
+		$output .= write_message(_ACTIONSUCCESSFUL);
+	}
+}
+
+else if($action == "add" || $action == "edit") {
+
+	if(!empty($_GET['cat']) && isNumber($_GET['cat'])) $cat = $_GET["cat"];
+	else $cat = -1;
+	$catid = isset($_POST['catid']) && isNumber($_POST['catid']) ? $_POST['catid'] : "";
+
+	$output .= "<div id=\"pagetitle\">".($action == "edit" ? _EDITCHALLENGE : _ADDCHALLENGE)."</div>";
+	if(isset($_POST['submit'])) {
+		$title = escapestring(descript($_POST['title'], $allowed_tags));
+		$summary = escapestring(replace_naughty(strip_tags(descript($_POST['summary']), $allowed_tags)));
+		$challenger = escapestring(strip_tags(descript($_POST['challenger']), $allowed_tags));
+		if(!$challenger) $challenger = _ANONYMOUS;
+		$challengeruid = isset($_POST['challengeruid']) && isNumber($_POST['challengeruid']) ? $_POST['challengeruid'] : 0;
+		$catid = isset($_POST['catid']) ? array_filter(explode(",", $_POST['catid']), "isNumber") : array( );
+		$category = implode(",", $catid);
+		if(!$category) $category = -1;
+		$characters = isset($_POST['charid']) ? array_filter($_POST['charid'], "isNumber") : array( );
+		$charid = implode(",", $characters);
+		if(empty($title) || empty($summary)) {
+			$output .= write_error(_REQUIREDINFO);
+		}
+		else if(find_naughty($title) || find_naughty($challenger)) {
+			$output .= write_error(_NAUGHTYWORDS);
+		}
+		else if(!isMEMBER && $captcha && !captcha_confirm()) {
+			$output .= write_error(_CAPTCHAFAIL);
+			$tpl->assign("output", $output);
+			$tpl->printToScreen( );
+			exit( );
+		}
+		else {
+			if($action != "edit") 
+				$insert = "INSERT INTO ".TABLEPREFIX."fanfiction_challenges (title, summary, catid, characters, challenger, uid) VALUES('$title', '$summary', '$category', '$charid', '$challenger', '$challengeruid')";
+			else 
+				$insert = "UPDATE ".TABLEPREFIX."fanfiction_challenges SET title = '$title', summary = '$summary', challenger = '$challenger', catid = '$category', characters = '$charid' WHERE chalid = '$chalid'";
+			dbquery($insert);
+			$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'addchallenge'");
+			while($code = dbassoc($codequery)) {
+				eval($code['code_text']);
+			}
+			$output .= write_message(_ACTIONSUCCESSFUL."  <a href=\""._BASEDIR."browse.php?type=challenges\">"._BACK2PREVIOUS."</a>");
+			$tpl->assign("output", $output);
+			$tpl->printToScreen( );
+			exit( );
+		}		
+	}
+	if($action == "edit" && $chalid) {
+		$challenge = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_challenges WHERE chalid='$chalid' LIMIT 1");
+		list($chalid, $challenger, $chaluid, $chaltitle, $categories, $characters, $summary) = dbrow($challenge);
+		$cat = -1;
+		$catid = explode(",", $categories);
+		$charids = explode(",", $characters);
+	}
+	else {
+		$chaltitle = "";
+		$summary = "";
+		$categories = "";
+	}
+	$challenger = $action == "edit" ? $challenger : USERPENNAME;
+	$chaluid = $action == "edit" ? $chaluid : USERUID;
+	$output .= "<form METHOD=\"POST\" name=\"form\" action=\"challenges.php?action=$action".(isset($chalid) ? "&amp;chalid=$chalid" : "")."\">";
+	$output .= "<div class=\"tblborder\" style=\"width: 550px; margin: 0 auto; padding: 5px;\">";
+	$output .= "<label for=\"challenger\">"._NAME.":</label> ";
+	if(isMEMBER) $output .= $challenger."<input type=\"hidden\" id=\"challenger\" name=\"challenger\" value=\"$challenger\"><input type=\"hidden\" name=\"challengeruid\" value=\"$chaluid\"><br />";
+	else $output .= "<input  type=\"text\" class=\"textbox=\" name=\"challenger\" maxlength=\"200\" size=\"30\"> <font color=\"red\">*</font><br />";
+	$output .= "<label for=\"title\">"._TITLE.":</label> <span class=\"required\">*</span> <input  type=\"text\" class=\"textbox=\" name=\"title\" id=\"title\" maxlength=\"200\" value=\"".htmlentities(stripslashes($chaltitle))."\" size=\"50\"><br />
+		<label for=\"summary\">"._SUMMARY.":</label> <span class=\"required\">*</span><br /><textarea class=\"textbox\" rows=\"6\" id=\"summary\" name=\"summary\" cols=\"58\">".stripslashes($summary)."</textarea>";
+	if($tinyMCE) 
+		$output .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('summary');\" checked><label for='toggle'>"._TINYMCETOGGLE."</label></div>";
+	if(!$multiplecats) $output .= "<input type=\"hidden\" name=\"catid\" id=\"catid\" value=\"1\">";
+	else {
+		include(_BASEDIR."includes/categories.php");
+		$output .= "<input type=\"hidden\" name=\"formname\" value=\"challenges\">";
+	}
+	$output .= "<label for=\"charid\">"._CHARACTERS.":</label> <br /><select class=\"textbox\" size=\"8\" style=\"width: 100%;\" name=\"charid[]\" id=\"charid\" multiple>";
+	foreach($charlist as $char => $info) {
+			if($info['catid'] == -1) $output .= "<option value=\"$char\"".(isset($charids) && in_array($char, $charids) ? " selected" : "").">".$info['name']."</option>";
+	}		
+	$output .= "</select>";
+	$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'challengeform'");
+	while($code = dbassoc($codequery)) {
+		eval($code['code_text']);
+	}
+	if(!isMEMBER && $captcha) $output .= "<div><span class=\"label\">"._CAPTCHANOTE."</span><input MAXLENGTH=5 SIZE=5 name=\"userdigit\" type=\"text\" value=\"\"><br /><img width=120 height=30 src=\""._BASEDIR."includes/button.php\" style=\"border: 1px solid #111;\">";
+	$output .= "<div style=\"text-align: center; margin: 1em;\"><input type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></div></div></form>";
+}
+
+else if($action == "delete") {
+
+	if($chalid)
+	{
+
+		$confirmed = isset($_GET["confirmed"]) ? $_GET["confirmed"] : false;
+	
+		$output .= "<div id=\"pagetitle\">"._DELETECHALLENGE."</div>";
+		if(!$admin) {
+			list($uid) = dbrow(dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_challenges WHERE chalid = '$chalid' LIMIT 1"));
+			if(USERUID != $uid) $output .=  write_error(_NOTAUTHORIZED);
+		}	
+		if($confirmed == "no") {
+			$output .= write_message(_ACTIONCANCELLED."  <a href=\""._BASEDIR."browse.php?type=challenges\">"._BACK2PREVIOUS."</a>");
+		}
+		else if($confirmed == "yes" && $chalid) {
+			dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_challenges WHERE chalid = '$chalid'");
+			$responses = dbquery("SELECT challenges, sid FROM  ".TABLEPREFIX."fanfiction_stories WHERE FIND_IN_SET($chalid, challenges) > 0");
+			while($response = dbassoc($responses)) {
+				$challenges = explode(",", $response[challenges]);
+				if(is_array($challenges)) 
+					foreach($challenges as $key=>$value) { if($value == $chalid) unset($challenges[$key]); }
+				dbquery("UPDATE  ".TABLEPREFIX."fanfiction_stories SET challenges = '".implode(",", $challenges)."' WHERE sid = $response[sid] LIMIT 1");
+			}
+			$output .=  write_message(_ACTIONSUCCESSFUL."  <a href=\"challenges.php\">"._BACK2PREVIOUS."</a>");
+		}
+		else {
+			$output .= write_message(_CONFIRMDELETE."<br /><br />[ <a href=\"challenges.php?action=delete&amp;confirmed=yes&amp;chalid=$chalid\">"._YES."</a> | 
+				<a href=\"challenges.php?action=delete&amp;confirmed=no\">"._NO."</a> ]");
+		}
+	}
+}
+
+else if($action == "respond") {
+
+	if(!isset($chalid)) {
+		$output .= write_error(_ERROR);
+	}
+	if(isset($_POST['submit'])) {
+		$count = 0;
+		if(isset($_POST["sid"]) && is_array($_POST["sid"])) {
+			foreach($_POST["sid"] as $story) {
+				if(isNumber($story))
+				{
+					$result = dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET challenges = CONCAT('$chalid', ',', challenges) WHERE sid = '$story'");
+					$count++;
+				}
+			}
+		}
+		if(isset($_POST['seriesid']) && is_array($_POST["seriesid"])) {
+			foreach($_POST["seriesid"] as $series) {
+				if(isNumber($series))
+				{
+					$result2 = dbquery("UPDATE ".TABLEPREFIX."fanfiction_series SET challenges = CONCAT(challenges, ',' '$chalid') WHERE seriesid = '$series'");
+					$count++;
+				}
+			}
+		}
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_challenges SET responses = responses + $count WHERE chalid = '$chalid'");
+		if($count) $output .= write_message(_ACTIONSUCCESSFUL." <a href='"._BASEDIR."browse.php?type=challenges'>"._BACK2CHALLENGES."</a>");
+	}
+	else {
+		$challenge = dbquery("SELECT title, challenger, uid FROM ".TABLEPREFIX."fanfiction_challenges WHERE chalid = '$chalid' LIMIT 1");
+		list($title, $challenger, $challengeruid) = dbrow($challenge);
+		$output .= "<div id=\"pagetitle\">$title "._BY." ".($challengeruid ? "<a href=\""._BASEDIR."viewuser.php?uid=$challengeruid\">$challenger</a>" : "$challenger")."</div>";
+		$output .= "<form METHOD=\"POST\" name=\"form\" action=\"challenges.php?action=respond&amp;chalid=$chalid\">";
+		$output .= "<input type=\"hidden\" name=\"chalid\" value=\"$chalid\">";
+		if(($admin) && isset($_GET['stories']) && $_GET['stories'] == "others") {
+			if($let == _OTHER) $letter = _PENNAMEFIELD." REGEXP '^[^a-z]'";	
+			else if($let) $letter = _PENNAMEFIELD." LIKE '$let%'";
+			$pagelink = _BASEDIR."modules/challenges/challenges.php?action=respond&amp;stories=others&amp;chalid=$chalid&amp;".($let ? "let=$let&amp;" : "");
+			$authorlink = "<a href=\""._BASEDIR."modules/challenges/challenges.php?action=respond&amp;chalid=$chalid&amp;stories=";
+			$countquery = "SELECT count(distinct uid) FROM ".TABLEPREFIX."fanfiction_authorprefs WHERE stories > 0 ".(isset($letter) ? " AND $letter" : "");
+			$authorquery = "SELECT ap.stories, "._PENNAMEFIELD." as penname, "._UIDFIELD." as uid FROM "._AUTHORTABLE.", ".TABLEPREFIX."fanfiction_authorprefs as ap WHERE ap.uid = author.uid AND ap.stories > 0 ".(isset($letter) ? " AND $letter" : "");
+			include(_BASEDIR."includes/members_list.php");
+		}
+		else {
+			$authuid = isset($_GET["stories"]) && isNumber($_GET['stories']) ? $_GET["stories"] : USERUID;
+			$stories = dbquery("SELECT stories.title, stories.sid FROM ".TABLEPREFIX."fanfiction_stories as stories LEFT JOIN ".TABLEPREFIX."fanfiction_coauthors as coauth ON coauth.sid = stories.sid WHERE stories.validated > 0 AND (stories.uid = '$authuid' OR coauth.uid = '$authuid')");
+
+			if($admin) $output .= "<div style=\"text-align: center; margin-bottom: 1em;\"><a href=\"challenges.php?action=respond&amp;stories=others&amp;chalid=$chalid\">"._CHOOSEAUTHOR."</a></div>";
+			$output .= "<table class=\"tblborder\" style=\"width: 500px; margin: 0 auto;\"><tr><th class=\"tblborder\">"._STORIES."</th></tr>";
+			$numstories = 0;
+			while($story = dbassoc($stories)) {
+				$output .= "<tr><td class=\"tblborder\"><input type=\"checkbox\" class=\"checkbox\" value=\"$story[sid]\" name=\"sid[]\">".stripslashes($story['title'])."</td></tr>";
+				$numstories++;
+			}
+			if($numstories == 0) $output .= "<tr><td align=\"center\">"._NORESULTS."</td></tr>";
+			$series2 = dbquery("SELECT title, seriesid FROM ".TABLEPREFIX."fanfiction_series WHERE uid = '$authuid' AND FIND_IN_SET($chalid, challenges) < 1 ORDER BY title ASC");
+			$output .= "<tr><th class=\"tblborder\">"._SERIES."</th></tr>";
+			$numseries = 0;
+			while($series = dbassoc($series2)) {
+				$output .= "<tr><td><input type=\"checkbox\" class=\"checkbox\" value=\"$series[seriesid]\" name=\"seriesid[]\">".stripslashes($series['title'])."</td></tr>";
+				$numseries++;
+			}
+			if($numseries < 1) $output .= "<tr><td align=\"center\">"._NORESULTS."</td></tr>";
+			$output .="</table><div style=\"text-align: center; margin: 1em;\"><input type=\"submit\" class=\"button\" name=\"submit\" value=\"submit\"></div></form>";
+		}
+	}
+}
+else {
+
+	$catid = isset($_GET['catid']) ? $_GET['catid'] : false;	
+	if($chalid) {
+		if(file_exists("./$skindir/challenges_title.tpl")) $challenges = new TemplatePower("./$skindir/challenges_title.tpl");
+		else $challenges = new TemplatePower(_BASEDIR."modules/challenges/default_tpls/challenges_title.tpl");
+		$challenges->prepare( );
+
+		$challenge = dbquery("SELECT * FROM  ".TABLEPREFIX."fanfiction_challenges WHERE chalid = '$chalid' LIMIT 1");
+		list($chalid, $challenger, $uid, $title, $cat, $chars, $summary, $responses) = dbrow($challenge);
+		$challenger = stripslashes($challenger);
+		$title = stripslashes($title);
+		$summary= stripslashes($summary);
+
+		$challenges->newBlock("titleblock");
+		if(isADMIN || USERUID == $uid) $challenges->assign("adminoptions", "<div class=\"adminoptions\">".($admin ? _ADMINOPTIONS : _OPTIONS).": [<a href=\"challenges.php?action=edit&amp;chalid=$chalid\">"._EDIT."</a>] [<a href=\"challenges.php?action=delete&amp;chalid=$chalid\">"._DELETE."</a>]</div>");
+		$challenges->assign("author", ($uid ? "<a href=\""._BASEDIR."viewuser.php?uid=$uid\">$challenger</a>" : "$challenger"));
+		$challenges->assign("title", $title);
+		$challenges->assign("summary",$summary);
+		$challenges->assign("skindir", $skindir);
+		$challenges->assign("characters", $chars ? charlist($chars) : _NONE);
+		$challenges->assign("category", $cat > 0 ? catlist($cat) : _NONE);
+		$challenges->assign("respond", "<div class=\"respond\"><a href=\"challenges.php?action=respond&amp;chalid=$chalid\">"._RESPOND2CHALLENGE."</a></div>");
+		$challenges->assign("reportthis", "[<a href=\""._BASEDIR."contact.php?action=report&amp;url=modules/challenges/challenges.php?chalid=".$chalid."\">"._REPORTTHIS."</a>]");
+		$output .= $challenges->getOutputContent( );
+		$tpl->gotoBlock( "_ROOT" );
+		$tpl->newBlock("listings");
+		list($scount) = dbrow(dbquery(_SERIESCOUNT." WHERE FIND_IN_SET($chalid, challenges) > 0"));
+		$count = 0;
+		if($scount > $offset) {
+			$seriesquery = dbquery(_SERIESQUERY." AND FIND_IN_SET($chalid, series.challenges) > 0 LIMIT $offset, $itemsperpage");
+			while($stories = dbassoc($seriesquery)) {
+				include(_BASEDIR."includes/seriesblock.php");
+			}
+		}
+		if($scount - $offset < $itemsperpage) {
+			$storyoffset = $offset - $scount > 0 ? $offset - $scount : 0;
+			$remainder = $itemsperpage - $count;
+			list($scount2) = dbrow(dbquery(_STORYCOUNT." AND FIND_IN_SET($chalid, challenges) > 0"));
+			if($scount2 > 0) {
+				$storyquery = _STORYQUERY." AND FIND_IN_SET($chalid, stories.challenges) > 0";
+				$storyquery .= " LIMIT $offset, $remainder";
+				$storyresults = dbquery($storyquery);
+				while($stories = dbassoc($storyresults)) {
+					$tpl->newBlock("storyblock");
+					include(_BASEDIR."includes/storyblock.php"); 
+				}
+			}
+		}
+		if($scount + $scount2 > $itemsperpage) {
+			$tpl->gotoBlock( "listings" );
+			$tpl->assign( "pagelinks", build_pagelinks("challenges.php?chalid=$chalid&amp;", $scount + $scount2, $offset));
+		}
+		$tpl->gotoBlock( "_ROOT" );
+	}
+}
+
+$tpl->assign("output", $output);
+$tpl->printToScreen( );
+?>

--- /dev/null
+++ b/modules/challenges/challengesby.php
@@ -1,1 +1,72 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+if(!defined("_CHARSET")) exit( );
+if(!isset($anonchallenges)) accessDenied( );
+if(!isset($uid)) {
+	$uid = USERUID;
+}
+else {
+	$authquery = dbquery("SELECT "._PENNAMEFIELD." FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '$uid'");
+	list($penname) = dbrow($authquery);
+}
+if(file_exists(_BASEDIR."modules/challenges/languages/{$language}.php")) include_once(_BASEDIR."modules/challenges/languages/{$language}.php");
+else include_once(_BASEDIR."modules/challenges/languages/en.php");
+$countquery = dbquery("SELECT COUNT(chalid) FROM ".TABLEPREFIX."fanfiction_challenges WHERE uid = '$uid'");
+list($numchal) = dbrow($countquery);
+if($numchal) {
+	$infoquery = dbquery("SELECT "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '$uid' LIMIT 1");
+	list($penname) = dbrow($infoquery);
+	$output .= "<div class='sectionheader'>"._CHALLENGESBY." $penname</div>";
+	if(file_exists("./$skindir/challenges.tpl")) $challenges = new TemplatePower("./$skindir/challenges.tpl");
+	else $challenges = new TemplatePower(_BASEDIR."modules/challenges/default_tpls/challenges.tpl");
+	$challenges->prepare( );
+	$chalquery = dbquery("SELECT chal.*, "._PENNAMEFIELD." as penname FROM ".TABLEPREFIX."fanfiction_challenges as chal, "._AUTHORTABLE." WHERE "._UIDFIELD." = chal.uid AND chal.uid = '$uid' LIMIT $offset, $itemsperpage");
+	$count = 0;
+	while($challenge = dbassoc($chalquery)) {
+		$challenges->newBlock("challenge");
+		if(isADMIN || USERUID == $challenge['uid']) $challenges->assign("adminoptions", "<div class=\"adminoptions\"><span class=\"label\">".(isADMIN ? _ADMINOPTIONS : _OPTIONS).":</span> [<a href=\""._BASEDIR."modules/challenges/challenges.php?action=edit&amp;chalid=".$challenge['chalid']."\">"._EDIT."</a>] [<a href=\""._BASEDIR."modules/challenges/challenges.php?action=delete&amp;chalid=".$challenge['chalid']."\">"._DELETE."</a>]</div>");
+		$challenges->assign("author", ($challenge['uid'] ? "<a href=\"viewuser.php?uid=".$challenge['uid']."\">".$challenge['challenger']."</a>" : $challenge['challenger']));
+		$challenges->assign("title", "<a href=\"modules/challenges/challenges.php?chalid=".$challenge['chalid']."\">".stripslashes($challenge['title'])."</a>");
+		$challenges->assign("numresponses", "<a href=\"modules/challenges/challenges.php?chalid=".$challenge['chalid']."\">".$challenge['responses']."</a>");
+		$challenges->assign("responses", "<a href=\"modules/challenges/challenges.php?chalid=".$challenge['chalid']."\">"._RESPONSES."</a>");
+		$challenges->assign("summary", stripslashes($challenge['summary']));
+		$challenges->assign("characters", $challenge['characters'] ? charlist($challenge['characters']) : _NONE);
+		$challenges->assign("category"   , ($challenge['catid'] > 0 ? catlist($challenge['catid']) : _NONE) );
+		$challenges->assign("respond", "<div class=\"respond\"><a href=\""._BASEDIR."modules/challenges/challenges.php?action=respond&amp;chalid=".$challenge['chalid']."\">"._RESPOND2CHALLENGE."</a></div>");
+		$challenges->assign("reportthis", "[<a href=\""._BASEDIR."contact.php?action=report&amp;url=modules/challenges/challenges.php?chalid=".$challenge['chalid']."\">"._REPORTTHIS."</a>]");
+		$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'challengeblock'");
+		while($code = dbassoc($codequery)) {
+			eval($code['code_text']);
+		}
+		$count++;
+		$challenges->assign("oddeven", ($count % 2 ? "odd" : "even"));
+	}
+	$tpl->newBlock("listings");
+	if($numchal > $itemsperpage) $tpl->assign("pagelinks", build_pagelinks(basename($_SERVER['PHP_SELF'])."?action=challengesby&amp;uid=$uid&amp;", $numchal, $offset));
+	$tpl->gotoBlock("_ROOT");
+	$output .= $challenges->getOutputContent( );
 
+}
+else $output .= write_message(_NORESULTS);
+?>
+

--- /dev/null
+++ b/modules/challenges/default_tpls/challenges.tpl
@@ -1,1 +1,10 @@
-
+<!-- START BLOCK : challenge -->
+<div class="listbox {oddeven} clearfix">
+<div class="title">{title} by {author} [{responses} - {numresponses}] {reportthis}</div>
+<div class="content">
+<span class="label">Summary: </span>{summary}<br />
+<span class="label">Categories:</span> {category} <span class="label">Characters: </span>{characters}</div>
+{adminoptions}
+{respond}
+</div>
+<!-- END BLOCK : challenge -->

--- /dev/null
+++ b/modules/challenges/default_tpls/challenges_title.tpl
@@ -1,1 +1,10 @@
-
+<!-- START BLOCK : titleblock -->
+	<div id="pagetitle">{title} by {author} </div>
+	<div id="titleblock">
+		<span class="label">Summary: </span>{summary}<br />
+		<span class="label">Categories:</span> {category}<br />
+		<span class="label">Characters: </span>{characters}<br />
+		{adminoptions}{reportthis}
+	</div>
+	{respond}
+<!-- END BLOCK : titleblock -->

--- /dev/null
+++ b/modules/challenges/deletestory.php
@@ -1,1 +1,32 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+
+if(!defined("_CHARSET")) exit( );
+
+if(isset($anonchallenges) && !empty($story['challenges'])) {
+	$challenges = dbquery("UPDATE ".TABLEPREFIX."fanfiction_challenges SET responses = responses - 1 WHERE ".findclause("chalid", $story['challenges']));
+	while($c = dbassoc($challenges)) {
+	}
+}
+?>

--- /dev/null
+++ b/modules/challenges/deluser.php
@@ -1,1 +1,31 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+
+if(!defined("_CHARSET")) exit( );
+
+if(isset($anonchallenges)) {
+	list($penname) = dbrow(dbquery("SELECT penname FROM ".TABLEPREFIX."fanfiction_authors WHERE uid = '".$uid."' LIMIT 1"));
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_challenges SET uid = '0', challenger = '$penname' WHERE uid = '".$uid."'");	
+}
+?>

--- /dev/null
+++ b/modules/challenges/index.php

--- /dev/null
+++ b/modules/challenges/install.php
@@ -1,1 +1,79 @@
+<?php
+$current = "challenges";
+include ("../../header.php");
 
+//make a new TemplatePower object
+if(file_exists( "$skindir/default.tpl")) $tpl = new TemplatePower("$skindir/default.tpl" );
+else $tpl = new TemplatePower(_BASEDIR."default_tpls/default.tpl");
+$tpl->assignInclude( "header", "$skindir/header.tpl" );
+$tpl->assignInclude( "footer", "$skindir/footer.tpl" );
+include(_BASEDIR."includes/pagesetup.php");
+include_once(_BASEDIR."languages/".$language."_admin.php");
+if(file_exists("languages/".$language.".php")) include_once("languages/".$language.".php");
+else include_once("languages/en.php");
+if(!isADMIN) accessDenied( );
+$confirm = isset($_GET['confirm']) ? $_GET['confirm'] : false;
+$table = dbassoc(dbquery("SHOW TABLES LIKE '".TABLEPREFIX."challenges'"));
+if($table) $output .= write_message(_ALREADYINSTALLED);
+else  {
+if($confirm == "yes") {
+	include("version.php");
+	dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_codeblocks`(`code_text`, `code_type`, `code_module`) VALUES ( 'include(_BASEDIR.\"modules/challenges/authorof.php\");', 'AO', 'challenges');");
+	dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_codeblocks`(`code_text`, `code_type`, `code_module`) VALUES ('include(_BASEDIR.\"modules/challenges/storyblock.php\");', 'storyblock', 'challenges');");
+	dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_codeblocks`(`code_text`, `code_type`, `code_module`) VALUES ('include(_BASEDIR.\"modules/challenges/seriesblock.php\");', 'seriesblock', 'challenges');");
+	dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_codeblocks`(`code_text`, `code_type`, `code_module`) VALUES ('include(_BASEDIR.\"modules/challenges/seriestitle.php\");', 'seriestitle', 'challenges');");
+	dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_codeblocks`(`code_text`, `code_type`, `code_module`) VALUES ('include(_BASEDIR.\"modules/challenges/adminfunctions.php\");', 'delchar', 'challenges');");
+	dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_codeblocks`(`code_text`, `code_type`, `code_module`) VALUES ('include(_BASEDIR.\"modules/challenges/adminfunctions.php\");', 'delcategory', 'challenges');");
+	dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_codeblocks`(`code_text`, `code_type`, `code_module`) VALUES ('include(_BASEDIR.\"modules/challenges/otherresults.php\");', 'otherresults', 'challenges');");
+	dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_codeblocks`(`code_text`, `code_type`, `code_module`) VALUES ( 'include(_BASEDIR.\"modules/challenges/deluser.php\");', 'deluser', 'challenges');");
+	dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_codeblocks`(`code_text`, `code_type`, `code_module`) VALUES ( 'include(_BASEDIR.\"modules/challenges/stats.php\");', 'sitestats', 'challenges');");
+	dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_modules(`name`, `version`) VALUES('$moduleName', '$moduleVersion')");
+	$proquery = dbquery("SELECT count(panel_id) FROM `".TABLEPREFIX."fanfiction_panels` WHERE panel_type = 'P' AND panel_hidden = '0'");
+	list($profiles) = dbrow($proquery);
+	$profiles++;
+	dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_panels` (`panel_name`, `panel_title`, `panel_url`, `panel_level`, `panel_order`, `panel_hidden`, `panel_type`) VALUES ('challengesby', 'Challenges by {author}', 'modules/challenges/challengesby.php', 0, $profiles, 0, 'P');");
+	$userquery = dbquery("SELECT count(panel_id) FROM `".TABLEPREFIX."fanfiction_panels` WHERE panel_type = 'U' AND panel_hidden = '0'");
+	list($userpanels) = dbrow($userquery);
+	$userpanels++;
+	dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_panels` (`panel_name`, `panel_title`, `panel_url`, `panel_level`, `panel_order`, `panel_hidden`, `panel_type`) VALUES ('challengesby', 'Your Challenges', 'modules/challenges/challengesby.php', 0, $userpanels, 0, 'U');");
+	$topquery = dbquery("SELECT count(panel_id) FROM `".TABLEPREFIX."fanfiction_panels` WHERE panel_type = 'L' AND panel_hidden = '0'");
+	list($listpanels) = dbrow($topquery);
+	$listpanels++;
+	dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_panels` (`panel_name` , `panel_title` , `panel_url` , `panel_level` , `panel_order` , `panel_hidden` , `panel_type` ) VALUES ('challenges', 'Top 10 Challenges', 'modules/challenges/topchallenges.php', '0', $listpanels, 0, 'L');");
+	$browsequery = dbquery("SELECT count(panel_id) FROM `".TABLEPREFIX."fanfiction_panels` WHERE panel_type = 'B' AND panel_hidden = '0'");
+	list($browse) = dbrow($browsequery);
+	$browse++;
+	dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_panels` (`panel_name` , `panel_title` , `panel_url` , `panel_level` , `panel_order` , `panel_hidden` , `panel_type` ) VALUES ('challenges', 'Challenges', 'modules/challenges/browse.php', '0', $browse, 0, 'B');");
+	dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_pagelinks` (`link_name`, `link_text`, `link_url`, `link_target`, `link_access`) VALUES ('challenges', 'Challenges', 'browse.php?type=challenges', '0', 0);");
+	dbquery("ALTER TABLE `".$settingsprefix."fanfiction_settings` ADD `anonchallenges` TINYINT( 1 ) NOT NULL");
+	dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_stories` ADD `challenges` varchar(200) NOT NULL default '0'");
+	$series = dbassoc(dbquery("SHOW COLUMNS FROM ".TABLEPREFIX."fanfiction_series LIKE 'challenges'"));
+	if(!$series) dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_series` ADD `challenges` varchar(200) NOT NULL default '0'");
+	dbquery("CREATE TABLE `".TABLEPREFIX."fanfiction_challenges` (
+	  `chalid` int(11) NOT NULL auto_increment,
+	  `challenger` varchar(200) NOT NULL default '',
+	  `uid` int(11) NOT NULL default '0',
+	  `title` varchar(250) NOT NULL default '',	
+	  `catid` varchar(200) NOT NULL default '',
+	  `characters` varchar(200) NOT NULL default '',
+	  `summary` text NOT NULL,
+	  `responses` int(11) NOT NULL default '0',
+	  PRIMARY KEY  (`chalid`),
+	  KEY `title` (`catid`),
+	  KEY `uid` (`uid`),
+	  KEY `title_2` (`title`),
+	  KEY `characters` (`characters`)
+	) ENGINE=MyISAM;");
+	dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_modules`(`version`, `name`) VALUES('$moduleVersion', '$moduleName')");
+	$output = write_message(_ACTIONSUCCESSFUL);
+}
+else if($confirm == "no") {
+	$output = write_message(_ACTIONCANCELLED);
+}
+else {
+	$output = write_message(_CONFIRMINSTALL."<br /><a href='install.php?confirm=yes'>"._YES."</a> "._OR." <a href='install.php?confirm=no'>"._NO."</a>");
+}
+}
+$tpl->assign("output", $output);
+$tpl->printToScreen( );
+?>

--- /dev/null
+++ b/modules/challenges/languages/en.php
@@ -1,1 +1,17 @@
-
+<?php
+define("_ADDCHALLENGE", "Add Challenge");
+define("_ANONCHALLENGES", "Allow anonymous challenges?");
+define("_BACK2CHALLENGES", "Back to Challenges");
+define("_CHALLENGEADMIN", "Challenges Administration");
+define("_CHALLENGES", "Challenges");
+define("_CHALLENGERS", "Challengers");
+define("_CHALLENGESBY", "Challenges by");
+define("_EDITCHALLENGE", "Edit Challenge");
+define("_DELETECHALLENGE", "Delete Challenge");
+define("_ISSUECHALLENGE", "Issue a challenge!");
+define("_REMOVECHALLENGE", "Remove from this challenge");
+define("_RESPOND2CHALLENGE", "Respond to the challenge!");
+define("_RESPONSES", "Responses");
+define("_RECALCCHAL", "Recalculate Responses");
+define("_UNINSTALLWARNING", "<strong>Warning!</strong> All data related to challenges will be deleted from the database!");
+?>

--- /dev/null
+++ b/modules/challenges/otherresults.php
@@ -1,1 +1,66 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+if(file_exists(_BASEDIR."modules/challenges/languages/{$language}.php")) include_once(_BASEDIR."modules/challenges/languages/{$language}.php");
+else include_once(_BASEDIR."modules/challenges/languages/en.php");
+if(empty($type) || $type != "challenges") { // If you're already browsing challenges no sense putting them in the other results.
+$chalquery = array( );
+if(isset($charid)) {
+	if(!is_array($charid)) $charid = array($charid);
+	if(count($charid) > 0) {
+		foreach($charid as $c) {
+			$chars[] = "FIND_IN_SET('$c', characters) > 0";
+		}
+		$chalquery[] = implode(" OR ", $chars);
+	}
+}
+if(is_array($catid) && count($catid) > 0) {
+	$categories = array( );
+	// Get the recursive list.
+	foreach($catid as $cat) {
+		if($cat == "false" || empty($cat) || $cat == -1) continue;
+		$categories = array_merge($categories, recurseCategories($cat));
+	}
+	// Now format the SQL
+	$cats = array( );
+	foreach($categories as $cat) {
+		$cats[] = "FIND_IN_SET($cat, catid) > 0 ";
+	}
+	// Now implode the SQL list
+	if(!empty($cats)) $chalquery[] = "(".implode(" OR ", $cats).")";
+}
+if($searchterm) {
+	if($searchtype == "title") $chalquery[] = "title LIKE '%$searchterm%'";
+	if($searchtype == "summary") $chalquery[] = "summary LIKE '%$searchterm%'";
+}
+if(count($chalquery) > 0) {
+	$chalquery = "WHERE ".implode(" AND ", $chalquery);
+	$query = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_challenges $chalquery");
+	$challenges = dbnumrows($query);
+
+	if($challenges > 0) $otherresults[] = "<a href='browse.php?type=challenges&amp;$terms'>$challenges "._CHALLENGES."</a>";
+}
+	unset($where, $query, $chars, $cats);
+}
+?>

--- /dev/null
+++ b/modules/challenges/seriesblock.php
@@ -1,1 +1,42 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+if(!defined("_CHALLENGES")) {
+	global $language;
+	if(file_exists(_BASEDIR."modules/challenges/languages/{$language}.php")) include_once(_BASEDIR."modules/challenges/languages/{$language}.php");
+	else include_once(_BASEDIR."modules/challenges/languages/en.php");
+}
+	global $chalid;
+if(isset($stories['challenges'])) {
+	$challengelinks = array( );
+	$chalinfo = dbquery("SELECT chalid, title FROM ".TABLEPREFIX."fanfiction_challenges WHERE FIND_IN_SET(chalid, '".$stories['challenges']."') > 0");
+	while($c = dbassoc($chalinfo)) {
+		$challengelinks[] = "<a href='"._BASEDIR."modules/challenges/challenges.php?chalid=".$c['chalid']."'>".stripslashes($c['title'])."</a>";
+	}
+	$allclasslist .= "<span class='label'>"._CHALLENGES.": </span> ".(!empty($challengelinks) ? implode(", ", $challengelinks) : _NONE)."<br />";
+	$tpl->assign("challengelinks", (!empty($challengelinks) ? implode(", ", $challengelinks) : _NONE));
+	if((isADMIN && uLEVEL < 4) || USERUID == $stories['uid'])
+		if($current == "challenges") $adminlinks .= " [<a href='challenges.php?action=remove&amp;chalid=$chalid&amp;seriesid=".$stories['seriesid']."'>"._REMOVECHALLENGE."</a>]";
+}
+?>

--- /dev/null
+++ b/modules/challenges/seriestitle.php
@@ -1,1 +1,40 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+
+if(!defined("_CHARSET")) exit( );
+
+
+$challengelinks = array( );
+if(isset($series['challenges'])) {
+	global $language;
+	if(file_exists(_BASEDIR."modules/challenges/languages/{$language}.php")) include_once(_BASEDIR."modules/challenges/languages/{$language}.php");
+	else include_once(_BASEDIR."modules/challenges/languages/en.php");
+	$chalinfo = dbquery("SELECT chalid, title FROM ".TABLEPREFIX."fanfiction_challenges WHERE FIND_IN_SET(chalid, '".$series['challenges']."') > 0");
+	while($c = dbassoc($chalinfo)) {
+		$challengelinks[]= "<a href='"._BASEDIR."modules/challenges/challenges.php?chalid=".$c['chalid']."'>".stripslashes($c['title'])."</a>";
+	}		
+}		
+$allclasslist .= "<span class='label'>"._CHALLENGES.": </span> ".(!empty($challengelinks) ? implode(", ", $challengelinks) : _NONE)."<br />";
+$titleblock->assign("challengelinks", (!empty($challengelinks) ? implode(", ", $challengelinks) : _NONE));
+?>

--- /dev/null
+++ b/modules/challenges/stats.php
@@ -1,1 +1,44 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+
+if(!defined("_CHARSET")) exit( );
+
+if(file_exists(_BASEDIR."modules/challenges/languages/{$language}.php")) 
+	include_once(_BASEDIR."modules/challenges/languages/{$language}.php"); 
+else include_once(_BASEDIR."modules/challenges/languages/en.php");
+
+$chalquery = dbquery("SELECT count(chalid) FROM ".TABLEPREFIX."fanfiction_challenges");
+list($chalcount) = dbrow($chalquery);
+$chalquery = dbquery("SELECT count(DISTINCT uid) FROM ".TABLEPREFIX."fanfiction_challenges");
+list($challengers) = dbrow($chalquery);
+if(!empty($blocks['info']['style']) && $blocks['info']['style'] == 2) {
+	$tpl->assignGlobal("totalchallenges", $chalcount);
+	$tpl->assignGlobal("challengers", $challengers);
+}
+else if(!empty($blocks['info']['style']) && $blocks["info"]["style"] == 1) {
+	$content = preg_replace("@\{totalchallenges\}@", $chalcount, $content);
+	$content = preg_replace("@\{challengers\}@", $challengers, $content);
+}
+else $content .= "<div><span class='label'>"._CHALLENGES.": </span>".$chalcount."</div><div><span class='label'>"._CHALLENGERS.": </span>".$challengers."</div>";
+?>

--- /dev/null
+++ b/modules/challenges/storyblock.php
@@ -1,1 +1,43 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+
+if(!defined("_CHARSET")) exit( );
+if(!defined("_CHALLENGES")) {
+	global $language;
+	if(file_exists(_BASEDIR."modules/challenges/languages/{$language}.php")) include_once(_BASEDIR."modules/challenges/languages/{$language}.php");
+	else include_once(_BASEDIR."modules/challenges/languages/en.php");
+}
+if(!empty($stories['challenges'])) {
+	$challengelinks = array( );
+	$chalresult = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_challenges WHERE FIND_IN_SET(chalid, '".$stories['challenges']."') > 0");
+	while($chal = dbassoc($chalresult)) {
+		$challengelinks[] = "<a href='"._BASEDIR."modules/challenges/challenges.php?chalid=".$chal['chalid']."'>".stripslashes($chal['title'])."</a>";
+	}
+	$tpl->assign("challengelinks", (!empty($challengelinks) ? implode(", ", $challengelinks) : _NONE));
+	$allclasslist .= "<span class='label'>"._CHALLENGES.": </span> ".implode(", ", $challengelinks)."<br />";
+}
+else $tpl->assign("challengelinks", _NONE);
+if($current == "challenges") $adminlinks  .= " [<a href='challenges.php?action=remove&amp;chalid=".$chalid."&amp;sid=".$stories['sid']."'>"._REMOVECHALLENGE."</a>]";
+
+?>

--- /dev/null
+++ b/modules/challenges/topchallenges.php
@@ -1,1 +1,57 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+if(!defined("_CHARSET")) exit( );
+if(!isset($anonchallenges)) accessDenied( );
 
+if(file_exists(_BASEDIR."modules/challenges/languages/{$language}.php")) include_once(_BASEDIR."modules/challenges/languages/{$language}.php");
+else include_once(_BASEDIR."modules/challenges/languages/en.php");
+
+$chalquery = dbquery("SELECT chal.*, "._PENNAMEFIELD." as penname FROM ".TABLEPREFIX."fanfiction_challenges as chal, "._AUTHORTABLE." WHERE "._UIDFIELD." = chal.uid ORDER BY chal.responses DESC LIMIT 10");
+if(dbnumrows($chalquery) > 0) {
+	$count = 0;
+	if(file_exists("./$skindir/challenges.tpl")) $challenges = new TemplatePower("./$skindir/challenges.tpl");
+	else $challenges = new TemplatePower("./"._BASEDIR."modules/challenges/default_tpls/challenges.tpl");
+	$challenges->prepare( );
+	while($challenge = dbassoc($chalquery)) {
+		$challenges->newBlock("challenge");
+		if(isADMIN || USERUID == $challenge['uid']) $challenges->assign("adminoptions", "<div class=\"adminoptions\"><span class=\"label\">".(isADMIN ? _ADMINOPTIONS : _OPTIONS).":</span> [<a href=\"challenges.php?action=edit&amp;chalid=".$challenge['chalid']."\">"._EDIT."</a>] [<a href=\"challenges.php?action=delete&amp;chalid=".$challenge['chalid']."\">"._DELETE."</a>]</div>");
+		$challenges->assign("author", ($challenge['uid'] ? "<a href=\"viewuser.php?uid=".$challenge['uid']."\">".$challenge['challenger']."</a>" : $challenge['challenger']));
+		$challenges->assign("title", "<a href=\"modules/challenges/challenges.php?chalid=".$challenge['chalid']."\">".stripslashes($challenge['title'])."</a>");
+		$challenges->assign("numresponses", "<a href=\"modules/challenges/challenges.php?chalid=".$challenge['chalid']."\">".$challenge['responses']."</a>");
+		$challenges->assign("responses", "<a href=\"modules/challenges/challenges.php?chalid=".$challenge['chalid']."\">"._RESPONSES."</a>");
+		$challenges->assign("summary", stripslashes($challenge['summary']));
+		$challenges->assign("characters", $challenge['characters'] ? charlist($challenge['characters']) : _NONE);
+		$challenges->assign("category"   , ($challenge['catid'] > 0 ? catlist($challenge['catid']) : _NONE) );
+		$challenges->assign("respond", "<div class=\"respond\"><a href=\"modules/challenges/challenges.php?action=respond&amp;chalid=".$challenge['chalid']."\">"._RESPOND2CHALLENGE."</a></div>");
+		$count++;
+		$challenges->assign("oddeven", ($count % 2 ? "odd" : "even"));
+	}
+	$tpl->newBlock("listings");
+	if(dbnumrows($chalquery) > $itemsperpage) $tpl->assign("pagelinks", build_pagelinks(basename($_SERVER['PHP_SELF'])."?=challengesby&amp;uid=$uid&amp;", $numchal, $offset));
+	$tpl->gotoBlock("_ROOT");
+	$output .= $challenges->getOutputContent( );
+
+}
+else $output .= write_message(_NORESULTS);
+?>
+

--- /dev/null
+++ b/modules/challenges/uninstall.php
@@ -1,1 +1,36 @@
+<?php
+$current = "challenges";
+include ("../../header.php");
 
+//make a new TemplatePower object
+if(file_exists( "$skindir/default.tpl")) $tpl = new TemplatePower("$skindir/default.tpl" );
+else $tpl = new TemplatePower(_BASEDIR."default_tpls/default.tpl");
+$tpl->assignInclude( "header", "$skindir/header.tpl" );
+$tpl->assignInclude( "footer", "$skindir/footer.tpl" );
+include(_BASEDIR."includes/pagesetup.php");
+include_once(_BASEDIR."languages/".$language."_admin.php");
+if(!isADMIN) accessDenied( );
+$confirm = isset($_GET['confirm']) ? $_GET['confirm'] : false;
+if($confirm == "yes") {
+	dbquery("DELETE FROM `".TABLEPREFIX."fanfiction_codeblocks` WHERE code_module = 'challenges'");
+	dbquery("DELETE FROM `".TABLEPREFIX."fanfiction_panels` WHERE panel_name LIKE 'challenges%'");
+	dbquery("DELETE FROM `".TABLEPREFIX."fanfiction_pagelinks` WHERE link_name LIKE 'challenges%'");
+	dbquery("ALTER TABLE `".$settingsprefix."fanfiction_settings` DROP `anonchallenges`");
+	dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_stories` DROP `challenges`");
+	dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_series` DROP `challenges`");
+	dbquery("DROP TABLE `".TABLEPREFIX."fanfiction_challenges`");
+	include("version.php");
+	dbquery("DELETE FROM `".TABLEPREFIX."fanfiction_modules` WHERE name = '$moduleName'");	
+	$output = write_message(_ACTIONSUCCESSFUL);
+}
+else if($confirm == "no") {
+	$output = write_message(_ACTIONCANCELLED);
+}
+else {
+	$chalquery = dbquery("SHOW COLUMNS FROM ".$settingsprefix."fanfiction_settings LIKE 'anonchallenges'");
+	if(dbnumrows($chalquery)) $output = write_message(_CONFIRMUNINSTALL." "._UNINSTALLWARNING."<br /><a href='uninstall.php?confirm=yes'>"._YES."</a> "._OR." <a href='uninstall.php?confirm=no'>"._NO."</a>");
+	else $output .= write_message(_MODNOTINSTALLED);
+}
+$tpl->assign("output", $output);
+$tpl->printToScreen( );
+?>

--- /dev/null
+++ b/modules/challenges/update.php
@@ -1,1 +1,45 @@
+<?php
+$current = "challenges";
+include ("../../header.php");
 
+//make a new TemplatePower object
+if(file_exists( "$skindir/default.tpl")) $tpl = new TemplatePower("$skindir/default.tpl" );
+else $tpl = new TemplatePower(_BASEDIR."default_tpls/default.tpl");
+$tpl->assignInclude( "header", "$skindir/header.tpl" );
+$tpl->assignInclude( "footer", "$skindir/footer.tpl" );
+include(_BASEDIR."includes/pagesetup.php");
+include_once(_BASEDIR."languages/".$language."_admin.php");
+if(file_exists("languages/".$language.".php")) include_once("languages/".$language.".php");
+else include_once("languages/en.php");
+if(!isADMIN) accessDenied( );
+$confirm = isset($_GET['confirm']) ? $_GET['confirm'] : false;
+include("version.php");
+list($currentVersion) = dbrow(dbquery("SELECT version FROM ".TABLEPREFIX."fanfiction_modules WHERE name = 'Challenges' LIMIT 1"));
+$currentVersion = explode(".", $currentVersion);
+if(empty($currentVersion ) || $currentVersion[1] < 4) {
+if($confirm == "yes") {
+	if(empty($currentVersion) || $currentVersion[1] == 0) {
+		dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_codeblocks` (`code_text`, `code_type`, `code_module`) VALUES ( 'include(_BASEDIR.\"modules/challenges/deluser.php\");', 'deluser', 'challenges');");
+	}
+	else if($currentVersion[1] < 1) {
+		dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_codeblocks` (`code_text`, `code_type`, `code_module`) VALUES('include(_BASEDIR.\"modules/challenges/stats.php\");', 'sitestats', 'challenges');");
+	}
+	else if($currentVersion[1] < 3) {
+		dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_name = 'challenges' AND panel_type = 'A' LIMIT 1");
+	}
+	$statsOkay = dbquery("SELECT code_id FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_module = 'challenges' AND code_type = 'stats'");
+	if(dbnumrows($statsOkay) == 0) dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_codeblocks`(`code_text`, `code_type`, `code_module`) VALUES ( 'include(_BASEDIR.\"modules/challenges/stats.php\");', 'sitestats', 'challenges');");
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_modules SET version = '1.4' WHERE name = 'Challenges' LIMIT 1");
+	$output = write_message(_ACTIONSUCCESSFUL);
+}
+else if($confirm == "no") {
+	$output = write_message(_ACTIONCANCELLED);
+}
+else {
+	$output = write_message(_CONFIRMUPDATE."<br /><a href='update.php?confirm=yes'>"._YES."</a> "._OR." <a href='update.php?confirm=no'>"._NO."</a>");
+}
+}
+else $output .= write_message(_ALREADYUPDATED);
+$tpl->assign("output", $output);
+$tpl->printToScreen( );
+?>

--- /dev/null
+++ b/modules/challenges/version.php
@@ -1,1 +1,13 @@
+<?php
+/*
+This file will be called by admin/modules.php and update.php to determine if 
+the module version in the database is the current version of the module.  
+The version number in this file will be the current version.
+*/
 
+if(!defined("_CHARSET")) exit( );
+
+$moduleVersion = "1.4";
+$moduleName = "Challenges";
+
+?>

file:b/modules/index.php (new)
--- /dev/null
+++ b/modules/index.php

file:b/news.php (new)
--- /dev/null
+++ b/news.php
@@ -1,1 +1,152 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+$current = "news";
+
+include ("header.php");
+
+if(file_exists("$skindir/default.tpl")) $tpl = new TemplatePower( "$skindir/default.tpl" );
+else $tpl = new TemplatePower("default_tpls/default.tpl");
+
+include("includes/pagesetup.php");
+
+
+if(isset($_REQUEST['nid'])) $nid = $_REQUEST['nid'];
+if(!isset($nid) || !isNumber($nid)) $nid = false;
+$cid = isset($_REQUEST['cid']) && isNumber($_REQUEST['cid']) ? $_REQUEST['cid'] : false;
+
+if($nid) {
+
+	$output .= "<div id=\"pagetitle\">"._NEWS."</div>";
+	if(isset($_POST['submit']))
+	{
+		$comment = escapestring(format_story(replace_naughty(strip_tags($_POST['comment'], $allowed_tags))));
+		if(!$cid && USERUID) {
+			$insert = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_comments (nid, uid, comment, time) VALUES ('$nid', '".(USERUID ? USERUID : 0)."', '$comment', now())");
+			if($insert) dbquery("UPDATE ".TABLEPREFIX."fanfiction_news SET comments = comments + 1 WHERE nid = '$nid' LIMIT 1");
+		}
+		else if($cid) {
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_comments SET comment = '$comment' WHERE cid = '$cid'");
+		}
+		unset($comment);
+	}
+	if(isset($_GET['del']) && isADMIN && uLEVEL < 4 && !empty($cid)) {
+		$insert = dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_comments WHERE cid = '$cid'");
+		if($insert) dbquery("UPDATE ".TABLEPREFIX."fanfiction_news SET comments = comments - 1 WHERE nid = '$nid' LIMIT 1");
+	}
+	$newsquery = dbquery("SELECT n.*, n.time as date FROM ".TABLEPREFIX."fanfiction_news as n WHERE n.nid = '$nid' LIMIT 1");
+	$stories = dbassoc($newsquery);
+	if(file_exists("./$skindir/newsbox.tpl"))
+		$news = new TemplatePower( "./$skindir/newsbox.tpl" );
+	else $news = new TemplatePower( "./default_tpls/newsbox.tpl" );
+	$news->prepare( );	
+	//create a new number_row block
+	$news->newBlock("newsbox");
+
+	//assign values
+	$news->assign("newstitle"   , stripslashes($stories['title']) );
+	$news->assign("newsstory"   , format_story($stories['story']) );
+	$news->assign("newsauthor", stripslashes($stories['author']) );
+	$news->assign("newsid", $stories['nid']);
+	$news->assign("oddeven", "odd");
+	$news->assign("skindir", $skindir);
+	$news->assign("newsdate", date("$dateformat $timeformat", $stories['date']) );
+	if($newscomments)
+		$news->assign("newscomments", "<a href=\"news.php?action=newsstory&amp;nid=".$stories['nid']."\">".$stories['comments']." "._COMMENTS."</a>");
+	if(isADMIN && uLEVEL < 4) 
+		$news->assign("adminoptions", "<a href=\"admin.php?action=news&amp;form=".$stories['nid']."\">"._EDIT."</a> | <a href=\"admin.php?action=news&amp;delete=".$stories['nid']."\">"._DELETE."</a>");
+	$output .= $news->getOutputContent( );
+
+	$cquery = dbquery("SELECT COUNT(cid) FROM ".TABLEPREFIX."fanfiction_comments WHERE nid = '$nid'");
+	list($ccount) = dbrow($cquery);
+	if($ccount) {
+		$query2 = dbquery("SELECT c.*, "._PENNAMEFIELD." as penname, c.time as date FROM ".TABLEPREFIX."fanfiction_comments as c LEFT JOIN "._AUTHORTABLE." ON c.uid = "._UIDFIELD." WHERE c.nid = '$nid' ORDER BY time LIMIT $offset, $itemsperpage");
+		$output .= "<div class=\"sectionheader\">"._COMMENTS."</div>";
+		if(file_exists("$skindir/comments.tpl")) $c = new TemplatePower( "$skindir/comments.tpl" );
+		else $c = new TemplatePower( "default_tpls/comments.tpl" );
+		$c->prepare( );
+		$count = 0;
+		while($comments = dbassoc($query2)) {
+			$c->newBlock("commentbox");
+			$c->assign("comment", format_story($comments['comment']));
+			$c->assign("uname", $comments['penname']);
+			$c->assign("date", date("$dateformat $timeformat", $comments['date']));
+			if(isADMIN && uLEVEL < 4)
+				$c->assign("adminoptions", "<div class='adminoptions'><span class='label'>"._ADMINOPTIONS.":</span> [<a href=\"news.php?action=newsstory&amp;edit=".$comments['cid']."&amp;nid=$nid\">"._EDIT."</a>] [<a href=\"news.php?action=newsstory&amp;cid=".$comments['cid']."&amp;del=1&amp;nid=$nid\">"._DELETE."</a>]</div>");
+			$c->assign("oddeven", ($count % 2 ? "odd" : "even"));
+			$count++;
+		}
+		$output .= $c->getOutputContent( );
+		if($ccount > $itemsperpage) $output .= build_pagelinks("news.php?nid=$nid&amp;", $ccount, $offset);
+	}
+	if(isMEMBER) {
+		$output .= "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"news.php?action=newsstory&amp;nid=$nid\">";
+		if(isset($_GET['edit']) && isNumber($_GET['edit'])) {
+			
+			$select = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_comments WHERE cid = '".$_GET['edit']."' LIMIT 1");
+			list($cid, $nid, $uname, $comment, $time) = dbrow($select);
+			$output .= "<input type=\"hidden\" name=\"cid\" value=\"$cid\">";
+		}
+		else $comment = "";
+		$output .= "<table align=\"center\"><tr><td><strong>"._PENNAME.":</strong></td><td>".USERPENNAME."<INPUT type=\"hidden\" name=\"uname\" value=\"".USERPENNAME."\"></td></tr>
+		<tr><td><b>"._COMMENTS.":</b></td><td><TEXTAREA name=\"comment\" cols=\"35\" rows=\"6\">$comment</TEXTAREA></td></tr>
+		<tr><td><INPUT type=\"hidden\" name=\"nid\" value=\"$nid\"><INPUT name=\"submit\" id=\"submit\" type=\"submit\" value=\""._SUBMIT."\"></td></tr></table></form>";
+	}
+	$tpl->assign("output", $output);
+}
+else {
+	$output .= "<div id=\"pagetitle\">"._NEWS."</div>";
+	if(file_exists("./$skindir/newsbox.tpl"))
+		$news = new TemplatePower( "./$skindir/newsbox.tpl" );
+	else $news = new TemplatePower( "./default_tpls/newsbox.tpl" );
+	$news->prepare( );
+	$cquery = dbquery("SELECT count(nid) FROM ".TABLEPREFIX."fanfiction_news");
+	list($count) = dbrow($cquery);
+	$newsquery = dbquery("SELECT n.*, n.time as date FROM ".TABLEPREFIX."fanfiction_news as n ORDER BY n.time DESC LIMIT $offset, $itemsperpage");
+	$counter = 0;
+	while($stories = dbassoc($newsquery)) {
+
+		//create a new number_row block
+		$news->newBlock("newsbox");
+		
+		//assign values
+		$news->assign("newstitle"   , $stories['title']);
+		$news->assign("newsstory"   , nl2br($stories['story']) );
+		$news->assign("newsauthor", $stories['author']);
+		$news->assign("newsdate", date("$dateformat $timeformat", $stories['date']) );
+		$news->assign("newsid", $stories['nid']);
+		$news->assign("skindir", $skindir);
+		if($newscomments)
+			$news->assign("newscomments", "<a href=\"news.php?action=newsstory&amp;nid=".$stories['nid']."\">".$stories['comments']." "._COMMENTS."</a>");
+		if(isADMIN && uLEVEL < 4) 
+			$news->assign("adminoptions", "<a href=\"admin.php?action=news&amp;form=".$stories['nid']."\">"._EDIT."</a> | <a href=\"admin.php?action=news&amp;delete=".$stories['nid']."\">"._DELETE."</a>");
+		$news->assign("oddeven", ($counter % 2 ? "even" : "odd"));
+		$counter++;
+	}
+	$output .= $news->getOutputContent( );
+	if ($count > $itemsperpage) $output .= build_pagelinks("news.php?", $count, $offset);
+	$tpl->assign("output", $output);
+}
+
+$tpl->printToScreen();
+dbclose( );
+?>

file:b/reviews.php (new)
--- /dev/null
+++ b/reviews.php
@@ -1,1 +1,421 @@
-
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+//Begin basic page setup
+
+$current = "reviews";
+include ("header.php");
+
+//make a new TemplatePower object
+if(file_exists("$skindir/reviews.tpl")) $tpl = new TemplatePower( "$skindir/reviews.tpl" );
+else $tpl = new TemplatePower("default_tpls/reviews.tpl");
+if(file_exists("$skindir/reviewblock.tpl")) $tpl->assignInclude("reviewsblock", "$skindir/reviewblock.tpl" );
+else $tpl->assignInclude("reviewsblock", "default_tpls/reviewblock.tpl");
+$tpl->assignInclude( "header", "./$skindir/header.tpl" );
+$tpl->assignInclude( "footer", "./$skindir/footer.tpl" );
+
+//let TemplatePower do its thing, parsing etc.
+$tpl->prepare();
+
+include("includes/pagesetup.php");
+
+$reviewid = isset($_REQUEST['reviewid']) ? $_REQUEST['reviewid'] : false;
+if(!isNumber($reviewid)) unset($reviewid);
+$type = isset($_REQUEST['type']) ? $_REQUEST['type'] : false;
+$item = isset($_REQUEST['item']) ? $_REQUEST['item'] : false;
+if(!isNumber($item)) unset($item);
+
+if($action == "delete") {
+	if(isADMIN && uLEVEL <= 3) $notauthor = 1;
+	$query = dbquery("SELECT item, chapid, type, review, rating, uid FROM ".TABLEPREFIX."fanfiction_reviews WHERE reviewid = '$reviewid' LIMIT 1");
+	list($item, $chapid, $type, $review, $rating, $reviewuid) = dbrow($query);
+	if($reviewuid == USERUID) $notauthor = 1;
+	if($type == "SE") $query2 = "SELECT uid FROM ".TABLEPREFIX."fanfiction_series WHERE seriesid = '$item' LIMIT 1";
+	if($type == "ST") $query2 = "SELECT uid FROM ".TABLEPREFIX."fanfiction_stories WHERE sid = '$item' LIMIT 1";
+	else {
+		$revauthor = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'revauthor'");
+		while($code = dbassoc($revauthor)) {
+			eval($code['code_text']);
+		}
+	}
+	$authorquery = dbquery($query2);
+	list($author) = dbrow($authorquery);
+	if($author != USERUID && !$notauthor && ($revdelete < 2 || ($revdelete == 1 && $reviewuid))) accessDenied( );
+	$delete = isset($_GET['delete']) ? $_GET['delete'] : false;
+	$output .= "<div id=\"pagetitle\">"._DELETEREVIEW."</div>";
+	if($delete == "yes") {
+		if($type == "ST") {
+			$query = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_stories WHERE sid = $item LIMIT 1");
+			
+			list($author) = dbrow($query);
+			if($review != "No Review") {
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET reviews = (reviews - 1) WHERE sid = '$item'");
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET reviews = (reviews - 1) WHERE chapid = '$chapid'");
+			}
+			$count =  dbquery("SELECT AVG(rating) as totalcount FROM ".TABLEPREFIX."fanfiction_reviews WHERE item = '$item' AND type='ST' AND rating != '-1'");
+			list($totalcount) = dbrow($count);
+			if($totalcount) dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET rating = '".round($totalcount)."' WHERE sid = '$item'");
+			$count2 =  dbquery("SELECT AVG(rating) as totalcount FROM ".TABLEPREFIX."fanfiction_reviews WHERE chapid = '$chapid' AND rating != '-1'");
+			list($totalcount) = dbrow($count2);
+			if($totalcount) dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET rating = '".round($totalcount)."' WHERE chapid = '$chapid'");
+			$series = dbquery("SELECT seriesid FROM ".TABLEPREFIX."fanfiction_inseries WHERE sid = '$item'");
+			if(dbnumrows($series)) {
+				while($thisseries = dbassoc($series)) {
+					seriesreview($thisseries);
+				}
+			}
+		}
+		if($type == "SE") {
+			if($review != "No Review") dbquery("UPDATE ".TABLEPREFIX."fanfiction_series SET reviews = (reviews - 1) WHERE seriesid = '$item'");
+			seriesreview($item);
+		}
+		else {
+			$revdelete = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'revdelete'");
+			while($code = dbassoc($revdelete)) {
+				eval($code['code_text']);
+			}
+		}
+		if($review != "No Review") {
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET reviews = reviews - 1");
+			list($count) = dbrow(dbquery("SELECT COUNT(DISTINCT uid) FROM ".TABLEPREFIX."fanfiction_reviews WHERE review != 'No Review' AND uid != 0"));
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET reviewers = '$count'");
+		}
+		dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_reviews WHERE reviewid = '$reviewid'");
+		
+		$output .= write_message(_ACTIONSUCCESSFUL.(isset($back) ? $back : ""));
+	}
+	else if ($delete == "no") {
+		$output .= write_message(_ACTIONCANCELLED);
+	}
+	else {
+		$output .= write_message(_CONFIRMDELETE."<BR><BR>
+			[ <a href=\"reviews.php?action=delete&amp;delete=yes&amp;reviewid=$reviewid\">"._YES."</a> | <a href=\"reviews.php?action=delete&amp;delete=no&amp;reviewid=$reviewid\">"._NO."</a> ]");
+	}
+}
+else if($action == "edit" || $action == "add") {
+	if(isset($_GET['next']) && isNumber($_GET['next'])) $nextchapter = $_GET['next'];
+	if(!isMEMBER && !$anonreviews) accessDenied( );
+	if(!isset($chapid) && $type == "ST") { 
+		$chapquery = dbquery("SELECT chapid FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '$item' AND inorder = '1' LIMIT 1");
+		list($chapid) = dbrow($chapquery);
+	}
+	$tpl->assign("pagetitle", "<div id =\"pagetitle\">"._REVIEW."</div>");
+	if(isset($_POST['submit'])) {
+		$reviewer = isset($_POST['reviewer']) ? escapestring(descript(strip_tags($_POST['reviewer'], $allowed_tags))) : "";
+		$review = format_story(strip_tags(descript($_POST['review']), $allowed_tags));
+		$review = escapestring($review);
+		$rating = isset($_POST['rating']) && isNumber($_POST['rating']) ? $_POST['rating'] : -1;
+		if(!$review) $review = "No Review";
+		if(!$reviewer && $action != "edit") $reviewer = _ANONYMOUS;
+		if(isMEMBER) $reviewer = USERPENNAME;
+		if(!$rateonly && $review == "No Review") $output .= write_error(_MISSINGINFO2);
+		else if($captcha && !isMEMBER && !captcha_confirm()) $output .= write_error(_CAPTCHAFAIL);
+		else if($review == "No Review" && $_POST['rating'] == "-1") $output .= write_error(_MISSINGINFO);
+		else if(find_naughty($reviewer)) $output .= write_error(_NAUGHTYWORDS);
+		else if($action == "add" && (!$type || !$item)) $output .= write_error(_ERROR);
+		else {
+			$output .= write_message(_REVTHANKYOU);
+			if($action == "edit") {
+				$update = dbquery("UPDATE ".TABLEPREFIX."fanfiction_reviews SET review = '$review', rating = '$rating' WHERE reviewid = '$reviewid' LIMIT 1");
+				$info = dbquery("SELECT item, type, chapid FROM ".TABLEPREFIX."fanfiction_reviews WHERE reviewid = '$reviewid' LIMIT 1");
+				list($item, $type, $chapid) = dbrow($info);
+			}
+			else if($type == "ST") {
+				if(isset($_POST['chapid']) && isNumber($_POST['chapid'])) $chapid = $_POST['chapid'];
+				dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_reviews (item, type, reviewer, review, rating, date, uid, chapid) VALUES ('$item', 'ST', '$reviewer', '$review', '$rating', now(), '".(USERUID && isNumber(USERUID) ? USERUID : 0)."', '$chapid')");
+				$count =  dbquery("SELECT AVG(rating) as totalcount FROM ".TABLEPREFIX."fanfiction_reviews WHERE item = '$item' AND type = 'ST' AND rating != '-1'");
+				list($totalcount) = dbrow($count);
+				if($totalcount) $update = dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET rating = '".round($totalcount)."' WHERE sid = '$item'");
+				unset($totalcount);
+				$count2 = dbquery("SELECT AVG(rating) as totalcount FROM ".TABLEPREFIX."fanfiction_reviews WHERE chapid = '$chapid' AND rating != '-1'");
+				list($totalcount) = dbrow($count2);
+				if($totalcount) $update = dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET rating = '".round($totalcount)."' WHERE chapid = '$chapid'");
+				if($review != "No Review") {
+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET reviews = (reviews + 1) WHERE sid = '$item'");
+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET reviews = (reviews + 1) WHERE chapid = '$chapid'");
+				}
+				$series = dbquery("SELECT seriesid FROM ".TABLEPREFIX."fanfiction_inseries WHERE sid = '$item'");
+				if(dbnumrows($series)) {
+					while($s = dbassoc($series)) {
+						seriesreview($s['seriesid']);
+					}
+				}
+				$output .= write_message("<a href=\"viewstory.php?sid=$item".(isset($_GET['next']) ? "&amp;chapter=".$_GET['next'] : "")."\">"._BACKTOSTORY."</a></center>");
+
+				$uidquery = dbquery("SELECT uid,title, coauthors FROM ".TABLEPREFIX."fanfiction_stories WHERE sid = '$item'");
+				list($author, $title, $coauthors) = dbrow($uidquery);
+				if($coauthors) {
+					$array_coauthors = array( );
+					$coQuery = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_coauthors WHERE sid = '$item'");
+					while($c = dbassoc($coQuery)) {
+						$array_coauthors[] = $c['uid'];
+					}
+				}
+			}
+			else if($type == "SE"){
+				dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_reviews (item, type, reviewer, review, rating, date, uid) VALUES ('$item', 'SE', '$reviewer', '$review', '$rating', now(), '".(USERUID && isNumber(USERUID) ? USERUID : 0)."')");
+				$thisseries = $item;
+				seriesreview($item);
+				$uidquery = dbquery("SELECT uid as uid,title FROM ".TABLEPREFIX."fanfiction_series WHERE seriesid = '$item'");
+				list($author, $title) = dbrow($uidquery);
+
+			}
+			else {
+				$revadd = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'revadd'");
+				while($code = dbassoc($revadd)) {
+					eval($code['code_text']);
+				}
+			}
+			if($review != "No Review" && $action == "add") {
+				$mailquery= dbquery("SELECT ap.newreviews,"._EMAILFIELD." as email, "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs as ap ON ap.uid = "._UIDFIELD." WHERE "._UIDFIELD." = '$author' ".(!empty($coauthors) ? " OR ".findclause(_UIDFIELD, $array_coauthors) : ""));
+				while($mail = dbassoc($mailquery)) {
+					if($mail['newreviews']) {
+						include_once("includes/emailer.php");
+						$subject = _REVEMAIL1.$title;
+						$mailtext = sprintf(_REVEMAIL2, "type=$type&amp;item=$item");
+						$result = sendemail($mail['penname'], $mail['email'], $sitename, $siteemail, $subject, $mailtext, "html");
+					}
+				}
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET reviews = reviews + 1");
+				list($count) = dbrow(dbquery("SELECT COUNT(DISTINCT uid) FROM ".TABLEPREFIX."fanfiction_reviews WHERE review != 'No Review' AND uid != 0"));
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET reviewers = '$count'");
+			}
+			if($logging && !USERUID) {
+				if($type == "ST") {
+					$storyquery = dbquery("SELECT s.title, s.uid, s.rid, s.sid FROM ".TABLEPREFIX."fanfiction_stories as s WHERE s.sid = '$item' LIMIT 1");
+					$story = dbassoc($storyquery);
+					$title = "<a href=\"viewstory.php?sid=$item\">".stripslashes($story['title'])."</a>";
+					$authoruid = $story['uid'];
+				}
+				else if($type == "SE") {
+					$storyquery = dbquery("SELECT title, uid FROM ".TABLEPREFIX."fanfiction_series WHERE seriesid = '$item' LIMIT 1");
+					list($title, $authoruid) = dbrow($storyquery);
+					$titletext = $title;
+					$title = "<a href=\"viewseries.php?seriesid=$item\">".stripslashes($title)."</a>";	
+				}
+				else { 
+					$titlequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'revtitle'");
+					while($code = dbassoc($titlequery)) {
+						eval($code['code_text']);
+					}
+				}
+				$reviewname = $reviewer."(".$_SERVER['REMOTE_ADDR'].")";
+				if($action == "add") dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_REVIEW, $reviewname, truncate_text($review), $title))."', '0', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'RE', " . time() . ")");
+				else dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_EDIT_REVIEW, USERPENNAME, USERUID, $title, $reviewid))."', '0', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'RE', " . time() . ")");
+			}
+		}
+	}
+	else {
+		if(!$anonreviews && !USERPENNAME) accessDenied( );
+		else {
+			if($action == "edit") {
+				$result = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_reviews WHERE reviewid = '$reviewid' LIMIT 1");
+				$review = dbassoc($result);
+			}
+			include("includes/reviewform.php");
+			$output .= $form;
+		}
+	}
+}
+else {
+	$query = "";
+	if(empty($reviewid) && empty($type)) accessDenied( );
+	if(!empty($reviewid) && empty($type)) {
+		list($type, $item) = dbrow(dbquery("SELECT type, item FROM ".TABLEPREFIX."fanfiction_reviews WHERE reviewid = '$reviewid' LIMIT 1"));
+	}
+	if($type == "ST") {
+		$storyquery = dbquery("SELECT s.title, s.uid, s.rid, s.sid, s.coauthors FROM ".TABLEPREFIX."fanfiction_stories as s WHERE s.sid = '$item' LIMIT 1");
+		$story = dbassoc($storyquery);
+		$title = title_link($story);
+		$authoruid = $story['uid'];
+		$array_coauthors = array();
+		if(!empty($story['coauthors'])) {
+			$colist = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_coauthors WHERE sid = '$item'");
+			while($c = dbassoc($colist)) {
+				$array_coauthors[] = $c['uid'];
+			}
+		}
+	}
+	else if($type == "SE") {
+		$storyquery = dbquery("SELECT title, uid FROM ".TABLEPREFIX."fanfiction_series WHERE seriesid = '$item' LIMIT 1");
+		list($title, $authoruid) = dbrow($storyquery);
+		$titletext = $title;
+		$title = "<a href=\"series.php?seriesid=$item\">".stripslashes($title)."</a>";
+	}
+	else { 
+		$titlequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'revtitle'");
+		while($code = dbassoc($titlequery)) {
+			eval($code['code_text']);
+		}
+	}
+	$tpl->assign("pagetitle", "<div id=\"pagetitle\">"._REVIEWSFOR." $title</div>");
+	if($type == "SE") {
+		$jumpmenu = "";
+		$stinseries = dbquery("SELECT sid, subseriesid, inorder FROM ".TABLEPREFIX."fanfiction_inseries WHERE seriesid = '$item'");
+		$scount = dbnumrows($stinseries);
+		if($scount) {
+			$subs = array( );
+			$stories = array( );
+			while($i = dbassoc($stinseries)) {
+				if($i['subseriesid']) {
+					$subs[$i['inorder']] = $i['subseriesid'];
+					$serieslist[] = $i['subseriesid'];
+				}
+				else {
+					$stories[$i['inorder']] = $i['sid'];
+					$storieslist[] = $i['sid'];
+				}
+			}
+			if(count($subs) > 0) {
+				$subsquery = dbquery(_SERIESQUERY." AND FIND_IN_SET(seriesid, '".implode(",", $subs)."') > 0");
+				while($sub = dbassoc($subsquery)) {
+					$inlist[array_search($sub['seriesid'], $subs)] = $sub;
+				}
+			}
+			if(count($stories)) {
+				$seriesstoryquery = dbquery(_STORYQUERY." AND FIND_IN_SET(sid, '".implode(",", $stories)."') > 0");
+				while($story = dbassoc($seriesstoryquery)) {
+					$inlist[array_search($story['sid'], $stories)] = $story;
+				}
+			}
+			if(is_array($inlist)) ksort($inlist);
+			$jumpmenu = "<form name=\"jump\" action=\"\">";
+			$jumpmenu .= "<select name=\"sid\" onChange=\"if (this.selectedIndex >0) window.location=this.options[this.selectedIndex].value\">";
+			$jumpmenu .= "<option value=\"reviews.php?type=SE&amp;item=$item\">"._VIEWALLREVIEWS."</option>";
+			foreach($inlist as $x => $st) {
+				$jumpmenu .= "<option value=\"reviews.php?type=".(isset($st['sid']) ? "ST&amp;item=".$st['sid'] : "SE&amp;item=".$st['seriesid'])."\">"._REVIEWSFOR." ".$st['title']."</option>";
+				if(!empty($st['sid'])) $storylist[] = $st['sid'];
+				else if(!empty($st['subseriesid'])) $serieslist[] = $st['subseriesid'];
+			}
+			$jumpmenu .= "</select></form>";
+		}
+		$tpl->assign("jumpmenu", $jumpmenu );
+		$query = "SELECT review.reviewid, review.respond, review.review, review.uid, review.reviewer, review.rating, review.date as date, series.title as seriestitle, stories.title as title FROM ".TABLEPREFIX."fanfiction_reviews as review LEFT JOIN ".TABLEPREFIX."fanfiction_series as series ON review.item = series.seriesid AND review.type = 'SE' LEFT JOIN ".TABLEPREFIX."fanfiction_stories as stories ON stories.sid = review.item AND review.type ='ST' WHERE 
+			((series.seriesid = '$item' AND series.seriesid = review.item AND review.type = 'SE')".
+			(isset($storylist) ? " OR (FIND_IN_SET(review.item, '".(implode(",", $storieslist))."') > 0 AND review.type = 'ST')" : "").
+			(isset($serieslist) ? " OR (FIND_IN_SET(item, '".(implode(",", $serieslist))."') > 0 AND type = 'SE')" : "").
+			") AND review.review != 'No Review'";
+		$count =  "SELECT count(reviewid) FROM ".TABLEPREFIX."fanfiction_reviews WHERE item = '$item' AND type = 'SE' AND review != 'No Review'";
+
+	}
+	else if($type == "ST") {
+		if(isset($chapid))  {
+			$query = "SELECT review.reviewid, review.respond, review.review, review.uid, review.reviewer, review.rating, date as date, chapter.title as title, chapter.inorder as inorder FROM ".TABLEPREFIX."fanfiction_reviews as review, ".TABLEPREFIX."fanfiction_chapters as chapter WHERE chapter.chapid = '$chapid' AND chapter.chapid = review.chapid AND review.review != 'No Review' ";
+			$count =  "SELECT count(reviewid) FROM ".TABLEPREFIX."fanfiction_reviews as review WHERE chapid = '$chapid' AND review != 'No Review'";
+		}
+		else  {
+			$query = "SELECT review.reviewid, review.respond, review.review, review.uid, review.reviewer, review.rating, review.date as date, chapter.title as title, chapter.inorder as inorder FROM ".TABLEPREFIX."fanfiction_reviews as review, ".TABLEPREFIX."fanfiction_chapters as chapter WHERE chapter.sid = '$item' AND chapter.chapid = review.chapid AND review.review != 'No Review' AND review.type = 'ST'";
+			$count = "SELECT count(reviewid) FROM ".TABLEPREFIX."fanfiction_reviews as review WHERE item = '$item' AND review != 'No Review' AND type = 'ST'";
+		}
+		$jumpmenu = "<form name=\"jump\" action=\"\">";
+		$jumpmenu .= "<select name=\"sid\" onChange=\"window.location=this.options[this.selectedIndex].value\">";
+		$jumpmenu .= "<option value=\"reviews.php?type=ST&amp;item=".$story['sid'].(isset($_GET['unresponded']) ? "&amp;unresponded=1" : "")."\"";
+		if(!isset($chapid))
+			$jumpmenu .= " selected";
+		$jumpmenu .= ">"._VIEWALLREVIEWS."</option>";
+		$chapquery = dbquery("SELECT inorder, title, chapid, sid FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '".$story['sid']."' ORDER BY inorder ASC");
+		while($chapters = dbassoc($chapquery)) {
+			$jumpmenu .= "<option value=\"reviews.php?chapid=".$chapters['chapid'].(isset($_GET['unresponded']) ? "&amp;unresponded=1" : "")."&amp;type=ST&amp;item=$item\"";
+	
+			if(isset($chapid) && $chapid == $chapters['chapid'])
+				$jumpmenu .= " selected";
+
+			$jumpmenu .= ">"._REVIEWSFOR." ".$chapters['inorder'].". ".$chapters['title']."</option>\n";
+		}
+		$jumpmenu .= "</select></form>";
+
+		$tpl->assign("jumpmenu", $jumpmenu );
+	}
+	else {
+		$reviewquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'revqueries'");
+		while($code = dbassoc($reviewquery)) {
+			eval($code['code_text']);
+		}
+	}
+	if(isset($_GET['unresponded'])) {
+		$query .= "AND review.respond = '0' ";
+		$count .= "AND review.respond = '0' ";
+	}
+	if(!empty($reviewid)) {
+		$query .= " AND review.reviewid = '$reviewid' ";
+		$count .= " AND review.reviewid = '$reviewid' ";
+	}
+	$query .= "ORDER BY review.reviewid DESC LIMIT $offset,$itemsperpage";
+	$query = dbquery($query);
+	$count = dbquery($count);
+
+	list($numrows)= dbrow($count);
+	$counter = 0;
+	while($reviews = dbassoc($query))
+	{
+		$adminlink = "";
+		if(isADMIN && uLEVEL < 4) $adminlink = "<span class='label'>"._ADMINOPTIONS.": </span> [<a href=\"reviews.php?action=edit&amp;reviewid=".$reviews['reviewid']."\">"._EDIT."</a>]";
+		if( (isADMIN && uLEVEL < 4) || (USERUID && USERUID == $reviews['uid'])) $adminlink .= " [<a href=\"reviews.php?action=delete&amp;reviewid=".$reviews['reviewid']."\">"._DELETE."</a>]";
+		if($reviews['uid']) {
+			if(USERUID == $authoruid && $revdelete == 2 && !isADMIN) $adminlink .= " [<a href=\"reviews.php?action=delete&amp;reviewid=".$reviews['reviewid']."\">"._DELETE."</a>]";
+			$reviewer = "<a href=\"viewuser.php?uid=".$reviews['uid']."\">".$reviews['reviewer']."</a>";
+			$member = _SIGNED;
+		}
+		else {
+			if(USERUID == $authoruid && $revdelete && !isADMIN) $adminlink .= " [<a href=\"reviews.php?action=delete&amp;reviewid=".$reviews['reviewid']."\">"._DELETE."</a>]";
+			$reviewer = $reviews['reviewer'];
+			$member = _ANONYMOUS;
+		}
+		if(empty($reviews['respond']) && (USERUID == $authoruid || (isset($array_coauthors) && in_array(USERUID, $array_coauthors)))) $adminlink .= " [<a href=\"user.php?action=revres&amp;reviewid=".$reviews['reviewid']."\">"._RESPOND."</a>]";
+		$tpl->newBlock("reviewsblock");
+		$tpl->assign("reviewer"   , $reviewer );
+		$tpl->assign("reportthis", "[<a href=\""._BASEDIR."contact.php?action=report&amp;url=reviews.php?reviewid=".$reviews['reviewid']."\">"._REPORTTHIS."</a>]");
+		$tpl->assign("review"   , stripslashes($reviews['review']));
+		$tpl->assign("reviewdate", date("$dateformat $timeformat", $reviews['date']) );
+		$tpl->assign("rating", ratingpics($reviews['rating']) );
+		$tpl->assign("member", $member );
+		$tpl->assign("chapter", (!empty($reviews['title']) ? stripslashes($reviews['title']) : (!empty($reviews['seriestitle']) ? stripslashes($reviews['seriestitle']) : _NONE)) );
+		if(isset($reviews['inorder'])) $tpl->assign("chapternumber", $reviews['inorder'] );
+		if(!empty($adminlink)) $tpl->assign("adminoptions", "<div class=\"adminoptions\">$adminlink</div>");
+		$tpl->assign("oddeven", ($counter % 2 ? "odd" : "even"));
+		$counter++;
+	}
+	$tpl->gotoBlock( "_ROOT" );
+
+	if ($numrows > $itemsperpage) 
+		$tpl->assign("reviewpagelinks", build_pagelinks("reviews.php?type=$type&amp;item=$item&amp;".(!empty($chapid) ? "chapid=$chapid&amp;" : "").(isset($_GET['unresponded']) ? "unresponded=1&amp;" : ""), $numrows, $offset));
+	else if($numrows == 0) $tpl->assign("reviewpagelinks", write_message(_NORESULTS));
+	if(isMEMBER || $anonreviews)
+		$reviewslink = "<a href=\"reviews.php?action=add&amp;type=$type&amp;item=$item".(isset($chapid) ? "&amp;chapid=".$chapid : "")."\">"._SUBMITREVIEW."</a>";
+	else
+		$reviewslink = write_message(sprintf(_LOGINTOREVIEW, strtolower($pagelinks['login']['link']), strtolower($pagelinks['register']['link'])));
+	$tpl->assign("reviewslink", $reviewslink);
+	$form = "";
+	if($reviewsallowed) {
+		if(isMEMBER || $anonreviews) {
+			$item = $item;
+			$type = $type;
+			include("includes/reviewform.php");
+		}
+		else $form = write_message(sprintf(_LOGINTOREVIEW, strtolower($pagelinks['login']['link']), strtolower($pagelinks['register']['link'])));
+	}
+	$tpl->assign("reviewform", $form);
+
+}
+$tpl->assign("output", $output);
+$tpl->printToScreen( );
+?>

file:b/rss.php (new)
--- /dev/null
+++ b/rss.php
@@ -1,1 +1,97 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+ini_set('display_errors', 0);
+ini_set('display_startup_errors', 0);
+error_reporting(-1);
+
+define("_BASEDIR", "");
+  require_once("includes/dbfunctions.php");
+  require_once("config.php"); 
+$settingsresults = dbquery("SELECT sitename, url, siteemail, slogan, language, tableprefix, dateformat FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '$sitekey'");
+$settings = dbassoc($settingsresults);
+foreach($settings as $var => $val) {
+	$$var = $val;
+}
+define("TABLEPREFIX", $tableprefix);
+define("SITEKEY", $sitekey);
+define("_CHARSET", "utf-8");
+
+  include_once("includes/queries.php");
+  if(file_exists("languages/{$language}.php")) include("languages/{$language}.php");
+  else include("languages/en.php");
+  ob_start ("ob_gzhandler"); 
+
+function xmlentities ( $string )
+{
+   return str_replace ( array ( '&', '"', "'", '<', '>' ), array ( '&amp;' , '&quot;', '&apos;' , '&lt;' , '&gt;' ), $string );
+}
+
+$ratlist = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_ratings");
+while($rate = dbassoc($ratlist)) {
+	$ratings[$rate['rid']] = $rate['rating'];
+}
+
+  $rss="<?xml version=\"1.0\" encoding=\""._CHARSET."\"?>\n"; 
+  $rss.="<rss version=\"2.0\">\n"; 
+  $rss.="<channel>\n"; 
+  $rss.="<copyright>Copyright ".date("Y")."</copyright>\n"; 
+  $rss.="<lastBuildDate>".date("r")."</lastBuildDate>\n"; 
+  $rss.="<description>".xmlentities($slogan)."</description>\n"; 
+  $rss.="<link>$url</link>\n"; 
+  $rss.="<title>".xmlentities( $sitename)."</title>\n"; 
+  $rss.="<managingEditor>$siteemail</managingEditor>\n"; 
+  $rss.="<webMaster>$siteemail</webMaster>\n"; 
+  $rss.="<language>$language</language>\n"; 
+
+  $query = _STORYQUERY." ORDER BY updated DESC LIMIT 20";
+  $results = dbquery($query);
+  while($story = dbassoc($results)) {
+      $story['authors'][] = $story['penname'];
+      if($story['coauthors']) {
+      $coauth = dbquery("SELECT "._PENNAMEFIELD." as penname, co.uid FROM ".TABLEPREFIX."fanfiction_coauthors AS co LEFT JOIN "._AUTHORTABLE." ON co.uid = "._UIDFIELD." WHERE co.sid = '".$story['sid']."'");
+      while($c = dbassoc($coauth)) {
+        $story['authors'][] = $c['penname'];
+      }
+      }
+      foreach($story['authors'] AS $k => $v) {
+    $story['authors'][$k] = strip_tags(xmlentities( $v));
+      }
+      $rss.= "<item>
+    <title>".strip_tags(xmlentities($story['title']))." "._BY." ".implode(", ", $story['authors'])." [".$ratings[$story['rid']]."]</title>
+    <link>$url/viewstory.php?sid=".$story['sid']."</link>
+    <description>".strip_tags(xmlentities($story['summary']))."</description>
+    <pubDate>".date("r",$story['updated'])."</pubDate>
+      </item>\n";  
+  } 
+
+    $rss.="</channel>
+  </rss>"; 
+
+  header('Content-type: application/xml');
+  header("Cache-Control: must-revalidate"); 
+  header("Expires: ".gmdate("D, d M Y H:i:s", time() + 3600) . " GMT"); 
+
+  echo $rss; 
+
+?>
+

file:b/search.php (new)
--- /dev/null
+++ b/search.php
@@ -1,1 +1,339 @@
-
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+
+// Page Setup
+// Set the current page id.  Because search does multiple things there are multiple possibilities
+if(isset($_POST['submit']) || isset($_GET['offset'])) $current = "searchresults";
+else $current = "search";
+if(isset($_GET['action']) && $_GET['action'] == "advanced") $displayform = 1;
+// Now set up the page
+
+$displayform = 1;
+
+
+include ("header.php");
+
+if(file_exists("$skindir/browse.tpl")) $tpl = new TemplatePower( "$skindir/browse.tpl" );
+else $tpl = new TemplatePower("default_tpls/browse.tpl");
+if(file_exists("$skindir/listings.tpl")) $tpl->assignInclude( "listings", "./$skindir/listings.tpl" );
+else $tpl->assignInclude( "listings", "./default_tpls/listings.tpl" );
+
+include("includes/pagesetup.php");
+
+
+$searchtype = (isset($_REQUEST['searchtype']) ? $_REQUEST['searchtype'] : "simple");
+$searchterm =  (isset($_REQUEST['searchterm']) ? escapestring($_REQUEST['searchterm']) : false);
+
+if(isset($_POST['submit']) || isset($_GET['offset'])) {
+	$output .= "<div id=\"pagetitle\">"._RESULTS."</div>";
+	$query = array();
+	$countquery = array();
+	$scountquery = array();	
+	if($searchtype == "fulltext") {
+		$query = "SELECT stories.*, "._PENNAMEFIELD." as penname, stories.date as date, stories.updated as updated FROM "._AUTHORTABLE.", ".TABLEPREFIX."fanfiction_stories as stories, ".TABLEPREFIX."fanfiction_chapters as chapter WHERE chapter.storytext LIKE '%$searchterm%' AND chapter.sid = stories.sid AND stories.uid = "._UIDFIELD;
+		$countquery = "SELECT count(stories.sid) FROM ".TABLEPREFIX."fanfiction_stories as stories, ".TABLEPREFIX."fanfiction_chapters as chapter WHERE chapter.storytext LIKE '%$searchterm%' AND chapter.sid = stories.sid GROUP BY stories.sid";
+		$query .= " "._ORDERBY;
+		search($query, $countquery);
+		$tpl->assign("output", $output);
+		$tpl->printToScreen();
+		dbclose( );			
+		exit( );
+	}
+	if($searchterm && strlen($searchterm) < 3) {
+		errorExit(_SEARCHTERMTOOSHORT);
+	}
+	if($searchterm) {
+		if($searchtype == "title") {
+			$query[] = "stories.title LIKE '%$searchterm%'";
+			$countquery[] = "stories.title LIKE '%$searchterm%'";
+			$scountquery[] = "series.title LIKE '%$searchterm%'";
+		}
+		if($searchtype == "summary") {
+			$query[] = "stories.summary LIKE '%$searchterm%'";
+			$countquery[] = "stories.summary LIKE '%$searchterm%'";
+			$scountquery[] = "series.summary LIKE '%$searchterm%'";
+		}
+		if($searchtype == "penname") {
+			$authorquery = dbquery(_MEMBERLIST." WHERE "._PENNAMEFIELD." LIKE '%$searchterm%' GROUP BY "._UIDFIELD);
+			$authorlist = array();
+			while($auth = dbassoc($authorquery)) {
+				$authorlist[] = $auth['uid'];
+			}
+			if(count($authorlist) > 0) {
+				$authors = implode(",",$authorlist);
+				$query = "SELECT stories.*, "._PENNAMEFIELD." as penname, stories.date as date, stories.updated as updated FROM ("._AUTHORTABLE.", ".TABLEPREFIX."fanfiction_stories as stories) LEFT JOIN ".TABLEPREFIX."fanfiction_coauthors as coauth ON coauth.sid = stories.sid WHERE "._UIDFIELD." = stories.uid AND stories.validated > 0 AND (FIND_IN_SET(stories.uid, '$authors') > 0 OR FIND_IN_SET(coauth.uid, '$authors') > 0) ";
+				$countquery = "SELECT COUNT(stories.sid) FROM ".TABLEPREFIX."fanfiction_stories as stories LEFT JOIN ".TABLEPREFIX."fanfiction_coauthors as coauth ON coauth.sid = stories.sid WHERE stories.validated > 0 AND (FIND_IN_SET(stories.uid, '$authors') > 0 OR FIND_IN_SET(coauth.uid, '$authors') > 0)";
+				search($query, $countquery);
+				$tpl->assign("output", $output);
+				$tpl->printToScreen();
+				dbclose( );			
+				exit( );
+			}
+			else {
+				$query[] = "1 = 0";
+				$countquery[] = "1 = 0";
+				$scountquery[] = "1 = 0";
+			}
+		}
+		if($searchtype == "advanced") {
+			$query[] = "(stories.summary LIKE '%$searchterm%' OR stories.title LIKE '%$searchterm%') ";
+			$countquery[] = "(stories.summary LIKE '%$searchterm%' OR stories.title LIKE '%$searchterm%') ";
+			$scountquery[] = "(summary LIKE '%$searchterm%' OR title LIKE '%$searchterm%') ";
+		}
+	}
+	if(isset($_REQUEST['authors'])) {
+		$authors = isarray($_REQUEST['authors']) ? $_REQUEST['authors'] : explode(",", $_REQUEST['authors']);
+		$authors = array_filter($authors, "isNumber");
+		if($authors) {
+			$authors = implode(",", $authors);
+			$query[] = "FIND_IN_SET(stories.uid, '$authors') > 0";
+			$countquery[] = "FIND_IN_SET(stories.uid, '$authors') > 0";
+			$scountquery[] = "FIND_IN_SET(series.uid, '$authors') > 0";
+		}
+		else {
+			$query[] = "1 = 0";
+			$countquery[] = "1 = 0";
+			$scountquery[] = "1 = 0";
+		}
+	}
+	if(isset($_REQUEST['catid'])) {
+		$catid = is_array($_REQUEST['catid']) ? $_REQUEST['catid'] : explode(",", $_REQUEST['catid']);
+		$catid = array_filter($catid, "isNumber");
+	}
+	if(!isset($catid)) $catid = array("false");
+	$categories = array( );
+	// Get the recursive list.
+	foreach($catid as $cat) {
+		if($cat == "false" || empty($cat)) continue;
+		$categories = array_merge($categories, recurseCategories($cat));
+		}
+	// Now format the SQL
+	foreach($categories as $cat) {
+		$catstories[] = "FIND_IN_SET($cat, stories.catid) > 0 ";
+		$catseries[] = "FIND_IN_SET($cat, series.catid) > 0 ";
+	}
+	// Now implode the SQL list
+	if(!empty($catstories)) {
+		$query[] = "(".implode(" OR ", $catstories).")";
+		$countquery[] = "(".implode(" OR ", $catstories).")";
+		$scountquery[] = "(".implode(" OR ", $catseries).")";
+	}
+	if(isset($_REQUEST['charid'])) {
+		$charid = is_array($_REQUEST['charid']) ? $_REQUEST['charid'] : explode(",", $_REQUEST['charid']);
+	}
+	else $charid = array( );
+	if(isset($_REQUEST['charlist1'])) $charid[] = $_REQUEST['charlist1'];
+	if(isset($_REQUEST['charlist2'])) $charid[] = $_REQUEST['charlist2'];
+	$charid = array_filter($charid, "isNumber");
+	if(count($charid) > 0) {
+		foreach($charid as $c) {
+			if(!empty($c)) {
+				$charstories[] = "FIND_IN_SET($c, stories.charid) > 0 ";
+				$charseries[] = "FIND_IN_SET($c, series.characters) > 0 ";
+			}
+		}
+		if(count($charstories) > 0) {
+			$query[] = "(".implode(" AND ", $charstories).")";
+			$countquery[] = "(".implode(" AND ", $charstories).")";
+		}
+		if(count($charseries) > 0) $scountquery[] = "(".implode(" AND ", $charseries).")";
+	}
+
+	if(isset($_REQUEST['rid'])) $rid = is_array($_REQUEST['rid']) ? $_REQUEST['rid'] : explode(",", $_REQUEST['rid']);
+	else $rid = array();
+	if(count($rid) > 0) {
+		$rid = array_filter($rid, "isNumber");
+		$query[] = findclause('rid', $rid);
+		$countquery[] = findclause('rid', $rid);
+	}
+	if(isset($_REQUEST['complete'])) {
+		$query[] = "stories.completed = '1'";
+		$countquery[] = "stories.completed = '1'";
+	}
+	$classin = array( );
+	$classex = array( );
+	foreach($classtypelist as $id => $vars) {
+		$opts = array( );
+		$exopts = array( );
+		if(isset($_POST["class_".$id])) $opts = array_filter($_POST["class_".$id], "isNumber");
+		else if(isset($_GET["class_".$id])) {
+			$opts = array_merge($opts, explode(",", $_GET["class_".$id]));
+			$opts = array_filter($opts, "isNumber");
+		}
+		else if(isset($_REQUEST[$vars["name"]])) $opts[] = array($_REQUEST[$vars["name"]]);
+		$classin = array_merge($classin, $opts);
+		if(isset($_POST["exclass_".$id])) $exopts = array_filter($_POST["exclass_".$id], "isNumber");
+		else if(isset($_GET["exclass_".$id])) {
+			$exopts = array_merge($exopts, explode(",", $_GET["exclass_".$id]));
+			$exopts = array_filter($exopts, "isNumber");
+		}
+		$classex = array_merge($classex, $exopts);
+		unset($opts, $exopts);
+	}
+	if($classin) {
+		foreach($classin as $class) {
+			$query[] = "FIND_IN_SET($class, stories.classes) > 0";
+			$countquery[] = "FIND_IN_SET($class, stories.classes) > 0";
+			$scountquery[] = "FIND_IN_SET($class, series.classes) > 0";
+		}
+	}
+	if($classex) {
+		foreach($classex as $class) {
+			$query[] = "FIND_IN_SET($class, stories.classes) = 0";
+			$countquery[] = "FIND_IN_SET($class, stories.classes) = 0";
+			$scountquery[] = "FIND_IN_SET($class, series.classes) = 0";
+		}
+	}
+	// Begin story length
+	unset($wordcount);
+	$wordlow = isset($_REQUEST['wordlow']) && isNumber($_REQUEST['wordlow']) ? $_REQUEST['wordlow'] : "-500";
+	$wordhigh = isset($_REQUEST['wordhigh']) && isNumber($_REQUEST['wordhigh']) ? $_REQUEST['wordhigh'] : "1000000";
+	if($wordlow != "-500") $wordcount = "stories.wordcount > ".$wordlow;
+	if($wordhigh != "1000000") 
+	{
+		if($wordcount) $wordcount .= " AND stories.wordcount < ".$wordhigh;
+		else $wordcount = "stories.wordcount < ".$wordhigh;
+	}
+	if($wordhigh < $wordlow) $wordcount = "stories.wordcount < ".$wordlow;
+	if(!empty($wordcount)) {
+		$query[] = "($wordcount)";
+		$countquery[] = "($wordcount)";
+	}
+	// End wordcount
+
+	$codeblocks = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'browseterms'");
+	while($code = dbassoc($codeblocks)) {
+		eval($code['code_text']);
+	}
+
+	$query = (count($query) > 0 ? " AND ".implode(" AND ", $query) : "")." "._ORDERBY;
+	$countquery = count($countquery) > 0 ? " AND ".implode(" AND ", $countquery) : "";
+	if(count($scountquery) > 0) $scountquery = " WHERE ".implode(" AND ", $scountquery);
+	search(_STORYQUERY.$query, _STORYCOUNT.$countquery);
+	$otherresults = array( );
+	$termArray = array_merge($_GET, $_POST);
+	$termsList = array();
+	foreach($termArray as $term => $value) {
+		if($term == "submit" || $term == "wordhigh" || $term == "wordlow" || empty($value) || $term == "formname" || $term == "searchtype") continue;
+		$termsList[$term] = "$term=".(is_array($value) ? implode(",", $value) : $value);
+	}
+	$terms = implode("&amp;", $termsList);
+	if(!empty($scountquery)) {
+		$seriesresults = dbquery(_SERIESCOUNT.$scountquery);
+		list($scount) = dbrow($seriesresults);
+		if($scount > 0) $otherresults[] = "<a href='browse.php?type=series$terms'>$scount "._SERIES."</a>";
+	}
+	$codeblocks = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'otherresults'");
+	while($code = dbassoc($codeblocks)) {
+		eval($code['code_text']);
+	}
+	if(count($otherresults) > 0) $tpl->assign("otherresults", "<div id='otherresults'><span class='label'>"._OTHERRESULTS.":</span> ".implode(", ", $otherresults)."</div>");
+}
+else {
+	if($searchtype == "simple") {
+		$output .= "<div id=\"pagetitle\">"._SIMPLE."</div><div style='text-align: center;'><form method=\"post\" enctype=\"multipart/form-data\" action=\"search.php\">
+		<div class=\"tblborder\" style=\"width: 320px; padding: 5px; margin: 0 auto;\">
+		<select name=\"searchtype\">
+		<option value=\"penname\">"._PENNAME."</option>
+		<option value=\"title\">"._TITLE."</option>
+		<option value=\"summary\">"._SUMMARY."</option>";
+		if($store == "mysql")
+			$output .= "<option value=\"fulltext\">"._FULLTEXT."</option>";
+		$output .= "</select> <INPUT type=\"text\" class=\"textbox\" name=\"searchterm\" size=\"20\"> ";
+		$output .= "<INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\" size=\"20\">
+		<div style=\"font-size: 8pt; text-align: right;\"><a href=\"search.php?searchtype=advanced\">"._ADVANCED."</a></div></div></form></div>";
+	}
+	else {
+		$output .= "<div id=\"pagetitle\">"._ADVANCED."</div><div>
+			<form method=\"POST\" name=\"form\" enctype=\"multipart/form-data\" action=\"search.php?searchtype=advanced\">
+			<div class=\"tblborder\" style=\"width: 90%; margin: 0 auto; padding: 10px;\">";
+		if($multiplecats) {
+			include("includes/categories.php");
+			$output .= "<input type=\"hidden\" name=\"formname\" value=\"search\">";
+		}
+		$output .= "<div style='float: left; width: 99%;'>";
+		if(count($charlist) > 0) {
+			$output .= "<div style=\"float: left; width: 49%;\"><label for=\"charname\">"._CHARACTERS.": </label><br />\n";
+			$output .= "<select name=\"charid[]\"  style=\"width: 90%;\" multiple size=\"5\" id=\"charid\">";
+			foreach($charlist as $charid => $info) {
+				if($info['catid'] != -1) continue;
+				$output .= "<option value=\"".$charid."\">" .stripslashes($info['name'] ). "</option>\n";
+			}
+			$output .= "</select></div>";
+		}
+		$result = dbquery("SELECT rid, rating FROM ".TABLEPREFIX."fanfiction_ratings ORDER BY rating");
+		if(dbnumrows($result)) {
+			$output .= "<div style=\"float: left; width: 49%;\"><label for=\"rid\">"._RATINGS.":</label><br /><select id=\"rid\" style=\"width: 90%;\" multiple size=\"5\"name=\"rid[]\"><option value=\"-1\">"._ALL."</option>";
+			while ($ratingresults = dbassoc($result))
+			{
+				$output .= "<option value=\"".$ratingresults['rid']."\">".$ratingresults['rating']."</option>\n";
+			}
+			$output .= "</select></div>";
+		}
+		$output .= "<div style=\"clear: both;\">&nbsp;</div>";
+		$output .= " <div style=\"text-align: center;\">"._MULTIPLESELECT."</div>";
+		$result = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_classtypes ORDER BY classtype_name");
+		while($type = dbassoc($result)) {
+			$result2 = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_classes WHERE class_type = '".$type['classtype_id']."' ORDER BY class_name");
+			$select = "";
+			while ($class = dbassoc($result2)) {
+ 				$select .= "<option value=\"".$class['class_id']."\">".$class['class_name']."</option>";
+			}
+			$output .= "<div>
+				<div style=\"float: left; width: 49%; margin-bottom: 1em;\"><label for=\"class_".$type['classtype_id']."\">".$type['classtype_title']." "._INCLUDE.":</label><br />
+					 <select name=\"class_".$type['classtype_id']."[]\" id=\"class_".$type['classtype_id']."\"  style=\"width: 95%;\" multiple size=\"5\">$select</select></div>
+				<div style=\"float: left; width: 49%; margin-bottom: 1em;\"><label for=\"exclass_".$type['classtype_id']."\">".$type['classtype_title']." "._EXCLUDE.":</label><br />
+					 <select name=\"exclass_".$type['classtype_id']."[]\"  id=\"exclass_".$type['classtype_id']."\"  style=\"width: 95%;\" multiple size=\"5\">$select</select></div>
+				</div>";
+		}
+		$output .= "</div><label for=\"completed\">"._COMPLETEONLY.":</label> <input type=\"checkbox\" class=\"checkbox\" id=\"completed\" name=\"completed\" value=\"ON\"><label for=\"wordlow\">"._WORDCOUNT.":</label> <select size=\"1\" id=\"wordlow\" name=\"wordlow\">
+  <option value='-500'>&lt; 500</option>
+  <option>1000</option>
+  <option>5000</option>
+  <option>10000</option>
+  <option>50000</option>
+  <option>100000</option>
+  <option value='1000000'>100000+</option>
+  </select> - <select size=\"1\" name=\"wordhigh\">
+  <option value='1000000'>100000+</option>
+  <option>100000</option>
+  <option>50000</option>
+  <option>10000</option>
+  <option>5000</option>
+  <option>1000</option>
+  <option value='-500'>&lt; 500</option>
+  </select><br /><br /><label for=\"searchterm\">"._SEARCHTERM.": </label><INPUT type=\"text\" class=\"textbox\" name=\"searchterm\" id=\"searchterm\" size=\"20\">
+  
+  <label for=\"sortorder\">"._SORT.":</label> <select name=\"sortorder\" id=\"sortorder\"><option value=\"alpha\">"._ALPHA."</option><option value=\"update\">"._MOSTRECENT."</option></select>";
+	$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'searchform'");
+	while($code = dbassoc($codequery)) {
+		eval($code['code_text']);
+	}
+$output .= "<div id='submitdiv'><input name=\"submit\" id=\"submit\" value=\""._SUBMIT."\" type=\"submit\" class=\"button\"></div></div></form></div>";
+	}
+}
+$tpl->assign("output", $output);
+$tpl->printToScreen();
+dbclose( );
+?>

file:b/series.php (new)
--- /dev/null
+++ b/series.php
@@ -1,1 +1,378 @@
-
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2005-07 by Tammy Keefer
+// Valid HTML 4.01 Transitional 
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+//Begin basic page setup
+$current = "series";
+if($_GET['action'] == "add" || $_GET['action'] == "edit") $displayform = 1;
+
+include ("header.php");
+//make a new TemplatePower object
+if(file_exists("$skindir/default.tpl")) $tpl = new TemplatePower( "$skindir/default.tpl" );
+else $tpl = new TemplatePower("default_tpls/default.tpl");
+if(file_exists("$skindir/listings.tpl")) $tpl->assignInclude( "listings", "./$skindir/listings.tpl" );
+else $tpl->assignInclude( "listings", "./default_tpls/listings.tpl" );
+$tpl->assignInclude( "header", "./$skindir/header.tpl" );
+$tpl->assignInclude( "footer", "./$skindir/footer.tpl" );
+
+include("includes/pagesetup.php");
+$seriesid = isset($_GET['seriesid']) && isNumber($_GET['seriesid']) ? $_GET['seriesid'] : false;
+$showlist = true;
+$inorder = isset($_GET['inorder']) && isNumber($_GET['inorder']) ? $_GET['inorder'] : false;
+$add = isset($_GET['add']) ? $_GET['add'] : false;
+
+// before doing anything else check if the visitor is logged in.  If they are, check if they're an admin.  If not, check that they're 
+// trying to edit/delete/etc. their own stuff then get the penname 
+if(!isMEMBER) accessDenied( );
+
+if(isADMIN && uLEVEL < 3) $admin = 1;
+else $admin = 0;
+if(isADMIN && uLEVEL == 3) {
+	list($admincats) = dbrow(dbquery("SELECT categories FROM ".TABLEPREFIX."fanfiction_authorprefs WHERE uid = '".USERUID."'"));
+	if(isset($seriesid)) {
+		$series = dbquery("SELECT uid, isopen, catid from ".TABLEPREFIX."fanfiction_series WHERE seriesid='$seriesid' LIMIT 1");
+		list($owner, $seriesopen, $catid) = dbrow($series);
+		if(uLEVEL == 3 && $admincats != 0) {
+			$seriescats = explode(",", $catid);
+			$adcats = explode(",", $admincats);
+			foreach($seriescats as $cat) {
+				if(in_array($cat, $adcats)) $admin = 1;
+			}
+		}
+	}
+}
+if(!$allowseries && !$admin) accessDenied( );
+if($allowseries == 1 && !$admin) {
+	list($count) = dbrow(dbquery("SELECT COUNT(sid) FROM ".TABLEPREFIX."fanfiction_stories WHERE uid = '".USERUID."'"));
+	if($count == 0) accessDenied( );
+}
+
+if($action == "validate") {
+	$inorder = isset($_GET['inorder']) && isNumber($_GET['inorder']) ? $_GET['inorder'] : 0;
+	$valid = dbquery("UPDATE ".TABLEPREFIX."fanfiction_inseries SET confirmed = 1 WHERE seriesid = '$seriesid' AND inorder = '$inorder' LIMIT 1");
+	if($valid) {
+		$output .= write_message(_ACTIONSUCCESSFUL);
+		$showlist = true;
+	}
+}
+
+if($add == "series" || ($action == "add" && !$add) || $action == "edit") {
+	if(isset($_GET['cat']) && !empty($_GET['cat'])) $cat = $_GET['cat'];
+	else $cat = -1;
+	$isopen = isset($_GET['isopen']) ? $_GET['isopen'] : 0;
+
+	if(isset($_POST['submit'])) {
+		$title = addslashes(escapestring(strip_tags($_POST['title'], $allowed_tags)));
+		$summary = addslashes(escapestring(descript(strip_tags($_POST["summary"], $allowed_tags))));
+		$category = isset($_POST['catid']) ? explode(",", $_POST['catid']) : array();
+		$category = array_filter($category, "isNumber");
+		if($category) $category = implode(",", $category);
+		else $category = "";
+		$open = isset($_POST['open']) && isNumber($_POST['open']) ? $_POST['open'] : 0;
+		$characters = isset($_POST['charid']) ? $_POST['charid'] : array();
+		$characters = array_filter($characters, "isNumber");
+		if($characters) $charid = implode(",", $characters);
+		else $charid = "";
+		$classes = array( );
+		foreach($classtypelist as $type => $cinfo) {
+			if(isset($_POST["classes_".$type])) {
+				$opts = is_array($_POST["classes_".$type]) ? array_filter($_POST["classes_".$type], "isNumber") : array( );
+				$classes = array_merge($opts, $classes);
+			}
+		}
+		$classes = implode(",", $classes);
+		if(!empty($_POST['uid']) && isNumber($_POST['uid'])) $owner = $_POST['uid'];
+		else $owner = USERUID;
+		if($title == "" || $summary == "") {
+			$output .= write_error(_REQUIREDINFO);
+		}
+		else if(find_naughty($title) || find_naughty($summary)) {
+			$output .= write_error(_NAUGHTYWORDS);
+		}				
+		else {
+			$title = replace_naughty($title);
+			$summary = replace_naughty($summary);
+			if($action == "edit") {
+				$seriesid = $_POST['seriesid'];
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_series SET title = '$title', summary ='$summary', catid = '$category', isopen = '$open', characters = '$charid', classes = '$classes' WHERE seriesid = '$seriesid'");
+				$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'editseries'");
+				while($code = dbassoc($codequery)) {
+					eval($code['code_text']);
+				}
+				if($logging && $admin) {
+					$seriesinfo = dbquery("SELECT title, uid FROM ".TABLEPREFIX."fanfiction_series WHERE seriesid = '$seriesid'");
+					list($title, $uid) = dbrow($seriesinfo);
+					if($uid != USERUID) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_ADMIN_EDIT_SERIES, USERPENNAME, USERUID, $title, $seriesid))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'ED', " . time() . ")");
+				}
+				$output = write_message(_ACTIONSUCCESSFUL."<br />"._BACK2ACCT);
+			}
+			else {
+				dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_series (title, summary, catid, isopen, uid, characters, classes) VALUES('$title', '$summary', '$category', '$open', '$owner', '$charid', '$classes')");
+				$seriesid = dbinsertid();
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET series = series + 1");
+				$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'addseries'");
+				while($code = dbassoc($codequery)) {
+					eval($code['code_text']);
+				}
+				$add = "stories";
+				unset($_POST['submit']);
+			}
+		}
+	}
+	else {
+	$output = "<div id=\"pagetitle\">".($action == "edit" ? _EDITSERIES : ($add == "stories" ? _ADD2SERIES : _ADDSERIES))."</div>
+<form METHOD=\"POST\" style='width: 90%; margin: 0 auto;' name=\"form\" action=\"series.php?action=$action&amp;add=".(!empty($add) ? $add : "series").(!empty($seriesid) ? "&amp;seriesid=$seriesid" : "")."\">";
+	if($action == "edit" && !isset($POST['submit'])) {
+		$seriesquery = dbquery(_SERIESQUERY." AND seriesid = '$seriesid' LIMIT 1");
+		$series = dbassoc($seriesquery);
+		$series = array_map("stripslashes", $series);
+		$owner = $series['uid'];
+		$output .= "<input type=\"hidden\" name=\"seriesid\" value=\"$seriesid\">";
+	}
+	else $series = array("uid" => 0, "title" => "", "summary" => "");
+	$output .= "<div>";
+	if($admin) {
+		$authorquery = dbquery("SELECT "._PENNAMEFIELD." as penname, "._UIDFIELD." as uid FROM "._AUTHORTABLE." ORDER BY penname");
+		$output .= "<label for=\"uid=\">"._AUTHOR.":</label> <select name=\"uid\" id=\"uid\">";
+		while($authorresult = dbassoc($authorquery)) {	
+			$output .= "<option value=\"".$authorresult['uid']."\"".((USERUID == $authorresult['uid'] && !$seriesid) || (is_array($series) && $series['uid'] == $authorresult['uid']) ? " selected" : "").">".$authorresult['penname']."</option>";
+		}
+		$output .= "</select><font color=\"red\">*</font><br />";
+	}
+	$output .= "<label for=\"title\">"._TITLE.":</label> <font color=\"red\">*</font> <input  type=\"text\" class=\"textbox=\" name=\"title\" id=\"title\" value=\"".(isset($series) ? htmlentities($series['title']) : "")."\"  maxlength=\"200\" size=\"60\"><input type=\"hidden\" value=\"".(isset($series) ? $series['uid'] : "")."\"><br />
+		<label for=\"summary\">"._SUMMARY.":</label><font color=\"red\">*</font><br /><textarea rows=\"6\" id=\"summary\" name=\"summary\" cols=\"58\">".(isset($series) ? $series['summary'] : "")."</textarea><br />";
+	if($tinyMCE) 
+		$output .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('summary');\" checked><label for='toggle'>"._TINYMCETOGGLE."</label></div>";
+	if(!$multiplecats) $output .= "<input type=\"hidden\" name=\"catid[]\" id=\"catid\" value=\"1\">";
+	else {	
+		$catid = isset($series['catid']) ? explode(",", $series['catid']) : array( );
+		include("includes/categories.php");
+		$output .= "<input type=\"hidden\" name=\"formname\" value=\"series\">";
+	}
+	if(count($charlist) > 0) {
+		$output .= "<div style=\"float: left; width: 99%;\"><div style=\"float: left; padding: 5px; width: 47%;\"><label for=\"charid\">"._CHARACTERS.":</label> <br /><select size=\"5\" style=\"width: 99%;\" name=\"charid[]\" id=\"charid\" multiple>";
+		$chars = isset($series['characters']) ? explode(",", $series['characters']) : array( );
+		$catid[] = -1;
+		foreach($charlist as $char => $vars) {
+			if(is_array($catid) && in_array($vars['catid'], $catid)) $output .= "<option value=\"$char\"".(in_array($char, $chars) ? " selected" : "").">".$vars['name']."</option>";
+		}
+		$output .= "</select></div>";
+	}
+	$classes = isset($series['classes']) ? explode(",", $series['classes']) : array( );
+	foreach($classtypelist as $type => $typevars) {
+		$output .= "<div style=\"float: left; padding: 5px; width: 47%;\"><label for=\"classes_{$type}\">{$typevars['title']}:</label><br /><select size=\"5\" style=\"width: 99%;\" name=\"classes_{$type}[]\" id=\"$type\" multiple>";
+		foreach($classlist as $c => $vars) {
+			if($vars['type'] == $type) $output .= "<option value=\"$c\"".(in_array($c, $classes) ? " selected" : "").">".$vars['name']."</option>";
+		}
+		$output .= "</select></div>";
+	}
+	$isopen = isset($series['isopen']) ? $series['isopen'] : 0;
+	$output .= "<div style=\"clear:left;\">&nbsp;</div></div><label for=\"open\">"._SERIESTYPE.":</label> <select id=\"open\" name=\"open\">
+			<option value=\"2\"".($isopen == "2" ? " selected" : "").">"._OPEN."</option>
+			<option value=\"1\"".($isopen == "1" ? " selected" : "").">"._MODERATED."</option>
+			<option value=\"0\"".(!$isopen ? " selected" : "").">"._CLOSED."</option>
+		</select><div style=\"margin: 1em;\">"._OPENNOTE."</div>";
+	$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'seriesform'");
+	while($code = dbassoc($codequery)) {
+		eval($code['code_text']);
+	}
+	$output .= "<div style=\"text-align: center;\"><input type=\"submit\" class=\"submit\" name=\"submit\" value=\""._SUBMIT."\"></div></div></form>";
+	if($action == "add") {
+		$output .= "<center>"._SERIESNOTE."</center>";
+		$showlist = false;
+	}
+}
+}
+if($add == "stories") {
+	if(isset($seriesid) && isset($_POST['submit'])) {
+		if(!$seriesid) accessDenied( );
+		list($owner, $isopen, $title) = dbrow(dbquery("SELECT uid, isopen, title FROM ".TABLEPREFIX."fanfiction_series WHERE seriesid = '$seriesid' LIMIT 1"));
+		$seriescount = dbquery("SELECT count(seriesid) FROM ".TABLEPREFIX."fanfiction_inseries WHERE seriesid = '$seriesid'");
+		list($count) = dbrow($seriescount);
+		$seriesitems = dbquery("SELECT sid, subseriesid FROM ".TABLEPREFIX."fanfiction_inseries WHERE seriesid = '$seriesid'");
+		while($item = dbassoc($seriesitems)) {
+			if($item['sid']) $items[] = $item['sid'];
+			if($item['subseriesid']) $subs[] = $item['subseriesid'];
+		}
+		if($admin || USERUID == $owner || $isopen == 2 ) $confirmed = 1;
+		else {
+			$confirmed = 0;
+			include("includes/emailer.php");
+			$seriesMail = sprintf(_NEWSERIESITEMS, stripslashes($title));
+			$subject = sprintf("_SERIESITEMSSUBS", stripslashes($title));
+			$mailInfo = dbassoc(dbquery("SELECT "._PENNAMEFIELD." as penname, "._EMAILFIELD." as email FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '$owner' LIMIT 1"));
+			sendemail($mailInfo['penname'], $mailInfo['email'], $sitename, $siteemail, $subject, $seriesMail, "html");
+		}
+		if(!empty($_POST["sid"])) {
+			foreach($_POST["sid"] as $story) {
+				if(!isNumber($story)) continue;
+				if(!isset($items) || !is_array($items) || !in_array($story, $items)) {
+					$count++;
+					$validate = dbquery("SELECT validated FROM ".TABLEPREFIX."fanfiction_stories WHERE sid = '$story' LIMIT 1");
+					list($valid) = dbrow($validate);
+					if($valid) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_inseries (seriesid, sid, inorder, confirmed) VALUES('$seriesid', '$story', '$count', '$confirmed')");
+				}
+			}
+		}
+		$seriescount = dbquery("SELECT count(seriesid) FROM ".TABLEPREFIX."fanfiction_inseries WHERE seriesid = '$seriesid'");
+		list($count) = dbrow($seriescount);
+		if(!empty($_POST["subseriesid"])) {
+			foreach($_POST["subseriesid"] as $subseries) {
+				if(!isNumber($subseries)) continue;
+				if(!isset($subs) || !in_array($subseries, $subs)) {
+					$count++;
+					dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_inseries (seriesid, subseriesid, inorder) VALUES('$seriesid', '$subseries', '$count')");
+				}
+			}
+		}
+		$numstories = count(storiesInSeries($seriesid));
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_series SET numstories = '$numstories' WHERE seriesid = $seriesid LIMIT 1");
+		seriesreview($seriesid);
+		$showlist = true;
+		$output .= write_message(_ACTIONSUCCESSFUL);
+	}
+	else {
+		$output = "<div id=\"pagetitle\">".($action == "edit" ? _EDITSERIES : ($add == "stories" ? _ADD2SERIES : _ADDSERIES))."</div>
+			<form METHOD=\"POST\" style='width: 90%; margin: 0 auto;' name=\"form\" action=\"series.php?action=$action&amp;add=".(!empty($add) ? $add : "series").(!empty($seriesid) ? "&amp;seriesid=$seriesid" : "")."\">";
+		$output .= "<input type=\"hidden\" name=\"seriesid\" value=\"$seriesid\">";
+		$series = dbquery("SELECT title, uid, isopen FROM ".TABLEPREFIX."fanfiction_series WHERE seriesid = '$seriesid' LIMIT 1");
+		list($title, $owner) = dbrow($series);	
+		$output .= "<div class='sectionheader'>"._SERIES.": ".stripslashes($title)."</div>";
+		if(($admin || USERUID == $owner ) && isset($_GET['stories']) && $_GET['stories'] == "others") {
+			if($let == _OTHER) $letter= _PENNAMEFIELD." REGEXP '^[^a-z]'";
+			else $letter = _PENNAMEFIELD." LIKE '$let%'";
+			$pagelink = "series.php?action=$action&amp;add=stories&amp;stories=others&amp;seriesid=$seriesid&amp;";
+			$authorlink = "<a href=\"series.php?action=$action&amp;add=stories&amp;seriesid=$seriesid&amp;stories=";
+			$countquery = _MEMBERCOUNT." WHERE ap.stories > 0".(isset($letter) ? " AND $letter" : "");
+			$authorquery = _MEMBERLIST." WHERE ap.stories > 0".(isset($letter) ? " AND $letter" : "");
+			include("includes/members_list.php");
+			$showlist = false;
+		}
+		else {
+			$stories = dbquery("SELECT title, sid FROM ".TABLEPREFIX."fanfiction_stories WHERE validated > 0 AND uid = '".(isset($_GET["stories"]) && isNumber($_GET['stories']) ? $_GET["stories"] : USERUID)."' ORDER BY title ASC");
+			$seriesstories = dbquery("SELECT sid FROM ".TABLEPREFIX."fanfiction_inseries WHERE seriesid = '$seriesid'");
+			while($story = dbassoc($seriesstories)) {
+				$selectedstories["$story[sid]"] = 1;
+			}
+			if($admin || USERUID == $owner) $output .= "<div style=\"text-align: center;\"><a href=\"series.php?action=$action&amp;add=$add&amp;stories=others&amp;seriesid=$seriesid\">"._CHOOSEAUTHOR."</a></div>";
+			$output .= "<table style=\"width: 500px; margin: 0 auto;\" class=\"tblborder\"><tr><th class=\"tblborder\">"._STORIES."</th></tr>";
+			$numstories = 0;
+			while($story = dbassoc($stories)) {
+				if(!empty($selectedstories[$story['sid']])) continue;
+				$output .= "<tr><td><input type=\"checkbox\" class=\"checkbox\" value=\"".$story['sid']."\" name=\"sid[]\">".stripslashes($story['title'])."</td></tr>";
+				$numstories++;
+			}
+			if($numstories  == 0) $output .= "<tr><td align=\"center\">"._NORESULTS."</td></tr>";
+			$series2 = dbquery("SELECT title, seriesid FROM ".TABLEPREFIX."fanfiction_series WHERE uid = '".(isset($_GET['stories']) && isNumber($_GET['stories']) ? $_GET['stories'] : USERUID)."' ORDER BY title ASC");
+			$output .= "<tr><th class=\"tblborder\">"._SERIES."</th></tr>";
+			$numseries = 0;
+			while($series = dbassoc($series2)) {
+				if($series['seriesid'] != $seriesid) {
+					$output .= "<tr><td><input type=\"checkbox\" class=\"checkbox\" value=\"".$series['seriesid']."\" name=\"subseriesid[]\">".stripslashes($series['title'])."</td></tr>";
+					$numseries++;
+				}
+			}
+			if($numseries < 1) $output .= "<tr><td align=\"center\">"._NORESULTS."</td></tr>";
+			$output .="</table><p style=\"text-align: center;\">"._SERIESNOTE2."<br /><input type=\"submit\" class=\"button\" name=\"submit\" value=\"submit\"></p></form>";
+			$showlist = false;
+		}		
+	}
+}
+if($action == "delete") {
+	global $seriesid;
+
+	$confirmed = isset($_GET["confirmed"]) ? $_GET['confirmed'] : false;
+	$output = "<div id=\"pagetitle\">".(!empty($inorder) ? _REMOVEFROM : _DELETESERIES)."</div>";
+
+	if($confirmed == "no") {
+		$output .=  write_message(_ACTIONCANCELLED);
+	}
+	else if($confirmed == "yes" && $seriesid) {
+		if(!empty($inorder)) {
+			$info = dbquery("SELECT inorder, subseriesid, sid FROM ".TABLEPREFIX."fanfiction_inseries WHERE seriesid = '$seriesid' AND inorder = '$inorder' LIMIT 1");
+			list($inorder, $subseriesid, $sid) = dbrow($info);
+			$countquery = dbquery("SELECT count(seriesid) FROM ".TABLEPREFIX."fanfiction_inseries WHERE seriesid = '$seriesid'");
+			list($count) = dbrow($countquery);
+			dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_inseries WHERE seriesid = '$seriesid' AND ".($sid ? "sid = '$sid'" : "subseriesid = '$subseriesid'"). " LIMIT 1");
+			if($inorder < $count) dbquery("UPDATE ".TABLEPREFIX."fanfiction_inseries SET inorder = (inorder - 1) WHERE seriesid = '$seriesid' AND inorder > '$inorder'");
+			$output .= write_message(_ACTIONSUCCESSFUL);
+			$showlist = true;
+		}
+		else {
+
+			$seriesinfo = dbquery("SELECT title, uid FROM ".TABLEPREFIX."fanfiction_series WHERE seriesid = '$seriesid'");
+			list($title, $uid) = dbrow($seriesinfo);
+			include("includes/deletefunctions.php");
+			deleteSeries($seriesid);
+			$output .= write_message(_ACTIONSUCCESSFUL);
+			if($admin || USERUID == $uid) $showlist = true;
+			$seriesid = false;
+		}
+	}
+	else {
+		$output .= write_message((!empty($inorder) ? _CONFIRMREMOVE : _CONFIRMDELETE)."<br /><br />[ <a href=\"series.php?action=delete&amp;confirmed=yes&amp;seriesid=$seriesid".(!empty($inorder) ? "&amp;inorder=$inorder" : "")."\">"._YES."</a> | 
+			<a href=\"series.php?action=delete&amp;confirmed=no\">"._NO."</a> ]");
+		$showlist = false;
+	}
+}
+if($showlist) {
+	$go = isset($_GET['go']) ? $_GET['go'] : false;
+	if($go != "" && $seriesid != "") {
+		if(!empty($_GET['sid']) && isNumber($_GET['sid'])) $sid = $_GET["sid"];
+		if(!empty($_GET['subseriesid']) && isNumber($_GET['subseriesid'])) $subseriesid = $_GET["subseriesid"];
+		if(isset($inorder) && (isset($sid) || isset($subseriesid))) {
+			if($go == "up") $oneabove = $inorder - 1;
+			else $oneabove = $inorder + 1;
+			if($oneabove >= 1) {
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_inseries SET inorder = '$inorder' WHERE inorder = '$oneabove' AND seriesid = '$seriesid'");
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_inseries SET inorder = '$oneabove' WHERE ".(isset($sid) ? "sid = '$sid'" : "subseriesid = '$subseriesid'")." AND seriesid = '$seriesid'");	
+			}
+		}
+	}
+	if(empty($action) || $action == "manage") $output .= "<div id=\"pagetitle\">"._MANAGESERIES."</div>";
+	if($seriesid) {
+		list($owner, $isopen) = dbrow(dbquery("SELECT uid,isopen FROM ".TABLEPREFIX."fanfiction_series WHERE seriesid = '$seriesid' LIMIT 1"));
+		$result = dbquery("SELECT series.seriesid AS mainid, series.inorder, confirmed, series.sid, series.subseriesid, stories.title AS storytitle, sub.title AS subtitle FROM ".TABLEPREFIX."fanfiction_inseries AS series LEFT JOIN ".TABLEPREFIX."fanfiction_stories AS stories ON ( series.sid = stories.sid ) LEFT JOIN ".TABLEPREFIX."fanfiction_series AS sub ON ( sub.seriesid = series.subseriesid ) WHERE series.seriesid = '$seriesid' ORDER BY series.inorder");
+		$output .= "<table style=\"margin: 1em auto;\" cellpadding=\"0\" class=\"tblborder\">
+			<tr><th class=\"tblborder\">"._TITLE."</th><th class=\"tblborder\" width=\"26\">"._ORDER."</th><th class=\"tblborder\">"._OPTIONS."</th></tr>";
+		$rows = dbnumrows($result);
+		while($series = dbassoc($result)) {
+			$output .= "<tr><td class=\"tblborder\"><a href=\"".($series['subseriesid'] == 0 ? "viewstory.php?sid=".$series['sid']."\">".stripslashes($series['storytitle']) : "viewseries.php?seriesid=$series[subseriesid]\">".stripslashes($series['subtitle']))."</a></td>
+				<td class=\"tblborder\" align=\"center\">".($series['inorder'] == $rows ? "" : "<a href=\"series.php?action=manage&amp;go=down&amp;inorder=".$series['inorder']."&amp;".($series['sid'] ? "sid=".$series['sid'] : "subseriesid=".$series['subseriesid'])."&amp;seriesid=$seriesid\"><img src=\"images/arrowdown.gif\" align=\"right\" border=\"0\" width=\"13\" height=\"18\" alt=\""._DOWN."\"></a>").
+				($series['inorder'] == 1 ? "&nbsp;" : "<a href=\"series.php?action=manage&amp;go=up&amp;inorder=$series[inorder]&amp;".($series['sid'] ? "sid=".$series['sid'] : "subseriesid=".$series['subseriesid'])."&amp;seriesid=$seriesid\"><img src=\"images/arrowup.gif\" border=\"0\" width=\"13\" height=\"18\" align=\"left\" alt=\""._UP."\"></a>")."</td>
+				<td class=\"tblborder\">".($owner == USERUID || $admin ? "<a href=\"series.php?action=delete&amp;seriesid=$seriesid&amp;inorder=".$series['inorder']."\">"._REMOVE."</a>" : "&nbsp;").($isopen == 1 && empty($series['confirmed']) && USERUID == $owner ? " | <a href=\"series.php?action=validate&amp;seriesid=$seriesid&amp;inorder=".$series['inorder']."\">"._VALIDATE."</a>" : "")."</td></tr>";
+		}
+		$output .= "<tr><td colspan=\"3\" align=\"center\"><a href=\"series.php?action=add&amp;add=stories&amp;seriesid=$seriesid\">"._ADD2SERIES."</a></td></tr></table>";
+	}
+	else {
+		$result = dbquery("SELECT * from ".TABLEPREFIX."fanfiction_series WHERE uid = '".USERUID."' ORDER BY title");
+		$output .= "<table style=\"margin: 0 auto;\" cellpadding=\"0\" cellspacing=\"0\" class=\"tblborder\">
+			<tr><th class=\"tblborder\">"._TITLE."</th><th class=\"tblborder\">"._OPTIONS."</th></tr>";
+		while($series = dbassoc($result)) {
+			$output .= "<tr><td class=\"tblborder\"><a href=\"viewseries.php?seriesid=".$series['seriesid']."\">".stripslashes($series['title'])."</a></td><td class=\"tblborder\"><a href=\"series.php?action=add&amp;add=stories&amp;seriesid=".$series['seriesid']."\">"._ADD2SERIES."</a> | <a href=\"series.php?action=edit&amp;seriesid=$series[seriesid]\">"._EDIT."</a> | <a href=\"series.php?action=delete&amp;seriesid=$series[seriesid]\">"._DELETE."</a></td></tr>";
+		}
+		$output .= "<tr><td colspan='2' align='center' class=\"tblborder\"><a href='series.php?action=add'>"._ADDSERIES."</a></td></tr></table>";
+	}
+}
+$tpl->assign("output", $output);
+$tpl->printToScreen( );
+?>

--- /dev/null
+++ b/skins/Berrygood/ReadMe.txt
@@ -1,1 +1,12 @@
+Kali
+admin@made-by-kali.com
+http://www.made-by-kali.com
 
+This skin is released under the Creative Commons Attribution Non-Commercial License without any support or warranty. Use at your own risk. The credit link may NOT be removed from the footer unless you have paid for a license.
+
+The menus are hardcoded into the header.tpl. You must change it from there.
+
+----
+
+
+

--- /dev/null
+++ b/skins/Berrygood/browse.tpl
@@ -1,1 +1,13 @@
+<!-- INCLUDE BLOCK : header -->
+<div id="skinny">
+{output}{otherresults}
+<!-- START BLOCK : sortform -->
+<div id="sortform">{sortbegin}{categorymenu} {charactermenu1} {charactermenu2} {pairingsmenu} {ratingmenu} {classmenu} {sortmenu} {completemenu} {sortend}</div>
+<!-- END BLOCK : sortform -->
+<!-- INCLUDE BLOCK : listings -->
+</div>
+<div id="skinnybottom">
+&nbsp;
+</div>
+<!-- INCLUDE BLOCK : footer -->
 

--- /dev/null
+++ b/skins/Berrygood/cclicense.txt
@@ -1,1 +1,62 @@
+License
 
+THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
+
+BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
+
+1. Definitions
+
+   1. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License.
+   2. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License.
+   3. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership.
+   4. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License.
+   5. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast.
+   6. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work.
+   7. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
+   8. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images.
+   9. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium.
+
+2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws.
+
+3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:
+
+   1. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections;
+   2. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified.";
+   3. to Distribute and Publicly Perform the Work including as incorporated in Collections; and,
+   4. to Distribute and Publicly Perform Adaptations.
+
+The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Section 4(d).
+
+4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:
+
+   1. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(c), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(c), as requested.
+   2. You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works.
+   3. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and, (iv) consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties.
+   4.
+
+      For the avoidance of doubt:
+         1. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License;
+         2. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License if Your exercise of such rights is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(b) and otherwise waives the right to collect royalties through any statutory or compulsory licensing scheme; and,
+         3. Voluntary License Schemes. The Licensor reserves the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License that is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(c).
+   5. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise.
+
+5. Representations, Warranties and Disclaimer
+
+UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
+
+6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. Termination
+
+   1. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
+   2. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.
+
+8. Miscellaneous
+
+   1. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
+   2. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
+   3. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
+   4. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.
+   5. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
+   6. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law.
+

--- /dev/null
+++ b/skins/Berrygood/default.tpl
@@ -1,1 +1,9 @@
-
+<!-- INCLUDE BLOCK : header -->
+<div id="skinny">
+{output}
+</div>
+<div id="skinnybottom">
+&nbsp;
+</div>
+<!-- INCLUDE BLOCK : listings -->
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/Berrygood/footer.tpl
@@ -1,1 +1,10 @@
-
+<!-- START BLOCK : footer -->
+</div>
+</div>
+<div id="footer">
+{footer}<Br /><Br />
+<center>{tos} | {rules} | {contactus}<br />
+Skin created by <a href="http://www.made-by-kali.com">Kali</a></center></div>
+</div>
+</body></html>
+<!-- END BLOCK : footer -->

--- /dev/null
+++ b/skins/Berrygood/header.tpl
@@ -1,1 +1,32 @@
-
+<!-- START BLOCK : header -->
+<body>
+<div id="menu">
+	<ul id="menulist">
+<li>{home}</li>
+<li>{login}</li> 
+<li>{tos}</li>
+<li>{rules}</li>   
+<li>{help}</li> 
+<li>{register}</li>
+<li>{adminarea}</li>  
+</ul>
+</div>
+<div id="container">
+<div id="banner">&nbsp;
+</div>
+<div id="submenu">
+	<ul id="submenulist">
+<li>Browse By:</li>
+<li>{recent}</li> 
+<li>{authors}</li>
+<li>{catslink}</li>
+<li>{titles}</li> 
+<li>{series}</li> 
+<li>{challenges}</li>
+<li>{tens}</li>  
+<li>{search}</li> 
+</ul>
+</div>
+<div id="mainpage">
+<div id="content">
+<!-- END BLOCK : header -->

 Binary files /dev/null and b/skins/Berrygood/images/banner.jpg differ
 Binary files /dev/null and b/skins/Berrygood/images/banner.psd differ
 Binary files /dev/null and b/skins/Berrygood/images/bannerbg.jpg differ
 Binary files /dev/null and b/skins/Berrygood/images/blockbottom.jpg differ
 Binary files /dev/null and b/skins/Berrygood/images/blocktop.jpg differ
 Binary files /dev/null and b/skins/Berrygood/images/bodybg.jpg differ
 Binary files /dev/null and b/skins/Berrygood/images/defaulttop.jpg differ
 Binary files /dev/null and b/skins/Berrygood/images/footer.jpg differ
 Binary files /dev/null and b/skins/Berrygood/images/menubg.jpg differ
 Binary files /dev/null and b/skins/Berrygood/images/topmenubg.jpg differ
--- /dev/null
+++ b/skins/Berrygood/index.php

--- /dev/null
+++ b/skins/Berrygood/index.tpl
@@ -1,1 +1,68 @@
-
+<!-- INCLUDE BLOCK : header -->
+<div id="leftindex">
+      <div class="block">
+       <div class="title">{info_title}</div>
+       <div class="content">{info_content}<Br />
+	{skinchange_content}<br /><br />
+	{login}<br />
+	{register}
+	</div>
+</div>
+      <div class="block">
+       <div class="title">{poll_title}</div>
+       <div class="content">{poll_content}</div>
+	</div>
+</div>
+<div id="rightindex">
+    <div class="block">
+       <div class="title">{featured_title}</div>
+       <div class="content">
+	   <!-- START BLOCK : featuredblock -->
+{title} by {author}<br />
+<span class="label">Summary: </span>{summary}<br />
+<span class="label">Rated:</span> {rating} {score}<br />
+<span class="label">Categories:</span> {category} <br />
+<hr>
+	<!-- END BLOCK : featuredblock -->
+	</div>
+</div>
+     <div class="block">
+       <div class="title">{recent_title}</div>
+       <div class="content">
+	   	   <!-- START BLOCK : recentblock -->
+{title} by {author}<br />
+<span class="label">Summary: </span>{summary}<br />
+<span class="label">Rated:</span> {rating} {score}<br />
+<span class="label">Categories:</span> {category} <br />
+<hr>
+	<!-- END BLOCK : recentblock -->
+	</div>
+</div>
+    <div class="block">
+       <div class="title">{random_title}</div>
+       <div class="content">
+	   	   <!-- START BLOCK : randomblock -->
+{title} by {author}<br />
+<span class="label">Summary: </span>{summary}<br />
+<span class="label">Rated:</span> {rating} {score}<br />
+<span class="label">Categories:</span> {category} <br />
+<hr>
+	<!-- END BLOCK : randomblock -->
+	</div>
+</div>
+</div>
+<div id="middleindex">
+	<div class="block">
+       <div class="title">Welcome</div>
+       <div class="content">{welcome}</div>
+     </div>
+     <div class="block">
+       <div class="title">{news_title}</div>
+       <div class="content">{news_content}</div>
+    </div>
+    <div class="block">
+       <div class="title">{categories_title}</div>
+       <div class="content">{categories_content}</div>
+     </div>
+</div>
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/Berrygood/legal.txt
@@ -1,1 +1,7 @@
+This skin is made available for free download, use, and modification as long as this legal file and other notes found throughout the skin remain intact and a link back to http://www.made-by-kali.com/ is given in all sites where the skin is displayed. 
 
+There is no guarantee that this skin is free from errors of any kind. Users agree to hold me blameless from any liability directly or indirectly arising from the use of this skin.
+
+Users of this skin are forbidden to sell or offer paid installation of this skin without written and explicit permission from me, Katherine Araque-Frick (admin@made-by-kali.com)
+
+These terms may be subject to change at any time without prior notice and will still hold true for any earlier versions of the skin and for any user of any version of the skin.

--- /dev/null
+++ b/skins/Berrygood/printable.css
@@ -1,1 +1,15 @@
-
+BODY { font: 12pt "Times New Roman", "Times NR", Times, serif; color: black; background: white; }
+// Gives the page a 1 inch margin when printed.
+@page { margin: 1in; }
+hr { width: 70%; color: #000; background: #000;  margin: 1em auto;}
+.infobox { border: 1px solid #336; margin: 1em 10%; padding: 1em;}
+#pagetitle { font-size: 140%; text-align: center; }
+.label { font-weight: bold; }
+A { font-weight: bold; color: #336; text-decoration: none; }
+.chaptertitle { page-break-before: always; page-break-after: avoid; font-size: 125%; text-align: center; text-decoration: underline; margin-bottom: 1em;}
+.notes { border: 1px solid #336;  margin: 1em 10%;}
+.notes .title { padding: 5px; border-bottom: 1px solid #336; }
+.notes .noteinfo { padding: 5px; }
+#copyright { margin: 1em 10%; border: 1px solid #336; padding: 1ex;}
+#archivedat { text-align: center; }
+.toplink { text-align: right; }

--- /dev/null
+++ b/skins/Berrygood/reviews.tpl
@@ -1,1 +1,14 @@
-
+<!-- INCLUDE BLOCK : header -->
+<div id="skinny">
+{pagetitle}
+<div class="respond">{reviewslink}</div>
+<div class="jumpmenu">{jumpmenu}</div>
+{output}
+<!-- INCLUDE BLOCK : reviewsblock -->
+{reviewpagelinks}
+{reviewform}
+</div>
+<div id="skinnybottom">
+&nbsp;
+</div>
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/Berrygood/storyindex.tpl
@@ -1,1 +1,35 @@
-
+<!-- INCLUDE BLOCK : header -->
+<div id="skinny">
+<div id="pagetitle">{title} by {author}</div>
+<div id="sort"> [{reviews} - {numreviews}] {score}{printicon}</div>
+<div id="output">
+<div class="jumpmenu">{jumpmenu}</div>
+<div class="listbox">
+<div class="content">{featuredstory}<span class="label">Summary: </span>{summary}<br />
+<span class="label">Rated:</span> {rating}<br />
+<span class="label">Categories:</span> {category} <span class="label">Characters: </span> {characters}<br />
+{classifications}
+<span class="label">Challenges:</span> {challengelinks}<br /> <span class="label">Series:</span> {serieslinks}<br />
+<span class="label">Chapters: </span> {numchapters} <span class="label">Completed:</span> {completed} <br /> 
+<span class="label">Word count:</span> {wordcount} <span class="label">Read:</span> {count}<br />
+<span class="label"> Published: </span>{published} <span class="label">Updated:</span> {updated} </div>
+{adminlinks}
+</div>
+<div style='text-align: center;'>{addtofaves}</div>
+<!-- START BLOCK : storynotes -->
+<div class='notes'><div class='title'><span class='label'>Story Notes:</span></div><div class='noteinfo'>{storynotes}</div></div>
+<!-- END BLOCK : storynotes -->
+<!-- START BLOCK : storyindexblock -->
+      <p><b>{chapternumber}. {title} </b>by {author} [{reviews} - {numreviews}] {ratingpics} ({wordcount} words)<br />
+	{chapternotes}{adminoptions}</p>
+<!-- END BLOCK : storyindexblock -->
+{storyend}{last_read}
+<div id="pagelinks"><div class="jumpmenu">{jumpmenu2}</div></div>
+<div class="respond">{roundrobin}</div>
+{reviewform}
+</div>
+</div>
+<div id="skinnybottom">
+&nbsp;
+</div>
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/Berrygood/style.css
@@ -1,1 +1,501 @@
-
+/* Some definitions used everywhere */
+BODY { 
+	background: #c7bc8f;
+	color: #000;
+	margin: 0;
+	padding: 0;
+	text-align: center;
+ 	font-family: arial, helvetica, sans-serif;
+	font-size: 12px;
+}
+
+IMG { 
+	border: 0;
+	padding: 0;
+	margin: 0;
+}
+/* Header cells in tables throughout the site */
+TH { 
+	background: #000;
+	color: #FFF;
+	font-weight: bold;
+}
+/* links */
+A { 
+	color: #b34774;
+	font-weight: bold;
+	text-decoration: none;
+}
+/* hovering links */
+A:hover {
+	color: #000;
+	font-weight: bold;
+	text-decoration: none;
+}
+
+/* Top of Page */
+
+#container {
+	background: #b34675 url(images/bannerbg.jpg) top left repeat-x;
+	text-align: center;
+	margin: auto;
+}
+
+#banner {
+	margin: auto;
+	width: 713px;
+	height: 150px;
+ 	background: #C6BB8F url(images/banner.jpg) top center no-repeat;
+}
+
+/* the following defines your menu above the banner div */
+
+#menu {
+	padding: 5px;
+	text-align:center;
+	border-bottom: 1px solid #b34774;
+	background: #74234b url(images/topmenubg.jpg) top left repeat-x;
+}
+
+#menulist {
+ 	padding: 0px;
+ 	margin: 0px;
+}
+
+#menulist ul {
+ 	margin-left: 0;
+ 	padding-left: 0;
+ 	white-space: nowrap;
+}
+
+#menulist li {
+	 display: inline;
+ 	list-style-type: none;
+}
+
+#menulist a { 
+	padding-top: 1px;
+	padding-bottom: 1px;
+ 	padding-left: 7px;
+ 	padding-right: 7px;
+ 	margin-right: 3px;
+	}
+
+#menulist a:link, #menulist a:visited {
+ 	color: #fff;
+ 	text-decoration: none;
+ 	font-weight: bold;
+}
+
+#menulist a:hover{
+ 	color: #000;
+	text-decoration: none;
+	font-weight: bold;
+}
+
+/* the following defines your menu below the banner div */
+
+#submenu {
+	padding: 5px;
+	text-align:center;
+	border-top: 1px solid #681e43;
+	border-bottom: 1px solid #3f0724;
+	background: #b44675 url(images/menubg.jpg) top left repeat-x;
+}
+
+#submenulist {
+ 	padding: 0px;
+ 	margin: 0px;
+ 	text-align: center;
+}
+
+#submenulist ul {
+ 	margin-left: 0;
+ 	padding-left: 0;
+ 	white-space: nowrap;
+}
+
+#submenulist li {
+ 	display: inline;
+ 	list-style-type: none;
+}
+
+#submenulist a { 
+ 	padding-top: 1px;
+ 	padding-bottom: 1px;
+ 	padding-left: 7px;
+ 	padding-right: 7px;
+ 	margin-right: 3px;
+	}
+
+#submenulist a:link, #submenulist a:visited {
+ 	color: #fff;
+ 	text-decoration: none;
+ 	font-weight: bold;
+}
+
+#submenulist a:hover{
+ 	color: #000;
+ 	text-decoration: none;
+ 	font-weight: bold;
+}
+
+/* the footer box at the bottom of the page */
+#footer {
+	text-align:center;
+	font-weight:bold;
+ 	color: #FFF;
+	background: #c7bc8f url(images/footer.jpg) top left repeat-x;
+	padding: 10px;
+	clear: both;
+}
+
+#footer a{
+	color:#b34774;
+	}
+	
+#footer a:hover {
+	color:#fff;
+	}
+
+
+
+/* this is a carryover from 1.1.  Generally it is used around tables and table cells. */
+.tblborder { 
+	padding: 6px;
+	border-collapse: collapse;
+}
+
+/* Main Page Body */
+
+#mainpage {
+	padding: 15px;
+	padding-top: 25px;
+	background: #b34675;
+	background-image: url(images/bodybg.jpg);
+	background-position: top left;
+	background-repeat: repeat-x;
+	margin:auto;
+	text-align: left;
+}
+html>body #mainpage { 
+	height: auto;
+	min-height: 550px;
+}
+
+#leftindex { 
+	position:relative;
+	width: 180px;
+	float: left;
+	margin-left: 50px;
+	text-align: left;
+}
+#rightindex {
+	position:relative;
+	width: 180px;
+	margin-right: 50px;
+	float:right;
+	text-align: left;
+}
+
+#middleindex {
+	position:relative;
+	margin-left: 240px;
+	margin-right: 240px;
+	text-align: left;
+}
+
+/* This controls the look of the blocks on the index page. */
+
+/* The box around the block */
+.block { 
+	margin-bottom: 1em;
+}
+
+/* The block's title */
+.block .title {
+	color: #6a1d44;
+	background: #eeebde url(images/blocktop.jpg) top left repeat-x;
+	font-weight: bold;
+	font-size: 16px;
+	padding: 3px;
+	padding-left: 8px;
+	border-bottom: 1px solid #a4996f;
+}
+
+/* The block's content */
+.block .content {
+	padding: 10px 10px 15px 10px;
+	background: #eeebde url(images/blockbottom.jpg) bottom left repeat-x;
+}
+
+/* Used to prevent content from going to edges */
+#skinny {
+	margin: 0px 100px;
+	padding:15px;
+	background: #eeebde url(images/defaulttop.jpg) top left repeat-x;
+	
+}
+
+#skinnybottom {
+	margin: 0px 100px;
+	padding:15px;
+	background: #eeebde url(images/blockbottom.jpg) bottom left repeat-x;
+	
+}
+
+/* Most pages use pagetitle to format the page's title */
+#pagetitle { 
+	text-align: center;
+	font-size: 14px;
+	color: #000;
+	font-weight: bold;
+	margin-top: 1em;
+	margin-bottom: 1em;
+}
+
+
+/* Alphabet Setup */
+
+#alphabet, #pagelinks {
+	text-align: center;
+	word-spacing: .5em;
+	margin: 1em;
+}
+/* each link */
+#alphabet A, #pagelinks A {
+	color: #7d2148;
+	text-decoration: underline;
+	font-weight: bold;
+	font-size: 1.3em;
+}
+/* each link when hovered over */
+#alphabet A:hover, #pagelinks A:hover {
+	color: #fff;
+}
+/* the currently selected letter and currently selected page */
+#alphabet #currentletter, #pagelinks #currentletter {
+	color: #333;
+	font-weight: bold;
+	padding: 0 2px;
+}
+/* End alphabet and page link declarations */
+
+/* labels throughout the site in forms and in other places */
+.label, .classification {
+	color: #000;
+	font-weight: bold;
+}
+/* Admin options in various places.  */
+.adminoptions { 
+	color: #000;
+	font-weight: bold;
+}
+
+/* The listings of stories etc. */
+/* .sectionheader styles the headings "Stories" and "Series" */
+.sectionheader {
+	text-align: center;
+	font-size: 14px;
+	font-weight: bold;
+	color: #000;
+}
+
+/* The box around each individual story */
+.listbox {
+	margin: 1em 5%;
+	border: 1px solid #dbdbdb;
+	background: #fff;
+}
+
+/* The title bar for each story box. */
+.listbox .title {
+	background: #74234b url(images/topmenubg.jpg) top left repeat-x;
+	color: #FFF;
+	font-weight: bold;
+	padding: 4px;
+	padding-left: 8px;
+}
+
+/* The content of the box...summary, categories, etc. */
+.listbox .content {
+	padding: 6px;
+	background-color: #fff;
+}
+
+/* The tail info published date etc. on the last line */
+.listbox .tail {
+	background: #b44675 url(images/menubg.jpg) top left repeat-x;
+	padding: 4px; 
+}
+
+.listbox .title a {color:#d5ccab;}
+.listbox .title a:hover {color:#fff;}
+.listbox .tail a {color:#fff;}
+.listbox .tail a:hover {color:#ff0000;}
+/*End story/series listings */
+
+/* titleblock is used for the title information in series and challenges */
+#titleblock {
+	margin: 0 10%;
+}
+
+/* The pulldown jump menus on several pages. */
+.jumpmenu {
+	text-align: right;
+	margin-right: 1em;
+}
+
+/* On the story page, there's a jumpmenu at the bottom. It looks better centered, so this will replace the declaration above for that 
+drop down list ONLY */
+#pagelinks .jumpmenu2 {
+	text-align: center;
+}
+
+/* story notes */
+.noteinfo{
+	border: 1px solid #ccc; 
+	margin:1em; 
+	padding: 1em;
+	background: #fff;
+	}
+
+/* This is used on series and challenges and other places where a response is solicited */
+.respond { 
+	text-align: center;
+	padding: 6px;
+}
+
+/* The sort menu on the categories page */
+#sort { text-align: center; }
+
+#sortform { text-align: center; }
+
+/* On pages that don't use listings, the content is surrounded by a div labeled output to */
+#output { 
+	padding: 10px;
+}
+
+/* User Profile stuff */
+/* The top list of information */
+#profile {
+	margin: 1em 10%;
+}
+/* The sort menu in the profile */
+#profile #sort {
+	text-align: center;
+	font-weight: bold;
+	color: #000;
+ }
+/* The following declarations control the tabs */
+/* The outer tab box */
+#tabs {
+	text-align: center;
+	margin: 0;
+	padding: 0;
+}
+/* The individual tabs. */
+#tabs span {
+	padding: 5px;
+}
+/* Links in the tabs */
+
+#tabs #active {
+	color: #000;
+}
+
+#tabs a:{
+	color: #fe6000;
+}
+
+#active a:{
+	color: #fe6000;
+}
+
+/* The next link at the bottom of a multi-chapter story */
+#next { float: right; }
+/* The previous link at the bottom of a multi-chapter story */
+#prev { float: left; }
+
+#browse #category_content { width: 95% !important; margin: 1em auto; }
+
+/* Newsbox tweaks */
+.newsbox {
+	margin-bottom: 20px; 
+	border-bottom: 1px solid #000;
+	}
+	
+.newstitle {
+	font-weight: bold; 
+	font-size: 1.3em; 
+	border-bottom: 1px dashed #999; 
+	margin-bottom: 5px;
+	}
+	
+.commenteven, .commentodd {padding: 3px 10px; margin-bottom: 1.5em; border-bottom: 1px dashed #999;}
+.commentsig {font-weight: bold;}
+
+.recentstory , .featuredstory, .commentsig {
+	margin-bottom: 1em;
+	}
+
+table {font:12px arial;}
+
+
+ 
+@media only screen and (max-width: 768px) {
+
+	#skinny,
+	#skinnybottom {
+		margin: 0px 5px;
+	}
+
+	#skinnybottom {
+		width: 100%;
+	}
+			    
+	#content {
+		display: flex;
+		flex-direction: row;
+		flex-wrap: wrap;
+		width: 100%;
+	}
+
+	#leftindex {
+		position: initial;
+		width: 50%;
+		margin-left: auto;
+		margin-right: auto;
+		text-align: left;
+	}
+
+	#middleindex{
+		position: initial;
+		width: 100%;
+		margin-left: auto;
+		margin-right: auto;
+		text-align: left;
+	}
+
+	#rightindex {
+			position: initial;
+			width: 50%;
+			margin-left: auto;
+			margin-right: auto;
+			text-align: left;
+	}
+
+	.block {
+		margin: 10px;
+	}
+	#banner {
+		width: 100%;
+		height: 110px;
+		background-size: contain;
+	}
+
+	.listbox {
+		margin: 1em 0;
+	}
+}
+ 

--- /dev/null
+++ b/skins/Berrygood/user.tpl
@@ -1,1 +1,20 @@
-
+<!-- INCLUDE BLOCK : header -->
+<div id="skinny">
+<div id="profile">
+<!-- INCLUDE BLOCK : profile -->
+{adminoptions}
+<div id="sort">{sort}</div>
+</div>
+	<div id="tabs">
+<!-- START BLOCK : paneltabs -->
+<span {class}>{link} {count}</span>
+<!-- END BLOCK : paneltabs -->
+<div class='cleaner' style='clear: both;'>&nbsp;</div>
+	</div>
+{output}
+<!-- INCLUDE BLOCK : listings -->
+</div>
+<div id="skinnybottom">
+&nbsp;
+</div>
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/Berrygood/variables.php
@@ -1,1 +1,14 @@
-
+<?php
+$displayprofile = 1;
+$blocks["login"]["status"] = 2;
+$blocks["news"]["status"] = 2;
+$blocks["random"]["status"] = 2;
+$blocks["featured"]["status"] = 2;
+$blocks["recent"]["status"] = 2;
+$blocks["categories"]["status"] = 2;
+$blocks["search"]["status"] = 0;
+$blocks["poll"]["status"] = 2;
+$blocks['recent']['tpl'] = 1;
+$blocks['random']['tpl'] = 1;
+$blocks['featured']['tpl'] = 1;
+?>

--- /dev/null
+++ b/skins/Berrygood/viewstory.tpl
@@ -1,1 +1,31 @@
-
+<!-- INCLUDE BLOCK : header -->
+<div id="skinny">
+<div id="pagetitle">{title} by {author}</div>
+<div class="storyinfo"> [{reviews} - {numreviews}]<br />
+{toc} {reportthis}<br />
+{printicon} <br />
+{adminlinks} </div>
+<div class="jumpmenu">{textsizer}{jumpmenu}</div>
+<!-- START BLOCK : storynotes -->
+<div class='notes'>
+	<div class='title'><span class='label'>Story Notes:</span></div>
+	<div class='noteinfo'>{storynotes}</div>
+</div>
+<!-- END BLOCK : storynotes -->
+<!-- START BLOCK : notes -->
+<div class='notes'><div class='title'><span class='label'>Author's Chapter Notes:</span></div><div class='noteinfo'>{notes}</div></div>
+<!-- END BLOCK : notes -->
+<div id="story">{story}</div>
+<!-- START BLOCK : endnotes -->
+<div class='notes'><div class='title'><span class='label'>Chapter End Notes:</span></div><div class='noteinfo'>{endnotes}</div></div>
+<!-- END BLOCK : endnotes -->
+<div id="prev">{prev}</div><div id="next">{next}</div>
+{storyend}
+<div class="jumpmenu2">{jumpmenu2}</div>
+<div class="respond">{addtofaves} {roundrobin}</div>
+{reviewform}
+</div>
+<div id="skinnybottom">
+&nbsp;
+</div>
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/E-zfiction/ReadMe.txt
@@ -1,1 +1,14 @@
+Kali
+admin@made-by-kali.com
+http://www.made-by-kali.com
 
+This skin is released under the Creative Commons Attribution Non-Commercial License without any support or warranty. Use at your own risk. The credit link may NOT be removed from the footer unless you have paid for a license.
+
+The menus are hardcoded into the header.tpl and footer.tpl. You must change it from there.
+
+The default color for the skin is red. To change the color, copy the contents of a color folder into the main skin folder.
+
+----
+
+
+

 Binary files /dev/null and b/skins/E-zfiction/blue/images/menubg.gif differ
--- /dev/null
+++ b/skins/E-zfiction/blue/style.css
@@ -1,1 +1,500 @@
-
+/* Some definitions used everywhere */
+BODY { 
+	background: #333 url(images/stripes.png);
+	color: #000;
+	margin: 0;
+	padding: 0;
+	text-align: center;
+	font: 12px arial;
+}
+
+IMG { 
+	border: 0;
+	padding: 0;
+	margin: 0;
+}
+/* Header cells in tables throughout the site */
+TH { 
+	background: #006cca;
+	color: #FFF;
+	font-weight: bold;
+}
+/* links */
+A { 
+	color: #666;
+	font-weight: bold;
+	text-decoration: none;
+}
+/* hovering links */
+A:hover {
+	color: #333;
+	font-weight: bold;
+	text-decoration: none;
+}
+
+
+#container {
+	width: 85%;
+	margin: auto;
+	text-align: center;
+ 	background-color: #fff;
+}
+
+/* the box at the top of the page */
+#banner {
+	height: 160px;
+ 	background: #000000 url(images/top_image.gif) top left repeat-x;
+}
+
+#bannerimage{
+	float: left;
+	height: 160px;
+	background: #000000 url(images/left_top_image.gif) top left;
+	text-align: left;
+	width: 350px;
+	}
+
+/* Featured Story Block */
+#featured {
+	margin-left:400px;
+	text-align: left;
+	padding: 5px 15px 5px 1px;
+	color: #fff;
+	}
+
+.headertitle {
+    font-size: 15px;
+	color: #fff;
+	font-weight: bold;
+	border-bottom: 1px solid #c00000;
+	margin-bottom: 3px;
+	}
+
+#featured a:link, #featured a:visited {
+ 	color: #c00000;
+ 	text-decoration: none;
+ 	font-weight: bold;
+}
+
+#featured a:hover{
+ 	color: #333;
+    text-decoration: none;
+	font-weight: bold;
+}
+
+.greytext {color: #999;}
+
+#navigation {
+    background: #ccc url(images/greybg.gif) repeat-x top left;
+}
+
+#search {
+	text-align: right;
+	padding: 3px;
+	}
+
+
+/* The location of the div containing the RSS link in the banner area */
+#rss {
+	position: absolute;
+	right: 50px;
+	top: 55px; 
+}
+
+/* the following defines your menu below the banner div */
+/* the box around the menu and aligning the text to center */
+#menu {
+	padding-top: 5px;
+	padding-bottom: 2px;
+	padding-left: 4px;
+	padding-right: 4px;
+	font-size: 12px;
+	background: url(images/menubg.gif) repeat-x #006dcc;
+}
+
+#menulist {
+ 	padding: 0px;
+ 	margin: 0px;
+ 	text-align: left;
+}
+
+#menulist ul {
+ 	margin-left: 0;
+ 	padding-left: 0;
+ 	white-space: nowrap;
+}
+
+#menulist li {
+	 display: inline;
+ 	list-style-type: none;
+}
+
+#menulist a { 
+	padding-top: 1px;
+	padding-bottom: 1px;
+ 	padding-left: 7px;
+ 	padding-right: 7px;
+ 	margin-right: 3px;
+	}
+
+#menulist a:link, #menulist a:visited {
+ 	color: #fff;
+ 	text-decoration: none;
+ 	font-weight: bold;
+}
+
+#menulist a:hover{
+ 	color: #000;
+	text-decoration: none;
+	font-weight: bold;
+}
+
+
+/* the footer box at the bottom of the page */
+#footercon {
+	clear:both
+}
+
+#footertitle {
+	padding:4px;
+	color: #ccc;
+	font-weight: bold;
+	text-align: left;
+}
+
+#footer,#footertitle,#footerbottom{
+	background:#5d5d5d url(images/blackbg.gif) repeat-x top left
+}
+
+#footerlogin, #footerblurb{
+	background:#ccc url(images/greybg.gif) repeat-x top left
+}
+
+#footerlogin {
+	padding:2px 5px;
+	color: #000;
+}
+
+#footerlogin a:link {color: #fff;}
+
+#footermenu {
+	padding: 5px 2px 4px 4px;
+	font-size: 12px;
+	background: url(images/menubg.gif) repeat-x #c00000;
+}
+
+#footermenu a:link{
+	color: #333;
+}
+
+#footermenu a:visited{
+	color: #333;
+}
+
+#footermenu a:hover{
+	color: #fff;
+}
+
+#footerblurb{
+	padding: 5px;
+}
+
+#footerbottom {padding: 5px;}
+
+
+/* End universal page setup */
+
+/* this is a carryover from 1.1.  Generally it is used around tables and table cells. */
+.tblborder { 
+	padding: 6px;
+	border-collapse: collapse;
+}
+
+/* Main page surrounds the text between the header and the footer.  
+For IE, height is set to 650 to force the footer down to the bottom of the page where the content is short.  
+And the second declaration is for everyone else so that it will scroll if longer but be a minimum of 650px
+*/
+#mainpage {
+	height: 550px;
+	padding: 15px;
+	background: #FFF;
+	text-align: left;
+}
+html>body #mainpage { 
+	height: auto;
+	min-height: 550px;
+}
+
+/* This makes the actual story text appear in a 750px box, which prevents those at 800x600 from having to scroll sideways to view the story. To remove it, just delete this css and the "div id=skinny" tag (and the closing tag) from viewstory.tpl
+*/
+
+#skinny{
+	margin: auto;
+	width: 750px;
+	padding: 5px;
+	}
+
+
+/* Most pages use pagetitle to format the page's title */
+#pagetitle { 
+	border-top: 4px solid #000;
+	border-bottom: 1px solid #006dcc;
+	text-align: center;
+	font-size: 14px;
+	color: #666;
+	padding: 3px
+	font-weight: bold;
+	margin-top: 1em;
+	margin-bottom: 1em;
+}
+
+/* 
+Where there's a list of alphabet links #alphabet controls their look. 
+Just to make things simpler #pagelinks controls the look of the links at the bottom of multi-page results
+and will be set here too. Generally, they look alike.
+*/
+/* the box around the links */
+#alphabet, #pagelinks {
+	text-align: center;
+	word-spacing: .1em;
+	margin: 1em;
+}
+/* each link */
+#alphabet A, #pagelinks A {
+	color: #FFF;
+	text-decoration: none;
+	font-weight: bold;
+	background: #006cca;
+	border: 1px solid #006cca;
+	border-collapse: collapse;
+	padding: 0 2px;
+}
+/* each link when hovered over */
+#alphabet A:hover, #pagelinks A:hover {
+	background: #dbdbdb;
+	color: #fff;
+}
+/* the currently selected letter and currently selected page */
+#alphabet #current_letter, #pagelinks #currentpage {
+	background: #FFF;
+	color: #333;
+	font-weight: bold;
+	border: 1px solid #006cca;
+	padding: 0 2px;
+}
+/* End alphabet and page link declarations */
+
+/* labels throughout the site in forms and in other places */
+LABEL, .classification {
+	color: #666;
+	font-weight: bold;
+}
+/* Admin options in various places.  */
+.adminoptions { 
+	color: #006cca;
+	font-weight: bold;
+}
+
+/* The listings of stories etc. */
+/* .sectionheader styles the headings "Stories" and "Series" */
+.sectionheader {
+	border-top: 4px solid #000;
+	border-bottom: 1px solid #006dcc;
+	text-align: center;
+	font-size: 14px;
+	font-weight: bold;
+	padding: 3px;
+	color: #666;
+}
+
+/* The box around each individual story */
+.listbox {
+	margin: 1em 5%;
+	border: 1px solid #dbdbdb;
+}
+
+/* The title bar for each story box. */
+.listbox .title {
+	background: url(images/menubg.gif) repeat-x #006dcc;
+	color: #FFF;
+	font-weight: bold;
+	padding: 4px;
+	padding-left: 8px;
+}
+
+.listbox .title a{color:#ccc;}
+
+/* The content of the box...summary, categories, etc. */
+.listbox .content {
+	padding: 6px;
+	background-color: #ffffff;
+}
+
+/* The tail info published date etc. on the last line */
+.listbox .tail {
+	background: #ccc url(images/greybg.gif) repeat-x top left;
+	padding: 4px; 
+}
+
+/*End story/series listings */
+
+/* titleblock is used for the title information in series and challenges */
+#titleblock {
+	margin: 0 10%;
+}
+
+/* The pulldown jump menus on several pages. */
+.jumpmenu {
+	text-align: right;
+	margin-right: 1em;
+}
+
+/* On the story page, there's a jumpmenu at the bottom. It looks better centered, so this will replace the declaration above for that 
+drop down list ONLY */
+#pagelinks .jumpmenu {
+	text-align: center;
+}
+
+/* This is used on series and challenges and other places where a response is solicited */
+.respond { 
+	text-align: center;
+	padding: 6px;
+}
+
+/* The sort menu on the categories page */
+#sort { text-align: center; margin: 1em; }
+
+
+/* On pages that don't use listings, the content is surrounded by a div labeled output to */
+#output { 
+	padding: 10px;
+}
+
+/* User Profile stuff */
+/* The top list of information */
+#profile {
+	margin: 1em 10%;
+}
+/* The sort menu in the profile */
+#profile #sort {
+	text-align: right;
+	font-weight: bold;
+	color: #9ab96e;
+ }
+/* The following declarations control the tabs */
+/* The outer tab box */
+#tabs {
+	text-align: center;
+	margin: 0;
+	padding: 0;
+}
+/* The individual tabs. */
+#tabs span {
+	font-size: 12px;
+	background: #dbdbdb;
+	border: 1px solid #000;
+	padding: 3px;
+}
+/* Links in the tabs */
+
+#tabs #active {
+	background: #006cca;
+	color: #fff;
+}
+
+/* This controls the look of the blocks on the index page.   */
+
+/* The box around the block */
+.block { 
+	margin-bottom: 1.5em;
+	background: url(images/blockbg.gif) top left repeat-x #ededed;
+}
+
+/* The block's title */
+.block .title {
+	border-top: 4px solid #000;
+	border-bottom: 1px solid #006dcc;
+	font-weight: bold;
+	font-size: 16px;
+	color: #666;
+	padding: 2px;
+	padding-left: 8px;
+	margin-bottom: 3px;
+}
+
+/* The block's content */
+.block .content {
+	padding: 6px;
+
+}
+
+#leftindex { 
+	width: 200px;
+	float: left;
+}
+
+#rightindex {
+	margin-left: 220px;
+}
+
+
+/* The next link at the bottom of a multi-chapter story */
+#next { float: right; }
+/* The previous link at the bottom of a multi-chapter story */
+#prev { float: left; }
+
+#browse #category_content { width: 95% !important; margin: 1em auto; }
+
+#loginblock { 
+	margin: 3px 0 0 0;
+	text-align: right;
+}
+
+#loginblock .textbox, #loginblock .checkbox { 
+}
+
+#loginblock .button { 
+	padding: 0; 
+	margin: 0; 
+	font-weight: bold; 
+	font-family: "Arial"; 
+}
+#loginlinks {
+	display: inline;
+}
+#loginlinks A {
+	color: #999;
+}
+
+.label
+	{font-weight: bold;}
+
+/* Story Notes */
+.notes {
+	border: 1px solid #666;
+	margin: 1em;
+	padding: 1em;
+}
+
+.noteinfo {
+	border-top: 1px solid #ff0000;
+}
+	
+/*Newsbox Tweaks */
+.newsbox {
+	margin-bottom: 20px; 
+	border-bottom: 1px solid #000;
+	}
+	
+.newstitle {
+	font-weight: bold; 
+	font-size: 1.3em; 
+	border-bottom: 1px dashed #999; 
+	margin-bottom: 5px;
+	}
+	
+.commenteven, .commentodd {padding: 3px 10px; margin-bottom: 1.5em; border-bottom: 1px dashed #999;}
+.commentsig {font-weight: bold;}
+
+
+table {font:12px arial;}

--- /dev/null
+++ b/skins/E-zfiction/cclicense.txt
@@ -1,1 +1,62 @@
+License
 
+THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.
+
+BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.
+
+1. Definitions
+
+   1. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License.
+   2. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License.
+   3. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership.
+   4. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License.
+   5. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast.
+   6. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work.
+   7. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
+   8. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images.
+   9. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium.
+
+2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws.
+
+3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:
+
+   1. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections;
+   2. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified.";
+   3. to Distribute and Publicly Perform the Work including as incorporated in Collections; and,
+   4. to Distribute and Publicly Perform Adaptations.
+
+The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved, including but not limited to the rights set forth in Section 4(d).
+
+4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:
+
+   1. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(c), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(c), as requested.
+   2. You may not exercise any of the rights granted to You in Section 3 above in any manner that is primarily intended for or directed toward commercial advantage or private monetary compensation. The exchange of the Work for other copyrighted works by means of digital file-sharing or otherwise shall not be considered to be intended for or directed toward commercial advantage or private monetary compensation, provided there is no payment of any monetary compensation in connection with the exchange of copyrighted works.
+   3. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and, (iv) consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4(c) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties.
+   4.
+
+      For the avoidance of doubt:
+         1. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License;
+         2. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License if Your exercise of such rights is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(b) and otherwise waives the right to collect royalties through any statutory or compulsory licensing scheme; and,
+         3. Voluntary License Schemes. The Licensor reserves the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License that is for a purpose or use which is otherwise than noncommercial as permitted under Section 4(c).
+   5. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise.
+
+5. Representations, Warranties and Disclaimer
+
+UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.
+
+6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. Termination
+
+   1. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
+   2. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.
+
+8. Miscellaneous
+
+   1. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
+   2. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
+   3. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
+   4. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.
+   5. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.
+   6. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law.
+

--- /dev/null
+++ b/skins/E-zfiction/default.tpl
@@ -1,1 +1,4 @@
-
+<!-- INCLUDE BLOCK : header -->
+{output}
+<!-- INCLUDE BLOCK : listings -->
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/E-zfiction/footer.tpl
@@ -1,1 +1,21 @@
-
+<!-- START BLOCK : footer -->
+</div>
+<div id="footercon">
+<div id="footertitle">
+{sitename}
+</div>
+<div id="footerlogin">
+{login_content}
+</div>
+<div id="footermenu">
+{home} | {tos} | {rules} | {help} | {contactus} | {recent} | {authors} | {catslink} | {titles} | {series} | {challenges} | {tens} | {search}
+</div>
+<div id="footerblurb">
+{footer}
+<p><a href="http://www.made-by-kali.com">Efiction 3 skin created by Kali</a></p>
+</div>
+<div id="footerbottom">
+</div>
+</div>
+</body></html>
+<!-- END BLOCK : footer -->

--- /dev/null
+++ b/skins/E-zfiction/header.tpl
@@ -1,1 +1,40 @@
-
+<!-- START BLOCK : header -->
+<body>
+<div id="container">
+<div id="menu">
+	<ul id="menulist">
+<li>{home}</li> |
+<li>{login} |
+<li>{recent}</li> |
+<li>{authors}</li> |
+<li>{catslink}</li> |
+<li>{titles}</li> |
+<li>{series}</li> |
+<li>{challenges}</li> |
+<li>{tens}</li> |
+<li>{search}</li> 
+<li>{adminarea}</li>  
+</ul>
+</div>
+<div id="banner">
+<div id="bannerimage">
+&nbsp;
+</div>
+<div id="featured">
+<p>
+<div class="headertitle">Featured Story</div>
+	   	   <!-- START BLOCK : featuredblock -->
+			{title} by {author} | <span class="label">Rated:</span> {rating}<br />
+			<span class="label">Category:</span> {category}<br />
+			<span class="label">Summary: </span><span class="greytext">{summary}</span><br />
+	<!-- END BLOCK : featuredblock -->
+</p>
+</div>
+</div>
+<div id="navigation">
+<div id="search">
+{search_content}
+</div>
+</div>
+<div id="mainpage">
+<!-- END BLOCK : header -->

 Binary files /dev/null and b/skins/E-zfiction/images/altbg.gif differ
 Binary files /dev/null and b/skins/E-zfiction/images/blackbg.gif differ
 Binary files /dev/null and b/skins/E-zfiction/images/blockbg.gif differ
 Binary files /dev/null and b/skins/E-zfiction/images/catbackground.gif differ
 Binary files /dev/null and b/skins/E-zfiction/images/greybg.gif differ
 Binary files /dev/null and b/skins/E-zfiction/images/left_top_image-blank.gif differ
 Binary files /dev/null and b/skins/E-zfiction/images/left_top_image.gif differ
 Binary files /dev/null and b/skins/E-zfiction/images/menubg.gif differ
 Binary files /dev/null and b/skins/E-zfiction/images/stripes.png differ
 Binary files /dev/null and b/skins/E-zfiction/images/top_image.gif differ
--- /dev/null
+++ b/skins/E-zfiction/index.php

--- /dev/null
+++ b/skins/E-zfiction/index.tpl
@@ -1,1 +1,38 @@
-
+<!-- INCLUDE BLOCK : header -->
+<div id="leftindex">
+      <div class="block">
+       <div class="title">{info_title}</div>
+       <div class="content">{info_content}</div>
+	</div>
+<div class="block">
+       <div class="title">{login_title}</div>
+       <div class="content">{login_content}</div>
+     </div>
+<div class="block">
+       <div class="title">{skinchange_title}</div>
+       <div class="content">{skinchange_content}</div>
+     </div>
+     <div class="block">
+       <div class="title">{random_title}</div>
+       <div class="content">{random_content}</div>
+     </div>
+     <div class="block">
+       <div class="title">{recent_title}</div>
+       <div class="content">{recent_content}</div>
+     </div>
+    <div class="block">
+       <div class="title">{categories_title}</div>
+       <div class="content">{categories_content}</div>
+     </div>
+</div>
+<div id="rightindex">
+	<div class="block">
+       <div class="title">Welcome</div>
+       <div class="content">{welcome}</div>
+     </div>
+     <div class="block">
+       <div class="title">{news_title}</div>
+       <div class="content">{news_content}</div>
+    </div>
+</div>
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/E-zfiction/legal.txt
@@ -1,1 +1,7 @@
+This skin is made available for free download, use, and modification as long as this legal file and other notes found throughout the skin remain intact and a link back to http://www.made-by-kali.com/ is given in all sites where the skin is displayed. 
 
+There is no guarantee that this skin is free from errors of any kind. Users agree to hold me blameless from any liability directly or indirectly arising from the use of this skin.
+
+Users of this skin are forbidden to sell or offer paid installation of this skin without written and explicit permission from me, Katherine Araque-Frick (admin@made-by-kali.com)
+
+These terms may be subject to change at any time without prior notice and will still hold true for any earlier versions of the skin and for any user of any version of the skin.

--- /dev/null
+++ b/skins/E-zfiction/newsbox.tpl
@@ -1,1 +1,7 @@
-
+<!-- START BLOCK : newsbox -->
+<div class="newsbox {oddeven}">
+<div class="newstitle">{newstitle} {adminoptions}</div>
+{newsstory}<br /><br />
+   --{newsauthor} on {newsdate} {newscomments}
+</div>
+<!-- END BLOCK : newsbox -->

 Binary files /dev/null and b/skins/E-zfiction/orange/images/menubg.gif differ
--- /dev/null
+++ b/skins/E-zfiction/orange/style.css
@@ -1,1 +1,505 @@
-
+/* Some definitions used everywhere */
+BODY { 
+	background: #333 url(images/stripes.png);
+	color: #000;
+	margin: 0;
+	padding: 0;
+	text-align: center;
+	font: 12px arial;
+}
+
+IMG { 
+	border: 0;
+	padding: 0;
+	margin: 0;
+}
+/* Header cells in tables throughout the site */
+TH { 
+	background: #f07300;
+	color: #FFF;
+	font-weight: bold;
+}
+/* links */
+A { 
+	color: #333;
+	font-weight: bold;
+	text-decoration: none;
+}
+/* hovering links */
+A:hover {
+	color: #666;
+	font-weight: bold;
+	text-decoration: none;
+}
+
+
+#container {
+	width: 85%;
+	margin: auto;
+	text-align: center;
+ 	background-color: #fff;
+}
+
+/* the box at the top of the page */
+#banner {
+	height: 160px;
+ 	background: #000000 url(images/top_image.gif) top left repeat-x;
+}
+
+#bannerimage{
+	float: left;
+	height: 160px;
+	background: #000000 url(images/left_top_image.gif) top left;
+	text-align: left;
+	width: 350px;
+	}
+
+/* Featured Story Block */
+#featured {
+	margin-left:400px;
+	text-align: left;
+	padding: 5px 15px 5px 1px;
+	color: #fff;
+	}
+
+.headertitle {
+    font-size: 15px;
+	color: #fff;
+	font-weight: bold;
+	border-bottom: 1px solid #c00000;
+	margin-bottom: 3px;
+	}
+
+#featured a:link, #featured a:visited {
+ 	color: #c00000;
+ 	text-decoration: none;
+ 	font-weight: bold;
+}
+
+#featured a:hover{
+ 	color: #333;
+    text-decoration: none;
+	font-weight: bold;
+}
+
+.greytext {color: #999;}
+
+#navigation {
+    background: #ccc url(images/greybg.gif) repeat-x top left;
+}
+
+#search {
+	text-align: right;
+	padding: 3px;
+	}
+
+
+/* The location of the div containing the RSS link in the banner area */
+#rss {
+	position: absolute;
+	right: 50px;
+	top: 55px; 
+}
+
+/* the following defines your menu below the banner div */
+/* the box around the menu and aligning the text to center */
+#menu {
+	padding-top: 5px;
+	padding-bottom: 2px;
+	padding-left: 4px;
+	padding-right: 4px;
+	font-size: 12px;
+	background: url(images/menubg.gif) repeat-x #ff8400;
+}
+
+#menulist {
+ 	padding: 0px;
+ 	margin: 0px;
+ 	text-align: left;
+}
+
+#menulist ul {
+ 	margin-left: 0;
+ 	padding-left: 0;
+ 	white-space: nowrap;
+}
+
+#menulist li {
+	 display: inline;
+ 	list-style-type: none;
+}
+
+#menulist a { 
+	padding-top: 1px;
+	padding-bottom: 1px;
+ 	padding-left: 7px;
+ 	padding-right: 7px;
+ 	margin-right: 3px;
+	}
+
+#menulist a:link, #menulist a:visited {
+ 	color: #fff;
+ 	text-decoration: none;
+ 	font-weight: bold;
+}
+
+#menulist a:hover{
+ 	color: #000;
+	text-decoration: none;
+	font-weight: bold;
+}
+
+
+/* the footer box at the bottom of the page */
+/* the footer box at the bottom of the page */
+#footercon {
+	clear:both
+}
+
+#footertitle {
+	padding:4px;
+	color: #ccc;
+	font-weight: bold;
+	text-align: left;
+}
+
+#footer,#footertitle,#footerbottom{
+	background:#5d5d5d url(images/blackbg.gif) repeat-x top left
+}
+
+#footerlogin, #footerblurb{
+	background:#ccc url(images/greybg.gif) repeat-x top left
+}
+
+#footerlogin {
+	padding:2px 5px;
+	color: #000;
+}
+
+#footerlogin a:link {color: #fff;}
+
+#footermenu {
+	padding: 5px 2px 4px 4px;
+	font-size: 12px;
+	background: url(images/menubg.gif) repeat-x #c00000;
+}
+
+#footermenu a:link{
+	color: #333;
+}
+
+#footermenu a:visited{
+	color: #333;
+}
+
+#footermenu a:hover{
+	color: #fff;
+}
+
+#footerblurb{
+	padding: 5px;
+}
+
+#footerbottom {padding: 5px;}
+
+
+/* End universal page setup */
+
+/* this is a carryover from 1.1.  Generally it is used around tables and table cells. */
+.tblborder { 
+	padding: 6px;
+	border-collapse: collapse;
+}
+
+/* Main page surrounds the text between the header and the footer.  
+For IE, height is set to 650 to force the footer down to the bottom of the page where the content is short.  
+And the second declaration is for everyone else so that it will scroll if longer but be a minimum of 650px
+*/
+#mainpage {
+	height: 550px;
+	padding: 15px;
+	background: #FFF;
+	text-align: left;
+}
+html>body #mainpage { 
+	height: auto;
+	min-height: 550px;
+}
+
+/* This makes the actual story text appear in a 750px box, which prevents those at 800x600 from having to scroll sideways to view the story. To remove it, just delete this css and the "div id=skinny" tag (and the closing tag) from viewstory.tpl
+*/
+
+#skinny{
+	margin: auto;
+	width: 750px;
+	padding: 5px;
+	}
+
+
+/* Most pages use pagetitle to format the page's title */
+#pagetitle { 
+	border-top: 4px solid #000;
+	border-bottom: 1px solid #ff8400;
+	text-align: center;
+	font-size: 14px;
+	color: #666;
+	padding: 3px
+	font-weight: bold;
+	margin-top: 1em;
+	margin-bottom: 1em;
+}
+
+/* 
+Where there's a list of alphabet links #alphabet controls their look. 
+Just to make things simpler #pagelinks controls the look of the links at the bottom of multi-page results
+and will be set here too. Generally, they look alike.
+*/
+/* the box around the links */
+#alphabet, #pagelinks {
+	text-align: center;
+	word-spacing: .1em;
+	margin: 1em;
+}
+/* each link */
+#alphabet A, #pagelinks A {
+	color: #FFF;
+	text-decoration: none;
+	font-weight: bold;
+	background: #f07300;
+	border: 1px solid #f07300;
+	border-collapse: collapse;
+	padding: 0 2px;
+}
+/* each link when hovered over */
+#alphabet A:hover, #pagelinks A:hover {
+	background: #dbdbdb;
+	color: #fff;
+}
+/* the currently selected letter and currently selected page */
+#alphabet #current_letter, #pagelinks #currentpage {
+	background: #FFF;
+	color: #333;
+	font-weight: bold;
+	border: 1px solid #f07300;
+	padding: 0 2px;
+}
+/* End alphabet and page link declarations */
+
+/* labels throughout the site in forms and in other places */
+LABEL, .classification {
+	color: #666;
+	font-weight: bold;
+}
+/* Admin options in various places.  */
+.adminoptions { 
+	color: #f07300;
+	font-weight: bold;
+}
+
+/* The listings of stories etc. */
+/* .sectionheader styles the headings "Stories" and "Series" */
+.sectionheader {
+	border-top: 4px solid #000;
+	border-bottom: 1px solid #ff8400;
+	text-align: center;
+	font-size: 14px;
+	font-weight: bold;
+	padding: 3px;
+	color: #666;
+}
+
+/* The box around each individual story */
+.listbox {
+	margin: 1em 5%;
+	border: 1px solid #dbdbdb;
+}
+
+/* The title bar for each story box. */
+.listbox .title {
+	background: url(images/menubg.gif) repeat-x #ff8400;
+	color: #FFF;
+	font-weight: bold;
+	padding: 4px;
+	padding-left: 8px;
+}
+
+.listbox .title a{color:#ccc;}
+
+/* The content of the box...summary, categories, etc. */
+.listbox .content {
+	padding: 6px;
+	background-color: #ffffff;
+}
+
+/* The tail info published date etc. on the last line */
+.listbox .tail {
+	background: #ccc url(images/greybg.gif) repeat-x top left;
+	padding: 4px; 
+}
+
+/*End story/series listings */
+
+/* titleblock is used for the title information in series and challenges */
+#titleblock {
+	margin: 0 10%;
+}
+
+/* The pulldown jump menus on several pages. */
+.jumpmenu {
+	text-align: right;
+	margin-right: 1em;
+}
+
+/* On the story page, there's a jumpmenu at the bottom. It looks better centered, so this will replace the declaration above for that 
+drop down list ONLY */
+#pagelinks .jumpmenu {
+	text-align: center;
+}
+
+/* This is used on series and challenges and other places where a response is solicited */
+.respond { 
+	text-align: center;
+	padding: 6px;
+}
+
+/* The sort menu on the categories page */
+#sort { text-align: center; margin: 1em; }
+
+
+/* On pages that don't use listings, the content is surrounded by a div labeled output to */
+#output { 
+	padding: 10px;
+}
+
+/* User Profile stuff */
+/* The top list of information */
+#profile {
+	margin: 1em 10%;
+}
+/* The sort menu in the profile */
+#profile #sort {
+	text-align: right;
+	font-weight: bold;
+	color: #9ab96e;
+ }
+/* The following declarations control the tabs */
+/* The outer tab box */
+#tabs {
+	text-align: center;
+	margin: 0;
+	padding: 0;
+}
+/* The individual tabs. */
+#tabs span {
+	font-size: 12px;
+	background: #dbdbdb;
+	border: 1px solid #000;
+	padding: 3px;
+}
+/* Links in the tabs */
+
+#tabs #active {
+	background: #f07300;
+	color: #fff;
+}
+
+/* This controls the look of the blocks on the index page.   */
+
+/* The box around the block */
+.block { 
+	margin-bottom: 1.5em;
+	background: url(images/blockbg.gif) top left repeat-x #ededed;
+}
+
+/* The block's title */
+.block .title {
+	border-top: 4px solid #000;
+	border-bottom: 1px solid #ff8400;
+	font-weight: bold;
+	font-size: 16px;
+	color: #666;
+	padding: 2px;
+	padding-left: 8px;
+	margin-bottom: 3px;
+}
+
+/* The block's content */
+.block .content {
+	padding: 6px;
+
+}
+
+#leftindex { 
+	width: 200px;
+	float: left;
+}
+
+#rightindex {
+	margin-left: 220px;
+}
+
+
+/* The next link at the bottom of a multi-chapter story */
+#next { float: right; }
+/* The previous link at the bottom of a multi-chapter story */
+#prev { float: left; }
+
+#browse #category_content { width: 95% !important; margin: 1em auto; }
+
+#loginblock { 
+	margin: 3px 0 0 0;
+	text-align: right;
+}
+
+#loginblock .textbox, #loginblock .checkbox { 
+}
+
+#loginblock .button { 
+	padding: 0; 
+	margin: 0; 
+	font-weight: bold; 
+	font-family: "Arial"; 
+}
+#loginlinks {
+	display: inline;
+}
+#loginlinks A {
+	color: #999;
+}
+
+.label
+	{font-weight: bold;}
+
+/* Story Notes */
+.notes {
+	border: 1px solid #666;
+	margin: 1em;
+	padding: 1em;
+}
+
+.noteinfo {
+	border-top: 1px solid #ff0000;
+}
+	
+/*Newsbox Tweaks */
+.newsbox {
+	margin-bottom: 20px; 
+	border-bottom: 1px solid #000;
+	}
+	
+.newstitle {
+	font-weight: bold; 
+	font-size: 1.3em; 
+	border-bottom: 1px dashed #999; 
+	margin-bottom: 5px;
+	}
+	
+.commenteven, .commentodd {padding: 3px 10px; margin-bottom: 1.5em; border-bottom: 1px dashed #999;}
+.commentsig {font-weight: bold;}
+
+.recentstory , .featuredstory, .commentsig {
+	margin-bottom: 1em;
+	}
+
+
+table {font:12px arial;}

 Binary files /dev/null and b/skins/E-zfiction/pink/images/menubg.gif differ
--- /dev/null
+++ b/skins/E-zfiction/pink/style.css
@@ -1,1 +1,498 @@
-
+/* Some definitions used everywhere */
+BODY { 
+	background: #333 url(images/stripes.png);
+	color: #000;
+	margin: 0;
+	padding: 0;
+	text-align: center;
+	font: 12px arial;
+}
+
+IMG { 
+	border: 0;
+	padding: 0;
+	margin: 0;
+}
+/* Header cells in tables throughout the site */
+TH { 
+	background: #dd2d99;
+	color: #FFF;
+	font-weight: bold;
+}
+/* links */
+A { 
+	color: #333;
+	font-weight: bold;
+	text-decoration: none;
+}
+/* hovering links */
+A:hover {
+	color: #666;
+	font-weight: bold;
+	text-decoration: none;
+}
+
+
+#container {
+	width: 85%;
+	margin: auto;
+	text-align: center;
+ 	background-color: #fff;
+}
+
+/* the box at the top of the page */
+#banner {
+	height: 160px;
+ 	background: #000000 url(images/top_image.gif) top left repeat-x;
+}
+
+#bannerimage{
+	float: left;
+	height: 160px;
+	background: #000000 url(images/left_top_image.gif) top left;
+	text-align: left;
+	width: 350px;
+	}
+
+/* Featured Story Block */
+#featured {
+	margin-left:400px;
+	text-align: left;
+	padding: 5px 15px 5px 1px;
+	color: #fff;
+	}
+
+.headertitle {
+    font-size: 15px;
+	color: #fff;
+	font-weight: bold;
+	border-bottom: 1px solid #c00000;
+	margin-bottom: 3px;
+	}
+
+#featured a:link, #featured a:visited {
+ 	color: #c00000;
+ 	text-decoration: none;
+ 	font-weight: bold;
+}
+
+#featured a:hover{
+ 	color: #333;
+    text-decoration: none;
+	font-weight: bold;
+}
+
+.greytext {color: #999;}
+
+#navigation {
+    background: #ccc url(images/greybg.gif) repeat-x top left;
+}
+
+#search {
+	text-align: right;
+	padding: 3px;
+	}
+
+
+/* The location of the div containing the RSS link in the banner area */
+#rss {
+	position: absolute;
+	right: 50px;
+	top: 55px; 
+}
+
+/* the following defines your menu below the banner div */
+/* the box around the menu and aligning the text to center */
+#menu {
+	padding-top: 5px;
+	padding-bottom: 2px;
+	padding-left: 4px;
+	padding-right: 4px;
+	font-size: 12px;
+	background: url(images/menubg.gif) repeat-x #dd2d99;
+}
+
+#menulist {
+ 	padding: 0px;
+ 	margin: 0px;
+ 	text-align: left;
+}
+
+#menulist ul {
+ 	margin-left: 0;
+ 	padding-left: 0;
+ 	white-space: nowrap;
+}
+
+#menulist li {
+	 display: inline;
+ 	list-style-type: none;
+}
+
+#menulist a { 
+	padding-top: 1px;
+	padding-bottom: 1px;
+ 	padding-left: 7px;
+ 	padding-right: 7px;
+ 	margin-right: 3px;
+	}
+
+#menulist a:link, #menulist a:visited {
+ 	color: #fff;
+ 	text-decoration: none;
+ 	font-weight: bold;
+}
+
+#menulist a:hover{
+ 	color: #000;
+	text-decoration: none;
+	font-weight: bold;
+}
+
+
+/* the footer box at the bottom of the page */
+/* the footer box at the bottom of the page */
+#footercon {
+	clear:both
+}
+
+#footertitle {
+	padding:4px;
+	color: #ccc;
+	font-weight: bold;
+	text-align: left;
+}
+
+#footer,#footertitle,#footerbottom{
+	background:#5d5d5d url(images/blackbg.gif) repeat-x top left
+}
+
+#footerlogin, #footerblurb{
+	background:#ccc url(images/greybg.gif) repeat-x top left
+}
+
+#footerlogin {
+	padding:2px 5px;
+	color: #000;
+}
+
+#footerlogin a:link {color: #fff;}
+
+#footermenu {
+	padding: 5px 2px 4px 4px;
+	font-size: 12px;
+	background: url(images/menubg.gif) repeat-x #c00000;
+}
+
+#footermenu a:link{
+	color: #333;
+}
+
+#footermenu a:visited{
+	color: #333;
+}
+
+#footermenu a:hover{
+	color: #fff;
+}
+
+#footerblurb{
+	padding: 5px;
+}
+
+#footerbottom {padding: 5px;}
+
+/* End universal page setup */
+
+/* this is a carryover from 1.1.  Generally it is used around tables and table cells. */
+.tblborder { 
+	padding: 6px;
+	border-collapse: collapse;
+}
+
+/* Main page surrounds the text between the header and the footer.  
+For IE, height is set to 650 to force the footer down to the bottom of the page where the content is short.  
+And the second declaration is for everyone else so that it will scroll if longer but be a minimum of 650px
+*/
+#mainpage {
+	height: 550px;
+	padding: 15px;
+	background: #FFF;
+	text-align: left;
+}
+html>body #mainpage { 
+	height: auto;
+	min-height: 550px;
+}
+
+/* This makes the actual story text appear in a 750px box, which prevents those at 800x600 from having to scroll sideways to view the story. To remove it, just delete this css and the "div id=skinny" tag (and the closing tag) from viewstory.tpl
+*/
+
+#skinny{
+	margin: auto;
+	width: 750px;
+	padding: 5px;
+	}
+
+
+/* Most pages use pagetitle to format the page's title */
+#pagetitle { 
+	border-top: 4px solid #000;
+	border-bottom: 1px solid #dd2d99;
+	text-align: center;
+	font-size: 14px;
+	color: #666;
+	padding: 3px
+	font-weight: bold;
+	margin-top: 1em;
+	margin-bottom: 1em;
+}
+
+/* 
+Where there's a list of alphabet links #alphabet controls their look. 
+Just to make things simpler #pagelinks controls the look of the links at the bottom of multi-page results
+and will be set here too. Generally, they look alike.
+*/
+/* the box around the links */
+#alphabet, #pagelinks {
+	text-align: center;
+	word-spacing: .1em;
+	margin: 1em;
+}
+/* each link */
+#alphabet A, #pagelinks A {
+	color: #FFF;
+	text-decoration: none;
+	font-weight: bold;
+	background: #dd2d99;
+	border: 1px solid #dd2d99;
+	border-collapse: collapse;
+	padding: 0 2px;
+}
+/* each link when hovered over */
+#alphabet A:hover, #pagelinks A:hover {
+	background: #dbdbdb;
+	color: #fff;
+}
+/* the currently selected letter and currently selected page */
+#alphabet #current_letter, #pagelinks #currentpage {
+	background: #FFF;
+	color: #333;
+	font-weight: bold;
+	border: 1px solid #dd2d99;
+	padding: 0 2px;
+}
+/* End alphabet and page link declarations */
+
+/* labels throughout the site in forms and in other places */
+LABEL, .classification {
+	color: #666;
+	font-weight: bold;
+}
+/* Admin options in various places.  */
+.adminoptions { 
+	color: #dd2d99;
+	font-weight: bold;
+}
+
+/* The listings of stories etc. */
+/* .sectionheader styles the headings "Stories" and "Series" */
+.sectionheader {
+	border-top: 4px solid #000;
+	border-bottom: 1px solid #dd2d99;
+	text-align: center;
+	font-size: 14px;
+	font-weight: bold;
+	padding: 3px;
+	color: #666;
+}
+
+/* The box around each individual story */
+.listbox {
+	margin: 1em 5%;
+	border: 1px solid #dbdbdb;
+}
+
+/* The title bar for each story box. */
+.listbox .title {
+	background: url(images/menubg.gif) repeat-x #dd2d99;
+	color: #FFF;
+	font-weight: bold;
+	padding: 4px;
+	padding-left: 8px;
+}
+
+.listbox .title a{color:#ccc;}
+
+/* The content of the box...summary, categories, etc. */
+.listbox .content {
+	padding: 6px;
+	background-color: #ffffff;
+}
+
+/* The tail info published date etc. on the last line */
+.listbox .tail {
+	background: #ccc url(images/greybg.gif) repeat-x top left;
+	padding: 4px; 
+}
+
+/*End story/series listings */
+
+/* titleblock is used for the title information in series and challenges */
+#titleblock {
+	margin: 0 10%;
+}
+
+/* The pulldown jump menus on several pages. */
+.jumpmenu {
+	text-align: right;
+	margin-right: 1em;
+}
+
+/* On the story page, there's a jumpmenu at the bottom. It looks better centered, so this will replace the declaration above for that 
+drop down list ONLY */
+#pagelinks .jumpmenu {
+	text-align: center;
+}
+
+/* This is used on series and challenges and other places where a response is solicited */
+.respond { 
+	text-align: center;
+	padding: 6px;
+}
+
+/* The sort menu on the categories page */
+#sort { text-align: center; margin: 1em; }
+
+
+/* On pages that don't use listings, the content is surrounded by a div labeled output to */
+#output { 
+	padding: 10px;
+}
+
+/* User Profile stuff */
+/* The top list of information */
+#profile {
+	margin: 1em 10%;
+}
+/* The sort menu in the profile */
+#profile #sort {
+	text-align: right;
+	font-weight: bold;
+	color: #9ab96e;
+ }
+/* The following declarations control the tabs */
+/* The outer tab box */
+#tabs {
+	text-align: center;
+	margin: 0;
+	padding: 0;
+}
+/* The individual tabs. */
+#tabs span {
+	font-size: 12px;
+	background: #dbdbdb;
+	border: 1px solid #000;
+	padding: 3px;
+}
+/* Links in the tabs */
+
+#tabs #active {
+	background: #dd2d99;
+	color: #fff;
+}
+
+/* This controls the look of the blocks on the index page.   */
+
+/* The box around the block */
+.block { 
+	margin-bottom: 1.5em;
+	background: url(images/blockbg.gif) top left repeat-x #ededed;
+}
+
+/* The block's title */
+.block .title {
+	border-top: 4px solid #000;
+	border-bottom: 1px solid #dd2d99;
+	font-weight: bold;
+	font-size: 16px;
+	color: #666;
+	padding: 2px;
+	padding-left: 8px;
+	margin-bottom: 3px;
+}
+
+/* The block's content */
+.block .content {
+	padding: 6px;
+
+}
+
+#leftindex { 
+	width: 200px;
+	float: left;
+}
+
+#rightindex {
+	margin-left: 220px;
+}
+
+
+/* The next link at the bottom of a multi-chapter story */
+#next { float: right; }
+/* The previous link at the bottom of a multi-chapter story */
+#prev { float: left; }
+
+#browse #category_content { width: 95% !important; margin: 1em auto; }
+
+#loginblock { 
+	margin: 3px 0 0 0;
+	text-align: right;
+}
+
+#loginblock .textbox, #loginblock .checkbox { 
+}
+
+#loginblock .button { 
+	padding: 0; 
+	margin: 0; 
+	font-weight: bold; 
+	font-family: "Arial"; 
+}
+#loginlinks {
+	display: inline;
+}
+#loginlinks A {
+	color: #999;
+}
+
+.label
+	{font-weight: bold;}
+
+/* Story Notes */
+#notes {
+	border: 1px solid #666;
+	margin: 1em;
+	padding: 1em;
+}
+
+.noteinfo {
+	border-top: 1px solid #ff0000;
+}
+	
+/*Newsbox Tweaks */
+.newsbox {
+	margin-bottom: 20px; 
+	border-bottom: 1px solid #000;
+	}
+	
+.newstitle {
+	font-weight: bold; 
+	font-size: 1.3em; 
+	border-bottom: 1px dashed #999; 
+	margin-bottom: 5px;
+	}
+	
+.commenteven, .commentodd {padding: 3px 10px; margin-bottom: 1.5em; border-bottom: 1px dashed #999;}
+.commentsig {font-weight: bold;}
+table {font:12px arial;}

--- /dev/null
+++ b/skins/E-zfiction/printable.css
@@ -1,1 +1,15 @@
-
+BODY { font: 12pt "Times New Roman", "Times NR", Times, serif; color: black; background: white; }
+// Gives the page a 1 inch margin when printed.
+@page { margin: 1in; }
+hr { width: 70%; color: #000; background: #000;  margin: 1em auto;}
+.infobox { border: 1px solid #336; margin: 1em 10%; padding: 1em;}
+#pagetitle { font-size: 140%; text-align: center; }
+.label { font-weight: bold; }
+A { font-weight: bold; color: #336; text-decoration: none; }
+.chaptertitle { page-break-before: always; page-break-after: avoid; font-size: 125%; text-align: center; text-decoration: underline; margin-bottom: 1em;}
+.notes { border: 1px solid #336;  margin: 1em 10%;}
+.notes .title { padding: 5px; border-bottom: 1px solid #336; }
+.notes .noteinfo { padding: 5px; }
+#copyright { margin: 1em 10%; border: 1px solid #336; padding: 1ex;}
+#archivedat { text-align: center; }
+.toplink { text-align: right; }

--- /dev/null
+++ b/skins/E-zfiction/profile.tpl
@@ -1,1 +1,14 @@
-
+<!-- START BLOCK : profile -->
+<div id="profile">
+<div id="bio">
+	<div id="biotitle"><span class="label">Penname: </span>{userpenname} <span class="label">Real name: </span>{realname}</div>
+	<div id="biocontent">
+	<span class="label">Member Since: </span>{membersince}<br />
+	<span class="label">Membership status:</span> {userlevel}<br />
+	<span class="label">Bio:</span><br>{image}{bio}<br />
+	{authorfields} 
+	</div>
+</div>
+{adminoptions} {reportthis}
+</div>
+<!-- END BLOCK : profile -->

 Binary files /dev/null and b/skins/E-zfiction/purple/images/menubg.gif differ
--- /dev/null
+++ b/skins/E-zfiction/purple/style.css
@@ -1,1 +1,500 @@
-
+/* Some definitions used everywhere */
+BODY { 
+	background: #333 url(images/stripes.png);
+	color: #000;
+	margin: 0;
+	padding: 0;
+	text-align: center;
+	font: 12px arial;
+}
+
+IMG { 
+	border: 0;
+	padding: 0;
+	margin: 0;
+}
+/* Header cells in tables throughout the site */
+TH { 
+	background: #7b00e3;
+	color: #FFF;
+	font-weight: bold;
+}
+/* links */
+A { 
+	color: #333;
+	font-weight: bold;
+	text-decoration: none;
+}
+/* hovering links */
+A:hover {
+	color: #666;
+	font-weight: bold;
+	text-decoration: none;
+}
+
+
+#container {
+	width: 85%;
+	margin: auto;
+	text-align: center;
+ 	background-color: #fff;
+}
+
+/* the box at the top of the page */
+#banner {
+	height: 160px;
+ 	background: #000000 url(images/top_image.gif) top left repeat-x;
+}
+
+#bannerimage{
+	float: left;
+	height: 160px;
+	background: #000000 url(images/left_top_image.gif) top left;
+	text-align: left;
+	width: 350px;
+	}
+
+/* Featured Story Block */
+#featured {
+	margin-left:400px;
+	text-align: left;
+	padding: 5px 15px 5px 1px;
+	color: #fff;
+	}
+
+.headertitle {
+    font-size: 15px;
+	color: #fff;
+	font-weight: bold;
+	border-bottom: 1px solid #c00000;
+	margin-bottom: 3px;
+	}
+
+#featured a:link, #featured a:visited {
+ 	color: #c00000;
+ 	text-decoration: none;
+ 	font-weight: bold;
+}
+
+#featured a:hover{
+ 	color: #333;
+    text-decoration: none;
+	font-weight: bold;
+}
+
+.greytext {color: #999;}
+
+#navigation {
+    background: #ccc url(images/greybg.gif) repeat-x top left;
+}
+
+#search {
+	text-align: right;
+	padding: 3px;
+	}
+
+
+/* The location of the div containing the RSS link in the banner area */
+#rss {
+	position: absolute;
+	right: 50px;
+	top: 55px; 
+}
+
+/* the following defines your menu below the banner div */
+/* the box around the menu and aligning the text to center */
+#menu {
+	padding-top: 5px;
+	padding-bottom: 2px;
+	padding-left: 4px;
+	padding-right: 4px;
+	font-size: 12px;
+	background: url(images/menubg.gif) repeat-x #7b00e3;
+}
+
+#menulist {
+ 	padding: 0px;
+ 	margin: 0px;
+ 	text-align: left;
+}
+
+#menulist ul {
+ 	margin-left: 0;
+ 	padding-left: 0;
+ 	white-space: nowrap;
+}
+
+#menulist li {
+	 display: inline;
+ 	list-style-type: none;
+}
+
+#menulist a { 
+	padding-top: 1px;
+	padding-bottom: 1px;
+ 	padding-left: 7px;
+ 	padding-right: 7px;
+ 	margin-right: 3px;
+	}
+
+#menulist a:link, #menulist a:visited {
+ 	color: #fff;
+ 	text-decoration: none;
+ 	font-weight: bold;
+}
+
+#menulist a:hover{
+ 	color: #000;
+	text-decoration: none;
+	font-weight: bold;
+}
+
+
+/* the footer box at the bottom of the page */
+/* the footer box at the bottom of the page */
+#footercon {
+	clear:both
+}
+
+#footertitle {
+	padding:4px;
+	color: #ccc;
+	font-weight: bold;
+	text-align: left;
+}
+
+#footer,#footertitle,#footerbottom{
+	background:#5d5d5d url(images/blackbg.gif) repeat-x top left
+}
+
+#footerlogin, #footerblurb{
+	background:#ccc url(images/greybg.gif) repeat-x top left
+}
+
+#footerlogin {
+	padding:2px 5px;
+	color: #000;
+}
+
+#footerlogin a:link {color: #fff;}
+
+#footermenu {
+	padding: 5px 2px 4px 4px;
+	font-size: 12px;
+	background: url(images/menubg.gif) repeat-x #c00000;
+}
+
+#footermenu a:link{
+	color: #333;
+}
+
+#footermenu a:visited{
+	color: #333;
+}
+
+#footermenu a:hover{
+	color: #fff;
+}
+
+#footerblurb{
+	padding: 5px;
+}
+
+#footerbottom {padding: 5px;}
+
+
+/* End universal page setup */
+
+/* this is a carryover from 1.1.  Generally it is used around tables and table cells. */
+.tblborder { 
+	padding: 6px;
+	border-collapse: collapse;
+}
+
+/* Main page surrounds the text between the header and the footer.  
+For IE, height is set to 650 to force the footer down to the bottom of the page where the content is short.  
+And the second declaration is for everyone else so that it will scroll if longer but be a minimum of 650px
+*/
+#mainpage {
+	height: 550px;
+	padding: 15px;
+	background: #FFF;
+	text-align: left;
+}
+html>body #mainpage { 
+	height: auto;
+	min-height: 550px;
+}
+
+/* This makes the actual story text appear in a 750px box, which prevents those at 800x600 from having to scroll sideways to view the story. To remove it, just delete this css and the "div id=skinny" tag (and the closing tag) from viewstory.tpl
+*/
+
+#skinny{
+	margin: auto;
+	width: 750px;
+	padding: 5px;
+	}
+
+
+/* Most pages use pagetitle to format the page's title */
+#pagetitle { 
+	border-top: 4px solid #000;
+	border-bottom: 1px solid #7b00e3;
+	text-align: center;
+	font-size: 14px;
+	color: #666;
+	padding: 3px
+	font-weight: bold;
+	margin-top: 1em;
+	margin-bottom: 1em;
+}
+
+/* 
+Where there's a list of alphabet links #alphabet controls their look. 
+Just to make things simpler #pagelinks controls the look of the links at the bottom of multi-page results
+and will be set here too. Generally, they look alike.
+*/
+/* the box around the links */
+#alphabet, #pagelinks {
+	text-align: center;
+	word-spacing: .1em;
+	margin: 1em;
+}
+/* each link */
+#alphabet A, #pagelinks A {
+	color: #FFF;
+	text-decoration: none;
+	font-weight: bold;
+	background: #7b00e3;
+	border: 1px solid #7b00e3;
+	border-collapse: collapse;
+	padding: 0 2px;
+}
+/* each link when hovered over */
+#alphabet A:hover, #pagelinks A:hover {
+	background: #dbdbdb;
+	color: #fff;
+}
+/* the currently selected letter and currently selected page */
+#alphabet #current_letter, #pagelinks #currentpage {
+	background: #FFF;
+	color: #333;
+	font-weight: bold;
+	border: 1px solid #7b00e3;
+	padding: 0 2px;
+}
+/* End alphabet and page link declarations */
+
+/* labels throughout the site in forms and in other places */
+LABEL, .classification {
+	color: #666;
+	font-weight: bold;
+}
+/* Admin options in various places.  */
+.adminoptions { 
+	color: #7b00e3;
+	font-weight: bold;
+}
+
+/* The listings of stories etc. */
+/* .sectionheader styles the headings "Stories" and "Series" */
+.sectionheader {
+	border-top: 4px solid #000;
+	border-bottom: 1px solid #7b00e3;
+	text-align: center;
+	font-size: 14px;
+	font-weight: bold;
+	padding: 3px;
+	color: #666;
+}
+
+/* The box around each individual story */
+.listbox {
+	margin: 1em 5%;
+	border: 1px solid #dbdbdb;
+}
+
+/* The title bar for each story box. */
+.listbox .title {
+	background: url(images/menubg.gif) repeat-x #7b00e3;
+	color: #FFF;
+	font-weight: bold;
+	padding: 4px;
+	padding-left: 8px;
+}
+
+/* The content of the box...summary, categories, etc. */
+.listbox .content {
+	padding: 6px;
+	background-color: #ffffff;
+}
+
+/* The tail info published date etc. on the last line */
+.listbox .tail {
+	background: #ccc url(images/greybg.gif) repeat-x top left;
+	padding: 4px; 
+}
+
+.listbox .title a{color:#ccc;}
+
+/*End story/series listings */
+
+/* titleblock is used for the title information in series and challenges */
+#titleblock {
+	margin: 0 10%;
+}
+
+/* The pulldown jump menus on several pages. */
+.jumpmenu {
+	text-align: right;
+	margin-right: 1em;
+}
+
+/* On the story page, there's a jumpmenu at the bottom. It looks better centered, so this will replace the declaration above for that 
+drop down list ONLY */
+#pagelinks .jumpmenu {
+	text-align: center;
+}
+
+/* This is used on series and challenges and other places where a response is solicited */
+.respond { 
+	text-align: center;
+	padding: 6px;
+}
+
+/* The sort menu on the categories page */
+#sort { text-align: center; margin: 1em; }
+
+
+/* On pages that don't use listings, the content is surrounded by a div labeled output to */
+#output { 
+	padding: 10px;
+}
+
+/* User Profile stuff */
+/* The top list of information */
+#profile {
+	margin: 1em 10%;
+}
+/* The sort menu in the profile */
+#profile #sort {
+	text-align: right;
+	font-weight: bold;
+	color: #9ab96e;
+ }
+/* The following declarations control the tabs */
+/* The outer tab box */
+#tabs {
+	text-align: center;
+	margin: 0;
+	padding: 0;
+}
+/* The individual tabs. */
+#tabs span {
+	font-size: 12px;
+	background: #dbdbdb;
+	border: 1px solid #000;
+	padding: 3px;
+}
+/* Links in the tabs */
+
+#tabs #active {
+	background: #7b00e3;
+	color: #fff;
+}
+
+/* This controls the look of the blocks on the index page.   */
+
+/* The box around the block */
+.block { 
+	margin-bottom: 1.5em;
+	background: url(images/blockbg.gif) top left repeat-x #ededed;
+}
+
+/* The block's title */
+.block .title {
+	border-top: 4px solid #000;
+	border-bottom: 1px solid #7b00e3;
+	font-weight: bold;
+	font-size: 16px;
+	color: #666;
+	padding: 2px;
+	padding-left: 8px;
+	margin-bottom: 3px;
+}
+
+/* The block's content */
+.block .content {
+	padding: 6px;
+
+}
+
+#leftindex { 
+	width: 200px;
+	float: left;
+}
+
+#rightindex {
+	margin-left: 220px;
+}
+
+
+/* The next link at the bottom of a multi-chapter story */
+#next { float: right; }
+/* The previous link at the bottom of a multi-chapter story */
+#prev { float: left; }
+
+#browse #category_content { width: 95% !important; margin: 1em auto; }
+
+#loginblock { 
+	margin: 3px 0 0 0;
+	text-align: right;
+}
+
+#loginblock .textbox, #loginblock .checkbox { 
+}
+
+#loginblock .button { 
+	padding: 0; 
+	margin: 0; 
+	font-weight: bold; 
+	font-family: "Arial"; 
+}
+#loginlinks {
+	display: inline;
+}
+#loginlinks A {
+	color: #999;
+}
+
+.label
+	{font-weight: bold;}
+
+/* Story Notes */
+#notes {
+	border: 1px solid #666;
+	margin: 1em;
+	padding: 1em;
+}
+
+.noteinfo {
+	border-top: 1px solid #ff0000;
+}
+	
+/*Newsbox Tweaks */
+.newsbox {
+	margin-bottom: 20px; 
+	border-bottom: 1px solid #000;
+	}
+	
+.newstitle {
+	font-weight: bold; 
+	font-size: 1.3em; 
+	border-bottom: 1px dashed #999; 
+	margin-bottom: 5px;
+	}
+	
+.commenteven, .commentodd {padding: 3px 10px; margin-bottom: 1.5em; border-bottom: 1px dashed #999;}
+.commentsig {font-weight: bold;}
+
+table {font:12px arial;}

--- /dev/null
+++ b/skins/E-zfiction/storyindex.tpl
@@ -1,1 +1,29 @@
-
+<!-- INCLUDE BLOCK : header -->
+<div id="pagetitle">{title} by {author}</div>
+<div id="sort"> [{reviews} - {numreviews}] {score}{printicon}</div>
+<div id="output">
+<div class="jumpmenu">{jumpmenu}</div>
+<div class="listbox">
+<div class="content">{featuredstory}<span class="label">Summary: </span>{summary}<br />
+<span class="label">Rated:</span> {rating}<br />
+<span class="label">Categories:</span> {category} <span class="label">Characters: </span> {characters}<br />
+{classifications}
+<span class="label">Challenges:</span> {challengelinks}<br /> <span class="label">Series:</span> {serieslinks}<br />
+<span class="label">Chapters: </span> {numchapters} <span class="label">Completed:</span> {completed} <br /> 
+<span class="label">Word count:</span> {wordcount} <span class="label">Read:</span> {count}<br />
+<span class="label"> Published: </span>{published} <span class="label">Updated:</span> {updated} </div>
+{adminlinks}
+</div>
+<div style='text-align: center;'>{addtofaves}</div>
+<!-- START BLOCK : storynotes -->
+<div class='notes'><div class='title'><span class='label'>Story Notes:</span></div><div class='noteinfo'>{storynotes}</div></div>
+<!-- END BLOCK : storynotes -->
+<!-- START BLOCK : storyindexblock -->
+      <p><b>{chapternumber}. {title} </b>by {author} [{reviews} - {numreviews}] {ratingpics} ({wordcount} words)<br />
+	{chapternotes}{adminoptions}</p>
+<!-- END BLOCK : storyindexblock -->
+<div id="pagelinks"><div class="jumpmenu">{jumpmenu2}</div></div>
+<div class="respond">{roundrobin}</div>
+{reviewform}
+</div>
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/E-zfiction/style.css
@@ -1,1 +1,493 @@
-
+/* Some definitions used everywhere */
+BODY { 
+	background: #333 url(images/stripes.png);
+	color: #000;
+	margin: 0;
+	padding: 0;
+	text-align: center;
+	font: 12px arial;
+}
+
+IMG { 
+	border: 0;
+	padding: 0;
+	margin: 0;
+}
+/* Header cells in tables throughout the site */
+TH { 
+	background: #c00000;
+	color: #FFF;
+	font-weight: bold;
+}
+/* links */
+A { 
+	color: #333;
+	font-weight: bold;
+	text-decoration: none;
+}
+/* hovering links */
+A:hover {
+	color: #666;
+	font-weight: bold;
+	text-decoration: none;
+}
+
+#container {
+	width: 85%;
+	margin: auto;
+	text-align: center;
+ 	background-color: #fff;
+}
+
+/* the box at the top of the page */
+#banner {
+	height: 160px;
+ 	background: #000000 url(images/top_image.gif) top left repeat-x;
+}
+
+#bannerimage{
+	float: left;
+	height: 160px;
+	background: #000000 url(images/left_top_image.gif) top left;
+	text-align: left;
+	width: 350px;
+	}
+
+/* Featured Story Block */
+#featured {
+	margin-left:400px;
+	text-align: left;
+	padding: 5px 15px 5px 1px;
+	color: #fff;
+	}
+
+.headertitle {
+    font-size: 15px;
+	color: #fff;
+	font-weight: bold;
+	border-bottom: 1px solid #c00000;
+	margin-bottom: 3px;
+	}
+
+#featured a:link, #featured a:visited {
+ 	color: #c00000;
+ 	text-decoration: none;
+ 	font-weight: bold;
+}
+
+#featured a:hover{
+ 	color: #333;
+    text-decoration: none;
+	font-weight: bold;
+}
+
+.greytext {color: #999;}
+
+/* Header Menu */
+
+#navigation {
+    background: #ccc url(images/greybg.gif) repeat-x top left;
+}
+
+#search {
+	text-align: right;
+	padding: 3px;
+	}
+
+
+/* The location of the div containing the RSS link in the banner area */
+#rss {
+	position: absolute;
+	right: 50px;
+	top: 55px; 
+}
+
+/* the following defines your menu below the banner div */
+/* the box around the menu and aligning the text to center */
+#menu {
+	padding: 5px 2px 4px 4px;
+	font-size: 12px;
+	background: url(images/menubg.gif) repeat-x #c00000;
+}
+
+#menulist {
+ 	padding: 0px;
+ 	margin: 0px;
+ 	text-align: left;
+}
+
+#menulist ul {
+ 	margin-left: 0;
+ 	padding-left: 0;
+ 	white-space: nowrap;
+}
+
+#menulist li {
+	 display: inline;
+ 	list-style-type: none;
+}
+
+#menulist a { 
+	padding: 1px 7px;
+ 	margin-right: 3px;
+	}
+
+#menulist a:link, #menulist a:visited {
+ 	color: #fff;
+ 	text-decoration: none;
+ 	font-weight: bold;
+}
+
+#menulist a:hover{
+ 	color: #000;
+	text-decoration: none;
+	font-weight: bold;
+}
+
+
+/* the footer box at the bottom of the page */
+#footercon {
+	clear:both
+}
+
+#footertitle {
+	padding:4px;
+	color: #ccc;
+	font-weight: bold;
+	text-align: left;
+}
+
+#footer,#footertitle,#footerbottom{
+	background:#5d5d5d url(images/blackbg.gif) repeat-x top left
+}
+
+#footerlogin, #footerblurb{
+	background:#ccc url(images/greybg.gif) repeat-x top left
+}
+
+#footerlogin {
+	padding:2px 5px;
+	color: #000;
+}
+
+#footerlogin a:link {color: #fff;}
+
+#footermenu {
+	padding: 5px 2px 4px 4px;
+	font-size: 12px;
+	background: url(images/menubg.gif) repeat-x #c00000;
+}
+
+#footermenu a:link{
+	color: #333;
+}
+
+#footermenu a:visited{
+	color: #333;
+}
+
+#footermenu a:hover{
+	color: #fff;
+}
+
+#footerblurb{
+	padding: 5px;
+}
+
+#footerbottom {padding: 5px;}
+
+
+/* End universal page setup */
+
+/* this is a carryover from 1.1.  Generally it is used around tables and table cells. */
+.tblborder { 
+	padding: 6px;
+	border-collapse: collapse;
+}
+
+/* Main page surrounds the text between the header and the footer.  
+For IE, height is set to 650 to force the footer down to the bottom of the page where the content is short.  
+And the second declaration is for everyone else so that it will scroll if longer but be a minimum of 650px
+*/
+#mainpage {
+	height: 550px;
+	padding: 15px;
+	background: #FFF;
+	text-align: left;
+}
+html>body #mainpage { 
+	height: auto;
+	min-height: 550px;
+}
+
+/* This makes the actual story text appear in a 750px box, which prevents those at 800x600 from having to scroll sideways to view the story. To remove it, just delete this css and the "div id=skinny" tag (and the closing tag) from viewstory.tpl
+*/
+
+#skinny{
+	margin: auto;
+	width: 750px;
+	padding: 5px;
+	}
+
+
+/* Most pages use pagetitle to format the page's title */
+#pagetitle { 
+	border-top: 4px solid #000;
+	border-bottom: 1px solid #c00000;
+	text-align: center;
+	font-size: 14px;
+	color: #666;
+	padding: 3px
+	font-weight: bold;
+	margin-top: 1em;
+	margin-bottom: 1em;
+}
+
+/* 
+Where there's a list of alphabet links #alphabet controls their look. 
+Just to make things simpler #pagelinks controls the look of the links at the bottom of multi-page results
+and will be set here too. Generally, they look alike.
+*/
+/* the box around the links */
+#alphabet, #pagelinks {
+	text-align: center;
+	word-spacing: .1em;
+	margin: 1em;
+}
+/* each link */
+#alphabet A, #pagelinks A {
+	color: #FFF;
+	text-decoration: none;
+	font-weight: bold;
+	background: #c00000;
+	border: 1px solid #c00000;
+	border-collapse: collapse;
+	padding: 0 2px;
+}
+/* each link when hovered over */
+#alphabet A:hover, #pagelinks A:hover {
+	background: #dbdbdb;
+	color: #fff;
+}
+/* the currently selected letter and currently selected page */
+#alphabet #current_letter, #pagelinks #currentpage {
+	background: #FFF;
+	color: #333;
+	font-weight: bold;
+	border: 1px solid #c00000;
+	padding: 0 2px;
+}
+/* End alphabet and page link declarations */
+
+/* labels throughout the site in forms and in other places */
+LABEL, .classification {
+	color: #666;
+	font-weight: bold;
+}
+/* Admin options in various places.  */
+.adminoptions { 
+	color: #c00000;
+	font-weight: bold;
+}
+
+/* The listings of stories etc. */
+/* .sectionheader styles the headings "Stories" and "Series" */
+.sectionheader {
+	border-top: 4px solid #000;
+	border-bottom: 1px solid #c00000;
+	text-align: center;
+	font-size: 14px;
+	font-weight: bold;
+	padding: 3px;
+	color: #666;
+}
+
+/* The box around each individual story */
+.listbox {
+	margin: 1em 5%;
+	border: 1px solid #dbdbdb;
+}
+
+/* The title bar for each story box. */
+.listbox .title {
+	background: url(images/menubg.gif) repeat-x #c00000;
+	color: #FFF;
+	font-weight: bold;
+	padding: 4px;
+	padding-left: 8px;
+}
+
+.listbox .title a{color:#ccc;}
+
+/* The content of the box...summary, categories, etc. */
+.listbox .content {
+	padding: 6px;
+	background-color: #ffffff;
+}
+
+/* The tail info published date etc. on the last line */
+.listbox .tail {
+	background: #ccc url(images/greybg.gif) repeat-x top left;
+	padding: 4px; 
+}
+
+/*End story/series listings */
+
+/* titleblock is used for the title information in series and challenges */
+#titleblock {
+	margin: 0 10%;
+}
+
+/* The pulldown jump menus on several pages. */
+.jumpmenu {
+	text-align: right;
+	margin-right: 1em;
+}
+
+/* On the story page, there's a jumpmenu at the bottom. It looks better centered, so this will replace the declaration above for that 
+drop down list ONLY */
+#pagelinks .jumpmenu {
+	text-align: center;
+}
+
+/* This is used on series and challenges and other places where a response is solicited */
+.respond { 
+	text-align: center;
+	padding: 6px;
+}
+
+/* The sort menu on the categories page */
+#sort { text-align: center; margin: 1em; }
+
+
+/* On pages that don't use listings, the content is surrounded by a div labeled output to */
+#output { 
+	padding: 10px;
+}
+
+/* User Profile stuff */
+/* The top list of information */
+#profile {
+	margin: 1em 10%;
+}
+/* The sort menu in the profile */
+#profile #sort {
+	text-align: right;
+	font-weight: bold;
+	color: #9ab96e;
+ }
+/* The following declarations control the tabs */
+/* The outer tab box */
+#tabs {
+	text-align: center;
+	margin: 0;
+	padding: 0;
+}
+/* The individual tabs. */
+#tabs span {
+	font-size: 12px;
+	background: #dbdbdb;
+	border: 1px solid #000;
+	padding: 3px;
+}
+/* Links in the tabs */
+
+#tabs #active {
+	background: #c00000;
+	color: #fff;
+}
+
+/* This controls the look of the blocks on the index page.   */
+
+/* The box around the block */
+.block { 
+	margin-bottom: 1.5em;
+	background: url(images/blockbg.gif) top left repeat-x #ededed;
+}
+
+/* The block's title */
+.block .title {
+	border-top: 4px solid #000;
+	border-bottom: 1px solid #c00000;
+	font-weight: bold;
+	font-size: 16px;
+	color: #666;
+	padding: 2px;
+	padding-left: 8px;
+	margin-bottom: 3px;
+}
+
+/* The block's content */
+.block .content {
+	padding: 6px;
+}
+
+#leftindex { 
+	width: 200px;
+	float: left;
+}
+
+#rightindex {
+	margin-left: 220px;
+}
+
+
+/* The next link at the bottom of a multi-chapter story */
+#next { float: right; }
+/* The previous link at the bottom of a multi-chapter story */
+#prev { float: left; }
+
+#browse #category_content { width: 95% !important; margin: 1em auto; }
+
+#loginblock { 
+	margin: 3px 0 0 0;
+	text-align: right;
+}
+
+#loginblock .textbox, #loginblock .checkbox { 
+}
+
+#loginblock .button { 
+	padding: 0; 
+	margin: 0; 
+	font-weight: bold; 
+	font-family: "Arial"; 
+}
+#loginlinks {
+	display: inline;
+}
+#loginlinks A {
+	color: #999;
+}
+
+.label
+	{font-weight: bold;}
+
+/* Story Notes */
+.notes {
+	border: 1px solid #666;
+	margin: 1em;
+	padding: 1em;
+}
+
+.noteinfo {
+	border-top: 1px solid #ff0000;
+}
+	
+/*Newsbox Tweaks */
+.newsbox {
+	margin-bottom: 20px; 
+	border-bottom: 1px solid #000;
+	}
+	
+.newstitle {
+	font-weight: bold; 
+	font-size: 1.3em; 
+	border-bottom: 1px dashed #999; 
+	margin-bottom: 5px;
+	}
+	
+.commenteven, .commentodd {padding: 3px 10px; margin-bottom: 1.5em; border-bottom: 1px dashed #999;}
+.commentsig {font-weight: bold;}
+
+table {font:12px arial;}

--- /dev/null
+++ b/skins/E-zfiction/user.tpl
@@ -1,1 +1,15 @@
-
+<!-- INCLUDE BLOCK : header -->
+<div id="profile">
+<!-- INCLUDE BLOCK : profile -->
+{adminoptions}
+<div id="sort">{sort}</div>
+</div>
+	<div id="tabs">
+<!-- START BLOCK : paneltabs -->
+<span {class}>{link} {count}</span>
+<!-- END BLOCK : paneltabs -->
+<div class='cleaner' style='clear: both;'>&nbsp;</div>
+	</div>
+{output}
+<!-- INCLUDE BLOCK : listings -->
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/E-zfiction/variables.php
@@ -1,1 +1,14 @@
-
+<?php
+$blocks["categories"]["status"] = 1;
+$blocks["info"]["status"] = 2;
+$blocks["login"]["status"] = 1;
+$blocks['login']['acctlink'] = 2;
+$blocks["login"]["form"] = 1; // Long form with register and lost password options
+$blocks["random"]["status"] = 2;
+$blocks["recent"]["status"] = 2;
+$blocks["featured"]["status"] = 1;
+$blocks["featured"]["tpl"] = 2;
+$blocks["skinchange"]["status"] = 1;
+$blocks["news"]["status"] = 2;
+$displayprofile = 1;
+?>

--- /dev/null
+++ b/skins/E-zfiction/viewstory.tpl
@@ -1,1 +1,26 @@
-
+<!-- INCLUDE BLOCK : header -->
+<div id="pagetitle">{title} by {author}</div>
+<div class="storyinfo"> [{reviews} - {numreviews}]<br />
+{toc} {reportthis}<br />
+{printicon} <br />
+{adminlinks} </div>
+<div class="jumpmenu">{textsizer}{jumpmenu}</div>
+<!-- START BLOCK : storynotes -->
+<div class='notes'>
+	<div class='title'><span class='label'>Story Notes:</span></div>
+	<div class='noteinfo'>{storynotes}</div>
+</div>
+<!-- END BLOCK : storynotes -->
+<!-- START BLOCK : notes -->
+<div class='notes'><div class='title'><span class='label'>Author's Chapter Notes:</span></div><div class='noteinfo'>{notes}</div></div>
+<!-- END BLOCK : notes -->
+<div id="story">{story}</div>
+<!-- START BLOCK : endnotes -->
+<div class='notes'><div class='title'><span class='label'>Chapter End Notes:</span></div><div class='noteinfo'>{endnotes}</div></div>
+<!-- END BLOCK : endnotes -->
+<div id="prev">{prev}</div><div id="next">{next}</div>
+{storyend}
+<div class="jumpmenu2">{jumpmenu2}</div>
+<div class="respond">{addtofaves} {roundrobin}</div>
+{reviewform}
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/Epiphany/base.css
@@ -1,1 +1,128 @@
+/* 
+RESPONSIVE GRID LAYOUT
+created by http://artphilia.de
+ */
 
+* {
+	margin: 0;
+	padding: 0;
+	}
+
+*, *:after, *:before {
+	-webkit-box-sizing: border-box;
+	-moz-box-sizing: border-box;
+	box-sizing: border-box;
+}
+
+.grid-wrapper {
+	width: 100%;
+	max-width: 1280px;
+	min-width: 755px;
+	margin: 0 auto;
+	padding: 6px;
+	overflow: hidden;
+}
+
+.grid-wrapper:after {
+	content: "";
+	display: table;
+	clear: both;
+}
+
+[class*='gb-'] {
+	float: left;
+	padding: 6px;
+}
+
+[class*='gb-']:last-of-type {
+	padding-right: 0;
+}
+
+/* class gb -- grid box */
+.gb-100, .gb-full {
+	width: 100%;
+}
+
+.gb-90 {
+	width: 90%;
+}
+
+.gb-80 {
+	width: 80%;
+}
+
+.gb-70 {
+	width: 70%;
+}
+
+.gb-60 {
+	width: 60%;
+}
+
+.gb-50, .gb-half, .gb-2qrt {
+	width: 50%;
+}
+
+.gb-40 {
+	width: 40%;
+}
+
+.gb-30 {
+	width: 30%;
+}
+
+.gb-20 {
+	width: 20%;
+}
+
+.gb-10 {
+	width: 10%;
+}
+
+.gb-1thrd, .gb-33 {
+	width: 33%;
+}
+
+.gb-2thrd {
+	width: 67%;
+}
+
+.gb-1qrt, .gb-25 {
+	width: 25%;
+}
+
+.gb-3qrt, .gb-75 {
+	width: 75%;
+}
+
+/* golden ratio: http://en.wikipedia.org/wiki/Golden_ratio */
+.gb-golden1 {
+	width: 38.2%;
+}
+
+.gb-golden2 {
+	width: 61.8%;
+}
+
+@media handheld, only screen and (max-width: 825px) {
+.grid-wrapper {
+	width: 100%;
+	min-width: 0;
+	margin: 0;
+	padding: 6px;
+}
+
+[class*="gb-"] { 
+	display: block;
+	float: none;
+	padding: 0;
+	margin: 0;
+	width: 100% !important;
+}
+
+@media screen and ( max-width: 567px )  {
+.screen-micro,
+	.screen-micro > [class*="gb-"] {
+	display: none; 	
+	}
+}

--- /dev/null
+++ b/skins/Epiphany/browse.tpl
@@ -1,1 +1,8 @@
+<!-- INCLUDE BLOCK : header -->
+{output}<h2>{otherresults}</h2>
+<!-- START BLOCK : sortform -->
+<div id="sortform">{sortbegin}{categorymenu} {charactermenu1} {charactermenu2} {pairingsmenu} {ratingmenu} {classmenu} {sortmenu} {completemenu} {sortend}</div>
+<!-- END BLOCK : sortform -->
+<!-- INCLUDE BLOCK : listings -->
+<!-- INCLUDE BLOCK : footer -->
 

--- /dev/null
+++ b/skins/Epiphany/categories.tpl
@@ -1,1 +1,7 @@
+<!-- START BLOCK : categoryblock -->
+<div class="category">
+&rarr;  {link} {count}
+<div class="cat_description">{image} {description}</div>
+</div>
+<!-- END BLOCK : categoryblock -->
 

--- /dev/null
+++ b/skins/Epiphany/challenges.tpl
@@ -1,1 +1,9 @@
-
+<!-- START BLOCK : challenge -->
+<div class="listbox {oddeven} clearfix">
+<h1>{title} by {author}</h1>
+<b>Summary: </b>{summary}<br />
+<b>Categories:</b> {category} <b>Characters: </b>{characters}<br />
+{adminoptions}
+<div align="center">{respond}</div>
+</div><br>
+<!-- END BLOCK : challenge -->

--- /dev/null
+++ b/skins/Epiphany/comments.tpl
@@ -1,1 +1,6 @@
-
+<!-- START BLOCK : commentbox -->
+<div class="comment {oddeven} clearfix">
+<i>{uname} schrieb am {date}</i><br><p>{comment}</p>
+{adminoptions}
+</div><br>
+<!-- END BLOCK : commentbox -->

--- /dev/null
+++ b/skins/Epiphany/default.tpl
@@ -1,1 +1,4 @@
-
+<!-- INCLUDE BLOCK : header -->
+					{output}
+<!-- INCLUDE BLOCK : listings -->
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/Epiphany/footer.tpl
@@ -1,1 +1,30 @@
+		</div>
+		<div class="gb-20 sidebar">
+				<h3><span>{info_title}</span></h3>{info_content}<br /><br />{online_content}
 
+				<!-- Just delete the < !-- and -- > before and after the shoutbox/poll to make it visible. Remember to add the blocks at your admin panel. -->
+				<br />Your <b>shoutbox and/or poll</b> could be here. Just edit the footer.tpl<br />
+				<!-- <h3>{shoutbox_title}</h3>{shoutbox_content} -->
+				<!-- <h3>{poll_title}</h3>{poll_content} -->
+				<br />
+				<div align="center">{xml} {skinchange_content}</div>
+		</div>
+
+		<div class="gb-full">
+				<div class="gb-33"><h3>{featured_title}</h3>{featured_content}</div>
+				<div class="gb-33"><h3>{recent_title}</h3>{recent_content}</div>
+				<div class="gb-33"><h3>{random_title}</h3>{random_content}</div>
+		</div>
+		
+	<!-- START BLOCK : footer -->
+    <div class="gb-full footer">
+			<hr />
+			{footer}
+			<div class="copyright">Skin by <a href="http://artphilia.de">Artphilia Designs</a>. All rights reserved.</div>
+    </div>
+
+	</div> <!-- closing content grid -->   			
+	<!-- END BLOCK : footer -->
+
+	</body>
+</html>

--- /dev/null
+++ b/skins/Epiphany/header.tpl
@@ -1,1 +1,18 @@
-
+<!-- START BLOCK : header -->
+<body>
+	<div class="grid-wrapper container">
+			<div class="gb-full">
+				<div id="header">
+					<div class="gb-50">
+						<div align="left"><span class="fa fa-power-off"></span> {adminarea} {login} {logout}</div><div id="login">{login_content}</div>
+					</div>
+					<div class="gb-50">
+						<div align="right">{search_content}</div>
+					</div>
+					<div id="sitename">{sitename}</div>
+					<div id="slogan">{slogan}</div>
+					<div id="menu">{menu_content}</div>
+				</div>
+			</div>
+		<div class="gb-80 content">
+<!-- END BLOCK : header -->

 Binary files /dev/null and b/skins/Epiphany/images/bg-pattern.png differ
 Binary files /dev/null and b/skins/Epiphany/images/bg.png differ
 Binary files /dev/null and b/skins/Epiphany/images/preview.jpg differ
--- /dev/null
+++ b/skins/Epiphany/index.tpl
@@ -1,1 +1,6 @@
-
+<!-- INCLUDE BLOCK : header -->
+			<div class="gb-full">
+				<div class="gb-50">{welcome}</div>
+				<div class="gb-50"><h1><span>{news_title}</span></h1>{news_content} <br /> <div align="center">{newsarchive}</div></div>
+			</div>
+	<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/Epiphany/listings.tpl
@@ -1,1 +1,32 @@
+<!-- START BLOCK : listings -->
+{seriesheader}<br />
+<!-- START BLOCK : seriesblock -->
+<div class="listbox {oddeven}  clearfix">
+<h2>{title} {new} by {author}</h2>
+<b>Rated:</b> {rating} &bull; {numreviews} {reviews} {score} {featuredstory} {roundrobin}<br />
+<b>Summary:</b> {summary}<br />
+<div class="storyinfo">
+<b>Categories:</b> {category}<br />
+<b>Characters:</b> {characters}<br />
+{classifications}
+<b>Open:</b> {open} {comment}<br />{adminoptions}
+</div></div>
+<!-- END BLOCK : seriesblock -->
 
+{stories}<br />
+<!-- START BLOCK : storyblock -->
+<div class="listbox {oddeven} clearfix">
+<h2>{title} {new} by {author}</h2>
+<b>Rated:</b> {rating} &bull; {numreviews} {reviews} {score} {featuredstory} {roundrobin}<br />
+<b>Summary:</b> {summary}<br />
+<div class="storyinfo">
+<b>Categories:</b> {category}<br />
+<b>Characters:</b> {characters}<br />
+{classifications}
+<b>Series:</b> {serieslinks}<br />
+<b>Chapters:</b> {numchapters} | <b>Completed:</b> {completed} | <b>Words:</b> {wordcount} | <b>Hits</b>: {count} | <b>Published:</b> </b>{published} | <b>Updated:</b> {updated}
+<br />{addtofaves} {reportthis} {comment}<br />{adminlinks}<br />
+</div></div>
+<!-- END BLOCK : storyblock -->
+{pagelinks}
+<!-- END BLOCK : listings -->

--- /dev/null
+++ b/skins/Epiphany/newsbox.tpl
@@ -1,1 +1,8 @@
-
+<!-- START BLOCK : newsbox -->
+<div id="newsbox">
+<h2>{newstitle}</h2>
+{newsstory}
+<div class="newssig">by <i class="fa fa-user"></i> {newsauthor} @ {newsdate} &nbsp;{adminoptions}</div>
+<div class="newscom">{newscomments}</div>
+</div>
+<!-- END BLOCK : newsbox -->

--- /dev/null
+++ b/skins/Epiphany/printable.css
@@ -1,1 +1,32 @@
+body {
+	font-family: 'Cambria', 'Times New Roman', 'Garamond', serif;
+	font-size: 11px;
+	color: #000000;
+	background-color: #ffffff;
+	}
 
+/* Gives the page a 1 inch margin when printed. */
+@page { margin: 1in; }
+
+hr { width: 70%; color: #000000; background-color: #000000;  margin: 2em auto; }
+
+.infobox, .notes, #copyright { border: 1px solid #efefef; margin: 10%; padding: 50px; }
+
+h1 { margin-top: 15px; font-size: 200%; font-weight: normal; font-style: italic; text-align: center; }
+
+b { font-weight: bold; }
+
+a { font-weight: normal; color: #fcbb00; text-decoration: none; }
+
+.chaptertitle {
+	page-break-before: always;
+	page-break-after: avoid;
+	font-size: 140%;
+	text-align: center;
+	text-decoration: underline;
+	font-style: italic;
+	margin-bottom: 1em;
+	}
+
+.title { padding: 5px; border-bottom: 1px dashed #efefef; }
+.noteinfo { padding: 5px; }

--- /dev/null
+++ b/skins/Epiphany/profile.tpl
@@ -1,1 +1,20 @@
+<!-- START BLOCK : profile -->
+<div id="bio">
+	<!-- Website Profile Link -->
+	
+	<i class="fa fa-user"></i> {userpenname}<br />
+	<i class="fa fa-calendar"></i> {membersince}<br />
+	<i class="fa fa-globe"></i> {location}<br />
+	<i class="fa fa-home"></i> {website}<br>
+  <i class="fa fa-twitter"></i> {twitter}<br>
 
+	<!-- End Website Profile Link -->
+	
+
+	<br><blockquote>{bio}</blockquote><br>
+
+</div>
+<div align="right">{adminoptions}</div>
+<br />
+{reportthis}
+<!-- END BLOCK : profile -->

--- /dev/null
+++ b/skins/Epiphany/recommendations.tpl
@@ -1,1 +1,18 @@
+<!-- START BLOCK : recommendation -->
+<div class="listbox {oddeven} clearfix">
+<h1> {title} {new} von {author}</h1>
+<b>Eingestuft:</b> {rating} {score} {featuredstory} [{reviews} - {numreviews}] 
+<div class="content">
+<b>Inhalt:</b> {summary} <br />
+<b>Empfohlen von:</b> {recommender}<br />
+<b>Empfehlungskommentar:</b> {reccomment}<br />
+<b>Kategorie:</b> {category} <br />
+<b>Charaktere:</b> {characters}<br />
+{classifications}
+<b>Abgeschlossen:</b> {completed}  
+{adminlinks}</div>
+<b>Added:</b> {published} {reportthis} {addtofaves}
+</div>
+{comment}<br>
+<!-- END BLOCK : recommendation -->
 

--- /dev/null
+++ b/skins/Epiphany/reviewblock.tpl
@@ -1,1 +1,11 @@
-
+<!-- START BLOCK : reviewsblock -->
+<div class="listbox">
+<div class="content{oddeven}">
+<span class="label">Reviewer: </span>{reviewer} <span class="label">{member}</span> {rating} {reportthis}<br />
+<span class="label">Date: </span>{reviewdate}
+<span class="label">Title: </span>{chapter}
+<p>{review}</p>
+{adminoptions}
+</div>
+</div>
+<!-- END BLOCK : reviewsblock -->

--- /dev/null
+++ b/skins/Epiphany/reviews.tpl
@@ -1,1 +1,16 @@
+<!-- INCLUDE BLOCK : header -->
+{pagetitle}<br>
+{output}
+<!-- START BLOCK : reviewsblock -->
 
+

+<blockquote>{review}</blockquote>
+<div align="right">{adminoptions}</div>
+
+<br /><br />
+
+<!-- END BLOCK : reviewsblock -->
+{reviewpagelinks}
+{reviewslink}
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/Epiphany/storyindex.tpl
@@ -1,1 +1,39 @@
-
+<!-- INCLUDE BLOCK : header -->
+<div class="gb-full"> 
+	<h1>{title} von {author}</h1>
+	<div align="right">{printicon} {printepub}</div>
+	<div id="output">
+	<div class="jumpmenu">{jumpmenu}</div>
+	<div class="listbox">
+	<b>Zusammenfassung:</b> {summary}<br>
+	<b>Eingestuft:</b> {rating} [{reviews} - {numreviews}] {score} {featuredstory}<br>
+	<b>Kategorie:</b> {category}<br>
+	<b>Charaktere:</b> {characters}<br>
+	{classifications}
+	<b>Herausforderung:</b> {challengelinks}<br> <b>Serie:</b> {serieslinks}<br>
+	<b>Kapitel: </b> {numchapters} <b>Abgeschlossen:</b> {completed} <br> 


+	</div>
+	{adminlinks}<br>
+	<div align="center">{addtofaves}</div>
+	</div>
+	
+	<br><br>
+	
+	<!-- START BLOCK : storynotes -->
+	<blockquote><i><b>Story Anmerkungen:</b></i> {storynotes}</blockquote>
+	<!-- END BLOCK : storynotes -->
+	<br><br>
+	
+	<!-- START BLOCK : storyindexblock -->
+	<b>{chapternumber}.</b> {title} by {author} [{reviews} - {numreviews}] {ratingpics} ({wordcount} words)
+	<br><i>{chapternotes}</i> {adminoptions}<br>
+	<!-- END BLOCK : storyindexblock -->
+	
+	{storyend} {last_read}
+	<div id="pagelinks"><div class="jumpmenu">{jumpmenu2}</div></div>
+	<div class="respond">{roundrobin}</div>
+	{reviewform}
+</div>
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/Epiphany/style.css
@@ -1,1 +1,402 @@
-
+/*
+		Skin Name: Epiphany (responsive)
+		Skin Download: http://artphilia.de
+		Description: This is a grid based responsive layout.
+		Author: Nadia Volkrodt
+		Author E-Mail: nadia@artphilia.de
+*/
+
+
+/* import fonts */
+@import url(http://fonts.googleapis.com/css?family=Raleway:400,700,300|Patua+One:400);
+@import url(http://netdna.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.css); 
+
+/* import basic settings, IE-fixes and grids */
+@import url(base.css);
+
+/*---------------------------------------------------------------------
+   Basic styles
+------------------------------------------------------------------------*/
+html, body { 
+	height: 100%;
+	}            
+
+body { 
+	background-color: #efa008;
+	background-image: url(images/bg-pattern.png);
+	background-repeat: repeat;
+	text-align: justify;
+	font-family: 'Raleway', Tahoma, sans-serif;
+	font-size: 11pt;
+	color: #323232;
+	margin: 15px 0;
+	padding: 0;
+	}
+
+table { 
+	text-align: justify;
+	}
+tr:nth-child(odd) {
+	background-color: transparent;
+	padding: 6px;
+	}
+tr:nth-child(even), td:nth-child(even) {
+	background-color: transparent;
+	padding: 6px;
+	}
+
+ul li {
+	list-style-type: none;
+	}
+a, a:active, a:visited {
+	font-weight: normal;
+	text-decoration: none;
+	text-transform: none;
+	color: #efa008;
+	-webkit-transition: 1s;
+	-moz-transition: 1s;
+	transition: 1s;
+	}
+a:hover {
+	color: #123456;
+	text-decoration: none;
+	background-color: transparent;
+	}
+
+h1 {
+  border-bottom: 1px solid #989898;
+  color: #5c5c5c;
+	font-family: 'Patua One', cursive;
+	font-size: 26pt;
+	font-weight: normal;
+  margin-bottom: 30px;
+  position: relative;
+  text-align: center;
+}
+h1 span {
+  background-color: #e8e8e8;
+  padding: 0 15px;
+  position: relative;
+  top: 20px;
+}
+h2  {
+	color: #5c5c5c;
+	font-family: 'Patua One', cursive;
+	font-size: 22pt;
+	font-weight: normal;
+	padding: 5px 0;
+	}
+h3 {
+ 	border-left: 10px solid #efa008;
+	font-family: 'Patua One', cursive;
+	font-size: 18pt;
+	padding: 5px 10px; 
+	color: #5c5c5c;
+	font-weight: normal;
+	text-transform: normal;
+	}
+
+h4, #pagetitle, .sectionheader {
+	font-size: 16pt;
+	font-family: 'Patua One', cursive;
+	font-weight: normal;
+	text-align: center;
+	padding: 10px 0;
+	color: #5c5c5c;
+}
+		
+/*---------------------------------------------------------------------
+   General page alignment and width
+------------------------------------------------------------------------*/
+
+#header {
+	color: #989898;
+	padding: 10px;
+}
+
+.container {
+	background-color: #e8e8e8;
+	background-image: url(images/bg.png);
+	background-repeat: no-repeat;
+	padding: 10px;
+	-webkit-border-radius: 5px;
+	-moz-border-radius: 5px;
+	border-radius: 5px;
+	margin-bottom: 20px;
+}
+
+.content {
+	margin: 80px 0 0 0;
+	text-align: justify;
+	font-style: normal;
+	}
+
+.sidebar {
+	margin: 75px 0 25px 0;
+	font-style: normal;
+	text-align: justify;
+	background-color: #dedede;
+	padding: 10px;
+	-webkit-border-radius: 10px 0 10px 0;
+	-moz-border-radius: 10px 0 10px 0;
+	border-radius: 10px 0 10px 0;
+	}
+
+.footer {
+	text-align: center;
+	margin-top: 20px;
+	padding: 10px;
+	}
+
+/*---------------------------------------------------------------------
+   General page alignment and width
+------------------------------------------------------------------------*/
+
+
+.label, label {
+	color: #5c5c5c;
+	font-weight: bold;
+}
+
+hr {
+  height: 1px;
+  margin: 15px 0;
+  background: -webkit-gradient(linear, 0 0, 100% 0, from(rgba(0,0,0,0)), color-stop(0.5, #e8e8e8), to(rgba(0,0,0,0)));
+  background: -webkit-linear-gradient(left, rgba(0,0,0,0), #e8e8e8, rgba(0,0,0,0));
+  background: -moz-linear-gradient(left, rgba(0,0,0,0), #e8e8e8, rgba(0,0,0,0));
+  background: -o-linear-gradient(left, rgba(0,0,0,0), #e8e8e8, rgba(0,0,0,0));
+  background: linear-gradient(left, rgba(0,0,0,0), #e8e8e8, rgba(0,0,0,0));
+  border: 0;
+}
+hr:after { 
+  display: block; 
+  content:'';
+  height: 30px;
+  background-image: -webkit-gradient(radial, 50% 0%, 0, 50% 0%, 116, color-stop(0%, #dcdcdc), color-stop(100%, rgba(255, 255, 255, 0)));
+  background-image: -webkit-radial-gradient(center top, farthest-side, #dcdcdc 0%, rgba(255, 255, 255, 0) 100%);
+  background-image: -moz-radial-gradient(center top, farthest-side, #dcdcdc 0%, rgba(255, 255, 255, 0) 100%);
+  background-image: -o-radial-gradient(center top, farthest-side, #dcdcdc 0%, rgba(255, 255, 255, 0) 100%);
+  background-image: radial-gradient(farthest-side at center top, #dcdcdc 0%, rgba(255, 255, 255, 0) 100%);
+}
+
+input, textarea, select {
+	background-color: #e8e8e8;
+	border: 1px solid #cbcbcb;
+	font-family: 'Raleway', Tahoma, sans-serif;
+	font-size: 10pt;
+	color: #5c5c5c;
+	margin: 2px;
+	padding: 2px 6px;
+	-webkit-border-radius: 4px;
+	-moz-border-radius: 4px;
+	border-radius: 4px;
+}
+.button, .button a {
+	margin: 0 auto;
+	text-align: center;
+	text-transform: none;
+	margin: 2px;
+	padding: 2px 6px;
+	cursor: pointer;
+	background-color: #e8e8e8;
+	border: 1px solid #cbcbcb;
+	-webkit-border-radius: 4px;
+	-moz-border-radius: 4px;
+	border-radius: 4px;
+	color: #5c5c5c;
+}
+
+blockquote {
+	margin: 10px auto;
+	padding: 15px;
+	width: 90%;
+	border-width: 0 1px;
+	border-style: solid;
+	border-color: #989898;
+}
+
+/*---------------------------------------------------------------------
+  Style of story list
+------------------------------------------------------------------------*/
+.even, .odd, .comment {
+	margin-top: 0;
+	margin-right: auto;
+	margin-bottom: 0;
+	margin-left: auto;
+	padding: 5px;
+}
+.even:hover, .odd:hover {
+	background-color: transparent;
+}
+
+/*---------------------------------------------------------------------
+   News
+------------------------------------------------------------------------*/
+#newsarchive, #sortform, .respond {
+	text-align: center;
+	}
+#newsbox {
+	background-position: top left;
+	background-image: url();
+	background-repeat: no-repeat;
+	margin: 0 auto;
+	padding: 20px;
+	}
+.newscom {
+	background-color: transparent;
+	font-weight: normal;
+  text-align: right;
+  font-family: 'Raleway', Tahoma, sans-serif;
+  font-size: 20px;
+	padding: 0;
+	margin: 0;
+	}
+.newssig {
+	font-family: 'Raleway', Tahoma, sans-serif;
+	font-style: none;
+	font-size: 9pt;
+	text-align: right;
+	margin-top: 10px;
+	padding: 4px;
+	background-color: #dedede;
+	-webkit-border-radius: 4px;
+	-moz-border-radius: 4px;
+	border-radius: 4px;
+	}
+
+/*---------------------------------------------------------------------
+   Categories
+------------------------------------------------------------------------*/	
+.category {
+	text-align: left;
+	width: 75%;
+	margin: 0 auto;
+	}
+.catimg {
+	float: left;
+	padding: 3px 6px 3px 0;
+	}
+.cat_description { 
+	padding: 5px;
+	text-align: left;
+	}
+	
+/*---------------------------------------------------------------------
+  Page links
+------------------------------------------------------------------------*/
+#pagelinks {
+	width: 100%;
+	text-align: center;
+	padding: 1em;
+	font-family: 'Patua One', cursive;
+	font-size: 16pt;
+	}
+#pagelinks a {
+	font-weight: normal;
+	text-decoration: none;
+	text-transform: none;
+	-webkit-transition: 1s;
+	-moz-transition: 1s;
+	transition: 1s;
+	}
+#pagelinks a:hover {
+	text-decoration: none;
+	background-color: transparent;
+	}
+a#currentpage {
+	color: #123456;
+	background-color: transparent;
+	}
+/*---------------------------------------------------------------------
+   Misc Styles, used in multiple places throughout the page
+------------------------------------------------------------------------*/		
+#alphabet { 
+	text-align: center; 
+	padding: 5px; 
+	font-family: 'Raleway', Tahoma, sans-serif;
+	font-size: 20px;
+	}
+#jumpmenu {
+	text-align: right;
+	}
+#story {
+	padding: 50px 10px;
+	text-align: justify;
+	}
+#login {
+	margin: 0;
+	}
+#columncontainer {
+	width: 90%;
+	text-align: justify;
+}
+.column, #columncontainer a {
+	font-family: 'Raleway', Tahoma, sans-serif;
+	font-size: 18px;
+	}
+.copyright {
+	padding: 5px 0;
+	text-transform: uppercase;
+	font-size: 9pt;
+}
+
+/*---------------------------------------------------------------------
+  MENU
+------------------------------------------------------------------------*/
+#menu { 
+	width: 100%;
+	}
+#menu ul {
+	background: transparent;
+	text-align: center;
+
+	}
+#menu li {
+	display: inline-block;
+	padding: 8px 16px;
+	margin: 1px;
+	background-color: #292929;
+	-webkit-border-radius: 6px 0 6px 0;
+	-moz-border-radius: 6px 0 6px 0;
+	border-radius: 6px 0 6px 0;
+}
+#menu li:hover {
+	background-color: transparent;
+}
+#menu a {
+	font-family: 'Patua One', cursive;
+	font-size: 11pt;
+	font-style: normal;
+	letter-spacing: 1px;
+	text-align: justify;
+	text-transform: none;
+	color: #efa008;
+	-webkit-transition: 1s;
+	-moz-transition: 1s;
+	transition: 1s;
+}
+#menu a:hover {
+	color: #5c5c5c;
+}
+
+/*---------------------------------------------------------------------
+  SITE NAME / SLOGAN
+------------------------------------------------------------------------*/
+#sitename {
+	color: #dedede;
+	font-family: 'Patua One', cursive;
+	font-size: 32pt;
+	text-shadow: 0 0 2px #222;
+	padding-top: 20px;
+	text-align: center;
+}
+#slogan {
+	color: #dedede;
+	font-family: 'Raleway', Tahoma, sans-serif;
+	font-size: 10pt;
+	text-transform: none;
+	font-style: italic;
+	margin: -10px 0 0 50px;
+	text-align: center;
+	padding-bottom: 20px;
+}

--- /dev/null
+++ b/skins/Epiphany/user.tpl
@@ -1,1 +1,11 @@
+<!-- INCLUDE BLOCK : header -->
+<!-- INCLUDE BLOCK : profile -->
+<div align="center">{sort}</div>
+<br><br>
+<!-- START BLOCK : paneltabs -->
+<div {class}>{link} {count}</div>
+<!-- END BLOCK : paneltabs -->
 
+{output}
+<!-- INCLUDE BLOCK : listings -->
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/Epiphany/variables.php
@@ -1,1 +1,71 @@
+<?php
+/* CATEGORY BLOCK
+		Categories are to show only on the index.
+		I currently have it set to display:
+		The image, then the link, the story count in brackets, and then the description in a div tag. (template)
+		Three columns (columns)*/
+$blocks["categories"]["status"] = '1';
+$blocks["categories"]["template"] = "{image} {link} [{count}] <div>{description}</div>";
+$blocks["categories"]["columns"] = '3';
 
+
+/* FEATURED BLOCK
+		By default, the featured stories is off.*/
+$blocks["featured"]["status"] =  '1';
+
+
+/* INFO BLOCK
+		Info is set to display only on the home page.  I don't bother to style it.*/
+$blocks["info"]["status"] = '1';
+
+
+/* MENU BLOCK
+		The menu is set to display on all pages.
+		Additional styles include:
+		As an inline list. (style=2)
+		Links to home, recent, authors, categories,titles,series,search,top tens, browse by, help, contact us, and the login info. */
+$blocks["menu"]["status"] = '1';
+$blocks["menu"]["content"] = array (
+  0	=>	'home',
+  1 => 	'recent',
+  2 => 	'authors',
+  3 => 	'titles',
+  4 => 	'catslink',
+  5 => 	'browse',
+  6 => 	'help',
+  7 => 	'contact us');
+$blocks["menu"]["style"] = 0;
+
+
+/* LOG-IN BLOCK
+		The login form is set to display on all pages, even though I only actually call it on the index.  It can safely be changed to just the index, but I did this to address a possible bug.
+		I currently have it set to display:
+		In long format (form) */
+$blocks["login"]["status"] = '1';
+$blocks["login"]["form"] = '1';
+
+
+/* RANDOM STORIES BLOCK
+		Status is set to display on just the index page.*/
+$blocks["random"]["status"] = '1';
+
+
+/* RECENT STORIES BLOCK
+		By default, the recent stories block is off.*/
+$blocks["recent"]["status"] = '1';
+
+
+/* SKIN CHANGER
+		Status is set to display on all pages. */
+$blocks["skinchange"]["status"] = '1';
+
+
+/* NEWS BLOCK
+		Status is set to display on just the index page. */
+$blocks["news"]["status"] = '1';
+
+
+/* NEW STORY INDICATOR
+		Styled: Plain text surrounded with the superscript HTML tag with font-size set to extra small and italic.*/
+$new = "<sup style='font-size:small;font-style:bold'>New!</sup>";
+?>

--- /dev/null
+++ b/skins/Epiphany/viewstory.tpl
@@ -1,1 +1,27 @@
-
+<!-- INCLUDE BLOCK : header -->
+<div class="gb-full">
+	<h2>{title} von {author}</h2>
+	<div id="jumpmenu">{jumpmenu}</div>
+	<div id="sort">[{reviews} - {numreviews}] &nbsp; {printicon} {toc}<br>
+	<div align="right">{adminlinks}</div><br>
+	{textsizer}</div>
+	
+	<!-- START BLOCK : storynotes -->
+	<blockquote><h2>Story Bemerkung:</h2> {storynotes}</blockquote>
+	<!-- END BLOCK : storynotes -->
+	
+	<!-- START BLOCK : notes -->
+	<blockquote><b>Kapitel Bemerkung:</b> {notes}</blockquote>
+	<!-- END BLOCK : notes -->
+	
+	<div id="story">{story}</div>
+	
+	<!-- START BLOCK : endnotes -->
+	<blockquote><b>Kapitel Abschlussbemerkung:</b> {endnotes}</blockquote>
+	<!-- END BLOCK : endnotes -->
+	
+	<div id="pagelinks"><div id="prev">{prev}</div><div class="jumpmenu">{jumpmenu2}</div><div id="next">{next}</div></div>
+	<div class="respond">{roundrobin}</div>
+	<div id="reviewform">{reviewform}</div>
+</div>
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/Sommerbrise/base.css
@@ -1,1 +1,129 @@
+/* 
+RESPONSIVE GRID LAYOUT
+created by http://artphilia.de
+ */
 
+* {
+	margin: 0;
+	padding: 0;
+	}
+
+*, *:after, *:before {
+	-webkit-box-sizing: border-box;
+	-moz-box-sizing: border-box;
+	box-sizing: border-box;
+}
+
+.grid-wrapper {
+	width: 100%;
+	max-width: 1280px;
+	min-width: 755px;
+	margin: 0 auto;
+	padding: 6px;
+	overflow: hidden;
+}
+
+.grid-wrapper:after {
+	content: "";
+	display: table;
+	clear: both;
+}
+
+[class*='gb-'] {
+	float: left;
+	padding: 6px;
+}
+
+[class*='gb-']:last-of-type {
+	padding-right: 0;
+}
+
+/* class gb -- grid box */
+.gb-100, .gb-full {
+	width: 100%;
+}
+
+.gb-90 {
+	width: 90%;
+}
+
+.gb-80 {
+	width: 80%;
+}
+
+.gb-70 {
+	width: 70%;
+}
+
+.gb-60 {
+	width: 60%;
+}
+
+.gb-50, .gb-half, .gb-2qrt {
+	width: 50%;
+}
+
+.gb-40 {
+	width: 40%;
+}
+
+.gb-30 {
+	width: 30%;
+}
+
+.gb-20 {
+	width: 20%;
+}
+
+.gb-10 {
+	width: 10%;
+}
+
+.gb-1thrd, .gb-33 {
+	width: 33%;
+}
+
+.gb-2thrd {
+	width: 67%;
+}
+
+.gb-1qrt, .gb-25 {
+	width: 25%;
+}
+
+.gb-3qrt, .gb-75 {
+	width: 75%;
+}
+
+/* golden ratio: http://en.wikipedia.org/wiki/Golden_ratio */
+.gb-golden1 {
+	width: 38.2%;
+}
+
+.gb-golden2 {
+	width: 61.8%;
+}
+
+@media handheld, only screen and (max-width: 825px) {
+.grid-wrapper {
+	width: 100%;
+	min-width: 0;
+	margin: 0;
+	padding: 6px;
+}
+
+[class*="gb-"] { 
+	display: block;
+	float: none;
+	padding: 0;
+	margin: 0;
+	width: 100% !important;
+}
+}
+
+@media screen and ( max-width: 567px )  {
+.screen-micro,
+	.screen-micro > [class*="gb-"] {
+	display: none; 	
+	}
+}

--- /dev/null
+++ b/skins/Sommerbrise/browse.tpl
@@ -1,1 +1,8 @@
+<!-- INCLUDE BLOCK : header -->
+{output}<h2>{otherresults}</h2>
+<!-- START BLOCK : sortform -->
+<div id="sortform">{sortbegin}{categorymenu} {charactermenu1} {charactermenu2} {pairingsmenu} {ratingmenu} {classmenu} {sortmenu} {completemenu} {sortend}</div>
+<!-- END BLOCK : sortform -->
+<!-- INCLUDE BLOCK : listings -->
+<!-- INCLUDE BLOCK : footer -->
 

--- /dev/null
+++ b/skins/Sommerbrise/categories.tpl
@@ -1,1 +1,7 @@
+<!-- START BLOCK : categoryblock -->
+<div class="category">
+&rarr;  {link} {count}
+<div class="cat_description">{image} {description}</div>
+</div>
+<!-- END BLOCK : categoryblock -->
 

--- /dev/null
+++ b/skins/Sommerbrise/challenges.tpl
@@ -1,1 +1,9 @@
-
+<!-- START BLOCK : challenge -->
+<div class="listbox {oddeven} clearfix">
+<h1>{title} by {author}</h1>
+<b>Summary: </b>{summary}<br />
+<b>Categories:</b> {category} <b>Characters: </b>{characters}<br />
+{adminoptions}
+<div align="center">{respond}</div>
+</div><br>
+<!-- END BLOCK : challenge -->

--- /dev/null
+++ b/skins/Sommerbrise/comments.tpl
@@ -1,1 +1,6 @@
-
+<!-- START BLOCK : commentbox -->
+<div class="comment {oddeven} clearfix">
+<i>{uname} schrieb am {date}</i><br><p>{comment}</p>
+{adminoptions}
+</div><br>
+<!-- END BLOCK : commentbox -->

--- /dev/null
+++ b/skins/Sommerbrise/default.tpl
@@ -1,1 +1,4 @@
-
+<!-- INCLUDE BLOCK : header -->
+					{output}
+<!-- INCLUDE BLOCK : listings -->
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/Sommerbrise/extra_header.php
@@ -1,1 +1,12 @@
+<?php
 
+ // @import is not working correctly on mobile devices, sometimes subset is ignored
+ 
+?>
+
+
+<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700&display=swap&subset=latin-ext' rel='stylesheet'>
+<link href='https://fonts.googleapis.com/css?family=Courgette&display=swap&subset=latin-ext' rel='stylesheet'>
+<link href='https://netdna.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.css'>
+
+ 

--- /dev/null
+++ b/skins/Sommerbrise/footer.tpl
@@ -1,1 +1,15 @@
+		</div>
+	
+	<!-- START BLOCK : footer -->
+    <div class="gb-full footer">
+			<hr />
+			{footer}
+			<div class="copyright">Copyright &copy; 2015 <a href="http://artphilia.de">Artphilia Designs</a>. All rights reserved.</div>
+			{skinchange_content}
+    </div>
 
+	</div> <!-- closing content grid -->   			
+	<!-- END BLOCK : footer -->
+
+	</body>
+</html>

--- /dev/null
+++ b/skins/Sommerbrise/header.tpl
@@ -1,1 +1,9 @@
-
+<!-- START BLOCK : header -->
+	<div class="login"><span class="fa fa-sign-in"></span> {adminarea} {login} {logout} {search_content}</div>
+	<div id="sitename">{sitename}</div>
+	<div id="spacer"></div>
+	<div id="slogan">{slogan}</div>
+	<div id="menu">{menu_content}</div>
+	<div class="grid-wrapper container">	
+		<div class="gb-full content">
+<!-- END BLOCK : header -->

--- /dev/null
+++ b/skins/Sommerbrise/index.tpl
@@ -1,1 +1,6 @@
-
+<!-- INCLUDE BLOCK : header -->
+			<div class="gb-full">
+				<div class="gb-50">{welcome}</div>
+				<div class="gb-50"><h1><span>{news_title}</span></h1>{news_content} <br /> <div align="center">{newsarchive}</div></div>
+			</div>
+	<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/Sommerbrise/listings.tpl
@@ -1,1 +1,32 @@
+<!-- START BLOCK : listings -->
+{seriesheader}<br />
+<!-- START BLOCK : seriesblock -->
+<div class="listbox {oddeven}  clearfix">
+<h2>{title} {new} by {author}</h2>
+<b>Rated:</b> {rating} &bull; {numreviews} {reviews} {score} {featuredstory} {roundrobin}<br />
+<b>Summary:</b> {summary}<br />
+<div class="storyinfo">
+<b>Categories:</b> {category}<br />
+<b>Characters:</b> {characters}<br />
+{classifications}
+<b>Open:</b> {open} {comment}<br />{adminoptions}
+</div></div>
+<!-- END BLOCK : seriesblock -->
 
+{stories}<br />
+<!-- START BLOCK : storyblock -->
+<div class="listbox {oddeven} clearfix">
+<h2>{title} {new} by {author}</h2>
+<b>Rated:</b> {rating} &bull; {numreviews} {reviews} {score} {featuredstory} {roundrobin}<br />
+<b>Summary:</b> {summary}<br />
+<div class="storyinfo">
+<b>Categories:</b> {category}<br />
+<b>Characters:</b> {characters}<br />
+{classifications}
+<b>Series:</b> {serieslinks}<br />
+<b>Chapters:</b> {numchapters} | <b>Completed:</b> {completed} | <b>Words:</b> {wordcount} | <b>Hits</b>: {count} | <b>Published:</b> </b>{published} | <b>Updated:</b> {updated}
+<br />{addtofaves} {reportthis} {comment}<br />{adminlinks}<br />
+</div></div>
+<!-- END BLOCK : storyblock -->
+{pagelinks}
+<!-- END BLOCK : listings -->

--- /dev/null
+++ b/skins/Sommerbrise/newsbox.tpl
@@ -1,1 +1,8 @@
-
+<!-- START BLOCK : newsbox -->
+<div id="newsbox">
+<h2>{newstitle}</h2>
+<div class="newssig">by <i class="fa fa-user"></i> {newsauthor} @ {newsdate} &nbsp;{adminoptions}</div>
+{newsstory}
+<div class="newscom">{newscomments}</div>
+</div>
+<!-- END BLOCK : newsbox -->

--- /dev/null
+++ b/skins/Sommerbrise/printable.css
@@ -1,1 +1,32 @@
+body {
+	font-family: 'Cambria', 'Times New Roman', 'Garamond', serif;
+	font-size: 11px;
+	color: #000000;
+	background-color: #ffffff;
+	}
 
+/* Gives the page a 1 inch margin when printed. */
+@page { margin: 1in; }
+
+hr { width: 70%; color: #000000; background-color: #000000;  margin: 2em auto; }
+
+.infobox, .notes, #copyright { border: 1px solid #efefef; margin: 10%; padding: 50px; }
+
+h1 { margin-top: 15px; font-size: 200%; font-weight: normal; font-style: italic; text-align: center; }
+
+b { font-weight: bold; }
+
+a { font-weight: normal; color: #fcbb00; text-decoration: none; }
+
+.chaptertitle {
+	page-break-before: always;
+	page-break-after: avoid;
+	font-size: 140%;
+	text-align: center;
+	text-decoration: underline;
+	font-style: italic;
+	margin-bottom: 1em;
+	}
+
+.title { padding: 5px; border-bottom: 1px dashed #efefef; }
+.noteinfo { padding: 5px; }

--- /dev/null
+++ b/skins/Sommerbrise/profile.tpl
@@ -1,1 +1,20 @@
+<!-- START BLOCK : profile -->
+<div id="bio">
+	<!-- Website Profile Link -->
+	
+	<i class="fa fa-user"></i> {userpenname}<br />
+	<i class="fa fa-calendar"></i> {membersince}<br />
+	<i class="fa fa-globe"></i> {location}<br />
+	<i class="fa fa-home"></i> {website}<br>
+  <i class="fa fa-twitter"></i> {twitter}<br>
 
+	<!-- End Website Profile Link -->
+	
+
+	<br><blockquote>{bio}</blockquote><br>
+
+</div>
+<div align="right">{adminoptions}</div>
+<br />
+{reportthis}
+<!-- END BLOCK : profile -->

--- /dev/null
+++ b/skins/Sommerbrise/recommendations.tpl
@@ -1,1 +1,18 @@
+<!-- START BLOCK : recommendation -->
+<div class="listbox {oddeven} clearfix">
+<h1> {title} {new} von {author}</h1>
+<b>Eingestuft:</b> {rating} {score} {featuredstory} [{reviews} - {numreviews}] 
+<div class="content">
+<b>Inhalt:</b> {summary} <br />
+<b>Empfohlen von:</b> {recommender}<br />
+<b>Empfehlungskommentar:</b> {reccomment}<br />
+<b>Kategorie:</b> {category} <br />
+<b>Charaktere:</b> {characters}<br />
+{classifications}
+<b>Abgeschlossen:</b> {completed}  
+{adminlinks}</div>
+<b>Added:</b> {published} {reportthis} {addtofaves}
+</div>
+{comment}<br>
+<!-- END BLOCK : recommendation -->
 

--- /dev/null
+++ b/skins/Sommerbrise/reviewblock.tpl
@@ -1,1 +1,11 @@
-
+<!-- START BLOCK : reviewsblock -->
+<div class="listbox">
+<div class="content{oddeven}">
+<span class="label">Reviewer: </span>{reviewer} <span class="label">{member}</span> {rating} {reportthis}<br />
+<span class="label">Date: </span>{reviewdate}
+<span class="label">Title: </span>{chapter}
+<p>{review}</p>
+{adminoptions}
+</div>
+</div>
+<!-- END BLOCK : reviewsblock -->

--- /dev/null
+++ b/skins/Sommerbrise/reviews.tpl
@@ -1,1 +1,16 @@
+<!-- INCLUDE BLOCK : header -->
+{pagetitle}<br>
+{output}
+<!-- START BLOCK : reviewsblock -->
 
+

+<blockquote>{review}</blockquote>
+<div align="right">{adminoptions}</div>
+
+<br /><br />
+
+<!-- END BLOCK : reviewsblock -->
+{reviewpagelinks}
+{reviewslink}
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/Sommerbrise/storyindex.tpl
@@ -1,1 +1,39 @@
-
+<!-- INCLUDE BLOCK : header -->
+<div class="gb-full"> 
+	<h1>{title} von {author}</h1>
+	<div align="right">{printicon} {printepub}</div>
+	<div id="output">
+	<div class="jumpmenu">{jumpmenu}</div>
+	<div class="listbox">
+	<b>Zusammenfassung:</b> {summary}<br>
+	<b>Eingestuft:</b> {rating} [{reviews} - {numreviews}] {score} {featuredstory}<br>
+	<b>Kategorie:</b> {category}<br>
+	<b>Charaktere:</b> {characters}<br>
+	{classifications}
+	<b>Herausforderung:</b> {challengelinks}<br> <b>Serie:</b> {serieslinks}<br>
+	<b>Kapitel: </b> {numchapters} <b>Abgeschlossen:</b> {completed} <br> 


+	</div>
+	{adminlinks}<br>
+	<div align="center">{addtofaves}</div>
+	</div>
+	
+	<br><br>
+	
+	<!-- START BLOCK : storynotes -->
+	<blockquote><i><b>Story Anmerkungen:</b></i> {storynotes}</blockquote>
+	<!-- END BLOCK : storynotes -->
+	<br><br>
+	
+	<!-- START BLOCK : storyindexblock -->
+	<b>{chapternumber}.</b> {title} by {author} [{reviews} - {numreviews}] {ratingpics} ({wordcount} words)
+	<br><i>{chapternotes}</i> {adminoptions}<br>
+	<!-- END BLOCK : storyindexblock -->
+	
+	{storyend} {last_read}
+	<div id="pagelinks"><div class="jumpmenu">{jumpmenu2}</div></div>
+	<div class="respond">{roundrobin}</div>
+	{reviewform}
+</div>
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/Sommerbrise/style.css
@@ -1,1 +1,422 @@
-
+/*
+		Skin Name: Sommerbrise (responsive)
+		Skin Download: http://artphilia.de
+		Description: This is a grid based responsive layout.
+		Author: Nadia Volkrodt
+		Author E-Mail: nadia@artphilia.de
+*/
+ 
+
+/* import basic settings, IE-fixes and grids */
+@import url(base.css);
+
+/*---------------------------------------------------------------------
+   Basic styles
+------------------------------------------------------------------------*/
+html, body { 
+	height: 100%;
+	margin: 0;
+	padding: 0;
+	}            
+
+body { 
+	background-color: #fff;
+	background-image: url();
+	background-repeat: repeat;
+	text-align: justify;
+	font-family: 'Source Sans Pro', sans-serif;
+	font-size: 11pt;
+	font-weight: 300;
+	color: #574D4F;
+	}
+
+table { 
+	text-align: justify;
+	}
+tr:nth-child(odd) {
+	background-color: transparent;
+	padding: 6px;
+	}
+tr:nth-child(even), td:nth-child(even) {
+	background-color: transparent;
+	padding: 6px;
+	}
+
+ul li {
+	list-style-type: none;
+	}
+a, a:active, a:visited {
+	font-weight: normal;
+	text-decoration: none;
+	text-transform: none;
+	color: #e8202f;
+	padding: 1px 3px;
+	-webkit-transition: 1s;
+	-moz-transition: 1s;
+	transition: 1s;
+	}
+a:hover {
+	color: #FFD952;
+	border-bottom: 1px solid #c8e8e5;
+	}
+
+h1 {
+  border-bottom: 1px solid #FFD952;
+  color: #89d7e1;
+	font-family: 'Courgette', cursive;
+	font-size: 30pt;
+	font-weight: normal;
+  margin-bottom: 30px;
+  position: relative;
+  text-align: center;
+}
+h1 span {
+  background-color: #fff;
+  padding: 0 15px;
+  margin: 5px;
+  position: relative;
+  top: 20px;
+}
+h2  {
+	color: #89d7e1;
+	font-family: 'Courgette', cursive;
+	font-size: 22pt;
+	font-weight: normal;
+	padding: 5px 0;
+	}
+h3 {
+	font-family: 'Courgette', cursive;
+	font-size: 18pt;
+	padding: 5px 0; 
+	color: #89d7e1;
+	text-align: center;
+	font-weight: normal;
+	text-transform: normal;
+	}
+
+h4, #pagetitle, .sectionheader {
+	font-size: 16pt;
+	font-family: 'Courgette', cursive;
+	font-weight: normal;
+	text-align: center;
+	padding: 10px 0;
+	color: #89d7e1;
+}
+		
+/*---------------------------------------------------------------------
+   General page alignment and width
+------------------------------------------------------------------------*/
+
+.container {
+	padding: 10px 20px;
+	margin-bottom: 20px;
+}
+
+.content {
+	margin: 0;
+	text-align: justify;
+	font-style: normal;
+	}
+	
+.login {
+	margin: 5px 10px 0 0;
+	text-align: right;
+	}
+
+.sidebar {
+	margin: 0 0 25px 0;
+	font-style: normal;
+	text-align: justify;
+	border-right: 1px solid #d8d8d8;
+	padding: 10px;
+	}
+	
+@media handheld, only screen and (max-width: 825px) {
+.sidebar {
+	margin: 5px 0 25px 0;
+	font-style: normal;
+	text-align: justify;
+	border-right: 0;
+	padding: 10px;
+	}
+}	
+
+
+.footer {
+	text-align: center;
+	margin-top: 20px;
+	padding: 10px;
+	}
+
+/*---------------------------------------------------------------------
+   General page alignment and width
+------------------------------------------------------------------------*/
+
+
+.label, label {
+	font-weight: bold;
+}
+
+hr {
+  height: 1px;
+  margin: 15px 0;
+  background: -webkit-gradient(linear, 0 0, 100% 0, from(rgba(0,0,0,0)), color-stop(0.5, #d8d8d8), to(rgba(0,0,0,0)));
+  background: -webkit-linear-gradient(left, rgba(0,0,0,0), #d8d8d8, rgba(0,0,0,0));
+  background: -moz-linear-gradient(left, rgba(0,0,0,0), #d8d8d8, rgba(0,0,0,0));
+  background: -o-linear-gradient(left, rgba(0,0,0,0), #d8d8d8, rgba(0,0,0,0));
+  background: linear-gradient(left, rgba(0,0,0,0), #d8d8d8, rgba(0,0,0,0));
+  border: 0;
+}
+hr:after { 
+  display: block; 
+  content:'';
+  height: 30px;
+  background-image: -webkit-gradient(radial, 50% 0%, 0, 50% 0%, 116, color-stop(0%, #f9f9f9), color-stop(100%, rgba(255, 255, 255, 0)));
+  background-image: -webkit-radial-gradient(center top, farthest-side, #f9f9f9 0%, rgba(255, 255, 255, 0) 100%);
+  background-image: -moz-radial-gradient(center top, farthest-side, #f9f9f9 0%, rgba(255, 255, 255, 0) 100%);
+  background-image: -o-radial-gradient(center top, farthest-side, #f9f9f9 0%, rgba(255, 255, 255, 0) 100%);
+  background-image: radial-gradient(farthest-side at center top, #f9f9f9 0%, rgba(255, 255, 255, 0) 100%);
+}
+
+input, textarea, select {
+	background-color: #fff2c4;
+	border: 1px solid #FFD952;
+	font-family: 'Source Sans Pro', sans-serif;
+	font-size: 11pt;
+	color: #ffc700;
+	margin: 2px;
+	padding: 2px 6px;
+	-webkit-border-radius: 4px;
+	-moz-border-radius: 4px;
+	border-radius: 4px;
+}
+.button, .button a {
+	margin: 0 auto;
+	text-align: center;
+	text-transform: none;
+	margin: 2px;
+	padding: 2px 6px;
+	cursor: pointer;
+	background-color: #fff2c4;
+	border: 1px solid #FFD952;
+	-webkit-border-radius: 4px;
+	-moz-border-radius: 4px;
+	border-radius: 4px;
+	color: #ffc700;
+}
+
+blockquote {
+	margin: 10px auto;
+	padding: 15px;
+	width: 90%;
+	border-top: 2px solid #c8e8e5;
+}
+
+/*---------------------------------------------------------------------
+  Style of story list
+------------------------------------------------------------------------*/
+.even, .odd, .comment {
+	margin-top: 0;
+	margin-right: auto;
+	margin-bottom: 0;
+	margin-left: auto;
+	padding: 5px;
+}
+.even:hover, .odd:hover {
+	background-position: top center;
+	background-image: url();
+	background-repeat: no-repeat;
+}
+
+/*---------------------------------------------------------------------
+   News
+------------------------------------------------------------------------*/
+#newsarchive, #sortform, .respond {
+	text-align: center;
+	}
+#newsbox {
+	background-position: top center;
+	background-image: url();
+	background-repeat: no-repeat;
+	margin: 0 auto;
+	padding: 20px;
+	}
+.newscom {
+	background-color: transparent;
+	font-weight: normal;
+  text-align: right;
+  font-family: 'Source Sans Pro', sans-serif;
+  font-size: 20px;
+	padding: 0;
+	margin: 0;
+	}
+.newssig {
+	font-family: 'Source Sans Pro', sans-serif;
+	font-style: none;
+	font-size: 9pt;
+	text-align: left;
+	padding: 4px 0;
+	margin: -5px 0 15px 0;
+	}
+
+/*---------------------------------------------------------------------
+   Categories
+------------------------------------------------------------------------*/	
+.category {
+	text-align: left;
+	width: 75%;
+	margin: 0 auto;
+	}
+.catimg {
+	float: left;
+	padding: 3px 6px 3px 0;
+	}
+.cat_description { 
+	padding: 5px;
+	text-align: left;
+	}
+	
+/*---------------------------------------------------------------------
+  Page links / Alphabet
+------------------------------------------------------------------------*/
+#pagelinks, #alphabet {
+	width: 100%;
+	text-align: center;
+	border-top: 1px solid #ebebeb;
+	}
+#pagelinks a, #alphabet a {
+	font-weight: normal;
+	text-decoration: none;
+	text-transform: none;
+	font-size: 14pt;
+	padding: 0 4px;
+	-webkit-transition: 1s;
+	-moz-transition: 1s;
+	transition: 1s;
+	}
+#pagelinks a:hover, #alphabet a:hover {
+	text-decoration: none;
+	background-color: transparent;
+	color: #d8d8d8;
+	border-top: 1px solid #d8d8d8;
+	}
+a#currentpage {
+	border-top: 1px solid #89d7e1;
+	color: #89d7e1;
+	background-color: transparent;
+	}
+/*---------------------------------------------------------------------
+   Misc Styles, used in multiple places throughout the page
+------------------------------------------------------------------------*/		
+
+#jumpmenu {
+	text-align: right;
+	}
+#story {
+	padding: 50px 10px;
+	text-align: justify;
+	}
+#login {
+	margin: 0;
+	}
+#columncontainer {
+	width: 90%;
+	text-align: justify;
+}
+.column, #columncontainer a {
+	font-size: 13pt;
+	}
+.copyright {
+	padding: 5px 0;
+	text-transform: uppercase;
+	font-size: 9pt;
+}
+
+/*---------------------------------------------------------------------
+  MENU
+------------------------------------------------------------------------*/
+#menu { 
+	width: 100%;
+	margin: 4px 0;
+	}
+#menu ul {
+	background-color: #FFD952;
+	text-align: center;
+	padding: 4px 2px;
+	}
+#menu li {
+	display: inline-block;
+	padding: 10px 16px;
+	margin: 0;
+	}
+#menu li:hover {
+	padding: 10px 16px;
+	background-color: #FFE999;
+	}
+#menu a {
+	font-family: 'Courgette', cursive;
+	font-size: 16pt;
+	letter-spacing: 0;
+	text-transform: none;
+	color: #ffffff;
+	-webkit-transition: 1s;
+	-moz-transition: 1s;
+	transition: 1s;
+	}
+#menu a:hover {
+	color: #FFD952;
+	border-bottom: 0 dashed #4D4A4B;
+	}
+
+/*---------------------------------------------------------------------
+  SITE NAME / SLOGAN
+------------------------------------------------------------------------*/
+#sitename {
+	color: #e8202f;
+	font-family: 'Courgette', cursive;
+	font-size: 40pt;
+	padding: 10px 0 0 0;
+	text-align: center;
+
+}
+#spacer {
+	border-top: 5px solid #c8e8e5;
+	width: 400px;
+	margin: 0 auto;
+}
+#slogan {
+	color: #574D4F;
+	font-family: 'Source Sans Pro', sans-serif;
+	font-size: 14pt;
+	font-weight: 300;
+	text-transform: uppercase;
+	margin: 5px 0 0 0;
+	text-align: center;
+	padding-bottom: 20px;
+}
+
+/*---------------------------------------------------------------------
+  FIELDSET
+------------------------------------------------------------------------*/
+
+fieldset {
+	margin: 5px 10px;
+	padding: 6px;
+	text-align: left;
+	border: 1px solid #dcdcdc;
+	background-color: transparent;
+	background-image: url();
+	-webkit-border-radius: 4px;
+	-moz-border-radius: 4px;
+	border-radius: 4px; 
+}
+legend {
+	border: 0 solid #dcdcdc;
+	background-color: transparent;
+	margin: 0 0 0 30px;
+	padding: 6px;
+	text-transform: uppercase;
+	-webkit-border-radius: 2px;
+	-moz-border-radius: 2px;
+	border-radius: 2px; 
+}

--- /dev/null
+++ b/skins/Sommerbrise/user.tpl
@@ -1,1 +1,11 @@
+<!-- INCLUDE BLOCK : header -->
+<!-- INCLUDE BLOCK : profile -->
+<div align="center">{sort}</div>
+<br><br>
+<!-- START BLOCK : paneltabs -->
+<div {class}>{link} {count}</div>
+<!-- END BLOCK : paneltabs -->
 
+{output}
+<!-- INCLUDE BLOCK : listings -->
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/Sommerbrise/variables.php
@@ -1,1 +1,71 @@
+<?php
+/* CATEGORY BLOCK
+		Categories are to show only on the index.
+		I currently have it set to display:
+		The image, then the link, the story count in brackets, and then the description in a div tag. (template)
+		Three columns (columns)*/
+$blocks["categories"]["status"] = '1';
+$blocks["categories"]["template"] = "{image} {link} [{count}] <div>{description}</div>";
+$blocks["categories"]["columns"] = '3';
 
+
+/* FEATURED BLOCK
+		By default, the featured stories is off.*/
+$blocks["featured"]["status"] =  '1';
+
+
+/* INFO BLOCK
+		Info is set to display only on the home page.  I don't bother to style it.*/
+$blocks["info"]["status"] = '1';
+
+
+/* MENU BLOCK
+		The menu is set to display on all pages.
+		Additional styles include:
+		As an inline list. (style=2)
+		Links to home, recent, authors, categories,titles,series,search,top tens, browse by, help, contact us, and the login info. */
+$blocks["menu"]["status"] = '1';
+$blocks["menu"]["content"] = array (
+  0	=>	'home',
+  1 => 	'recent',
+  2 => 	'authors',
+  3 => 	'titles',
+  4 => 	'catslink',
+  5 => 	'browse',
+  6 => 	'help',
+  7 => 	'contact us');
+$blocks["menu"]["style"] = 0;
+
+
+/* LOG-IN BLOCK
+		The login form is set to display on all pages, even though I only actually call it on the index.  It can safely be changed to just the index, but I did this to address a possible bug.
+		I currently have it set to display:
+		In long format (form) */
+$blocks["login"]["status"] = '1';
+$blocks["login"]["form"] = '1';
+
+
+/* RANDOM STORIES BLOCK
+		Status is set to display on just the index page.*/
+$blocks["random"]["status"] = '1';
+
+
+/* RECENT STORIES BLOCK
+		By default, the recent stories block is off.*/
+$blocks["recent"]["status"] = '1';
+
+
+/* SKIN CHANGER
+		Status is set to display on all pages. */
+$blocks["skinchange"]["status"] = '1';
+
+
+/* NEWS BLOCK
+		Status is set to display on just the index page. */
+$blocks["news"]["status"] = '1';
+
+
+/* NEW STORY INDICATOR
+		Styled: Plain text surrounded with the superscript HTML tag with font-size set to extra small and italic.*/
+$new = "<sup style='font-size:small;font-style:bold'>New!</sup>";
+?>

--- /dev/null
+++ b/skins/Sommerbrise/viewstory.tpl
@@ -1,1 +1,27 @@
-
+<!-- INCLUDE BLOCK : header -->
+<div class="gb-full">
+	<h2>{title} von {author}</h2>
+	<div id="jumpmenu">{jumpmenu}</div>
+	<div id="sort">[{reviews} - {numreviews}] &nbsp; {printicon} {toc}<br>
+	<div align="right">{adminlinks}</div><br>
+	{textsizer}</div>
+	
+	<!-- START BLOCK : storynotes -->
+	<blockquote><h2>Story Bemerkung:</h2> {storynotes}</blockquote>
+	<!-- END BLOCK : storynotes -->
+	
+	<!-- START BLOCK : notes -->
+	<blockquote><b>Kapitel Bemerkung:</b> {notes}</blockquote>
+	<!-- END BLOCK : notes -->
+	
+	<div id="story">{story}</div>
+	
+	<!-- START BLOCK : endnotes -->
+	<blockquote><b>Kapitel Abschlussbemerkung:</b> {endnotes}</blockquote>
+	<!-- END BLOCK : endnotes -->
+	
+	<div id="pagelinks"><div id="prev">{prev}</div><div class="jumpmenu">{jumpmenu2}</div><div id="next">{next}</div></div>
+	<div class="respond">{roundrobin}</div>
+	<div id="reviewform">{reviewform}</div>
+</div>
+<!-- INCLUDE BLOCK : footer -->

--- /dev/null
+++ b/skins/SurpriseMe/extra_header.php
@@ -1,1 +1,13 @@
+<?php
+if(!defined("_CHARSET")) exit( );
+if(!isset($hiddenskins)) $hiddenskins = array( );
+if(is_string($hiddenskins)) $hiddenskins = explode(",", $hiddenskins);
 
+$directory = opendir(_BASEDIR."skins");
+while($filename = readdir($directory)) {
+	if($filename== "." || $filename == $siteskin || $filename== ".." || !is_dir(_BASEDIR."skins/".$filename) || (in_array($filename, $hiddenskins) && !isADMIN)) continue;
+	$skinlist[] = $filename;
+}
+$siteskin = $skinlist[(rand(0, count($skinlist) - 1))];
+$skindir = _BASEDIR."skins/$siteskin";
+?>

file:b/skins/index.php (new)
--- /dev/null
+++ b/skins/index.php

file:b/stories.php (new)
--- /dev/null
+++ b/stories.php
@@ -1,1 +1,985 @@
-
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+// page template setup
+
+$current = "stories";
+
+if(isset($_GET['action'])) {
+	if($_GET['action'] != "newchapter") $displayform = 1;
+	if($_GET['action'] == "newstory" || $_GET['action'] == "editstory") $current = "addstory";
+}
+
+include ("header.php");
+
+$tpl = new TemplatePower( file_exists("$skindir/default.tpl") ?  "$skindir/default.tpl" : "default_tpls/default.tpl");
+$tpl->assignInclude( "header", "./$skindir/header.tpl" );
+$tpl->assignInclude( "footer", "./$skindir/footer.tpl" );
+
+include("includes/pagesetup.php");
+include("includes/storyform.php");
+
+
+// before doing anything else check if the visitor is logged in.  If they are, check if they're an admin.  If not, check that they're 
+// trying to edit/delete/etc. their own stuff then get the penname 
+	if(!isMEMBER || ($submissionsoff && !isADMIN) || (!isADMIN && isset($uid))) accessDenied( );
+	if(!isADMIN || uLEVEL > 3) {
+		if(isset($chapid)) {
+			$result = dbquery("SELECT sid, uid FROM ".TABLEPREFIX."fanfiction_chapters WHERE chapid='$chapid' LIMIT 1");
+			if($result) list($sid, $author) = dbrow($result);
+		}
+		if(isset($sid)) {
+			$array_coauthors = array( );
+			$authorquery = dbquery("SELECT uid, rr, coauthors FROM ".TABLEPREFIX."fanfiction_stories WHERE sid='$sid' LIMIT 1");
+			$story = dbassoc($authorquery);
+			if($story['coauthors']) {
+				$cQuery = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_coauthors WHERE sid = '$sid'");
+				while($c = dbassoc($cQuery)) {
+					$array_coauthors[] = $c['uid'];
+				}
+			}
+			if($story['uid'] != USERUID && (is_array($array_coauthors) && !in_array(USERUID, $array_coauthors)) && !$story['rr']) accessDenied( );
+		}
+	}
+	else if(isADMIN && uLEVEL < 4 && isset($_GET['admin'])) {
+		$admin = 1;
+		$uid = isset($_GET['uid']) && isNumber($_GET['uid']) ? $_GET['uid'] : USERUID;
+	}
+	else {
+		$admin = 0;
+		$uid = USERUID;
+	}
+
+function preview_story($stories) {
+	global $current, $new, $extendcats, $skindir, $catlist, $charlist, $classlist, $featured, $retired, $rr, $reviewsallowed, $star, $halfstar, $classtypelist, $dateformat, $ratingslist, $recentdays;
+
+	$count = 0;
+	if(file_exists("$skindir/listings.tpl")) $tpl = new TemplatePower( "$skindir/listings.tpl" );
+	else $tpl = new TemplatePower("default_tpls/listings.tpl");
+	if(is_array($stories['coauthors']) && count($stories['coauthors']) > 0) $stories['coauthors'] = 1;
+	$tpl->prepare( );
+	$tpl->newBlock("listings");
+	$tpl->newBlock("storyblock");
+	$tpl->assignGlobal("skindir", $skindir);
+	include("includes/storyblock.php");
+	$text = $tpl->getOutputContent( );
+	$count = 0;
+	if(!empty($stories['storytext'])) {
+		$text .= "<br /><br />";
+		if(isset($_GET['textsize'])) $textsize = $_GET['textsize'];
+		else $textsize = 0;
+		
+		if(file_exists("./$skindir/viewstory.tpl")) $tpl = new TemplatePower("./$skindir/viewstory.tpl");
+		else $tpl = new TemplatePower(_BASEDIR."default_tpls/viewstory.tpl");
+		$tpl->prepare( );			
+		include("includes/storyblock.php");
+		$tpl->assign("adminlinks", $adminlinks);
+		if($stories['inorder'] == 1 && !empty($stories['storynotes'])) {
+			$tpl->gotoBlock("_ROOT");
+			$tpl->newBlock("storynotes");
+			$tpl->assign( "storynotes", stripslashes($stories['storynotes']));
+			$tpl->gotoBlock("_ROOT");
+		}
+		if(!empty($stories['notes'])) {
+			$tpl->newBlock("notes");
+			$tpl->assign( "notes", $stories['notes']);
+			$tpl->gotoBlock("_ROOT");
+		}
+		if(!empty($stories['endnotes'])) {
+			$tpl->newBlock("endnotes");
+			$tpl->assign( "endnotes", $stories['endnotes']);
+			$tpl->gotoBlock("_ROOT");
+		}
+		$tpl->gotoBlock("_ROOT");
+		$tpl->assign("chaptertitle", $stories['chaptertitle']);
+		$tpl->assign("chapternumber", $stories['inorder']);
+		$tpl->assign( "story", "<span style=\"font-size: ".(100 + ($textsize * 20))."%;\">".format_story($stories['storytext'])."</span>" );
+		$text .= $tpl->getOutputContent( );
+	}
+	return $text;
+}
+
+// function to add new story to archives.
+function newstory( ) {
+
+	global $autovalidate, $sid, $action, $sid, $store, $tpl, $admin, $sitename, $siteemail, $allowed_tags, $admincats, $alertson, $dateformat, $url, $minwords, $maxwords, $charlist, $catlist, $classtypelist;
+	$newchapter = $action == "newchapter";
+	$output = "<div id=\"pagetitle\">".($newchapter ? _ADDNEWCHAPTER : _ADDNEWSTORY)."</div>";
+// to avoid problems with register globals and hackers declare variables and do some clean up.
+	if(isset($admin) && isset($_POST['uid']) && isNumber($_POST['uid'])) {
+		$uid = $_POST['uid'];
+		$author = dbquery("SELECT "._PENNAMEFIELD." FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '$uid' LIMIT 1");
+		list($penname) = dbrow($author);
+	}
+	else {
+		$uid = USERUID;
+		$penname = USERPENNAME;
+	}
+	$title = isset($_POST['title']) ? descript(strip_tags($_POST['title'], $allowed_tags)) : "";
+	$summary = isset($_POST['summary']) ? replace_naughty(descript(strip_tags($_POST['summary'], $allowed_tags))) : "";
+	$storynotes = isset($_POST['storynotes']) ? descript(strip_tags($_POST['storynotes'], $allowed_tags)) : "";
+	$catid = isset($_POST['catid']) ? array_filter(explode(",", $_POST['catid']), "isNumber") : array( );
+	$charid = isset($_POST['charid']) ? array_filter($_POST['charid'], "isNumber") : array( );
+	$array_coauthors = isset($_POST['coauthors']) ? array_filter(explode(",", $_POST['coauthors']), "isNumber") : array( );
+	$classes = array( );
+	$classquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_classtypes");
+	while($type = dbassoc($classquery)) {
+		if(isset($_POST["class_".$type['classtype_id']])) {
+			$opts = is_array($_POST["class_".$type['classtype_id']]) ? array_filter($_POST["class_".$type['classtype_id']], "isNumber") : "";
+			$classes = array_merge($opts, $classes);
+		}
+	}
+	$rid = isset($_POST['rid']) ? descript($_POST['rid']) : "";
+	$rr = isset($_POST['rr']) && isNumber($_POST['rr']) ? $_POST['rr'] : 0;
+	$feat = isset($_POST['feature']) && isNumber($_POST['feature']) ? $_POST['feature'] : 0;
+	$complete = isset($_POST['complete']) && isNumber($_POST['complete']) ? $_POST['complete'] : 0;
+	$validated = isset($_POST['validated']) && isNumber($_POST['validated']) ? $_POST['validated'] : 0;
+	$chaptertitle = isset($_POST['chaptertitle']) ? descript(strip_tags($_POST['chaptertitle'], $allowed_tags)) : "";
+	$notes = isset($_POST['notes']) ? strip_tags(descript($_POST['notes']), $allowed_tags) : "";
+	$endnotes = isset($_POST['endnotes']) ? strip_tags(descript($_POST['endnotes']), $allowed_tags) : "";
+	$story = "";
+	if(isset($_FILES['storyfile']['name']) && $_FILES['storyfile']['name']) {
+		if ($_FILES['storyfile']['type'] != 'text/html' && $_FILES['storyfile']['type'] != 'text/plain') {
+ 			$failed = _INVALIDUPLOAD;
+			$submit = _PREVIEW;
+		}
+		else {
+			$texts = file($_FILES['storyfile']['tmp_name']);
+			foreach ($texts as $text) {
+				if($_FILES['storyfile']['type'] == 'text/html') $story .= rtrim($text, "\n\r\t")." ";
+				else $story .= $text;
+			}
+		}
+	}
+	else if(isset($_POST['storytext'])) $story = $_POST['storytext'];
+	$storytext = descript(strip_tags($story, $allowed_tags));
+	$words_to_count = strip_tags($storytext);
+	$pattern = "/[^(\w|\d|\'|\"|\.|\!|\?|;|,|\\|\/|\-\-|:|\&|@)]+/";
+	$words_to_count = preg_replace ($pattern, " ", $words_to_count);
+	$words_to_count = trim($words_to_count);
+	$wordcount = count(explode(" ",$words_to_count)); 
+	$au[] = $uid;
+	if(count($array_coauthors)) {
+		$au = array_merge($au, $array_coauthors);
+		$coauthors = 1;
+	}
+	else $coauthors = 0;
+// end variable declarations
+
+	if(isset($_POST['submit']) && $_POST['submit'] == _ADDSTORY && ((!$newchapter && (!$rid || !$title || !$summary || !$catid) || $storytext == "")))
+			$submit = _PREVIEW;
+	if (isset($_POST['submit'])) {
+		if(empty($failed)) $failed = "";
+		if(!$storytext) $failed .= "<br />"._NOSTORYTEXT;
+		if(!$newchapter && ($rid == "" || $title == "" || $summary == "" || !$catid)) $failed .= "<br />". _MISSINGFIELDS;
+		if(find_naughty($title)) $failed .= "<br />"._NAUGHTYWORDS;
+		if(($minwords && $wordcount < $minwords) || ($maxwords && $wordcount > $maxwords)) $failed .= "<br />"._WORDCOUNTFAILED;
+		$storyvalid = 0;
+		if($newchapter) {
+			$story = dbquery("SELECT sid, catid, title, summary, validated FROM ".TABLEPREFIX."fanfiction_stories WHERE sid = '$sid'");
+			if(!dbnumrows($story)) $failed .= "<br />"._ERROR;
+			else {
+				list($sid, $categories, $storytitle, $summary, $storyvalid) = dbrow($story);
+				$catid = explode(",", $categories);
+			}
+		}
+		if(!empty($failed)) {
+			$output .= write_error($failed);
+			$submit = _PREVIEW;
+		}
+	}
+	if(isset($_POST['submit']) && $_POST['submit'] == _ADDSTORY && !isset($submit)) 
+	{
+
+		$result = dbquery("SELECT "._UIDFIELD." as uid, "._PENNAMEFIELD." as penname, "._EMAILFIELD." as email, validated FROM "._AUTHORTABLE.", ".TABLEPREFIX."fanfiction_authorprefs as ap WHERE "._UIDFIELD." = '$uid' AND ap.uid = "._UIDFIELD." LIMIT 1");
+		$user = dbassoc($result);
+		$authorpenname = $user['penname'];
+		if(!$validated && (($autovalidate && !isADMIN) || $user['validated'] || $storyvalid == 2)) $validated = 1;
+		else if(!$validated) $validated = 0;
+		if($admin && USERUID != $uid) {
+			if($admincats && !sizeof(array_intersect( $catid, explode(",", $admincats)))) {
+				$output .= write_error(_NOTAUTHORIZEDADMIN."  "._TRYAGAIN);
+				return $output;
+			}
+		}
+		if($store == "mysql")
+		{
+			if(!$newchapter) {
+				$insert = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_stories (title, summary, storynotes, catid, classes, charid,  rid, date, updated, uid, validated, rr, completed, wordcount, featured, coauthors) VALUES ('".addslashes($title)."', '".addslashes(format_story($summary))."', '".addslashes(format_story($storynotes))."', '".($catid ? implode(",", $catid) : "")."', '".($classes? implode(",", $classes) : "")."', '".($charid ? implode(",", $charid) : "")."', '$rid', '" . time() ."', '" . time() . "', '$uid', '$validated', '$rr', '$complete', '$wordcount', '$feat', '$coauthors')");
+				$sid = dbinsertid( );
+				$inorder = 1;
+			}
+			else {
+				$inorder = $_GET['inorder'] + 1;
+			}
+			$query2 = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_chapters (title, inorder, notes, endnotes, validated, wordcount, sid, uid, storytext) VALUES('".addslashes(($chaptertitle != "" ? $chaptertitle : $title))."', '$inorder', '".addslashes(format_story($notes))."', '".addslashes(format_story($endnotes))."', '$validated', '$wordcount', '$sid', '$uid', '".addslashes($storytext)."')");
+			if(!$admin) $output = write_message(_STORYADDED).viewstories( );
+			else $output .= write_message(_ACTIONSUCCESSFUL).editstory( $sid );
+		}
+		else if ($store == "files")
+		{
+			if(!$newchapter) {
+				$insertstory = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_stories (title, summary, storynotes, catid, classes, charid, rid, date, updated, uid, validated, rr, completed, wordcount, featured, coauthors) VALUES ('".addslashes($title)."', '".addslashes(format_story($summary))."', '".addslashes(format_story($storynotes))."', '".($catid ? implode(",", $catid) : "")."', '".($classes ? implode(",", $classes) : "")."', '".($charid ? implode(",", $charid) : "")."', '$rid', '" . time() ."', '" . time() . "', '$uid', '$validated', '$rr', '$complete', '$wordcount', '$feat', '$coauthors')");
+				$sid = dbinsertid( );
+				$inorder = 1;
+			}
+			else {
+				$inorder = $_GET['inorder'] + 1;
+			}
+			$insertchapter = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_chapters (title, inorder, notes, endnotes, validated, wordcount, sid, uid) VALUES('".addslashes(($chaptertitle != "" ? $chaptertitle : $title))."', '$inorder', '".addslashes(format_story($notes))."', '".addslashes(format_story($endnotes))."', '".($validated ? 1 : 0)."', '$wordcount', '$sid', '$uid')");
+			$chapid = dbinsertid( );
+			if( !file_exists("".STORIESPATH."/$uid/" ) )
+			{
+				mkdir("".STORIESPATH."/$uid/", 0755);
+				chmod("".STORIESPATH."/$uid/", 0777);
+			}
+			$handle = fopen("".STORIESPATH."/$uid/$chapid.txt", 'w');
+			if ($handle)
+			{
+				fwrite($handle, $storytext);
+				fclose($handle);
+			}
+			chmod("".STORIESPATH."/$uid/$chapid.txt", 0644);
+			if(($newchapter && $insertchapter != false) || $insertstory != false) {
+				if($newchapter) {
+					unset($_POST['submit']);
+					$output = write_message(_ACTIONSUCCESSFUL).editstory( $sid );
+				}
+				else {
+					unset($_POST['submit']);
+					if(!$admin) $output = write_message(_STORYADDED).viewstories( );
+					else $output .= write_message(_ACTIONSUCCESSFUL).editstory( $sid );
+				}
+			}
+			else $output .= write_error(_FATALERROR." "._TRYAGAIN);
+		}
+		if(!$newchapter) {
+			if(count($array_coauthors)) {
+				foreach($au AS $c) {
+					if($c == $uid) continue;
+					dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_coauthors(`sid`, `uid`) VALUES('$sid', '$c')");
+				}
+			}
+			$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'addstory'");
+			while($code = dbassoc($codequery)) {
+				eval($code['code_text']);
+			}
+		}
+		$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'addchapter'");
+		while($code = dbassoc($codequery)) {
+			eval($code['code_text']);
+		}
+		// validate fic, send story alerts, and mail admins
+		if($validated) {
+			include("includes/emailer.php");
+			if(!isset($storytitle)) $storytitle = $title;
+			if(!$newchapter) {
+				foreach($catid as $cat) { categoryitems($cat, 1); }
+				if($alertson) {
+					$pennames[] = $penname;
+					$coQuery = dbquery("SELECT "._PENNAMEFIELD." AS penname FROM ".TABLEPREFIX."fanfiction_coauthors AS c LEFT JOIN "._AUTHORTABLE." ON "._UIDFIELD." = c.uid WHERE sid = '$sid'");
+					while($c = dbassoc($coQuery)) {
+						$pennames[] = $c['penname'];
+					}
+					$subject = _NEWSTORYAT.$sitename;
+					$mailtext = sprintf(_AUTHORALERTNOTE, $title, implode(", ", $pennames), $summary, $sid);
+					$favorites = dbquery("SELECT "._UIDFIELD." as uid, "._EMAILFIELD." as email, "._PENNAMEFIELD." as penname, alertson FROM ".TABLEPREFIX."fanfiction_favorites as fav, ".TABLEPREFIX."fanfiction_authorprefs as ap, "._AUTHORTABLE." WHERE FIND_IN_SET(fav.item,'".implode(",", $au)."') > 0 AND fav.type = 'AU' AND fav.uid = "._UIDFIELD." AND ap.uid = "._UIDFIELD." AND ap.alertson = '1'");
+					while($favuser = dbassoc($favorites)) { 
+						sendemail($favuser['penname'], $favuser['email'], $sitename, $siteemail, $subject, $mailtext, "html");
+					}				
+				}
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET stories = stories + 1");
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET stories = stories + 1 WHERE FIND_IN_SET(uid, '".implode(",", $au)."') > 0");
+			}
+			else if($alertson && $newchapter) {
+				$pennames[] = $penname;
+				$coQuery = dbquery("SELECT "._PENNAMEFIELD." AS penname FROM ".TABLEPREFIX."fanfiction_coauthors AS c LEFT JOIN "._AUTHORTABLE." ON "._UIDFIELD." = c.uid WHERE sid = '$sid'");
+				while($c = dbassoc($coQuery)) {
+					$pennames[] = $c['penname'];
+				}
+				$titlequery = dbquery("SELECT title FROM ".TABLEPREFIX."fanfiction_stories WHERE sid = '$sid' LIMIT 1");
+				list($title) = dbrow($titlequery);
+				$subject = _STORYALERT;
+				$mailtext = sprintf(_STORYALERTNOTE, $title, implode(", ", $pennames), $sid, $inorder);
+				$favorites = dbquery("SELECT "._UIDFIELD." as uid, "._EMAILFIELD." as email, "._PENNAMEFIELD." as penname, alertson FROM ".TABLEPREFIX."fanfiction_favorites as fav, ".TABLEPREFIX."fanfiction_authorprefs as ap, "._AUTHORTABLE." WHERE fav.item = '$sid' AND fav.type = 'ST' AND fav.uid = "._UIDFIELD." AND ap.uid = "._UIDFIELD." AND ap.alertson = '1'");
+				while($favuser = dbassoc($favorites)) { 
+					sendemail($favuser['penname'], $favuser['email'], $sitename, $siteemail, $subject, $mailtext, "html");
+				}
+			}
+			$update = dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET updated = '" . time() . "' WHERE sid = '$sid'");
+			list($chapters, $words) = dbrow(dbquery("SELECT COUNT(chapid), SUM(wordcount) FROM ".TABLEPREFIX."fanfiction_chapters WHERE validated > 0"));
+			list($authors) = dbrow(dbquery("SELECT COUNT(uid) FROM ".TABLEPREFIX."fanfiction_authorprefs WHERE stories > 0"));
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats set wordcount = '$words', chapters = '$chapters', authors = '$authors'");
+			$count =  dbquery("SELECT SUM(wordcount) as totalcount FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '$sid' AND validated = '1'");
+			list($totalcount) = dbrow($count);
+			if($totalcount) {
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET wordcount = '$totalcount' WHERE sid = '$sid'");
+			}
+		}
+		else {
+			$adminquery = dbquery("SELECT "._EMAILFIELD." as email, "._PENNAMEFIELD." as penname, contact,categories FROM ".TABLEPREFIX."fanfiction_authorprefs as ap, "._AUTHORTABLE." WHERE "._UIDFIELD." = ap.uid AND level > 0 AND level < 4");
+			if(empty($storytitle)) $storytitle = $title;
+			include("includes/emailer.php");
+			while($admins = dbassoc($adminquery)) {
+				global $sitename, $siteemail;
+				if($admins['contact'] == 1) {
+					if(!$admins['categories']) {
+						$subject = _NEWSTORYAT.$sitename;
+						$mailtext = sprintf(_NEWSTORYAT2, $storytitle, $authorpenname, $summary)."\n <a href='$url/admin.php?action=submitted'>$url/admin.php?action=submitted</a>";							
+						$mailresult = sendemail($admins['penname'], $admins['email'], $sitename, $siteemail, $subject, $mailtext, "html");
+					}	
+					else {
+						if(count(array_intersect($catid, explode(",", $admins['categories'])))) {
+							$subject = _NEWSTORYAT.$sitename;
+							$mailtext = sprintf(_NEWSTORYAT2, $storytitle, $authorpenname, $summary)."\n <a href='$url/admin.php?action=submitted'>$url/admin.php?action=submitted</a>";
+							sendemail($admins['penname'], $admins['email'], $sitename, $siteemail, $subject, $mailtext, "html");
+						}
+					}
+				}
+			}
+		}
+		return $output;
+	}
+	if($newchapter) {
+		$storyinfo = dbquery("SELECT s.*, s.updated as updated, s.date as date, "._PENNAMEFIELD." as penname  FROM ".TABLEPREFIX."fanfiction_stories as s, "._AUTHORTABLE." WHERE "._UIDFIELD." = s.uid AND sid = '$sid' LIMIT 1");
+		$stories = dbassoc($storyinfo);
+		$uid = $stories['uid'];
+		$chapterquery = dbquery("SELECT COUNT(sid) FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '$sid'");
+		list($inorder) = dbrow($chapterquery);
+	}
+	else {
+		$inorder = 0;
+		$stories['title'] = stripslashes($title);
+		$stories['summary'] = stripslashes($summary);
+		$stories['storynotes'] = stripslashes($storynotes);
+		$stories['catid'] = isset($catid) ? is_array($catid) ? implode(",", $catid) : $catid : "";
+		$stories['classes'] = isset($classes) && is_array($classes) ? implode(",", $classes) : $classes;
+		$stories['charid'] = isset($charid) ? is_array($charid) ? implode(",", $charid) : $charid : "";
+		$stories['coauthors'] = $au;
+		$stories['featured'] = $feat;
+		$stories['completed'] = $complete;
+		$stories['rid'] = $rid;
+		$stories['rr'] = $rr;
+		$stories['uid'] = $uid;
+		$stories['penname'] = $penname;
+		$stories['date'] = time( );
+		$stories['updated'] = time( );
+		$stories['sid'] = false;
+		$stories['rating'] = 0;
+		$stories['count'] = 0;
+		$stories['wordcount'] = $wordcount;
+		$stories['reviews'] = 0;
+		$stories['validated'] = 0;
+	}
+	if(!isADMIN || uLEVEL == 4) {
+		$rquery = dbquery("SELECT message_title, message_text FROM ".TABLEPREFIX."fanfiction_messages WHERE message_name = 'rules' LIMIT 1");
+		list($ruletitle, $ruletext) = dbrow($rquery);
+		$output .= "<div class=\"sectionheader\">$ruletitle</div>$ruletext";
+	}	
+	if($storytext){
+		$stories['storytext'] = $storytext;
+		$stories['chaptertitle'] = $chaptertitle;
+		$stories['inorder'] = $inorder;
+		$stories['notes'] = $notes;
+		$stories['endnotes'] = $endnotes;
+/*
+		$output .= "<div><span class=\"label\">"._CHAPTERTITLE.": </span> $chaptertitle</div>
+			<div><span class=\"label\">"._AUTHORSNOTES.":</span> ".format_story($notes)."</div>
+			<div><span class=\"label\">"._STORY.":</span><br />".format_story($storytext)."</div>
+			<div><span class=\"label\">"._ENDNOTES.":</span> ".format_story( $endnotes)."</div>";
+*/
+	}
+	if(isset($_POST['submit']) || $newchapter) $output .= preview_story($stories);
+
+	$submit = isset($_POST['submit']) ? $_POST['submit'] : false;
+	if(!$submit) $submit = _PREVIEW;
+	$output .= "<div class=\"tblborder\" style=\"width: 500px; padding: 10px; margin: 1em auto;\">
+	<form METHOD=\"POST\" name=\"form\" enctype=\"multipart/form-data\" action='stories.php?action=$action".($newchapter ? "&amp;sid=$sid&amp;inorder=$inorder" : "").($admin == 1 ? "&amp;admin=1&amp;uid=$uid" : "")."'>";
+	if(!$newchapter) $output .= storyform($stories, $submit);
+	$output .= chapterform($inorder, $notes, $endnotes, $storytext, $chaptertitle, $uid);
+	$output .= "<div style=\"text-align: center;\"><input type=\"submit\" class=\"button\" value=\""._PREVIEW."\" name=\"submit\">&nbsp; <input type=\"submit\" class=\"button\" 
+                 value=\""._ADDSTORY."\" name=\"submit\"></div></form></div>";
+	return $output;
+}
+// end newstory function
+
+function viewstories( ) {
+	global $storiespath, $ratings, $autovalidate, $reviewsallowed, $sid, $chapid, $up, $down;
+
+	$output = "<div id=\"pagetitle\">"._MANAGESTORIES."</div>";
+
+	$go = isset($_GET['go']) ? $_GET['go'] : false;
+	$com = isset($_GET['com']) ? $_GET['com'] : false;
+	$hidechapters = isset($_GET["chapters"]) ? $_GET["chapters"] : false;
+	if(($go || $com) && $sid) {
+		$inorder = isset($_GET['inorder']) && isNumber($_GET['inorder']) ? $_GET['inorder'] : false;
+		if($inorder && $chapid) {
+			if($go == "up") $oneabove = $inorder - 1;
+			else $oneabove = $inorder + 1;
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET inorder = '$inorder' WHERE sid = '$sid' and inorder = '$oneabove'");
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET inorder = '$oneabove' WHERE chapid = '$chapid'");	
+		}
+		if($com)  dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET completed = ".($com == "yes" ? "1" : "0")." WHERE sid = '$sid'");
+	}
+	$output .= "<p style=\"text-align: right; margin: 1em;\"><a href=\"stories.php?action=viewstories&amp;chapters=".($hidechapters != "view" ? "view\">"._VIEWCHAPTERS : "hide\">"._HIDECHAPTERS)."</a></p>
+		<div style=\"width: 90%; margin: 0 auto;\"><table cellpadding=\"3\" cellspacing=\"0\" width=\"100%\" class=\"tblborder\"><tr><th class=\"tblborder\">"._STORIES."</th><th colspan=\"3\" class=\"tblborder\">"._OPTIONS."</th>".($reviewsallowed ? "<th class=\"tblborder\">"._REVIEWS."</th>" : "").($autovalidate ? "" : "<th class=\"tblborder\">"._VALIDATED."</th>")."<th class=\"tblborder\">"._READS."</th></tr>";
+	
+	$squery = "SELECT stories.sid, title, reviews, rating, completed, validated, featured, count FROM " . TABLEPREFIX . "fanfiction_stories AS stories LEFT JOIN " . TABLEPREFIX . "fanfiction_coauthors AS coauth ON stories.sid = coauth.sid WHERE stories.uid = '" . USERUID . "' OR coauth.uid = '" . USERUID . "' GROUP BY stories.sid ORDER BY title ";
+	$sresult = dbquery($squery); 
+	$stories = dbnumrows($sresult);
+	while($story = dbassoc($sresult)) {
+		$query2 = dbquery("SELECT chapid, title, inorder, rating, reviews, validated, count FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '".$story['sid']."' ORDER BY inorder"); 
+		$chapters =  dbnumrows($query2);
+		$output .= "<tr><td class=\"tblborder\"><a href=\"viewstory.php?sid=".$story['sid']."\">".stripslashes($story['title'])."</a> ".ratingpics($story['rating'])." <strong>"._COMPLETE.":</strong> <a href=\"stories.php?action=viewstories&amp;sid=".$story['sid']."&amp;com=".$story['completed']."\"><a href=\"stories.php?action=viewstories&amp;sid=".$story['sid']."&amp;com=".($story['completed'] == 1 ? "no\">"._YES : "yes\">"._NO)."</a></td>
+			<td class=\"tblborder\" colspan=\"3\"><a href=\"stories.php?action=editstory&amp;sid=".$story['sid']."\">"._EDIT."</a> - <a href=\"stories.php?action=delete&amp;sid=".$story['sid']."\">"._DELETE."</a> - <a href=\"stories.php?action=newchapter&amp;sid=".$story['sid']."&amp;inorder=$chapters\">"._ADDNEWCHAPTER."</a></td>
+			";
+		if($reviewsallowed) $output .= "<td class=\"tblborder\" align=\"center\">".($story['reviews'] ? "<a href=\"reviews.php?type=ST&amp;item=".$story['sid']."\">".$story['reviews']."</a>" : "0")."</td>";
+		if(!$autovalidate) $output .= "<td class=\"tblborder\" align=\"center\">".($story['validated'] > 0 ? _YES : _NO)."</td>";
+		$output .= "<td class=\"tblborder\" align=\"center\">".($story['count'] ? $story['count'] : "0")."</td></tr>";
+		if($hidechapters && $hidechapters != "hide") {
+			while($chapter = dbassoc($query2)) {
+				$output .="<tr><td  class=\"tblborder\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"viewstory.php?sid=".$story['sid']."&amp;chapter=".$chapter['inorder']."\">$chapter[title]</a></td>";
+				if($chapters > 1) $output .= "<td  class=\"tblborder\" align=\"center\"><a href=\"stories.php?action=viewstories&amp;go=up&amp;sid=".$story['sid']."&amp;chapid=".$chapter['chapid']."&amp;inorder=".$chapter['inorder']."&amp;chapters=view\">$up</a></td>
+					<td class=\"tblborder\" align=\"center\"><a href=\"stories.php?action=viewstories&amp;go=down&amp;sid=".$story['sid']."&amp;chapid=".$chapter['chapid']."&amp;inorder=".$chapter['inorder']."&amp;chapters=view\">$down</a></td>";
+				$output .= "<td class=\"tblborder\"".($chapters > 1 ? "" : "colspan=\"3\"")."><a href=\"stories.php?action=editchapter&amp;chapid=".$chapter['chapid']."\">"._EDIT."</a>";
+				if($chapters > 1) $output .= " - <a href=\"stories.php?action=delete&amp;chapid=".$chapter['chapid']."&amp;sid=".$story['sid']."\">"._DELETE."</a>";
+				$output .= "</td><td class=\"tblborder\" align=\"center\">";
+				if($reviewsallowed) $output .= ($chapter['reviews'] ? "<a href=\"reviews.php?type=ST&amp;item=".$story['sid']."&amp;chapid=".$chapter['chapid']."\">".$chapter['reviews']."</a>" : "0");
+				if(!$autovalidate) $output .= "</td><td class=\"tblborder\" align=\"center\">".($chapter['validated'] > 0 ? _YES : _NO);
+				$output .= "<td class=\"tblborder\" align=\"center\">".$chapter['count']."</td></tr>";
+			}
+		}
+	}
+	$output .= "</table></div>";
+	if($stories < 1) $output .= write_message(_NORESULTS);
+	$output .= write_message("<a href='stories.php?action=newstory'>"._ADDNEWSTORY."</a>");
+	return $output;
+}
+// end viewstories function
+
+function editchapter( $chapid ) {
+	global $tpl, $chapid, $store, $alertson, $storiespath, $admin, $tinyMCE, $allowed_tags, $sid, $logging;
+
+	$output = "<div id=\"pagetitle\">"._EDITCHAPTER."</div>";
+// get variables from $_POST
+	if(isset($_POST['submit'])) {
+		$chaptertitle = strip_tags(descript($_POST["chaptertitle"]), $allowed_tags);
+		$notes = strip_tags(descript($_POST["notes"]), $allowed_tags);
+		$endnotes = strip_tags(descript($_POST["endnotes"]), $allowed_tags);
+		if(!empty($_FILES['storyfile']['name'])) {
+			if ($_FILES['storyfile']['type'] != 'text/html' && $_FILES['storyfile']['type'] != 'text/plain') {
+ 				 $failed = _INVALIDUPLOAD;
+				$submit = _PREVIEW;
+			}
+			else {
+				$texts = file($_FILES['storyfile']['tmp_name']);
+				foreach ($texts as $text) {
+					if($_FILES['storyfile']['type'] == 'text/html') $story .= rtrim($text, "\n\r\t")." ";
+					else $story .= $text;
+				}
+			}
+		}
+		else if(isset($_POST['storytext'])) $story = $_POST['storytext'];
+		$storytext = strip_tags(descript($story), $allowed_tags);
+		$inorder = $_POST["inorder"];
+		$words_to_count = strip_tags($storytext);
+		$pattern = "/[^(\w|\d|\'|\"|\.|\!|\?|;|,|\\|\/|\-\-|:|\&|@)]+/";
+		$words_to_count = preg_replace ($pattern, " ", $words_to_count);
+		$words_to_count = trim($words_to_count);
+		$wordcount = count(explode(" ",$words_to_count)); 
+	}
+	else {
+	}
+	if(isset($_POST['submit']) && $_POST['submit'] == _ADDSTORY) {
+		if(!$chaptertitle || !$storytext ) $submit == _PREVIEW;
+		else {
+			if($admin && empty($_POST["uid"])) {
+				$result2 = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_chapters WHERE chapid = '$chapid' LIMIT 1");
+				$user = dbassoc($result2);
+				$uid = $user['uid'];
+			}
+			else if(isset($_POST['uid']) && isNumber($_POST['uid'])) {
+				$uid = $_POST['uid'];
+			}
+			else $uid= USERUID;
+			if($store == "mysql") {
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET uid = '$uid', title = '".addslashes($chaptertitle)."', notes = '".addslashes($notes)."', endnotes = '".addslashes($endnotes)."', wordcount = '$wordcount', storytext = '".addslashes($storytext)."' WHERE chapid = '$chapid' LIMIT 1");
+			}
+			else if($store == "files"){
+				$updatequery = dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET uid = '$uid', title = '".addslashes($chaptertitle)."', notes = '".addslashes($notes)."', endnotes = '".addslashes($endnotes)."', wordcount = '$wordcount' WHERE chapid = '$chapid' LIMIT 1");
+				if( !file_exists( STORIESPATH."/$uid/" ) )
+				{
+					mkdir(STORIESPATH."/$uid", 0755);
+					chmod(STORIESPATH."/$uid", 0777);
+				}
+				$handle = fopen(STORIESPATH."/$uid/$chapid.txt", 'w+');
+
+				if ($handle)
+				{
+					fwrite($handle, descript($storytext));
+					fclose($handle);
+					$storytext = "";
+				}
+
+			}
+			//  Check that the chapter has been validated before updating the word count of the story.
+			$validquery = dbquery("SELECT validated, sid FROM ".TABLEPREFIX."fanfiction_chapters WHERE chapid = '$chapid' LIMIT 1");
+			list($valid, $sid) = dbrow($validquery);
+			if($valid) {
+				$count =  dbquery("SELECT SUM(wordcount) as totalcount FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '$sid'");
+				list($totalcount) = dbrow($count);
+				if($totalcount) {
+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET wordcount = '$totalcount' WHERE sid = '$sid'");
+				}
+			}
+			$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'editchapter'");
+			while($code = dbassoc($codequery)) {
+				eval($code['code_text']);
+			}
+			if($admin && $logging && USERUID != $uid) {
+				$storyinfo = dbquery("SELECT story.title, story.sid, chapter.uid, chapter.inorder, "._PENNAMEFIELD." as penname FROM ".TABLEPREFIX."fanfiction_stories as story, ".TABLEPREFIX."fanfiction_chapters as chapter, "._AUTHORTABLE." WHERE "._UIDFIELD." = chapter.uid AND story.sid = chapter.sid AND chapter.chapid = $chapid");
+				list($title, $sid, $chapuid, $inorder, $chappenname) = dbrow($storyinfo);
+				dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_ADMIN_EDIT_CHAPTER, USERPENNAME, USERUID, $title, $sid, $chappenname, $chapuid, $inorder))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'ED', " . time() . ")");
+			}
+			unset($_POST['submit']);
+			$output = write_message(_STORYUPDATED).editstory($sid);
+			$tpl->assign( "output", $output );
+			$tpl->printToScreen( );
+			dbclose( );
+			exit( );
+		}
+	}
+	$output .= "<div class=\"tblborder\" style=\"width: 550px; margin: 0 auto; padding: 5px;\">
+		<form METHOD=\"POST\"  enctype=\"multipart/form-data\" name=\"form\" action=\"stories.php?action=editchapter&amp;chapid=$chapid".($admin ? "&amp;admin=1" : "")."\">";
+	if(!isset($_POST['submit']) || $_POST['submit'] != _PREVIEW) {
+		$storyquery = dbquery("SELECT title, inorder, notes, endnotes, uid, storytext, sid FROM ".TABLEPREFIX."fanfiction_chapters WHERE chapid = '$chapid' LIMIT 1");
+		$story = dbassoc($storyquery);
+		$chaptertitle = stripslashes($story["title"]);
+		$storytext = $story["storytext"];
+		$inorder = $story["inorder"];
+		$notes = stripslashes($story["notes"]);
+		$endnotes = stripslashes($story["endnotes"]);
+		$sid = $story["sid"];
+
+		if($store == "mysql") $storytext = $story['storytext'];
+		else {
+			if($out = fopen (STORIESPATH."/".$story['uid']."/$chapid.txt", "r"))
+				while (!feof($out)) {
+					$storytext .= fgets($out, 10000);
+				}
+		}
+		$submit = _PREVIEW;
+		$output .= chapterform($inorder, $notes, $endnotes, stripslashes($storytext), $chaptertitle, $story['uid']);
+	}
+	else {
+		if(isset($failed)) $output .= write_message($failed);
+		$output .= "<span class='label'>"._TITLE.":</span> $chaptertitle<br />
+			<span class='label'>"._AUTHORSNOTES.":</span> $notes<br />
+			<hr><br />".format_story($storytext)."<hr>
+			<span class='label'>"._ENDNOTES.":</span> $endnotes<br />";
+		$output .= chapterform($inorder, $notes, $endnotes, $storytext, $chaptertitle, (isset($_POST['uid']) ? $_POST['uid'] : false));
+		$submit = $_POST['submit'];
+	}
+	$output .= "<p><input type=\"hidden\" name=\"sid\" value=\"$sid\"><input type=\"hidden\" name=\"inorder\" value=\"$inorder\"><input type=\"submit\" class=\"button\" value=\"$submit\" name=\"submit\">&nbsp; <input type=\"submit\" class=\"button\" value=\""._ADDSTORY."\" name=\"submit\"></p></form></div>";
+	return $output;
+
+}
+// end editchapter function
+
+function editstory($sid) {
+	global $tpl, $storiespath, $store, $allowed_tags, $uid, $admin, $tinyMCE, $up, $down, $dateformat, $classtypelist, $logging, $alertson;
+
+	$output = "<div id=\"pagetitle\">"._EDITSTORY."</div>";
+	if(isset($admin) && isset($uid)) {
+		$author = dbquery("SELECT "._PENNAMEFIELD." FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '$uid' LIMIT 1");
+		$authorvalid = 1; // It's an admin edit so it's valid.
+		list($penname) = dbrow($author);
+	}
+	else {  
+		$valid = dbquery("SELECT validated FROM ".TABLEPREFIX."fanfiction_authorprefs WHERE uid = '".USERUID."' LIMIT 1");
+		list($authorvalid) = dbrow($valid);
+		$uid = USERUID;
+		$penname = USERPENNAME;
+	}
+	if(isset($_POST['submit'])) {
+		$title = isset($_POST['title']) ? strip_tags(descript($_POST['title']), $allowed_tags) : "";
+		$summary = isset($_POST['summary']) ? strip_tags(descript($_POST['summary']), $allowed_tags) : "";
+		$storynotes = strip_tags(descript($_POST['storynotes']), $allowed_tags);
+		$rr = isset($_POST['rr']) && isNumber($_POST['rr']) ? $_POST['rr'] : 0;
+		$feat = isset($_POST['feature']) && isNumber($_POST['feature']) ? $_POST['feature'] : 0;
+		$complete = isset($_POST['complete']) && isNumber($_POST['complete']) ? $_POST['complete'] : 0;
+		$validated = isset($_POST['validated']) && isNumber($_POST['validated']) ? $_POST['validated'] : 0;
+		$chaptertitle = isset($_POST['chaptertitle']) ? descript(strip_tags($_POST['chaptertitle'], $allowed_tags)) : "";
+		$notes = isset($_POST['notes']) ? strip_tags(descript($_POST['notes']), $allowed_tags) : "";
+		$endnotes = isset($_POST['endnotes']) ? strip_tags(descript($_POST['endnotes']), $allowed_tags) : "";
+		$rid = isset($_POST['rid']) && isNumber($_POST['rid']) ? $_POST['rid'] : 0;
+		$catid = isset($_POST['catid']) ? array_filter(explode(",", $_POST['catid']), "isNumber") : array( );
+		$charid = isset($_POST['charid']) ? array_filter($_POST['charid'], "isNumber") : array( );
+		$array_coauthors = isset($_POST['coauthors']) ? array_filter(explode(",", $_POST['coauthors']), "isNumber") : array( );
+		if(isset($_POST['uid']) && isNumber($_POST['uid'])) $uid = $_POST['uid'];
+		else $uid = USERUID;
+		$classes = array( );
+		$classquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_classtypes");
+		while($type = dbassoc($classquery)) {
+			if(isset($_POST["class_".$type['classtype_id']])) {
+				$opts = is_array($_POST["class_".$type['classtype_id']]) ? array_filter($_POST["class_".$type['classtype_id']], "isNumber") : "";
+				$classes = array_merge($opts, $classes);
+			}
+		}
+		if(!$admin && $authorvalid && !$validated) $validated = 2;
+		$au[] = $uid;
+		if(count($array_coauthors)) {
+			$au = array_merge($au, $array_coauthors);
+			$coauthors = 1;
+		}
+		else $coauthors = 0;
+	}
+	if(isset($_POST['submit']) && $_POST['submit'] == _ADDSTORY) {
+		$oldcats = isset($_POST['oldcats']) ? array_filter(explode(",", $_POST['oldcats']), "isNumber") : array( );
+		if (!$rid || !$title || !$summary || !$catid) {
+			$output .= write_error(_MISSINGFIELDS);
+			$submit = _PREVIEW;
+		}
+		else {
+			// Change author of story.
+			if($admin) {
+				$authquery = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_stories WHERE sid = '".$sid."'");
+				list($olduid) = dbrow($authquery);
+				if($olduid != $uid) {
+					if($store == "files") {
+						$chapters = dbquery("SELECT chapid FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '$sid' AND uid = '$olduid'");
+						while($chap = dbassoc($chapters)) {
+							$chapid = $chap['chapid'];
+							$storytext = "";
+							if($out = fopen (STORIESPATH."/$olduid/$chapid.txt", "r"))
+							while (!feof($out)) {
+								$storytext .= fgets($out, 10000);
+							}
+							fclose($out);
+							unlink(STORIESPATH."/$olduid/$chapid.txt"); 
+							if($storytext) {
+								if( !file_exists( STORIESPATH."/$uid/" ) ) {
+									mkdir(STORIESPATH."/$uid", 0755);
+									chmod(STORIESPATH."/$uid", 0777);
+								}
+								$handle = fopen(STORIESPATH."/$uid/$chapid.txt", 'w');
+								if ($handle) {
+									fwrite($handle, $storytext);
+									fclose($handle);
+								}
+								chmod(STORIESPATH."/$uid/$chapid.txt", 0644);
+							}
+							dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET uid = '$uid' WHERE chapid = '$chapid' LIMIT 1");
+						}
+					}
+					else $chapupdate = dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET uid = '$uid' WHERE sid = '$sid' AND uid = '$olduid'");
+					$switch = dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET uid = '$uid' WHERE sid = '$sid' LIMIT 1");
+					if($logging) {
+						$authorquery = dbquery("SELECT "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '$olduid' LIMIT 1");
+						list($oldpenname) = dbrow($authorquery);
+						$author2query = dbquery("SELECT "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '$uid' LIMIT 1");
+						list($newpenname) = dbrow($author2query);
+						dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_ADMIN_EDIT_AUTHOR, USERPENNAME, USERUID, $title, $sid, $newpenname, $uid, $oldpenname, $olduid))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'ED', " . time() . ")");
+					}
+				}
+
+			}
+			// End change author of story
+			$oldinfo = dbquery("SELECT title, validated, featured, catid FROM ".TABLEPREFIX."fanfiction_stories WHERE sid = '$sid' LIMIT 1");
+			list($storytitle, $oldvalid, $oldfeat, $oldcats ) = dbrow($oldinfo);
+			$oldcats = explode(",", $oldcats);
+			if($validated) {
+				if(!$oldvalid) {
+					include("includes/emailer.php");
+					list($newchapter) = dbrow(dbquery("SELECT validated FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '$sid' AND inorder = '1'"));
+					if(!$newchapter) {
+						if($alertson) {
+							$pennames[] = $penname;
+							$coQuery = dbquery("SELECT "._PENNAMEFIELD." AS penname FROM ".TABLEPREFIX."fanfiction_coauthors AS c LEFT JOIN "._AUTHORTABLE." ON "._UIDFIELD." = c.uid WHERE sid = '$sid' ");
+							while($c = dbassoc($coQuery)) {
+								$pennames[] = $c['penname'];
+							}
+							$subject = _NEWSTORYAT;
+							$mailtext = sprintf(_AUTHORALERTNOTE, $title, implode(", ", $pennames), $summary, $sid);
+							$favorites = dbquery("SELECT "._UIDFIELD." as uid, "._EMAILFIELD." as email, "._PENNAMEFIELD." as penname, alertson FROM ".TABLEPREFIX."fanfiction_favorites as fav, ".TABLEPREFIX."fanfiction_authorprefs as ap, "._AUTHORTABLE." WHERE fav.item = $uid AND fav.type = 'AU' AND fav.uid = "._UIDFIELD." AND ap.uid = "._UIDFIELD." AND ap.alertson = '1'");
+							while($favuser = dbassoc($favorites)) { 
+								sendemail($favuser['penname'], $favuser['email'], $sitename, $siteemail, $subject, $mailtext, "html");
+							}				
+						}
+					}
+					else if($alertson && $newchapter) {
+						$pennames[] = $penname;
+						$coQuery = dbquery("SELECT "._PENNAMEFIELD." AS penname FROM ".TABLEPREFIX."fanfiction_coauthors AS c LEFT JOIN "._AUTHORTABLE." ON "._UIDFIELD." = c.uid WHERE sid = '$sid'");
+						while($c = dbassoc($coQuery)) {
+							$pennames[] = $c['penname'];
+						}
+						$titlequery = dbquery("SELECT title FROM ".TABLEPREFIX."fanfiction_stories WHERE sid = '$sid' LIMIT 1");
+						list($title) = dbrow($titlequery);
+						list($inorder) = dbrow(dbquery("SELECT inorder FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '$sid' ORDER BY inorder DESC LIMIT 1"));
+						$subject = _STORYALERT;
+						$mailtext = sprintf(_STORYALERTNOTE, $storytitle, implode(", ", $pennames), $sid, $inorder);
+						$favorites = dbquery("SELECT "._UIDFIELD." as uid, "._EMAILFIELD." as email, "._PENNAMEFIELD." as penname, alertson FROM ".TABLEPREFIX."fanfiction_favorites as fav, ".TABLEPREFIX."fanfiction_authorprefs as ap, "._AUTHORTABLE." WHERE fav.item = '$sid' AND fav.type = 'ST' AND fav.uid = "._UIDFIELD." AND ap.uid = "._UIDFIELD." AND ap.alertson = '1'");
+						while($favuser = dbassoc($favorites)) { 
+							sendemail($favuser['penname'], $favuser['email'], $sitename, $siteemail, $subject, $mailtext, "html");
+						}
+					}
+					$update = dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET validated = '$validated', updated = '" . time() . "' WHERE sid = '$sid'");
+					$update2 = dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET validated = 1 WHERE sid = '$sid'");
+					$coauths = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_coauthors WHERE sid = '$sid'");
+					while($c = dbassoc($coauths)) {
+						dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET stories = stories + 1 WHERE uid = '".$c['uid']."'");
+					}
+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET stories = stories + 1 WHERE uid = '$uid'");
+					$count =  dbquery("SELECT SUM(wordcount) as totalcount FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '$sid' AND validated = '1'");
+					list($totalcount) = dbrow($count);
+					if($totalcount) {
+						dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET wordcount = '$totalcount' WHERE sid = '$sid'");
+					}
+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET stories = stories + 1");
+				}
+				else if($validated == 2) {
+					$update = dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET validated = '$validated' WHERE sid = '$sid'");
+					$update2 = dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET validated = 1 WHERE sid = '$sid'");
+					$count =  dbquery("SELECT SUM(wordcount) as totalcount FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '$sid' AND validated = '1'");
+					list($totalcount) = dbrow($count);
+					if($totalcount) {
+						dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET wordcount = '$totalcount' WHERE sid = '$sid'");
+					}
+				}
+				$newcats = array_diff($catid, $oldcats);
+				foreach($newcats as $cat)  { categoryitems($cat, 1); }
+				$delcats = array_diff($oldcats, $catid);
+				foreach($delcats as $cat) { categoryitems($cat, -1); }
+			}
+			else if($admin && !$validated && $oldvalid > 0) {
+				foreach($oldcats as $cat) { categoryitems($cat, -1); }
+				$update = dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET validated = '0' WHERE sid = '$sid'");
+				$update2 = dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET validated = 0 WHERE sid = '$sid'");
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET stories = stories - 1");
+				$coauths = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_coauthors WHERE sid = '$sid'");
+				while($c = dbassoc($coauths)) {
+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET stories = stories - 1 WHERE uid = '".$c['uid']."'");
+				}
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET stories = stories - 1 WHERE uid = '$uid'");
+				list($chapters, $words) = dbrow(dbquery("SELECT COUNT(chapid), SUM(wordcount) FROM ".TABLEPREFIX."fanfiction_chapters WHERE validated > 0"));
+				list($authors) = dbrow(dbquery("SELECT COUNT(uid) FROM ".TABLEPREFIX."fanfiction_authorprefs WHERE stories > 0"));
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats set wordcount = '$words', chapters = '$chapters', authors = '$authors'");
+			}
+			else if(!$admin) $validated = $oldvalid;
+			if(!$admin && $oldfeat != $feat) $feat = $oldfeat;
+			// Update the site stats
+			list($chapters, $words) = dbrow(dbquery("SELECT COUNT(chapid), SUM(wordcount) FROM ".TABLEPREFIX."fanfiction_chapters WHERE validated > 0"));
+			list($authors) = dbrow(dbquery("SELECT COUNT(uid) FROM ".TABLEPREFIX."fanfiction_authorprefs WHERE stories > 0"));
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats set wordcount = '$words', chapters = '$chapters', authors = '$authors'");
+
+			$updatequery = dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET title = '".addslashes($title)."', summary = '".addslashes(format_story($summary))."', storynotes = '".addslashes(format_story($storynotes))."', rr = '".($rr ? 1 : 0)."', completed = '".($complete ? 1 : 0)."', validated = '$validated', rid = '$rid', classes = '".(is_array($classes) ? implode(",", $classes) : $classes)."', charid = '".(is_array($charid) ? implode(",", $charid) : $charid)."', catid = '".(is_array($catid) ? implode(",", $catid) : $catid)."', coauthors = '".$coauthors."', featured = '$feat' WHERE sid = '$sid'");
+		 
+			$clist = array( );
+			$coauths = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_coauthors WHERE sid = '$sid'");
+			while($c = dbassoc($coauths)) {
+				$clist[] = $c['uid'];
+			}
+			foreach($au AS $a) {
+				if($a == $uid) continue;
+				if(!in_array($a, $clist)) {
+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET stories = stories + 1 WHERE uid = '$a'");
+					dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_coauthors(`sid`, `uid`) VALUES('$sid', '$a')");
+				}
+			}
+			foreach($clist AS $c) {
+				if(!in_array($c, $au)) {
+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET stories = stories - 1 WHERE uid = '$c'");
+					dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_coauthors WHERE sid = '$sid' AND uid = '$c'");
+				}		
+			}
+			$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'editstory'");
+			while($code = dbassoc($codequery)) {
+				eval($code['code_text']);
+			}
+			if($logging && $admin) {
+				if(USERUID != $uid) { // If you're editing your own story, don't log it.
+					$authorquery = dbquery("SELECT "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '$uid' LIMIT 1");
+					list($penname) = dbrow($authorquery);
+					dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_ADMIN_EDIT, USERPENNAME, USERUID, $title, $sid, $penname, $uid))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'ED', " . time() . ")");
+				}
+			}
+			$output .= write_message(_STORYUPDATED."  ".($admin ? _BACK2ADMIN : _BACK2ACCT));
+			$tpl->assign( "output", $output );
+			$tpl->printToScreen( );
+			dbclose( );
+			exit( );
+		}
+	}
+	$query = dbquery("SELECT DATE_FORMAT(FROM_UNIXTIME(date), '$dateformat') as date, wordcount, uid FROM ".TABLEPREFIX."fanfiction_stories WHERE sid = '$sid' LIMIT 1");
+	list($published, $wordcount, $storyuid) = dbrow($query);
+	$formbegin = "<div class=\"tblborder\" style=\"margin: 10px auto; width: 550px; padding: 10px;\">
+		<form METHOD=\"POST\" name=\"form\" action=\"stories.php?action=editstory".($admin ? "&amp;admin=1" : "")."&amp;sid=$sid\">";
+
+	if(isset($_POST['submit']) && $_POST['submit'] != _PREVIEW) {
+		$submit = _PREVIEW;
+		$storyquery = dbquery("SELECT title, summary, storynotes,  rr, completed, rid, classes, charid, catid, featured, uid, coauthors, date as date FROM ".TABLEPREFIX."fanfiction_stories WHERE sid = '$sid' LIMIT 1");
+		$story = dbassoc($storyquery);
+		$output .= $formbegin.storyform($story, $preview);
+		$output .= "<input type=\"hidden\" name=\"oldcats\" value =\"".$story['catid']."\">";
+	}
+	else {
+		$submit = _PREVIEW;
+		$storyinfo = dbquery("SELECT s.*, s.date as date, s.updated as updated, "._PENNAMEFIELD." as penname FROM ".TABLEPREFIX."fanfiction_stories as s, "._AUTHORTABLE." WHERE "._UIDFIELD." = s.uid AND sid = '$sid' LIMIT 1");
+		$stories = dbassoc($storyinfo);
+		if($stories['coauthors'] && !isset($_POST['submit'])) {
+			$au = array();
+			$coauths = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_coauthors WHERE sid = '".$stories['sid']."'");
+			while($c = dbassoc($coauths)) {
+				$au[] = $c['uid'];
+			}
+			$stories['coauthors'] = $au;
+		}
+		if(isset($_POST['submit'])) {
+			$stories['title'] = stripslashes($title);
+			$stories['summary'] = stripslashes($summary);
+			$stories['storynotes'] = stripslashes($storynotes);
+			$stories['catid'] = isset($catid) ? is_array($catid) ? implode(",", $catid) : $catid : "";
+			$stories['classes'] = isset($classes) && is_array($classes) ? implode(",", $classes) : $classes;
+			$stories['charid'] = isset($charid) ? is_array($charid) ? implode(",", $charid) : $charid : "";		
+			$stories['coauthors'] = $au;
+			$stories['featured'] = $feat;
+			$stories['completed'] = $complete;
+			$stories['rid'] = $rid;
+			$stories['rr'] = $rr;
+			$stories['uid'] = $uid;
+			$stories['wordcount'] = $wordcount;
+		}
+		$output .= preview_story($stories);
+		$output .= $formbegin.storyform($stories, _PREVIEW);
+	}
+
+	$chapquery = dbquery("SELECT chapid, title, inorder, rating, reviews, validated, uid FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '$sid' ORDER BY inorder");
+	$chapters = dbnumrows($chapquery);
+	$output .= "<p><input type=\"submit\" class=\"button\" value=\"$submit\" name=\"submit\">&nbsp; <input type=\"submit\" class=\"button\" value=\""._ADDSTORY."\" name=\"submit\"></p></form></div>";
+	$output .= "<br><table class=\"tblborder\" style=\"margin: 0 auto; width: 500px;\"><tr><th>"._CHAPTER."</th>".($chapters > 1 ? "<th>"._MOVE."</th>" : "")."<th>"._OPTIONS."</th></tr>";
+			while($chapter = dbassoc($chapquery)) {
+				$output .="<tr><td class=\"tblborder\"><a href=\"viewstory.php?sid=$sid&amp;chapter=".$chapter['inorder']."\">".$chapter['title']."</a></td>";
+				if($chapters > 1) $output .= "<td align=\"center\" class=\"tblborder\">".($chapter['inorder'] == 1 ? "" : "<a href=\"stories.php?action=viewstories&amp;go=up&amp;sid=$sid&amp;chapid=".$chapter['chapid']."&amp;inorder=".$chapter['inorder']."\">$up</a>").
+					($chapter['inorder'] == $chapters ? "" : "<a href=\"stories.php?action=viewstories&amp;go=down&amp;sid=$sid&amp;chapid=".$chapter['chapid']."&amp;inorder=".$chapter['inorder']."\">$down</a>")."</td>";
+				$output .= "<td class=\"tblborder\" align=\"center\"><a href=\"stories.php?action=editchapter&amp;chapid=".$chapter['chapid'].($admin ? "&amp;admin=1&amp;uid=".$chapter['uid'] : "")."\">"._EDIT."</a>";
+				if($chapters > 1) $output .= " - <a href=\"stories.php?action=delete&amp;chapid=".$chapter['chapid']."&amp;sid=$sid".($admin ? "&amp;admin=1&amp;uid=".$chapter['uid'] : "")."\">"._DELETE."</a>";
+				$output .= "</td></tr>";
+			}
+	$output .= "<tr><td class=\"tblborder\" colspan=\"3\" align=\"center\"><a href=\"stories.php?action=newchapter&amp;sid=$sid&amp;inorder=$chapters".($admin ? "&amp;admin=1&amp;uid=".$storyuid : "")."\">"._ADDNEWCHAPTER."</a></td></tr></table>";
+	return $output;
+}
+// end editstory
+
+function delete( ) {
+	global $tpl, $store, $storiespath, $admin, $sid, $chapid, $logging;
+
+	$confirmed = isset($_GET['confirmed']) ? $_GET['confirmed'] : false;
+	if(!$sid && !$chapid) return write_error(_ERROR);
+	$output = "<div id=\"pagetitle\">".($chapid ? _DELETECHAPTERTITLE : _DELETESTORYTITLE)."</div>";
+	if($admin) {
+		if($chapid) $authorquery = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_chapters WHERE chapid = '$chapid' LIMIT 1");
+		else $authorquery = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_stories WHERE sid = '$sid' LIMIT 1");
+		list($uid) = dbrow($authorquery);
+	}
+	else $uid = USERUID;
+	if($confirmed == "no") {
+		$output .= "<center>"._ACTIONCANCELLED."  ".($admin ? _BACK2ADMIN : _BACK2ACCT)."</center>";
+	}
+	else if($confirmed == "yes") {
+		$storyquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_stories WHERE sid = '$sid' LIMIT 1");
+		$story = dbassoc($storyquery);
+		if($chapid) {
+			$chapterquery = dbquery("SELECT inorder, chapid, uid FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '$sid'");
+			$orderquery = dbquery("SELECT inorder FROM ".TABLEPREFIX."fanfiction_chapters WHERE chapid = '$chapid' LIMIT 1");
+			list($inorder) = dbrow($orderquery);
+			if(empty($inorder)) { // Shouldn't be possible and yet someone managed to do it.
+				errorExit();
+			}
+			$chapters = dbnumrows($chapterquery);
+		}
+		if(isset($chapters) && $chapters > 1) {
+			list($valid) = dbrow(dbquery("SELECT validated FROM ".TABLEPREFIX."fanfiction_chapters where chapid = '$chapid' LIMIT 1"));
+			dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_chapters WHERE chapid = '$chapid' LIMIT 1");
+			if($valid) dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET chapters = chapters - 1");
+			if($store == "files") unlink(STORIESPATH."/$uid/".$chapid.".txt"); 
+			if($inorder < $chapters) 
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET inorder = (inorder - 1) WHERE sid = '$sid' AND inorder > $inorder");
+			$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'delchapter'");
+			while($code = dbassoc($codequery)) {
+				eval($code['code_text']);
+			}
+
+			if($logging && $admin) {
+				$authorquery = dbquery("SELECT "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '$uid' LIMIT 1");
+				list($penname) = dbrow($authorquery);
+				dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_ADMIN_DEL_CHAPTER, USERPENNAME, USERUID, $story['title'], $sid, $penname, $uid, $inorder))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'DL', " . time() . ")");
+			}
+			return "<center>"._ACTIONSUCCESSFUL."</center>".editstory( $sid );
+		}
+		else {
+			include("includes/deletefunctions.php");
+			deleteStory($story);
+		}
+		$output = write_message(_ACTIONSUCCESSFUL."  ".($admin ? _BACK2ADMIN : viewstories( )));	
+	}
+	else {
+		if($chapid) {
+			$output .= write_message(_CONFIRMDELETE."<BR><BR>
+[ <a href=\"stories.php?action=delete&amp;confirmed=yes&amp;chapid=$chapid&amp;sid=$sid".(!empty($admin) ? "&amp;admin=1&amp;uid=".$uid : "")."\">"._YES."</a> | 
+				<a href=\"stories.php?action=delete&amp;confirmed=no\">"._NO."</a> ]");
+		}
+		else {
+			$output .= write_message(_DELETESTORY."<BR><BR>
+[ <a href=\"stories.php?action=delete&amp;confirmed=yes&amp;sid=$sid".(!empty($admin) ? "&amp;admin=1&amp;uid=".$uid : "")."\">"._YES."</a> | 
+				<a href=\"stories.php?action=delete&amp;confirmed=no\">"._NO."</a> ]");
+		}
+	}
+	return $output;
+}
+// end delete
+	
+switch($action) {
+	case "newstory":
+		$output .= newstory( );
+		break;
+	case "newchapter":
+		$output .= newstory( );
+		break;
+	case "editchapter":
+
+		$output .= editchapter($chapid);			
+		break;
+	case "editstory":
+		$output .= editstory($sid);
+		break;
+	case "delete":
+		$output .= delete( );
+		break;
+	default:
+		$output .= viewstories( );
+		break;
+}
+
+	$tpl->assign( "output", $output );
+	$tpl->printToScreen();
+	dbclose( );
+?>

file:b/template.php (new)
--- /dev/null
+++ b/template.php
@@ -1,1 +1,55 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+/* The $current variable is used to create the {page_id} variable. It is also 
+used in the pagelinks to identify the current page being displayed so that 
+link in the menu block can be highlighted.  If you decide to set this, check 
+the docs/creating_skins.htm file for a list of words already in use.  If you
+don't intend to use {page_id} in your skins and haven't added this page to 
+the $pagelinks list.  You can just ignore it */
+
+$current = "template";
+
+include ("header.php");
+
+if(file_exists("$skindir/default.tpl")) $tpl = new TemplatePower( "$skindir/default.tpl" );
+else $tpl = new TemplatePower(_BASEDIR."default_tpls/default.tpl");
+$tpl->assignInclude( "header", "./$skindir/header.tpl" );
+$tpl->assignInclude( "footer", "./$skindir/footer.tpl" );
+//let TemplatePower do its thing, parsing etc.
+$tpl->prepare();
+
+include("includes/pagesetup.php");
+
+//Start modifying below:
+
+/* This page is included for pages that require the inclusion of php scripting.  
+If you need to include html/text only you're encouraged to use the custom page 
+panel in the admin area.*/
+
+
+//Don't modify below this line	
+$tpl->assign("output", $output);
+$tpl->printToScreen();
+dbclose( );
+?>

file:b/tinymce/index.php (new)
--- /dev/null
+++ b/tinymce/index.php

file:b/tinymce/init.php (new)
--- /dev/null
+++ b/tinymce/init.php
@@ -1,1 +1,49 @@
+<?php
 
+echo "
+<script language=\"javascript\" type=\"text/javascript\"><!--";
+		$tinymessage = dbquery("SELECT message_text FROM " . TABLEPREFIX . "fanfiction_messages WHERE message_name = 'tinyMCE' LIMIT 1");
+		list($tinysettings) = dbrow($tinymessage);
+		if (!empty($tinysettings) && $current != "adminarea")
+		{
+			echo $tinysettings;
+		}
+		else
+		{
+			echo "
+	tinyMCE.init({ 
+		theme: 'advanced',
+		height: '250',
+		language: '$language',
+		convert_urls: 'false',
+		mode: 'textareas',
+		extended_valid_elements: 'a[name|href|target|title]',
+		plugins: 'advhr,advimage,advlink,searchreplace,contextmenu,preview,fullscreen,paste" . ($current == "adminarea" ? ",codeprotect" : "") . "',
+		theme_advanced_buttons1_add: 'fontsizeselect',
+		theme_advanced_buttons2_add: 'separator,pasteword,pastetext',
+		theme_advanced_buttons3_add_before: 'tablecontrols,separator',
+		theme_advanced_buttons3_add: 'advhr',
+		theme_advanced_toolbar_align: 'center',
+		theme_advanced_statusbar_location: 'bottom',
+		theme_advanced_path: 'false',
+		editor_deselector: 'mceNoEditor',
+";
+			if (USERUID)
+				echo "		external_image_list_url : '" . STORIESPATH . "/" . USERUID . "/images/imagelist.js',";
+			echo "
+		theme_advanced_resizing: true," . ($current == "adminarea" ? "\n\t\tentity_encoding: 'raw'" : "\n\t\tinvalid_elements: 'script,object,applet,iframe'") . "
+   });
+";
+		}
+		echo "
+var tinyMCEmode = true;
+	function toogleEditorMode(id) {
+		var elm = document.getElementById(id);
+
+		if (tinyMCE.getInstanceById(id) == null)
+			tinyMCE.execCommand('mceAddControl', false, id);
+		else
+			tinyMCE.execCommand('mceRemoveControl', false, id);
+	}
+";
+		echo " --></script>";

--- /dev/null
+++ b/tinymce/jscripts/index.php

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/blank.htm
@@ -1,1 +1,10 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>blank_page</title>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+</head>
+<body class="mceContentBody">
 
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/changelog.txt
@@ -1,1 +1,15 @@
+Version 2.0.1 (2008-03-12)
+	Fixed bug where Firefox 3 wasn't loading the contents correctly.
+Version 2.0 (2008-01-30)
+	Final version of the 2.x branch released.
+Version 2.0rc1 (2008-01-14)
+	Moved package from beta to release candidate.
+Version 2.0b2 (2007-11-21)
+	Fixed typo of que to queue so it compatible with TinyMCE 3.0b1.
+Version 2.0b1 (2007-11-15)
+	Fixed bug with IE6 casting an error on async property.
+Version 2.0a2 (2007-11-xx)
+	Fixed bug where on demand loading didn't work correctly in IE and Safari.
+Version 2.0a1 (2007-11-01)
+	Rewritten compressor for TinyMCE 3.x has on demand and progressive loading features.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/index.htm
@@ -1,1 +1,11 @@
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+<title>blank_page</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+</head>
+<body>
 
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/index.php

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/langs/en.js
@@ -1,1 +1,154 @@
-
+tinyMCE.addI18n({en:{
+common:{
+edit_confirm:"Do you want to use the WYSIWYG mode for this textarea?",
+apply:"Apply",
+insert:"Insert",
+update:"Update",
+cancel:"Cancel",
+close:"Close",
+browse:"Browse",
+class_name:"Class",
+not_set:"-- Not set --",
+clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?",
+clipboard_no_support:"Currently not supported by your browser, use keyboard shortcuts instead.",
+popup_blocked:"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.",
+invalid_data:"Error: Invalid values entered, these are marked in red.",
+more_colors:"More colors"
+},
+contextmenu:{
+align:"Alignment",
+left:"Left",
+center:"Center",
+right:"Right",
+full:"Full"
+},
+insertdatetime:{
+date_fmt:"%Y-%m-%d",
+time_fmt:"%H:%M:%S",
+insertdate_desc:"Insert date",
+inserttime_desc:"Insert time",
+months_long:"January,February,March,April,May,June,July,August,September,October,November,December",
+months_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",
+day_long:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday",
+day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun"
+},
+print:{
+print_desc:"Print"
+},
+preview:{
+preview_desc:"Preview"
+},
+directionality:{
+ltr_desc:"Direction left to right",
+rtl_desc:"Direction right to left"
+},
+layer:{
+insertlayer_desc:"Insert new layer",
+forward_desc:"Move forward",
+backward_desc:"Move backward",
+absolute_desc:"Toggle absolute positioning",
+content:"New layer..."
+},
+save:{
+save_desc:"Save",
+cancel_desc:"Cancel all changes"
+},
+nonbreaking:{
+nonbreaking_desc:"Insert non-breaking space character"
+},
+iespell:{
+iespell_desc:"Run spell checking",
+download:"ieSpell not detected. Do you want to install it now?"
+},
+advhr:{
+advhr_desc:"Horizontal rule"
+},
+emotions:{
+emotions_desc:"Emotions"
+},
+searchreplace:{
+search_desc:"Find",
+replace_desc:"Find/Replace"
+},
+advimage:{
+image_desc:"Insert/edit image"
+},
+advlink:{
+link_desc:"Insert/edit link"
+},
+xhtmlxtras:{
+cite_desc:"Citation",
+abbr_desc:"Abbreviation",
+acronym_desc:"Acronym",
+del_desc:"Deletion",
+ins_desc:"Insertion",
+attribs_desc:"Insert/Edit Attributes"
+},
+style:{
+desc:"Edit CSS Style"
+},
+paste:{
+paste_text_desc:"Paste as Plain Text",
+paste_word_desc:"Paste from Word",
+selectall_desc:"Select All"
+},
+paste_dlg:{
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",
+text_linebreaks:"Keep linebreaks",
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."
+},
+table:{
+desc:"Inserts a new table",
+row_before_desc:"Insert row before",
+row_after_desc:"Insert row after",
+delete_row_desc:"Delete row",
+col_before_desc:"Insert column before",
+col_after_desc:"Insert column after",
+delete_col_desc:"Remove column",
+split_cells_desc:"Split merged table cells",
+merge_cells_desc:"Merge table cells",
+row_desc:"Table row properties",
+cell_desc:"Table cell properties",
+props_desc:"Table properties",
+paste_row_before_desc:"Paste table row before",
+paste_row_after_desc:"Paste table row after",
+cut_row_desc:"Cut table row",
+copy_row_desc:"Copy table row",
+del:"Delete table",
+row:"Row",
+col:"Column",
+cell:"Cell"
+},
+autosave:{
+unload_msg:"The changes you made will be lost if you navigate away from this page."
+},
+fullscreen:{
+desc:"Toggle fullscreen mode"
+},
+media:{
+desc:"Insert / edit embedded media",
+edit:"Edit embedded media"
+},
+fullpage:{
+desc:"Document properties"
+},
+template:{
+desc:"Insert predefined template content"
+},
+visualchars:{
+desc:"Visual control characters on/off."
+},
+spellchecker:{
+desc:"Toggle spellchecker",
+menu:"Spellchecker settings",
+ignore_word:"Ignore word",
+ignore_words:"Ignore all",
+langs:"Languages",
+wait:"Please wait...",
+sug:"Suggestions",
+no_sug:"No suggestions",
+no_mpell:"No misspellings found."
+},
+pagebreak:{
+desc:"Insert page break."
+}}});

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/langs/readme.txt
@@ -1,1 +1,10 @@
+Beginning with version 2.0.5 the language packs are no
+longer included with the core distribution.
+Language packs can be downloaded from the TinyMCE website:
+http://tinymce.moxiecode.com/download.php
 
+The language pack codes are based on ISO-639-1:
+http://www.loc.gov/standards/iso639-2/englangn.html
+
+Plrease try using entities if possible. Like &aring; etc for non a-z characters.
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/license.txt
@@ -1,1 +1,505 @@
-
+		  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!
+
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advhr/css/advhr.css
@@ -1,1 +1,6 @@
+input.radio {border:1px none #000; background:transparent; vertical-align:middle;}
+.panel_wrapper div.current {height:80px;}
+#width {width:50px; vertical-align:middle;}
+#width2 {width:50px; vertical-align:middle;}
+#size {width:100px;}
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advhr/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.AdvancedHRPlugin',{init:function(ed,url){ed.addCommand('mceAdvancedHr',function(){ed.windowManager.open({file:url+'/rule.htm',width:250+parseInt(ed.getLang('advhr.delta_width',0)),height:160+parseInt(ed.getLang('advhr.delta_height',0)),inline:1},{plugin_url:url});});ed.addButton('advhr',{title:'advhr.advhr_desc',cmd:'mceAdvancedHr'});ed.onNodeChange.add(function(ed,cm,n){cm.setActive('advhr',n.nodeName=='HR');});ed.onClick.add(function(ed,e){e=e.target;if(e.nodeName==='HR')ed.selection.select(e);});},getInfo:function(){return{longname:'Advanced HR',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advhr',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.PluginManager.add('advhr',tinymce.plugins.AdvancedHRPlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advhr/editor_plugin_src.js
@@ -1,1 +1,54 @@
+/**
+ * $Id: editor_plugin_src.js 520 2008-01-07 16:30:32Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.AdvancedHRPlugin', {
+		init : function(ed, url) {
+			// Register commands
+			ed.addCommand('mceAdvancedHr', function() {
+				ed.windowManager.open({
+					file : url + '/rule.htm',
+					width : 250 + parseInt(ed.getLang('advhr.delta_width', 0)),
+					height : 160 + parseInt(ed.getLang('advhr.delta_height', 0)),
+					inline : 1
+				}, {
+					plugin_url : url
+				});
+			});
+
+			// Register buttons
+			ed.addButton('advhr', {
+				title : 'advhr.advhr_desc',
+				cmd : 'mceAdvancedHr'
+			});
+
+			ed.onNodeChange.add(function(ed, cm, n) {
+				cm.setActive('advhr', n.nodeName == 'HR');
+			});
+
+			ed.onClick.add(function(ed, e) {
+				e = e.target;
+
+				if (e.nodeName === 'HR')
+					ed.selection.select(e);
+			});
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Advanced HR',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advhr',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('advhr', tinymce.plugins.AdvancedHRPlugin);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/advhr/images/advhr.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advhr/js/rule.js
@@ -1,1 +1,44 @@
+var AdvHRDialog = {
+	init : function(ed) {
+		var dom = ed.dom, f = document.forms[0], n = ed.selection.getNode(), w;
 
+		w = dom.getAttrib(n, 'width');
+		f.width.value = w ? parseInt(w) : (dom.getStyle('width') || '');
+		f.size.value = dom.getAttrib(n, 'size') || parseInt(dom.getStyle('height')) || '';
+		f.noshade.checked = !!dom.getAttrib(n, 'noshade') || !!dom.getStyle('border-width');
+		selectByValue(f, 'width2', w.indexOf('%') != -1 ? '%' : 'px');
+	},
+
+	update : function() {
+		var ed = tinyMCEPopup.editor, h, f = document.forms[0], st = '';
+
+		h = '<hr';
+
+		if (f.size.value) {
+			h += ' size="' + f.size.value + '"';
+			st += ' height:' + f.size.value + 'px;';
+		}
+
+		if (f.width.value) {
+			h += ' width="' + f.width.value + (f.width2.value == '%' ? '%' : '') + '"';
+			st += ' width:' + f.width.value + (f.width2.value == '%' ? '%' : 'px') + ';';
+		}
+
+		if (f.noshade.checked) {
+			h += ' noshade="noshade"';
+			st += ' border-width: 1px; border-style: solid; border-color: #CCCCCC; color: #ffffff;';
+		}
+
+		if (ed.settings.inline_styles)
+			h += ' style="' + tinymce.trim(st) + '"';
+
+		h += ' />';
+
+		ed.execCommand("mceInsertContent", false, h);
+		tinyMCEPopup.close();
+	}
+};
+
+tinyMCEPopup.requireLangPack();
+tinyMCEPopup.onInit.add(AdvHRDialog.init, AdvHRDialog);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advhr/jscripts/rule.js
@@ -1,1 +1,44 @@
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
 
+	var formObj = document.forms[0];
+	formObj.width.value  = tinyMCE.getWindowArg('width');
+	formObj.size.value   = tinyMCE.getWindowArg('size');
+	formObj.insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('mceDo'),'Insert',true);
+	if (tinyMCE.getWindowArg('noshade')) {
+		formObj.noshade.checked = true;
+	}
+	if (tinyMCE.getWindowArg('width').lastIndexOf('%')!=-1) {
+		formObj.width2.value = "%";
+		formObj.width.value  = formObj.width.value.substring(0,formObj.width.value.length-1);
+	}
+}
+
+function insertHR() {
+	var formObj = document.forms[0];
+	var width   = formObj.width.value;
+	var size    = formObj.size.value;
+	var html = '<hr';
+	if (size!='' && size!=0) {
+		html += ' size="' + size + '"';
+	}
+	if (width!='' && width!=0) {
+		html += ' width="' + width;
+		if (formObj.width2.value=='%') {
+			html += '%';
+		}
+		html += '"';
+	}
+	if (formObj.noshade.checked==true) {
+		html += ' noshade="noshade"';
+	}
+	html += ' />';
+
+	tinyMCEPopup.execCommand("mceInsertContent", true, html);
+	tinyMCEPopup.close();
+}
+
+function cancelAction() {
+	tinyMCEPopup.close();
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advhr/langs/en.js
@@ -1,1 +1,9 @@
+// UK lang variables
 
+tinyMCE.addToLang('',{
+insert_advhr_desc : 'Horizontale rule',
+insert_advhr_width : 'Width',
+insert_advhr_size : 'Height',
+insert_advhr_noshade : 'No shadow'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advhr/langs/en_dlg.js
@@ -1,1 +1,5 @@
-
+tinyMCE.addI18n('en.advhr_dlg',{
+width:"Width",
+size:"Height",
+noshade:"No shadow"
+});

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advhr/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advhr/rule.htm
@@ -1,1 +1,64 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#advhr.advhr_desc}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="js/rule.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<link href="css/advhr.css" rel="stylesheet" type="text/css" />
+	<base target="_self" />
+</head>
+<body>
+<form onsubmit="AdvHRDialog.update();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;">{#advhr.advhr_desc}</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><label for="width">{#advhr_dlg.width}</label></td>
+                        <td nowrap="nowrap">
+                            <input id="width" name="width" type="text" value="" class="mceFocus" />
+                            <select name="width2" id="width2">
+                                <option value="">px</option>
+                                <option value="%">%</option>
+                            </select>
+                        </td>
+                    </tr>
+                    <tr>
+                        <td><label for="size">{#advhr_dlg.size}</label></td>
+                        <td><select id="size" name="size">
+                            <option value="">Normal</option>
+                            <option value="1">1</option>
+                            <option value="2">2</option>
+                            <option value="3">3</option>
+                            <option value="4">4</option>
+                            <option value="5">5</option>
+                        </select></td>
+                    </tr>
+                    <tr>
+                        <td><label for="noshade">{#advhr_dlg.noshade}</label></td>
+                        <td><input type="checkbox" name="noshade" id="noshade" class="radio" /></td>
+                    </tr>
+            </table>
+		</div>
+	</div>
+
+	<div class="mceActionPanel">
+		<div style="float: left">
+			<input type="submit" id="insert" name="insert" value="{#insert}" />
+		</div>
+
+		<div style="float: right">
+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+		</div>
+	</div>
+</form>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advimage/css/advimage.css
@@ -1,1 +1,14 @@
+#src_list, #over_list, #out_list {width:280px;}
+.mceActionPanel {margin-top:7px;}
+.alignPreview {border:1px solid #000; width:140px; height:140px; overflow:hidden; padding:5px;}
+.checkbox {border:0;}
+.panel_wrapper div.current {height:305px;}
+#prev {margin:0; border:1px solid #000; width:428px; height:150px; overflow:auto;}
+#align, #classlist {width:150px;}
+#width, #height {vertical-align:middle; width:50px; text-align:center;}
+#vspace, #hspace, #border {vertical-align:middle; width:30px; text-align:center;}
+#class_list {width:180px;}
+input {width: 280px;}
+#constrain, #onmousemovecheck {width:auto;}
+#id, #dir, #lang, #usemap, #longdesc {width:200px;}
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.AdvancedImagePlugin',{init:function(ed,url){ed.addCommand('mceAdvImage',function(){if(ed.dom.getAttrib(ed.selection.getNode(),'class').indexOf('mceItem')!=-1)return;ed.windowManager.open({file:url+'/image.htm',width:480+parseInt(ed.getLang('advimage.delta_width',0)),height:385+parseInt(ed.getLang('advimage.delta_height',0)),inline:1},{plugin_url:url});});ed.addButton('image',{title:'advimage.image_desc',cmd:'mceAdvImage'});},getInfo:function(){return{longname:'Advanced image',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.PluginManager.add('advimage',tinymce.plugins.AdvancedImagePlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js
@@ -1,1 +1,47 @@
+/**
+ * $Id: editor_plugin_src.js 677 2008-03-07 13:52:41Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.AdvancedImagePlugin', {
+		init : function(ed, url) {
+			// Register commands
+			ed.addCommand('mceAdvImage', function() {
+				// Internal image object like a flash placeholder
+				if (ed.dom.getAttrib(ed.selection.getNode(), 'class').indexOf('mceItem') != -1)
+					return;
+
+				ed.windowManager.open({
+					file : url + '/image.htm',
+					width : 480 + parseInt(ed.getLang('advimage.delta_width', 0)),
+					height : 385 + parseInt(ed.getLang('advimage.delta_height', 0)),
+					inline : 1
+				}, {
+					plugin_url : url
+				});
+			});
+
+			// Register buttons
+			ed.addButton('image', {
+				title : 'advimage.image_desc',
+				cmd : 'mceAdvImage'
+			});
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Advanced image',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('advimage', tinymce.plugins.AdvancedImagePlugin);
+})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advimage/image.htm
@@ -1,1 +1,239 @@
-
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#advimage_dlg.dialog_title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="../../utils/validate.js"></script>
+	<script type="text/javascript" src="../../utils/editable_selects.js"></script>
+	<script type="text/javascript" src="js/image.js"></script>
+	<link href="css/advimage.css" rel="stylesheet" type="text/css" />
+	<base target="_self" />
+</head>
+<body id="advimage" style="display: none">
+    <form onsubmit="ImageDialog.insert();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;">{#advimage_dlg.tab_general}</a></span></li>
+				<li id="appearance_tab"><span><a href="javascript:mcTabs.displayTab('appearance_tab','appearance_panel');" onmousedown="return false;">{#advimage_dlg.tab_appearance}</a></span></li>
+				<li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#advimage_dlg.tab_advanced}</a></span></li>
+			</ul>
+		</div>
+
+		<div class="panel_wrapper">
+			<div id="general_panel" class="panel current">
+				<fieldset>
+						<legend>{#advimage_dlg.general}</legend>
+
+						<table class="properties">
+							<tr>
+								<td class="column1"><label id="srclabel" for="src">{#advimage_dlg.src}</label></td>
+								<td colspan="2"><table border="0" cellspacing="0" cellpadding="0">
+									<tr> 
+									  <td><input name="src" type="text" id="src" value="" class="mceFocus" onchange="ImageDialog.showPreviewImage(this.value);" /></td> 
+									  <td id="srcbrowsercontainer">&nbsp;</td>
+									</tr>
+								  </table></td>
+							</tr>
+							<tr>
+								<td><label for="src_list">{#advimage_dlg.image_list}</label></td>
+								<td><select id="src_list" name="src_list" onchange="document.getElementById('src').value=this.options[this.selectedIndex].value;document.getElementById('alt').value=this.options[this.selectedIndex].text;document.getElementById('title').value=this.options[this.selectedIndex].text;ImageDialog.showPreviewImage(this.options[this.selectedIndex].value);"></select></td>
+							</tr>
+							<tr> 
+								<td class="column1"><label id="altlabel" for="alt">{#advimage_dlg.alt}</label></td> 
+								<td colspan="2"><input id="alt" name="alt" type="text" value="" /></td> 
+							</tr> 
+							<tr> 
+								<td class="column1"><label id="titlelabel" for="title">{#advimage_dlg.title}</label></td> 
+								<td colspan="2"><input id="title" name="title" type="text" value="" /></td> 
+							</tr>
+						</table>
+				</fieldset>
+
+				<fieldset>
+					<legend>{#advimage_dlg.preview}</legend>
+					<div id="prev"></div>
+				</fieldset>
+			</div>
+
+			<div id="appearance_panel" class="panel">
+				<fieldset>
+					<legend>{#advimage_dlg.tab_appearance}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr> 
+							<td class="column1"><label id="alignlabel" for="align">{#advimage_dlg.align}</label></td> 
+							<td><select id="align" name="align" onchange="ImageDialog.updateStyle('align');ImageDialog.changeAppearance();"> 
+									<option value="">{#not_set}</option> 
+									<option value="baseline">{#advimage_dlg.align_baseline}</option>
+									<option value="top">{#advimage_dlg.align_top}</option>
+									<option value="middle">{#advimage_dlg.align_middle}</option>
+									<option value="bottom">{#advimage_dlg.align_bottom}</option>
+									<option value="text-top">{#advimage_dlg.align_texttop}</option>
+									<option value="text-bottom">{#advimage_dlg.align_textbottom}</option>
+									<option value="left">{#advimage_dlg.align_left}</option>
+									<option value="right">{#advimage_dlg.align_right}</option>
+								</select> 
+							</td>
+							<td rowspan="6" valign="top">
+								<div class="alignPreview">
+									<img id="alignSampleImg" src="img/sample.gif" alt="{#advimage_dlg.example_img}" />
+									Lorem ipsum, Dolor sit amet, consectetuer adipiscing loreum ipsum edipiscing elit, sed diam
+									nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.Loreum ipsum
+									edipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam
+									erat volutpat.
+								</div>
+							</td>
+						</tr>
+
+						<tr>
+							<td class="column1"><label id="widthlabel" for="width">{#advimage_dlg.dimensions}</label></td>
+							<td nowrap="nowrap">
+								<input name="width" type="text" id="width" value="" size="5" maxlength="5" class="size" onchange="ImageDialog.changeHeight();" /> x 
+								<input name="height" type="text" id="height" value="" size="5" maxlength="5" class="size" onchange="ImageDialog.changeWidth();" /> px
+							</td>
+						</tr>
+
+						<tr>
+							<td>&nbsp;</td>
+							<td><table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="constrain" type="checkbox" name="constrain" class="checkbox" /></td>
+										<td><label id="constrainlabel" for="constrain">{#advimage_dlg.constrain_proportions}</label></td>
+									</tr>
+								</table></td>
+						</tr>
+
+						<tr>
+							<td class="column1"><label id="vspacelabel" for="vspace">{#advimage_dlg.vspace}</label></td> 
+							<td><input name="vspace" type="text" id="vspace" value="" size="3" maxlength="3" class="number" onchange="ImageDialog.updateStyle('vspace');ImageDialog.changeAppearance();" onblur="ImageDialog.updateStyle('vspace');ImageDialog.changeAppearance();" />
+							</td>
+						</tr>
+
+						<tr> 
+							<td class="column1"><label id="hspacelabel" for="hspace">{#advimage_dlg.hspace}</label></td> 
+							<td><input name="hspace" type="text" id="hspace" value="" size="3" maxlength="3" class="number" onchange="ImageDialog.updateStyle('hspace');ImageDialog.changeAppearance();" onblur="ImageDialog.updateStyle('hspace');ImageDialog.changeAppearance();" /></td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label id="borderlabel" for="border">{#advimage_dlg.border}</label></td> 
+							<td><input id="border" name="border" type="text" value="" size="3" maxlength="3" class="number" onchange="ImageDialog.updateStyle('border');ImageDialog.changeAppearance();" onblur="ImageDialog.updateStyle('border');ImageDialog.changeAppearance();" /></td> 
+						</tr>
+
+						<tr>
+							<td><label for="class_list">{#class_name}</label></td>
+							<td colspan="2"><select id="class_list" name="class_list" class="mceEditableSelect"></select></td>
+						</tr>
+
+						<tr>
+							<td class="column1"><label id="stylelabel" for="style">{#advimage_dlg.style}</label></td> 
+							<td colspan="2"><input id="style" name="style" type="text" value="" onchange="ImageDialog.changeAppearance();" /></td> 
+						</tr>
+
+						<!-- <tr>
+							<td class="column1"><label id="classeslabel" for="classes">{#advimage_dlg.classes}</label></td> 
+							<td colspan="2"><input id="classes" name="classes" type="text" value="" onchange="selectByValue(this.form,'classlist',this.value,true);" /></td> 
+						</tr> -->
+					</table>
+				</fieldset>
+			</div>
+
+			<div id="advanced_panel" class="panel">
+				<fieldset>
+					<legend>{#advimage_dlg.swap_image}</legend>
+
+					<input type="checkbox" id="onmousemovecheck" name="onmousemovecheck" class="checkbox" onclick="ImageDialog.setSwapImage(this.checked);" />
+					<label id="onmousemovechecklabel" for="onmousemovecheck">{#advimage_dlg.alt_image}</label>
+
+					<table border="0" cellpadding="4" cellspacing="0" width="100%">
+							<tr>
+								<td class="column1"><label id="onmouseoversrclabel" for="onmouseoversrc">{#advimage_dlg.mouseover}</label></td> 
+								<td><table border="0" cellspacing="0" cellpadding="0"> 
+									<tr> 
+									  <td><input id="onmouseoversrc" name="onmouseoversrc" type="text" value="" /></td> 
+									  <td id="onmouseoversrccontainer">&nbsp;</td>
+									</tr>
+								  </table></td>
+							</tr>
+							<tr>
+								<td><label for="over_list">{#advimage_dlg.image_list}</label></td>
+								<td><select id="over_list" name="over_list" onchange="document.getElementById('onmouseoversrc').value=this.options[this.selectedIndex].value;"></select></td>
+							</tr>
+							<tr> 
+								<td class="column1"><label id="onmouseoutsrclabel" for="onmouseoutsrc">{#advimage_dlg.mouseout}</label></td> 
+								<td class="column2"><table border="0" cellspacing="0" cellpadding="0"> 
+									<tr> 
+									  <td><input id="onmouseoutsrc" name="onmouseoutsrc" type="text" value="" /></td> 
+									  <td id="onmouseoutsrccontainer">&nbsp;</td>
+									</tr> 
+								  </table></td> 
+							</tr>
+							<tr>
+								<td><label for="out_list">{#advimage_dlg.image_list}</label></td>
+								<td><select id="out_list" name="out_list" onchange="document.getElementById('onmouseoutsrc').value=this.options[this.selectedIndex].value;"></select></td>
+							</tr>
+					</table>
+				</fieldset>
+
+				<fieldset>
+					<legend>{#advimage_dlg.misc}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td class="column1"><label id="idlabel" for="id">{#advimage_dlg.id}</label></td> 
+							<td><input id="id" name="id" type="text" value="" /></td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label id="dirlabel" for="dir">{#advimage_dlg.langdir}</label></td> 
+							<td>
+								<select id="dir" name="dir" onchange="ImageDialog.changeAppearance();"> 
+										<option value="">{#not_set}</option> 
+										<option value="ltr">{#advimage_dlg.ltr}</option> 
+										<option value="rtl">{#advimage_dlg.rtl}</option> 
+								</select>
+							</td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label id="langlabel" for="lang">{#advimage_dlg.langcode}</label></td> 
+							<td>
+								<input id="lang" name="lang" type="text" value="" />
+							</td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label id="usemaplabel" for="usemap">{#advimage_dlg.map}</label></td> 
+							<td>
+								<input id="usemap" name="usemap" type="text" value="" />
+							</td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label id="longdesclabel" for="longdesc">{#advimage_dlg.long_desc}</label></td>
+							<td><table border="0" cellspacing="0" cellpadding="0">
+									<tr>
+									  <td><input id="longdesc" name="longdesc" type="text" value="" /></td>
+									  <td id="longdesccontainer">&nbsp;</td>
+									</tr>
+								</table></td> 
+						</tr>
+					</table>
+				</fieldset>
+			</div>
+		</div>
+
+		<div class="mceActionPanel">
+			<div style="float: left">
+				<input type="submit" id="insert" name="insert" value="{#insert}" />
+			</div>
+
+			<div style="float: right">
+				<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+			</div>
+		</div>
+    </form>
+</body> 
+</html> 
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/advimage/images/sample.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/advimage/img/sample.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advimage/js/image.js
@@ -1,1 +1,442 @@
-
+var ImageDialog = {
+	preInit : function() {
+		var url;
+
+		tinyMCEPopup.requireLangPack();
+
+		if (url = tinyMCEPopup.getParam("external_image_list_url"))
+			document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>');
+	},
+
+	init : function(ed) {
+		var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, dom = ed.dom, n = ed.selection.getNode();
+
+		tinyMCEPopup.resizeToInnerSize();
+		this.fillClassList('class_list');
+		this.fillFileList('src_list', 'tinyMCEImageList');
+		this.fillFileList('over_list', 'tinyMCEImageList');
+		this.fillFileList('out_list', 'tinyMCEImageList');
+		TinyMCE_EditableSelects.init();
+
+		if (n.nodeName == 'IMG') {
+			nl.src.value = dom.getAttrib(n, 'src');
+			nl.width.value = dom.getAttrib(n, 'width');
+			nl.height.value = dom.getAttrib(n, 'height');
+			nl.alt.value = dom.getAttrib(n, 'alt');
+			nl.title.value = dom.getAttrib(n, 'title');
+			nl.vspace.value = this.getAttrib(n, 'vspace');
+			nl.hspace.value = this.getAttrib(n, 'hspace');
+			nl.border.value = this.getAttrib(n, 'border');
+			selectByValue(f, 'align', this.getAttrib(n, 'align'));
+			selectByValue(f, 'class_list', dom.getAttrib(n, 'class'), true, true);
+			nl.style.value = dom.getAttrib(n, 'style');
+			nl.id.value = dom.getAttrib(n, 'id');
+			nl.dir.value = dom.getAttrib(n, 'dir');
+			nl.lang.value = dom.getAttrib(n, 'lang');
+			nl.usemap.value = dom.getAttrib(n, 'usemap');
+			nl.longdesc.value = dom.getAttrib(n, 'longdesc');
+			nl.insert.value = ed.getLang('update');
+
+			if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(dom.getAttrib(n, 'onmouseover')))
+				nl.onmouseoversrc.value = dom.getAttrib(n, 'onmouseover').replace(/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1');
+
+			if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(dom.getAttrib(n, 'onmouseout')))
+				nl.onmouseoutsrc.value = dom.getAttrib(n, 'onmouseout').replace(/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1');
+
+			if (ed.settings.inline_styles) {
+				// Move attribs to styles
+				if (dom.getAttrib(n, 'align'))
+					this.updateStyle('align');
+
+				if (dom.getAttrib(n, 'hspace'))
+					this.updateStyle('hspace');
+
+				if (dom.getAttrib(n, 'border'))
+					this.updateStyle('border');
+
+				if (dom.getAttrib(n, 'vspace'))
+					this.updateStyle('vspace');
+			}
+		}
+
+		// Setup browse button
+		document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image');
+		if (isVisible('srcbrowser'))
+			document.getElementById('src').style.width = '260px';
+
+		// Setup browse button
+		document.getElementById('onmouseoversrccontainer').innerHTML = getBrowserHTML('overbrowser','onmouseoversrc','image','theme_advanced_image');
+		if (isVisible('overbrowser'))
+			document.getElementById('onmouseoversrc').style.width = '260px';
+
+		// Setup browse button
+		document.getElementById('onmouseoutsrccontainer').innerHTML = getBrowserHTML('outbrowser','onmouseoutsrc','image','theme_advanced_image');
+		if (isVisible('outbrowser'))
+			document.getElementById('onmouseoutsrc').style.width = '260px';
+
+		// If option enabled default contrain proportions to checked
+		if (ed.getParam("advimage_constrain_proportions", true))
+			f.constrain.checked = true;
+
+		// Check swap image if valid data
+		if (nl.onmouseoversrc.value || nl.onmouseoutsrc.value)
+			this.setSwapImage(true);
+		else
+			this.setSwapImage(false);
+
+		this.changeAppearance();
+		this.showPreviewImage(nl.src.value, 1);
+	},
+
+	insert : function(file, title) {
+		var ed = tinyMCEPopup.editor, t = this, f = document.forms[0];
+
+		if (f.src.value === '') {
+			if (ed.selection.getNode().nodeName == 'IMG') {
+				ed.dom.remove(ed.selection.getNode());
+				ed.execCommand('mceRepaint');
+			}
+
+			tinyMCEPopup.close();
+			return;
+		}
+
+		if (tinyMCEPopup.getParam("accessibility_warnings", 1)) {
+			if (!f.alt.value) {
+				tinyMCEPopup.editor.windowManager.confirm(tinyMCEPopup.getLang('advimage_dlg.missing_alt'), function(s) {
+					if (s)
+						t.insertAndClose();
+				});
+
+				return;
+			}
+		}
+
+		t.insertAndClose();
+	},
+
+	insertAndClose : function() {
+		var ed = tinyMCEPopup.editor, f = document.forms[0], nl = f.elements, v, args = {}, el;
+
+		tinyMCEPopup.restoreSelection();
+
+		// Fixes crash in Safari
+		if (tinymce.isWebKit)
+			ed.getWin().focus();
+
+		if (!ed.settings.inline_styles) {
+			args = {
+				vspace : nl.vspace.value,
+				hspace : nl.hspace.value,
+				border : nl.border.value,
+				align : getSelectValue(f, 'align')
+			};
+		} else {
+			// Remove deprecated values
+			args = {
+				vspace : '',
+				hspace : '',
+				border : '',
+				align : ''
+			};
+		}
+
+		tinymce.extend(args, {
+			src : nl.src.value,
+			width : nl.width.value,
+			height : nl.height.value,
+			alt : nl.alt.value,
+			title : nl.title.value,
+			'class' : getSelectValue(f, 'class_list'),
+			style : nl.style.value,
+			id : nl.id.value,
+			dir : nl.dir.value,
+			lang : nl.lang.value,
+			usemap : nl.usemap.value,
+			longdesc : nl.longdesc.value
+		});
+
+		args.onmouseover = args.onmouseout = '';
+
+		if (f.onmousemovecheck.checked) {
+			if (nl.onmouseoversrc.value)
+				args.onmouseover = "this.src='" + nl.onmouseoversrc.value + "';";
+
+			if (nl.onmouseoutsrc.value)
+				args.onmouseout = "this.src='" + nl.onmouseoutsrc.value + "';";
+		}
+
+		el = ed.selection.getNode();
+
+		if (el && el.nodeName == 'IMG') {
+			ed.dom.setAttribs(el, args);
+		} else {
+			ed.execCommand('mceInsertContent', false, '<img id="__mce_tmp" />', {skip_undo : 1});
+			ed.dom.setAttribs('__mce_tmp', args);
+			ed.dom.setAttrib('__mce_tmp', 'id', '');
+			ed.undoManager.add();
+		}
+
+		tinyMCEPopup.close();
+	},
+
+	getAttrib : function(e, at) {
+		var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2;
+
+		if (ed.settings.inline_styles) {
+			switch (at) {
+				case 'align':
+					if (v = dom.getStyle(e, 'float'))
+						return v;
+
+					if (v = dom.getStyle(e, 'vertical-align'))
+						return v;
+
+					break;
+
+				case 'hspace':
+					v = dom.getStyle(e, 'margin-left')
+					v2 = dom.getStyle(e, 'margin-right');
+
+					if (v && v == v2)
+						return parseInt(v.replace(/[^0-9]/g, ''));
+
+					break;
+
+				case 'vspace':
+					v = dom.getStyle(e, 'margin-top')
+					v2 = dom.getStyle(e, 'margin-bottom');
+					if (v && v == v2)
+						return parseInt(v.replace(/[^0-9]/g, ''));
+
+					break;
+
+				case 'border':
+					v = 0;
+
+					tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) {
+						sv = dom.getStyle(e, 'border-' + sv + '-width');
+
+						// False or not the same as prev
+						if (!sv || (sv != v && v !== 0)) {
+							v = 0;
+							return false;
+						}
+
+						if (sv)
+							v = sv;
+					});
+
+					if (v)
+						return parseInt(v.replace(/[^0-9]/g, ''));
+
+					break;
+			}
+		}
+
+		if (v = dom.getAttrib(e, at))
+			return v;
+
+		return '';
+	},
+
+	setSwapImage : function(st) {
+		var f = document.forms[0];
+
+		f.onmousemovecheck.checked = st;
+		setBrowserDisabled('overbrowser', !st);
+		setBrowserDisabled('outbrowser', !st);
+
+		if (f.over_list)
+			f.over_list.disabled = !st;
+
+		if (f.out_list)
+			f.out_list.disabled = !st;
+
+		f.onmouseoversrc.disabled = !st;
+		f.onmouseoutsrc.disabled  = !st;
+	},
+
+	fillClassList : function(id) {
+		var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
+
+		if (v = tinyMCEPopup.getParam('theme_advanced_styles')) {
+			cl = [];
+
+			tinymce.each(v.split(';'), function(v) {
+				var p = v.split('=');
+
+				cl.push({'title' : p[0], 'class' : p[1]});
+			});
+		} else
+			cl = tinyMCEPopup.editor.dom.getClasses();
+
+		if (cl.length > 0) {
+			lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), '');
+
+			tinymce.each(cl, function(o) {
+				lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']);
+			});
+		} else
+			dom.remove(dom.getParent(id, 'tr'));
+	},
+
+	fillFileList : function(id, l) {
+		var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
+
+		l = window[l];
+
+		if (l && l.length > 0) {
+			lst.options[lst.options.length] = new Option('', '');
+
+			tinymce.each(l, function(o) {
+				lst.options[lst.options.length] = new Option(o[0], o[1]);
+			});
+		} else
+			dom.remove(dom.getParent(id, 'tr'));
+	},
+
+	resetImageData : function() {
+		var f = document.forms[0];
+
+		f.elements.width.value = f.elements.height.value = '';
+	},
+
+	updateImageData : function(img, st) {
+		var f = document.forms[0];
+
+		if (!st) {
+			f.elements.width.value = img.width;
+			f.elements.height.value = img.height;
+		}
+
+		this.preloadImg = img;
+	},
+
+	changeAppearance : function() {
+		var ed = tinyMCEPopup.editor, f = document.forms[0], img = document.getElementById('alignSampleImg');
+
+		if (img) {
+			if (ed.getParam('inline_styles')) {
+				ed.dom.setAttrib(img, 'style', f.style.value);
+			} else {
+				img.align = f.align.value;
+				img.border = f.border.value;
+				img.hspace = f.hspace.value;
+				img.vspace = f.vspace.value;
+			}
+		}
+	},
+
+	changeHeight : function() {
+		var f = document.forms[0], tp, t = this;
+
+		if (!f.constrain.checked || !t.preloadImg) {
+			return;
+		}
+
+		if (f.width.value == "" || f.height.value == "")
+			return;
+
+		tp = (parseInt(f.width.value) / parseInt(t.preloadImg.width)) * t.preloadImg.height;
+		f.height.value = tp.toFixed(0);
+	},
+
+	changeWidth : function() {
+		var f = document.forms[0], tp, t = this;
+
+		if (!f.constrain.checked || !t.preloadImg) {
+			return;
+		}
+
+		if (f.width.value == "" || f.height.value == "")
+			return;
+
+		tp = (parseInt(f.height.value) / parseInt(t.preloadImg.height)) * t.preloadImg.width;
+		f.width.value = tp.toFixed(0);
+	},
+
+	updateStyle : function(ty) {
+		var dom = tinyMCEPopup.dom, st, v, f = document.forms[0], img = dom.create('img', {style : dom.get('style').value});
+
+		if (tinyMCEPopup.editor.settings.inline_styles) {
+			// Handle align
+			if (ty == 'align') {
+				dom.setStyle(img, 'float', '');
+				dom.setStyle(img, 'vertical-align', '');
+
+				v = getSelectValue(f, 'align');
+				if (v) {
+					if (v == 'left' || v == 'right')
+						dom.setStyle(img, 'float', v);
+					else
+						img.style.verticalAlign = v;
+				}
+			}
+
+			// Handle border
+			if (ty == 'border') {
+				dom.setStyle(img, 'border', '');
+
+				v = f.border.value;
+				if (v || v == '0') {
+					if (v == '0')
+						img.style.border = '0';
+					else
+						img.style.border = v + 'px solid black';
+				}
+			}
+
+			// Handle hspace
+			if (ty == 'hspace') {
+				dom.setStyle(img, 'marginLeft', '');
+				dom.setStyle(img, 'marginRight', '');
+
+				v = f.hspace.value;
+				if (v) {
+					img.style.marginLeft = v + 'px';
+					img.style.marginRight = v + 'px';
+				}
+			}
+
+			// Handle vspace
+			if (ty == 'vspace') {
+				dom.setStyle(img, 'marginTop', '');
+				dom.setStyle(img, 'marginBottom', '');
+
+				v = f.vspace.value;
+				if (v) {
+					img.style.marginTop = v + 'px';
+					img.style.marginBottom = v + 'px';
+				}
+			}
+
+			// Merge
+			dom.get('style').value = dom.serializeStyle(dom.parseStyle(img.style.cssText));
+		}
+	},
+
+	changeMouseMove : function() {
+	},
+
+	showPreviewImage : function(u, st) {
+		if (!u) {
+			tinyMCEPopup.dom.setHTML('prev', '');
+			return;
+		}
+
+		if (!st && tinyMCEPopup.getParam("advimage_update_dimensions_onchange", true))
+			this.resetImageData();
+
+		u = tinyMCEPopup.editor.documentBaseURI.toAbsolute(u);
+
+		if (!st)
+			tinyMCEPopup.dom.setHTML('prev', '<img id="previewImg" src="' + u + '" border="0" onload="ImageDialog.updateImageData(this);" onerror="ImageDialog.resetImageData();" />');
+		else
+			tinyMCEPopup.dom.setHTML('prev', '<img id="previewImg" src="' + u + '" border="0" onload="ImageDialog.updateImageData(this, 1);" />');
+	}
+};
+
+ImageDialog.preInit();
+tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advimage/jscripts/functions.js
@@ -1,1 +1,535 @@
-
+/* Functions for the advimage plugin popup */
+
+var preloadImg = null;
+var orgImageWidth, orgImageHeight;
+
+function preinit() {
+	// Initialize
+	tinyMCE.setWindowArg('mce_windowresize', false);
+
+	// Import external list url javascript
+	var url = tinyMCE.getParam("external_image_list_url");
+	if (url != null) {
+		// Fix relative
+		if (url.charAt(0) != '/' && url.indexOf('://') == -1)
+			url = tinyMCE.documentBasePath + "/" + url;
+
+		document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');
+	}
+}
+
+function convertURL(url, node, on_save) {
+	return eval("tinyMCEPopup.windowOpener." + tinyMCE.settings['urlconverter_callback'] + "(url, node, on_save);");
+}
+
+function getImageSrc(str) {
+	var pos = -1;
+
+	if (!str)
+		return "";
+
+	if ((pos = str.indexOf('this.src=')) != -1) {
+		var src = str.substring(pos + 10);
+
+		src = src.substring(0, src.indexOf('\''));
+
+		if (tinyMCE.getParam('convert_urls'))
+			src = convertURL(src, null, true);
+
+		return src;
+	}
+
+	return "";
+}
+
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	var formObj = document.forms[0];
+	var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
+	var elm = inst.getFocusElement();
+	var action = "insert";
+	var html = "";
+
+	// Image list src
+	html = getImageListHTML('imagelistsrc','src','onSelectMainImage');
+	if (html == "")
+		document.getElementById("imagelistsrcrow").style.display = 'none';
+	else
+		document.getElementById("imagelistsrccontainer").innerHTML = html;
+
+	// Image list oversrc
+	html = getImageListHTML('imagelistover','onmouseoversrc');
+	if (html == "")
+		document.getElementById("imagelistoverrow").style.display = 'none';
+	else
+		document.getElementById("imagelistovercontainer").innerHTML = html;
+
+	// Image list outsrc
+	html = getImageListHTML('imagelistout','onmouseoutsrc');
+	if (html == "")
+		document.getElementById("imagelistoutrow").style.display = 'none';
+	else
+		document.getElementById("imagelistoutcontainer").innerHTML = html;
+
+	// Src browser
+	html = getBrowserHTML('srcbrowser','src','image','advimage');
+	document.getElementById("srcbrowsercontainer").innerHTML = html;
+
+	// Over browser
+	html = getBrowserHTML('oversrcbrowser','onmouseoversrc','image','advimage');
+	document.getElementById("onmouseoversrccontainer").innerHTML = html;
+
+	// Out browser
+	html = getBrowserHTML('outsrcbrowser','onmouseoutsrc','image','advimage');
+	document.getElementById("onmouseoutsrccontainer").innerHTML = html;
+
+	// Longdesc browser
+	html = getBrowserHTML('longdescbrowser','longdesc','file','advimage');
+	document.getElementById("longdesccontainer").innerHTML = html;
+
+	// Resize some elements
+	if (isVisible('srcbrowser'))
+		document.getElementById('src').style.width = '260px';
+
+	if (isVisible('oversrcbrowser'))
+		document.getElementById('onmouseoversrc').style.width = '260px';
+
+	if (isVisible('outsrcbrowser'))
+		document.getElementById('onmouseoutsrc').style.width = '260px';
+
+	if (isVisible('longdescbrowser'))
+		document.getElementById('longdesc').style.width = '180px';
+
+	// Check action
+	if (elm != null && elm.nodeName == "IMG")
+		action = "update";
+
+	formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); 
+
+	if (action == "update") {
+		var src = tinyMCE.getAttrib(elm, 'src');
+		var onmouseoversrc = getImageSrc(tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseover')));
+		var onmouseoutsrc = getImageSrc(tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseout')));
+
+		src = convertURL(src, elm, true);
+
+		// Use mce_src if found
+		var mceRealSrc = tinyMCE.getAttrib(elm, 'mce_src');
+		if (mceRealSrc != "") {
+			src = mceRealSrc;
+
+			if (tinyMCE.getParam('convert_urls'))
+				src = convertURL(src, elm, true);
+		}
+
+		if (onmouseoversrc != "" && tinyMCE.getParam('convert_urls'))
+			onmouseoversrc = convertURL(onmouseoversrc, elm, true);
+
+		if (onmouseoutsrc != "" && tinyMCE.getParam('convert_urls'))
+			onmouseoutsrc = convertURL(onmouseoutsrc, elm, true);
+
+		// Setup form data
+		var style = tinyMCE.parseStyle(tinyMCE.getAttrib(elm, "style"));
+
+		// Store away old size
+		orgImageWidth = trimSize(getStyle(elm, 'width'))
+		orgImageHeight = trimSize(getStyle(elm, 'height'));
+
+		formObj.src.value    = src;
+		formObj.alt.value    = tinyMCE.getAttrib(elm, 'alt');
+		formObj.title.value  = tinyMCE.getAttrib(elm, 'title');
+		formObj.border.value = trimSize(getStyle(elm, 'border', 'borderWidth'));
+		formObj.vspace.value = tinyMCE.getAttrib(elm, 'vspace');
+		formObj.hspace.value = tinyMCE.getAttrib(elm, 'hspace');
+		formObj.width.value  = orgImageWidth;
+		formObj.height.value = orgImageHeight;
+		formObj.onmouseoversrc.value = onmouseoversrc;
+		formObj.onmouseoutsrc.value  = onmouseoutsrc;
+		formObj.id.value  = tinyMCE.getAttrib(elm, 'id');
+		formObj.dir.value  = tinyMCE.getAttrib(elm, 'dir');
+		formObj.lang.value  = tinyMCE.getAttrib(elm, 'lang');
+		formObj.longdesc.value  = tinyMCE.getAttrib(elm, 'longdesc');
+		formObj.usemap.value  = tinyMCE.getAttrib(elm, 'usemap');
+		formObj.style.value  = tinyMCE.serializeStyle(style);
+
+		// Select by the values
+		if (tinyMCE.isMSIE)
+			selectByValue(formObj, 'align', getStyle(elm, 'align', 'styleFloat'));
+		else
+			selectByValue(formObj, 'align', getStyle(elm, 'align', 'cssFloat'));
+
+		addClassesToList('classlist', 'advimage_styles');
+
+		selectByValue(formObj, 'classlist', tinyMCE.getAttrib(elm, 'class'));
+		selectByValue(formObj, 'imagelistsrc', src);
+		selectByValue(formObj, 'imagelistover', onmouseoversrc);
+		selectByValue(formObj, 'imagelistout', onmouseoutsrc);
+
+		updateStyle();
+		showPreviewImage(src, true);
+		changeAppearance();
+
+		window.focus();
+	} else
+		addClassesToList('classlist', 'advimage_styles');
+
+	// If option enabled default contrain proportions to checked
+	if (tinyMCE.getParam("advimage_constrain_proportions", true))
+		formObj.constrain.checked = true;
+
+	// Check swap image if valid data
+	if (formObj.onmouseoversrc.value != "" || formObj.onmouseoutsrc.value != "")
+		setSwapImageDisabled(false);
+	else
+		setSwapImageDisabled(true);
+}
+
+function setSwapImageDisabled(state) {
+	var formObj = document.forms[0];
+
+	formObj.onmousemovecheck.checked = !state;
+
+	setBrowserDisabled('overbrowser', state);
+	setBrowserDisabled('outbrowser', state);
+
+	if (formObj.imagelistover)
+		formObj.imagelistover.disabled = state;
+
+	if (formObj.imagelistout)
+		formObj.imagelistout.disabled = state;
+
+	formObj.onmouseoversrc.disabled = state;
+	formObj.onmouseoutsrc.disabled  = state;
+}
+
+function setAttrib(elm, attrib, value) {
+	var formObj = document.forms[0];
+	var valueElm = formObj.elements[attrib];
+
+	if (typeof(value) == "undefined" || value == null) {
+		value = "";
+
+		if (valueElm)
+			value = valueElm.value;
+	}
+
+	if (value != "") {
+		elm.setAttribute(attrib, value);
+
+		if (attrib == "style")
+			attrib = "style.cssText";
+
+		if (attrib == "longdesc")
+			attrib = "longDesc";
+
+		if (attrib == "width") {
+			attrib = "style.width";
+			value = value + "px";
+			value = value.replace(/%px/g, 'px');
+		}
+
+		if (attrib == "height") {
+			attrib = "style.height";
+			value = value + "px";
+			value = value.replace(/%px/g, 'px');
+		}
+
+		if (attrib == "class")
+			attrib = "className";
+
+		eval('elm.' + attrib + "=value;");
+	} else
+		elm.removeAttribute(attrib);
+}
+
+function makeAttrib(attrib, value) {
+	var formObj = document.forms[0];
+	var valueElm = formObj.elements[attrib];
+
+	if (typeof(value) == "undefined" || value == null) {
+		value = "";
+
+		if (valueElm)
+			value = valueElm.value;
+	}
+
+	if (value == "")
+		return "";
+
+	// XML encode it
+	value = value.replace(/&/g, '&amp;');
+	value = value.replace(/\"/g, '&quot;');
+	value = value.replace(/</g, '&lt;');
+	value = value.replace(/>/g, '&gt;');
+
+	return ' ' + attrib + '="' + value + '"';
+}
+
+function insertAction() {
+	var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
+	var elm = inst.getFocusElement();
+	var formObj = document.forms[0];
+	var src = formObj.src.value;
+	var onmouseoversrc = formObj.onmouseoversrc.value;
+	var onmouseoutsrc = formObj.onmouseoutsrc.value;
+
+	if (!AutoValidator.validate(formObj)) {
+		alert(tinyMCE.getLang('lang_invalid_data'));
+		return false;
+	}
+
+	if (tinyMCE.getParam("accessibility_warnings")) {
+		if (formObj.alt.value == "" && !confirm(tinyMCE.getLang('lang_advimage_missing_alt', '', true)))
+			return;
+	}
+
+	if (onmouseoversrc && onmouseoversrc != "")
+		onmouseoversrc = "this.src='" + convertURL(onmouseoversrc, tinyMCE.imgElement) + "';";
+
+	if (onmouseoutsrc && onmouseoutsrc != "")
+		onmouseoutsrc = "this.src='" + convertURL(onmouseoutsrc, tinyMCE.imgElement) + "';";
+
+	if (elm != null && elm.nodeName == "IMG") {
+		setAttrib(elm, 'src', convertURL(src, tinyMCE.imgElement));
+		setAttrib(elm, 'mce_src', src);
+		setAttrib(elm, 'alt');
+		setAttrib(elm, 'title');
+		setAttrib(elm, 'border');
+		setAttrib(elm, 'vspace');
+		setAttrib(elm, 'hspace');
+		setAttrib(elm, 'width');
+		setAttrib(elm, 'height');
+		setAttrib(elm, 'onmouseover', onmouseoversrc);
+		setAttrib(elm, 'onmouseout', onmouseoutsrc);
+		setAttrib(elm, 'id');
+		setAttrib(elm, 'dir');
+		setAttrib(elm, 'lang');
+		setAttrib(elm, 'longdesc');
+		setAttrib(elm, 'usemap');
+		setAttrib(elm, 'style');
+		setAttrib(elm, 'class', getSelectValue(formObj, 'classlist'));
+		setAttrib(elm, 'align', getSelectValue(formObj, 'align'));
+
+		//tinyMCEPopup.execCommand("mceRepaint");
+
+		// Repaint if dimensions changed
+		if (formObj.width.value != orgImageWidth || formObj.height.value != orgImageHeight)
+			inst.repaint();
+
+		// Refresh in old MSIE
+		if (tinyMCE.isMSIE5)
+			elm.outerHTML = elm.outerHTML;
+	} else {
+		var html = "<img";
+
+		html += makeAttrib('src', convertURL(src, tinyMCE.imgElement));
+		html += makeAttrib('mce_src', src);
+		html += makeAttrib('alt');
+		html += makeAttrib('title');
+		html += makeAttrib('border');
+		html += makeAttrib('vspace');
+		html += makeAttrib('hspace');
+		html += makeAttrib('width');
+		html += makeAttrib('height');
+		html += makeAttrib('onmouseover', onmouseoversrc);
+		html += makeAttrib('onmouseout', onmouseoutsrc);
+		html += makeAttrib('id');
+		html += makeAttrib('dir');
+		html += makeAttrib('lang');
+		html += makeAttrib('longdesc');
+		html += makeAttrib('usemap');
+		html += makeAttrib('style');
+		html += makeAttrib('class', getSelectValue(formObj, 'classlist'));
+		html += makeAttrib('align', getSelectValue(formObj, 'align'));
+		html += " />";
+
+		tinyMCEPopup.execCommand("mceInsertContent", false, html);
+	}
+
+	tinyMCE._setEventsEnabled(inst.getBody(), false);
+	tinyMCEPopup.close();
+}
+
+function cancelAction() {
+	tinyMCEPopup.close();
+}
+
+function changeAppearance() {
+	var formObj = document.forms[0];
+	var img = document.getElementById('alignSampleImg');
+
+	if (img) {
+		img.align = formObj.align.value;
+		img.border = formObj.border.value;
+		img.hspace = formObj.hspace.value;
+		img.vspace = formObj.vspace.value;
+	}
+}
+
+function changeMouseMove() {
+	var formObj = document.forms[0];
+
+	setSwapImageDisabled(!formObj.onmousemovecheck.checked);
+}
+
+function updateStyle() {
+	var formObj = document.forms[0];
+	var st = tinyMCE.parseStyle(formObj.style.value);
+
+	if (tinyMCE.getParam('inline_styles', false)) {
+		st['width'] = formObj.width.value == '' ? '' : formObj.width.value + "px";
+		st['height'] = formObj.height.value == '' ? '' : formObj.height.value + "px";
+		st['border-width'] = formObj.border.value == '' ? '' : formObj.border.value + "px";
+		st['margin-top'] = formObj.vspace.value == '' ? '' : formObj.vspace.value + "px";
+		st['margin-bottom'] = formObj.vspace.value == '' ? '' : formObj.vspace.value + "px";
+		st['margin-left'] = formObj.hspace.value == '' ? '' : formObj.hspace.value + "px";
+		st['margin-right'] = formObj.hspace.value == '' ? '' : formObj.hspace.value + "px";
+	} else {
+		st['width'] = st['height'] = st['border-width'] = null;
+
+		if (st['margin-top'] == st['margin-bottom'])
+			st['margin-top'] = st['margin-bottom'] = null;
+
+		if (st['margin-left'] == st['margin-right'])
+			st['margin-left'] = st['margin-right'] = null;
+	}
+
+	formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function styleUpdated() {
+	var formObj = document.forms[0];
+	var st = tinyMCE.parseStyle(formObj.style.value);
+
+	if (st['width'])
+		formObj.width.value = st['width'].replace('px', '');
+
+	if (st['height'])
+		formObj.height.value = st['height'].replace('px', '');
+
+	if (st['margin-top'] && st['margin-top'] == st['margin-bottom'])
+		formObj.vspace.value = st['margin-top'].replace('px', '');
+
+	if (st['margin-left'] && st['margin-left'] == st['margin-right'])
+		formObj.hspace.value = st['margin-left'].replace('px', '');
+
+	if (st['border-width'])
+		formObj.border.value = st['border-width'].replace('px', '');
+}
+
+function changeHeight() {
+	var formObj = document.forms[0];
+
+	if (!formObj.constrain.checked || !preloadImg) {
+		updateStyle();
+		return;
+	}
+
+	if (formObj.width.value == "" || formObj.height.value == "")
+		return;
+
+	var temp = (parseInt(formObj.width.value) / parseInt(preloadImg.width)) * preloadImg.height;
+	formObj.height.value = temp.toFixed(0);
+	updateStyle();
+}
+
+function changeWidth() {
+	var formObj = document.forms[0];
+
+	if (!formObj.constrain.checked || !preloadImg) {
+		updateStyle();
+		return;
+	}
+
+	if (formObj.width.value == "" || formObj.height.value == "")
+		return;
+
+	var temp = (parseInt(formObj.height.value) / parseInt(preloadImg.height)) * preloadImg.width;
+	formObj.width.value = temp.toFixed(0);
+	updateStyle();
+}
+
+function onSelectMainImage(target_form_element, name, value) {
+	var formObj = document.forms[0];
+
+	formObj.alt.value = name;
+	formObj.title.value = name;
+
+	resetImageData();
+	showPreviewImage(formObj.elements[target_form_element].value, false);
+}
+
+function showPreviewImage(src, start) {
+	var formObj = document.forms[0];
+
+	selectByValue(document.forms[0], 'imagelistsrc', src);
+
+	var elm = document.getElementById('prev');
+	var src = src == "" ? src : tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], src);
+
+	if (!start && tinyMCE.getParam("advimage_update_dimensions_onchange", true))
+		resetImageData();
+
+	if (src == "")
+		elm.innerHTML = "";
+	else
+		elm.innerHTML = '<img id="previewImg" src="' + src + '" border="0" onload="updateImageData();" onerror="resetImageData();" />'
+}
+
+function updateImageData() {
+	var formObj = document.forms[0];
+
+	preloadImg = document.getElementById('previewImg');
+
+	if (formObj.width.value == "")
+		formObj.width.value = preloadImg.width;
+
+	if (formObj.height.value == "")
+		formObj.height.value = preloadImg.height;
+
+	updateStyle();
+}
+
+function resetImageData() {
+	var formObj = document.forms[0];
+	formObj.width.value = formObj.height.value = "";	
+}
+
+function getSelectValue(form_obj, field_name) {
+	var elm = form_obj.elements[field_name];
+
+	if (elm == null || elm.options == null)
+		return "";
+
+	return elm.options[elm.selectedIndex].value;
+}
+
+function getImageListHTML(elm_id, target_form_element, onchange_func) {
+	if (typeof(tinyMCEImageList) == "undefined" || tinyMCEImageList.length == 0)
+		return "";
+
+	var html = "";
+
+	html += '<select id="' + elm_id + '" name="' + elm_id + '"';
+	html += ' class="mceImageList" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value=';
+	html += 'this.options[this.selectedIndex].value;';
+
+	if (typeof(onchange_func) != "undefined")
+		html += onchange_func + '(\'' + target_form_element + '\',this.options[this.selectedIndex].text,this.options[this.selectedIndex].value);';
+
+	html += '"><option value="">---</option>';
+
+	for (var i=0; i<tinyMCEImageList.length; i++)
+		html += '<option value="' + tinyMCEImageList[i][1] + '">' + tinyMCEImageList[i][0] + '</option>';
+
+	html += '</select>';
+
+	return html;
+
+	// tinyMCE.debug('-- image list start --', html, '-- image list end --');
+}
+
+// While loading
+preinit();
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advimage/langs/en.js
@@ -1,1 +1,28 @@
+// UK lang variables
 
+tinyMCE.addToLang('advimage',{
+tab_general : 'General',
+tab_appearance : 'Appearance',
+tab_advanced : 'Advanced',
+general : 'General',
+title : 'Title',
+preview : 'Preview',
+constrain_proportions : 'Constrain proportions',
+langdir : 'Language direction',
+langcode : 'Language code',
+long_desc : 'Long description link',
+style : 'Style',
+classes : 'Classes',
+ltr : 'Left to right',
+rtl : 'Right to left',
+id : 'Id',
+image_map : 'Image map',
+swap_image : 'Swap image',
+alt_image : 'Alternative image',
+mouseover : 'for mouse over',
+mouseout : 'for mouse out',
+misc : 'Miscellaneous',
+example_img : 'Appearance&nbsp;preview&nbsp;image',
+missing_alt : 'Are you sure you want to continue without including an Image Description? Without  it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advimage/langs/en_dlg.js
@@ -1,1 +1,43 @@
-
+tinyMCE.addI18n('en.advimage_dlg',{
+tab_general:"General",
+tab_appearance:"Appearance",
+tab_advanced:"Advanced",
+general:"General",
+title:"Title",
+preview:"Preview",
+constrain_proportions:"Constrain proportions",
+langdir:"Language direction",
+langcode:"Language code",
+long_desc:"Long description link",
+style:"Style",
+classes:"Classes",
+ltr:"Left to right",
+rtl:"Right to left",
+id:"Id",
+map:"Image map",
+swap_image:"Swap image",
+alt_image:"Alternative image",
+mouseover:"for mouse over",
+mouseout:"for mouse out",
+misc:"Miscellaneous",
+example_img:"Appearance preview image",
+missing_alt:"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.",
+dialog_title:"Insert/edit image",
+src:"Image URL",
+alt:"Image description",
+list:"Image list",
+border:"Border",
+dimensions:"Dimensions",
+vspace:"Vertical space",
+hspace:"Horizontal space",
+align:"Alignment",
+align_baseline:"Baseline",
+align_top:"Top",
+align_middle:"Middle",
+align_bottom:"Bottom",
+align_texttop:"Text top",
+align_textbottom:"Text bottom",
+align_left:"Left",
+align_right:"Right",
+image_list:"Image list"
+});

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advimage/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advlink/css/advlink.css
@@ -1,1 +1,9 @@
+.mceLinkList, .mceAnchorList, #targetlist {width:280px;}
+.mceActionPanel {margin-top:7px;}
+.panel_wrapper div.current {height:320px;}
+#classlist, #title, #href {width:280px;}
+#popupurl, #popupname {width:200px;}
+#popupwidth, #popupheight, #popupleft, #popuptop {width:30px;vertical-align:middle;text-align:center;}
+#id, #style, #classes, #target, #dir, #hreflang, #lang, #charset, #type, #rel, #rev, #tabindex, #accesskey {width:200px;}
+#events_panel input {width:200px;}
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advlink/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.AdvancedLinkPlugin',{init:function(ed,url){this.editor=ed;ed.addCommand('mceAdvLink',function(){var se=ed.selection;if(se.isCollapsed()&&!ed.dom.getParent(se.getNode(),'A'))return;ed.windowManager.open({file:url+'/link.htm',width:480+parseInt(ed.getLang('advlink.delta_width',0)),height:400+parseInt(ed.getLang('advlink.delta_height',0)),inline:1},{plugin_url:url});});ed.addButton('link',{title:'advlink.link_desc',cmd:'mceAdvLink'});ed.addShortcut('ctrl+k','advlink.advlink_desc','mceAdvLink');ed.onNodeChange.add(function(ed,cm,n,co){cm.setDisabled('link',co&&n.nodeName!='A');cm.setActive('link',n.nodeName=='A'&&!n.name);});},getInfo:function(){return{longname:'Advanced link',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlink',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.PluginManager.add('advlink',tinymce.plugins.AdvancedLinkPlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advlink/editor_plugin_src.js
@@ -1,1 +1,58 @@
+/**
+ * $Id: editor_plugin_src.js 539 2008-01-14 19:08:58Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.AdvancedLinkPlugin', {
+		init : function(ed, url) {
+			this.editor = ed;
+
+			// Register commands
+			ed.addCommand('mceAdvLink', function() {
+				var se = ed.selection;
+
+				// No selection and not in link
+				if (se.isCollapsed() && !ed.dom.getParent(se.getNode(), 'A'))
+					return;
+
+				ed.windowManager.open({
+					file : url + '/link.htm',
+					width : 480 + parseInt(ed.getLang('advlink.delta_width', 0)),
+					height : 400 + parseInt(ed.getLang('advlink.delta_height', 0)),
+					inline : 1
+				}, {
+					plugin_url : url
+				});
+			});
+
+			// Register buttons
+			ed.addButton('link', {
+				title : 'advlink.link_desc',
+				cmd : 'mceAdvLink'
+			});
+
+			ed.addShortcut('ctrl+k', 'advlink.advlink_desc', 'mceAdvLink');
+
+			ed.onNodeChange.add(function(ed, cm, n, co) {
+				cm.setDisabled('link', co && n.nodeName != 'A');
+				cm.setActive('link', n.nodeName == 'A' && !n.name);
+			});
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Advanced link',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlink',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('advlink', tinymce.plugins.AdvancedLinkPlugin);
+})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advlink/js/advlink.js
@@ -1,1 +1,529 @@
-
+/* Functions for the advlink plugin popup */
+
+tinyMCEPopup.requireLangPack();
+
+var templates = {
+	"window.open" : "window.open('${url}','${target}','${options}')"
+};
+
+function preinit() {
+	var url;
+
+	if (url = tinyMCEPopup.getParam("external_link_list_url"))
+		document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>');
+}
+
+function changeClass() {
+	var f = document.forms[0];
+
+	f.classes.value = getSelectValue(f, 'classlist');
+}
+
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	var formObj = document.forms[0];
+	var inst = tinyMCEPopup.editor;
+	var elm = inst.selection.getNode();
+	var action = "insert";
+	var html;
+
+	document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','advlink');
+	document.getElementById('popupurlbrowsercontainer').innerHTML = getBrowserHTML('popupurlbrowser','popupurl','file','advlink');
+	document.getElementById('linklisthrefcontainer').innerHTML = getLinkListHTML('linklisthref','href');
+	document.getElementById('anchorlistcontainer').innerHTML = getAnchorListHTML('anchorlist','href');
+	document.getElementById('targetlistcontainer').innerHTML = getTargetListHTML('targetlist','target');
+
+	// Link list
+	html = getLinkListHTML('linklisthref','href');
+	if (html == "")
+		document.getElementById("linklisthrefrow").style.display = 'none';
+	else
+		document.getElementById("linklisthrefcontainer").innerHTML = html;
+
+	// Resize some elements
+	if (isVisible('hrefbrowser'))
+		document.getElementById('href').style.width = '260px';
+
+	if (isVisible('popupurlbrowser'))
+		document.getElementById('popupurl').style.width = '180px';
+
+	elm = inst.dom.getParent(elm, "A");
+	if (elm != null && elm.nodeName == "A")
+		action = "update";
+
+	formObj.insert.value = tinyMCEPopup.getLang(action, 'Insert', true); 
+
+	setPopupControlsDisabled(true);
+
+	if (action == "update") {
+		var href = inst.dom.getAttrib(elm, 'href');
+		var onclick = inst.dom.getAttrib(elm, 'onclick');
+
+		// Setup form data
+		setFormValue('href', href);
+		setFormValue('title', inst.dom.getAttrib(elm, 'title'));
+		setFormValue('id', inst.dom.getAttrib(elm, 'id'));
+		setFormValue('style', inst.dom.getAttrib(elm, "style"));
+		setFormValue('rel', inst.dom.getAttrib(elm, 'rel'));
+		setFormValue('rev', inst.dom.getAttrib(elm, 'rev'));
+		setFormValue('charset', inst.dom.getAttrib(elm, 'charset'));
+		setFormValue('hreflang', inst.dom.getAttrib(elm, 'hreflang'));
+		setFormValue('dir', inst.dom.getAttrib(elm, 'dir'));
+		setFormValue('lang', inst.dom.getAttrib(elm, 'lang'));
+		setFormValue('tabindex', inst.dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : ""));
+		setFormValue('accesskey', inst.dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : ""));
+		setFormValue('type', inst.dom.getAttrib(elm, 'type'));
+		setFormValue('onfocus', inst.dom.getAttrib(elm, 'onfocus'));
+		setFormValue('onblur', inst.dom.getAttrib(elm, 'onblur'));
+		setFormValue('onclick', onclick);
+		setFormValue('ondblclick', inst.dom.getAttrib(elm, 'ondblclick'));
+		setFormValue('onmousedown', inst.dom.getAttrib(elm, 'onmousedown'));
+		setFormValue('onmouseup', inst.dom.getAttrib(elm, 'onmouseup'));
+		setFormValue('onmouseover', inst.dom.getAttrib(elm, 'onmouseover'));
+		setFormValue('onmousemove', inst.dom.getAttrib(elm, 'onmousemove'));
+		setFormValue('onmouseout', inst.dom.getAttrib(elm, 'onmouseout'));
+		setFormValue('onkeypress', inst.dom.getAttrib(elm, 'onkeypress'));
+		setFormValue('onkeydown', inst.dom.getAttrib(elm, 'onkeydown'));
+		setFormValue('onkeyup', inst.dom.getAttrib(elm, 'onkeyup'));
+		setFormValue('target', inst.dom.getAttrib(elm, 'target'));
+		setFormValue('classes', inst.dom.getAttrib(elm, 'class'));
+
+		// Parse onclick data
+		if (onclick != null && onclick.indexOf('window.open') != -1)
+			parseWindowOpen(onclick);
+		else
+			parseFunction(onclick);
+
+		// Select by the values
+		selectByValue(formObj, 'dir', inst.dom.getAttrib(elm, 'dir'));
+		selectByValue(formObj, 'rel', inst.dom.getAttrib(elm, 'rel'));
+		selectByValue(formObj, 'rev', inst.dom.getAttrib(elm, 'rev'));
+		selectByValue(formObj, 'linklisthref', href);
+
+		if (href.charAt(0) == '#')
+			selectByValue(formObj, 'anchorlist', href);
+
+		addClassesToList('classlist', 'advlink_styles');
+
+		selectByValue(formObj, 'classlist', inst.dom.getAttrib(elm, 'class'), true);
+		selectByValue(formObj, 'targetlist', inst.dom.getAttrib(elm, 'target'), true);
+	} else
+		addClassesToList('classlist', 'advlink_styles');
+}
+
+function checkPrefix(n) {
+	if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_email')))
+		n.value = 'mailto:' + n.value;
+
+	if (/^\s*www./i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_external')))
+		n.value = 'http://' + n.value;
+}
+
+function setFormValue(name, value) {
+	document.forms[0].elements[name].value = value;
+}
+
+function parseWindowOpen(onclick) {
+	var formObj = document.forms[0];
+
+	// Preprocess center code
+	if (onclick.indexOf('return false;') != -1) {
+		formObj.popupreturn.checked = true;
+		onclick = onclick.replace('return false;', '');
+	} else
+		formObj.popupreturn.checked = false;
+
+	var onClickData = parseLink(onclick);
+
+	if (onClickData != null) {
+		formObj.ispopup.checked = true;
+		setPopupControlsDisabled(false);
+
+		var onClickWindowOptions = parseOptions(onClickData['options']);
+		var url = onClickData['url'];
+
+		formObj.popupname.value = onClickData['target'];
+		formObj.popupurl.value = url;
+		formObj.popupwidth.value = getOption(onClickWindowOptions, 'width');
+		formObj.popupheight.value = getOption(onClickWindowOptions, 'height');
+
+		formObj.popupleft.value = getOption(onClickWindowOptions, 'left');
+		formObj.popuptop.value = getOption(onClickWindowOptions, 'top');
+
+		if (formObj.popupleft.value.indexOf('screen') != -1)
+			formObj.popupleft.value = "c";
+
+		if (formObj.popuptop.value.indexOf('screen') != -1)
+			formObj.popuptop.value = "c";
+
+		formObj.popuplocation.checked = getOption(onClickWindowOptions, 'location') == "yes";
+		formObj.popupscrollbars.checked = getOption(onClickWindowOptions, 'scrollbars') == "yes";
+		formObj.popupmenubar.checked = getOption(onClickWindowOptions, 'menubar') == "yes";
+		formObj.popupresizable.checked = getOption(onClickWindowOptions, 'resizable') == "yes";
+		formObj.popuptoolbar.checked = getOption(onClickWindowOptions, 'toolbar') == "yes";
+		formObj.popupstatus.checked = getOption(onClickWindowOptions, 'status') == "yes";
+		formObj.popupdependent.checked = getOption(onClickWindowOptions, 'dependent') == "yes";
+
+		buildOnClick();
+	}
+}
+
+function parseFunction(onclick) {
+	var formObj = document.forms[0];
+	var onClickData = parseLink(onclick);
+
+	// TODO: Add stuff here
+}
+
+function getOption(opts, name) {
+	return typeof(opts[name]) == "undefined" ? "" : opts[name];
+}
+
+function setPopupControlsDisabled(state) {
+	var formObj = document.forms[0];
+
+	formObj.popupname.disabled = state;
+	formObj.popupurl.disabled = state;
+	formObj.popupwidth.disabled = state;
+	formObj.popupheight.disabled = state;
+	formObj.popupleft.disabled = state;
+	formObj.popuptop.disabled = state;
+	formObj.popuplocation.disabled = state;
+	formObj.popupscrollbars.disabled = state;
+	formObj.popupmenubar.disabled = state;
+	formObj.popupresizable.disabled = state;
+	formObj.popuptoolbar.disabled = state;
+	formObj.popupstatus.disabled = state;
+	formObj.popupreturn.disabled = state;
+	formObj.popupdependent.disabled = state;
+
+	setBrowserDisabled('popupurlbrowser', state);
+}
+
+function parseLink(link) {
+	link = link.replace(new RegExp('&#39;', 'g'), "'");
+
+	var fnName = link.replace(new RegExp("\\s*([A-Za-z0-9\.]*)\\s*\\(.*", "gi"), "$1");
+
+	// Is function name a template function
+	var template = templates[fnName];
+	if (template) {
+		// Build regexp
+		var variableNames = template.match(new RegExp("'?\\$\\{[A-Za-z0-9\.]*\\}'?", "gi"));
+		var regExp = "\\s*[A-Za-z0-9\.]*\\s*\\(";
+		var replaceStr = "";
+		for (var i=0; i<variableNames.length; i++) {
+			// Is string value
+			if (variableNames[i].indexOf("'${") != -1)
+				regExp += "'(.*)'";
+			else // Number value
+				regExp += "([0-9]*)";
+
+			replaceStr += "$" + (i+1);
+
+			// Cleanup variable name
+			variableNames[i] = variableNames[i].replace(new RegExp("[^A-Za-z0-9]", "gi"), "");
+
+			if (i != variableNames.length-1) {
+				regExp += "\\s*,\\s*";
+				replaceStr += "<delim>";
+			} else
+				regExp += ".*";
+		}
+
+		regExp += "\\);?";
+
+		// Build variable array
+		var variables = [];
+		variables["_function"] = fnName;
+		var variableValues = link.replace(new RegExp(regExp, "gi"), replaceStr).split('<delim>');
+		for (var i=0; i<variableNames.length; i++)
+			variables[variableNames[i]] = variableValues[i];
+
+		return variables;
+	}
+
+	return null;
+}
+
+function parseOptions(opts) {
+	if (opts == null || opts == "")
+		return [];
+
+	// Cleanup the options
+	opts = opts.toLowerCase();
+	opts = opts.replace(/;/g, ",");
+	opts = opts.replace(/[^0-9a-z=,]/g, "");
+
+	var optionChunks = opts.split(',');
+	var options = [];
+
+	for (var i=0; i<optionChunks.length; i++) {
+		var parts = optionChunks[i].split('=');
+
+		if (parts.length == 2)
+			options[parts[0]] = parts[1];
+	}
+
+	return options;
+}
+
+function buildOnClick() {
+	var formObj = document.forms[0];
+
+	if (!formObj.ispopup.checked) {
+		formObj.onclick.value = "";
+		return;
+	}
+
+	var onclick = "window.open('";
+	var url = formObj.popupurl.value;
+
+	onclick += url + "','";
+	onclick += formObj.popupname.value + "','";
+
+	if (formObj.popuplocation.checked)
+		onclick += "location=yes,";
+
+	if (formObj.popupscrollbars.checked)
+		onclick += "scrollbars=yes,";
+
+	if (formObj.popupmenubar.checked)
+		onclick += "menubar=yes,";
+
+	if (formObj.popupresizable.checked)
+		onclick += "resizable=yes,";
+
+	if (formObj.popuptoolbar.checked)
+		onclick += "toolbar=yes,";
+
+	if (formObj.popupstatus.checked)
+		onclick += "status=yes,";
+
+	if (formObj.popupdependent.checked)
+		onclick += "dependent=yes,";
+
+	if (formObj.popupwidth.value != "")
+		onclick += "width=" + formObj.popupwidth.value + ",";
+
+	if (formObj.popupheight.value != "")
+		onclick += "height=" + formObj.popupheight.value + ",";
+
+	if (formObj.popupleft.value != "") {
+		if (formObj.popupleft.value != "c")
+			onclick += "left=" + formObj.popupleft.value + ",";
+		else
+			onclick += "left='+(screen.availWidth/2-" + (formObj.popupwidth.value/2) + ")+',";
+	}
+
+	if (formObj.popuptop.value != "") {
+		if (formObj.popuptop.value != "c")
+			onclick += "top=" + formObj.popuptop.value + ",";
+		else
+			onclick += "top='+(screen.availHeight/2-" + (formObj.popupheight.value/2) + ")+',";
+	}
+
+	if (onclick.charAt(onclick.length-1) == ',')
+		onclick = onclick.substring(0, onclick.length-1);
+
+	onclick += "');";
+
+	if (formObj.popupreturn.checked)
+		onclick += "return false;";
+
+	// tinyMCE.debug(onclick);
+
+	formObj.onclick.value = onclick;
+
+	if (formObj.href.value == "")
+		formObj.href.value = url;
+}
+
+function setAttrib(elm, attrib, value) {
+	var formObj = document.forms[0];
+	var valueElm = formObj.elements[attrib.toLowerCase()];
+	var dom = tinyMCEPopup.editor.dom;
+
+	if (typeof(value) == "undefined" || value == null) {
+		value = "";
+
+		if (valueElm)
+			value = valueElm.value;
+	}
+
+	// Clean up the style
+	if (attrib == 'style')
+		value = dom.serializeStyle(dom.parseStyle(value));
+
+	dom.setAttrib(elm, attrib, value);
+}
+
+function getAnchorListHTML(id, target) {
+	var inst = tinyMCEPopup.editor;
+	var nodes = inst.dom.select('a.mceItemAnchor,img.mceItemAnchor'), name, i;
+	var html = "";
+
+	html += '<select id="' + id + '" name="' + id + '" class="mceAnchorList" o2nfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target + '.value=';
+	html += 'this.options[this.selectedIndex].value;">';
+	html += '<option value="">---</option>';
+
+	for (i=0; i<nodes.length; i++) {
+		if ((name = inst.dom.getAttrib(nodes[i], "name")) != "")
+			html += '<option value="#' + name + '">' + name + '</option>';
+	}
+
+	html += '</select>';
+
+	return html;
+}
+
+function insertAction() {
+	var inst = tinyMCEPopup.editor;
+	var elm, elementArray, i;
+
+	elm = inst.selection.getNode();
+	checkPrefix(document.forms[0].href);
+
+	elm = inst.dom.getParent(elm, "A");
+
+	// Remove element if there is no href
+	if (!document.forms[0].href.value) {
+		tinyMCEPopup.execCommand("mceBeginUndoLevel");
+		i = inst.selection.getBookmark();
+		inst.dom.remove(elm, 1);
+		inst.selection.moveToBookmark(i);
+		tinyMCEPopup.execCommand("mceEndUndoLevel");
+		tinyMCEPopup.close();
+		return;
+	}
+
+	tinyMCEPopup.execCommand("mceBeginUndoLevel");
+
+	// Create new anchor elements
+	if (elm == null) {
+		tinyMCEPopup.execCommand("CreateLink", false, "#mce_temp_url#", {skip_undo : 1});
+
+		elementArray = tinymce.grep(inst.dom.select("a"), function(n) {return inst.dom.getAttrib(n, 'href') == '#mce_temp_url#';});
+		for (i=0; i<elementArray.length; i++)
+			setAllAttribs(elm = elementArray[i]);
+	} else
+		setAllAttribs(elm);
+
+	// Don't move caret if selection was image
+	if (elm.childNodes.length != 1 || elm.firstChild.nodeName != 'IMG') {
+		inst.focus();
+		inst.selection.select(elm);
+		inst.selection.collapse(0);
+		tinyMCEPopup.storeSelection();
+	}
+
+	tinyMCEPopup.execCommand("mceEndUndoLevel");
+	tinyMCEPopup.close();
+}
+
+function setAllAttribs(elm) {
+	var formObj = document.forms[0];
+	var href = formObj.href.value;
+	var target = getSelectValue(formObj, 'targetlist');
+
+	setAttrib(elm, 'href', href);
+	setAttrib(elm, 'mce_href', href);
+	setAttrib(elm, 'title');
+	setAttrib(elm, 'target', target == '_self' ? '' : target);
+	setAttrib(elm, 'id');
+	setAttrib(elm, 'style');
+	setAttrib(elm, 'class', getSelectValue(formObj, 'classlist'));
+	setAttrib(elm, 'rel');
+	setAttrib(elm, 'rev');
+	setAttrib(elm, 'charset');
+	setAttrib(elm, 'hreflang');
+	setAttrib(elm, 'dir');
+	setAttrib(elm, 'lang');
+	setAttrib(elm, 'tabindex');
+	setAttrib(elm, 'accesskey');
+	setAttrib(elm, 'type');
+	setAttrib(elm, 'onfocus');
+	setAttrib(elm, 'onblur');
+	setAttrib(elm, 'onclick');
+	setAttrib(elm, 'ondblclick');
+	setAttrib(elm, 'onmousedown');
+	setAttrib(elm, 'onmouseup');
+	setAttrib(elm, 'onmouseover');
+	setAttrib(elm, 'onmousemove');
+	setAttrib(elm, 'onmouseout');
+	setAttrib(elm, 'onkeypress');
+	setAttrib(elm, 'onkeydown');
+	setAttrib(elm, 'onkeyup');
+
+	// Refresh in old MSIE
+	if (tinyMCE.isMSIE5)
+		elm.outerHTML = elm.outerHTML;
+}
+
+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 getLinkListHTML(elm_id, target_form_element, onchange_func) {
+	if (typeof(tinyMCELinkList) == "undefined" || tinyMCELinkList.length == 0)
+		return "";
+
+	var html = "";
+
+	html += '<select id="' + elm_id + '" name="' + elm_id + '"';
+	html += ' class="mceLinkList" onfoc2us="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value=';
+	html += 'this.options[this.selectedIndex].value;';
+
+	if (typeof(onchange_func) != "undefined")
+		html += onchange_func + '(\'' + target_form_element + '\',this.options[this.selectedIndex].text,this.options[this.selectedIndex].value);';
+
+	html += '"><option value="">---</option>';
+
+	for (var i=0; i<tinyMCELinkList.length; i++)
+		html += '<option value="' + tinyMCELinkList[i][1] + '">' + tinyMCELinkList[i][0] + '</option>';
+
+	html += '</select>';
+
+	return html;
+
+	// tinyMCE.debug('-- image list start --', html, '-- image list end --');
+}
+
+function getTargetListHTML(elm_id, target_form_element) {
+	var targets = tinyMCEPopup.getParam('theme_advanced_link_targets', '').split(';');
+	var html = '';
+
+	html += '<select id="' + elm_id + '" name="' + elm_id + '" onf2ocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value=';
+	html += 'this.options[this.selectedIndex].value;">';
+	html += '<option value="_self">' + tinyMCEPopup.getLang('advlink_dlg.target_same') + '</option>';
+	html += '<option value="_blank">' + tinyMCEPopup.getLang('advlink_dlg.target_blank') + ' (_blank)</option>';
+	html += '<option value="_parent">' + tinyMCEPopup.getLang('advlink_dlg.target_parent') + ' (_parent)</option>';
+	html += '<option value="_top">' + tinyMCEPopup.getLang('advlink_dlg.target_top') + ' (_top)</option>';
+
+	for (var i=0; i<targets.length; i++) {
+		var key, value;
+
+		if (targets[i] == "")
+			continue;
+
+		key = targets[i].split('=')[0];
+		value = targets[i].split('=')[1];
+
+		html += '<option value="' + key + '">' + value + ' (' + key + ')</option>';
+	}
+
+	html += '</select>';
+
+	return html;
+}
+
+// While loading
+preinit();
+tinyMCEPopup.onInit.add(init);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advlink/jscripts/functions.js
@@ -1,1 +1,569 @@
-
+/* Functions for the advlink plugin popup */
+
+var templates = {
+	"window.open" : "window.open('${url}','${target}','${options}')"
+};
+
+function preinit() {
+	// Initialize
+	tinyMCE.setWindowArg('mce_windowresize', false);
+
+	// Import external list url javascript
+	var url = tinyMCE.getParam("external_link_list_url");
+	if (url != null) {
+		// Fix relative
+		if (url.charAt(0) != '/' && url.indexOf('://') == -1)
+			url = tinyMCE.documentBasePath + "/" + url;
+
+		document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');
+	}
+}
+
+function changeClass() {
+	var formObj = document.forms[0];
+	formObj.classes.value = getSelectValue(formObj, 'classlist');
+}
+
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	var formObj = document.forms[0];
+	var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
+	var elm = inst.getFocusElement();
+	var action = "insert";
+	var html;
+
+	document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','advlink');
+	document.getElementById('popupurlbrowsercontainer').innerHTML = getBrowserHTML('popupurlbrowser','popupurl','file','advlink');
+	document.getElementById('linklisthrefcontainer').innerHTML = getLinkListHTML('linklisthref','href');
+	document.getElementById('anchorlistcontainer').innerHTML = getAnchorListHTML('anchorlist','href');
+	document.getElementById('targetlistcontainer').innerHTML = getTargetListHTML('targetlist','target');
+
+	// Link list
+	html = getLinkListHTML('linklisthref','href');
+	if (html == "")
+		document.getElementById("linklisthrefrow").style.display = 'none';
+	else
+		document.getElementById("linklisthrefcontainer").innerHTML = html;
+
+	// Resize some elements
+	if (isVisible('hrefbrowser'))
+		document.getElementById('href').style.width = '260px';
+
+	if (isVisible('popupurlbrowser'))
+		document.getElementById('popupurl').style.width = '180px';
+
+	elm = tinyMCE.getParentElement(elm, "a");
+	if (elm != null && elm.nodeName == "A")
+		action = "update";
+
+	formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); 
+
+	setPopupControlsDisabled(true);
+
+	if (action == "update") {
+		var href = tinyMCE.getAttrib(elm, 'href');
+
+		href = convertURL(href, elm, true);
+
+		// Use mce_href if found
+		var mceRealHref = tinyMCE.getAttrib(elm, 'mce_href');
+		if (mceRealHref != "") {
+			href = mceRealHref;
+
+			if (tinyMCE.getParam('convert_urls'))
+				href = convertURL(href, elm, true);
+		}
+
+		var onclick = tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onclick'));
+
+		// Setup form data
+		setFormValue('href', href);
+		setFormValue('title', tinyMCE.getAttrib(elm, 'title'));
+		setFormValue('id', tinyMCE.getAttrib(elm, 'id'));
+		setFormValue('style', tinyMCE.serializeStyle(tinyMCE.parseStyle(tinyMCE.getAttrib(elm, "style"))));
+		setFormValue('rel', tinyMCE.getAttrib(elm, 'rel'));
+		setFormValue('rev', tinyMCE.getAttrib(elm, 'rev'));
+		setFormValue('charset', tinyMCE.getAttrib(elm, 'charset'));
+		setFormValue('hreflang', tinyMCE.getAttrib(elm, 'hreflang'));
+		setFormValue('dir', tinyMCE.getAttrib(elm, 'dir'));
+		setFormValue('lang', tinyMCE.getAttrib(elm, 'lang'));
+		setFormValue('tabindex', tinyMCE.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : ""));
+		setFormValue('accesskey', tinyMCE.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : ""));
+		setFormValue('type', tinyMCE.getAttrib(elm, 'type'));
+		setFormValue('onfocus', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onfocus')));
+		setFormValue('onblur', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onblur')));
+		setFormValue('onclick', onclick);
+		setFormValue('ondblclick', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'ondblclick')));
+		setFormValue('onmousedown', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmousedown')));
+		setFormValue('onmouseup', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseup')));
+		setFormValue('onmouseover', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseover')));
+		setFormValue('onmousemove', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmousemove')));
+		setFormValue('onmouseout', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseout')));
+		setFormValue('onkeypress', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeypress')));
+		setFormValue('onkeydown', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeydown')));
+		setFormValue('onkeyup', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeyup')));
+		setFormValue('target', tinyMCE.getAttrib(elm, 'target'));
+		setFormValue('classes', tinyMCE.getAttrib(elm, 'class'));
+
+		// Parse onclick data
+		if (onclick != null && onclick.indexOf('window.open') != -1)
+			parseWindowOpen(onclick);
+		else
+			parseFunction(onclick);
+
+		// Select by the values
+		selectByValue(formObj, 'dir', tinyMCE.getAttrib(elm, 'dir'));
+		selectByValue(formObj, 'rel', tinyMCE.getAttrib(elm, 'rel'));
+		selectByValue(formObj, 'rev', tinyMCE.getAttrib(elm, 'rev'));
+		selectByValue(formObj, 'linklisthref', href);
+
+		if (href.charAt(0) == '#')
+			selectByValue(formObj, 'anchorlist', href);
+
+		addClassesToList('classlist', 'advlink_styles');
+
+		selectByValue(formObj, 'classlist', tinyMCE.getAttrib(elm, 'class'), true);
+		selectByValue(formObj, 'targetlist', tinyMCE.getAttrib(elm, 'target'), true);
+	} else
+		addClassesToList('classlist', 'advlink_styles');
+
+	window.focus();
+}
+
+function setFormValue(name, value) {
+	document.forms[0].elements[name].value = value;
+}
+
+function convertURL(url, node, on_save) {
+	return eval("tinyMCEPopup.windowOpener." + tinyMCE.settings['urlconverter_callback'] + "(url, node, on_save);");
+}
+
+function parseWindowOpen(onclick) {
+	var formObj = document.forms[0];
+
+	// Preprocess center code
+	if (onclick.indexOf('return false;') != -1) {
+		formObj.popupreturn.checked = true;
+		onclick = onclick.replace('return false;', '');
+	} else
+		formObj.popupreturn.checked = false;
+
+	var onClickData = parseLink(onclick);
+
+	if (onClickData != null) {
+		formObj.ispopup.checked = true;
+		setPopupControlsDisabled(false);
+
+		var onClickWindowOptions = parseOptions(onClickData['options']);
+		var url = onClickData['url'];
+
+		if (tinyMCE.getParam('convert_urls'))
+			url = convertURL(url, null, true);
+
+		formObj.popupname.value = onClickData['target'];
+		formObj.popupurl.value = url;
+		formObj.popupwidth.value = getOption(onClickWindowOptions, 'width');
+		formObj.popupheight.value = getOption(onClickWindowOptions, 'height');
+
+		formObj.popupleft.value = getOption(onClickWindowOptions, 'left');
+		formObj.popuptop.value = getOption(onClickWindowOptions, 'top');
+
+		if (formObj.popupleft.value.indexOf('screen') != -1)
+			formObj.popupleft.value = "c";
+
+		if (formObj.popuptop.value.indexOf('screen') != -1)
+			formObj.popuptop.value = "c";
+
+		formObj.popuplocation.checked = getOption(onClickWindowOptions, 'location') == "yes";
+		formObj.popupscrollbars.checked = getOption(onClickWindowOptions, 'scrollbars') == "yes";
+		formObj.popupmenubar.checked = getOption(onClickWindowOptions, 'menubar') == "yes";
+		formObj.popupresizable.checked = getOption(onClickWindowOptions, 'resizable') == "yes";
+		formObj.popuptoolbar.checked = getOption(onClickWindowOptions, 'toolbar') == "yes";
+		formObj.popupstatus.checked = getOption(onClickWindowOptions, 'status') == "yes";
+		formObj.popupdependent.checked = getOption(onClickWindowOptions, 'dependent') == "yes";
+
+		buildOnClick();
+	}
+}
+
+function parseFunction(onclick) {
+	var formObj = document.forms[0];
+	var onClickData = parseLink(onclick);
+
+	// TODO: Add stuff here
+}
+
+function getOption(opts, name) {
+	return typeof(opts[name]) == "undefined" ? "" : opts[name];
+}
+
+function setPopupControlsDisabled(state) {
+	var formObj = document.forms[0];
+
+	formObj.popupname.disabled = state;
+	formObj.popupurl.disabled = state;
+	formObj.popupwidth.disabled = state;
+	formObj.popupheight.disabled = state;
+	formObj.popupleft.disabled = state;
+	formObj.popuptop.disabled = state;
+	formObj.popuplocation.disabled = state;
+	formObj.popupscrollbars.disabled = state;
+	formObj.popupmenubar.disabled = state;
+	formObj.popupresizable.disabled = state;
+	formObj.popuptoolbar.disabled = state;
+	formObj.popupstatus.disabled = state;
+	formObj.popupreturn.disabled = state;
+	formObj.popupdependent.disabled = state;
+
+	setBrowserDisabled('popupurlbrowser', state);
+}
+
+function parseLink(link) {
+	link = link.replace(new RegExp('&#39;', 'g'), "'");
+
+	var fnName = link.replace(new RegExp("\\s*([A-Za-z0-9\.]*)\\s*\\(.*", "gi"), "$1");
+
+	// Is function name a template function
+	var template = templates[fnName];
+	if (template) {
+		// Build regexp
+		var variableNames = template.match(new RegExp("'?\\$\\{[A-Za-z0-9\.]*\\}'?", "gi"));
+		var regExp = "\\s*[A-Za-z0-9\.]*\\s*\\(";
+		var replaceStr = "";
+		for (var i=0; i<variableNames.length; i++) {
+			// Is string value
+			if (variableNames[i].indexOf("'${") != -1)
+				regExp += "'(.*)'";
+			else // Number value
+				regExp += "([0-9]*)";
+
+			replaceStr += "$" + (i+1);
+
+			// Cleanup variable name
+			variableNames[i] = variableNames[i].replace(new RegExp("[^A-Za-z0-9]", "gi"), "");
+
+			if (i != variableNames.length-1) {
+				regExp += "\\s*,\\s*";
+				replaceStr += "<delim>";
+			} else
+				regExp += ".*";
+		}
+
+		regExp += "\\);?";
+
+		// Build variable array
+		var variables = new Array();
+		variables["_function"] = fnName;
+		var variableValues = link.replace(new RegExp(regExp, "gi"), replaceStr).split('<delim>');
+		for (var i=0; i<variableNames.length; i++)
+			variables[variableNames[i]] = variableValues[i];
+
+		return variables;
+	}
+
+	return null;
+}
+
+function parseOptions(opts) {
+	if (opts == null || opts == "")
+		return new Array();
+
+	// Cleanup the options
+	opts = opts.toLowerCase();
+	opts = opts.replace(/;/g, ",");
+	opts = opts.replace(/[^0-9a-z=,]/g, "");
+
+	var optionChunks = opts.split(',');
+	var options = new Array();
+
+	for (var i=0; i<optionChunks.length; i++) {
+		var parts = optionChunks[i].split('=');
+
+		if (parts.length == 2)
+			options[parts[0]] = parts[1];
+	}
+
+	return options;
+}
+
+function buildOnClick() {
+	var formObj = document.forms[0];
+
+	if (!formObj.ispopup.checked) {
+		formObj.onclick.value = "";
+		return;
+	}
+
+	var onclick = "window.open('";
+	var url = formObj.popupurl.value;
+
+	if (tinyMCE.getParam('convert_urls'))
+		url = convertURL(url, null, true);
+
+	onclick += url + "','";
+	onclick += formObj.popupname.value + "','";
+
+	if (formObj.popuplocation.checked)
+		onclick += "location=yes,";
+
+	if (formObj.popupscrollbars.checked)
+		onclick += "scrollbars=yes,";
+
+	if (formObj.popupmenubar.checked)
+		onclick += "menubar=yes,";
+
+	if (formObj.popupresizable.checked)
+		onclick += "resizable=yes,";
+
+	if (formObj.popuptoolbar.checked)
+		onclick += "toolbar=yes,";
+
+	if (formObj.popupstatus.checked)
+		onclick += "status=yes,";
+
+	if (formObj.popupdependent.checked)
+		onclick += "dependent=yes,";
+
+	if (formObj.popupwidth.value != "")
+		onclick += "width=" + formObj.popupwidth.value + ",";
+
+	if (formObj.popupheight.value != "")
+		onclick += "height=" + formObj.popupheight.value + ",";
+
+	if (formObj.popupleft.value != "") {
+		if (formObj.popupleft.value != "c")
+			onclick += "left=" + formObj.popupleft.value + ",";
+		else
+			onclick += "left='+(screen.availWidth/2-" + (formObj.popupwidth.value/2) + ")+',";
+	}
+
+	if (formObj.popuptop.value != "") {
+		if (formObj.popuptop.value != "c")
+			onclick += "top=" + formObj.popuptop.value + ",";
+		else
+			onclick += "top='+(screen.availHeight/2-" + (formObj.popupheight.value/2) + ")+',";
+	}
+
+	if (onclick.charAt(onclick.length-1) == ',')
+		onclick = onclick.substring(0, onclick.length-1);
+
+	onclick += "');";
+
+	if (formObj.popupreturn.checked)
+		onclick += "return false;";
+
+	// tinyMCE.debug(onclick);
+
+	formObj.onclick.value = onclick;
+
+	if (formObj.href.value == "")
+		formObj.href.value = url;
+}
+
+function setAttrib(elm, attrib, value) {
+	var formObj = document.forms[0];
+	var valueElm = formObj.elements[attrib.toLowerCase()];
+
+	if (typeof(value) == "undefined" || value == null) {
+		value = "";
+
+		if (valueElm)
+			value = valueElm.value;
+	}
+
+	if (value != "") {
+		elm.setAttribute(attrib.toLowerCase(), value);
+
+		if (attrib == "style")
+			attrib = "style.cssText";
+
+		if (attrib.substring(0, 2) == 'on')
+			value = 'return true;' + value;
+
+		if (attrib == "class")
+			attrib = "className";
+
+		eval('elm.' + attrib + "=value;");
+	} else
+		elm.removeAttribute(attrib);
+}
+
+function getAnchorListHTML(id, target) {
+	var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
+	var nodes = inst.getBody().getElementsByTagName("a");
+
+	var html = "";
+
+	html += '<select id="' + id + '" name="' + id + '" class="mceAnchorList" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target + '.value=';
+	html += 'this.options[this.selectedIndex].value;">';
+	html += '<option value="">---</option>';
+
+	for (var i=0; i<nodes.length; i++) {
+		if ((name = tinyMCE.getAttrib(nodes[i], "name")) != "")
+			html += '<option value="#' + name + '">' + name + '</option>';
+	}
+
+	html += '</select>';
+
+	return html;
+}
+
+function insertAction() {
+	var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
+	var elm = inst.getFocusElement();
+
+	elm = tinyMCE.getParentElement(elm, "a");
+
+	tinyMCEPopup.execCommand("mceBeginUndoLevel");
+
+	// Create new anchor elements
+	if (elm == null) {
+		if (tinyMCE.isSafari)
+			tinyMCEPopup.execCommand("mceInsertContent", false, '<a href="#mce_temp_url#">' + inst.selection.getSelectedHTML() + '</a>');
+		else
+			tinyMCEPopup.execCommand("createlink", false, "#mce_temp_url#");
+
+		var elementArray = tinyMCE.getElementsByAttributeValue(inst.getBody(), "a", "href", "#mce_temp_url#");
+		for (var i=0; i<elementArray.length; i++) {
+			var elm = elementArray[i];
+
+			// Move cursor behind the new anchor
+			if (tinyMCE.isGecko) {
+				var sp = inst.getDoc().createTextNode(" ");
+
+				if (elm.nextSibling)
+					elm.parentNode.insertBefore(sp, elm.nextSibling);
+				else
+					elm.parentNode.appendChild(sp);
+
+				// Set range after link
+				var rng = inst.getDoc().createRange();
+				rng.setStartAfter(elm);
+				rng.setEndAfter(elm);
+
+				// Update selection
+				var sel = inst.getSel();
+				sel.removeAllRanges();
+				sel.addRange(rng);
+			}
+
+			setAllAttribs(elm);
+		}
+	} else
+		setAllAttribs(elm);
+
+	tinyMCE._setEventsEnabled(inst.getBody(), false);
+	tinyMCEPopup.execCommand("mceEndUndoLevel");
+	tinyMCEPopup.close();
+}
+
+function setAllAttribs(elm) {
+	var formObj = document.forms[0];
+	var href = formObj.href.value;
+	var target = getSelectValue(formObj, 'targetlist');
+
+	// Make anchors absolute
+	if (href.charAt(0) != '#')
+		href = convertURL(href, elm);
+
+	setAttrib(elm, 'href', href);
+	setAttrib(elm, 'mce_href', href);
+	setAttrib(elm, 'title');
+	setAttrib(elm, 'target', target == '_self' ? '' : target);
+	setAttrib(elm, 'id');
+	setAttrib(elm, 'style');
+	setAttrib(elm, 'class', getSelectValue(formObj, 'classlist'));
+	setAttrib(elm, 'rel');
+	setAttrib(elm, 'rev');
+	setAttrib(elm, 'charset');
+	setAttrib(elm, 'hreflang');
+	setAttrib(elm, 'dir');
+	setAttrib(elm, 'lang');
+	setAttrib(elm, 'tabindex');
+	setAttrib(elm, 'accesskey');
+	setAttrib(elm, 'type');
+	setAttrib(elm, 'onfocus');
+	setAttrib(elm, 'onblur');
+	setAttrib(elm, 'onclick');
+	setAttrib(elm, 'ondblclick');
+	setAttrib(elm, 'onmousedown');
+	setAttrib(elm, 'onmouseup');
+	setAttrib(elm, 'onmouseover');
+	setAttrib(elm, 'onmousemove');
+	setAttrib(elm, 'onmouseout');
+	setAttrib(elm, 'onkeypress');
+	setAttrib(elm, 'onkeydown');
+	setAttrib(elm, 'onkeyup');
+
+	// Refresh in old MSIE
+	if (tinyMCE.isMSIE5)
+		elm.outerHTML = elm.outerHTML;
+}
+
+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 getLinkListHTML(elm_id, target_form_element, onchange_func) {
+	if (typeof(tinyMCELinkList) == "undefined" || tinyMCELinkList.length == 0)
+		return "";
+
+	var html = "";
+
+	html += '<select id="' + elm_id + '" name="' + elm_id + '"';
+	html += ' class="mceLinkList" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value=';
+	html += 'this.options[this.selectedIndex].value;';
+
+	if (typeof(onchange_func) != "undefined")
+		html += onchange_func + '(\'' + target_form_element + '\',this.options[this.selectedIndex].text,this.options[this.selectedIndex].value);';
+
+	html += '"><option value="">---</option>';
+
+	for (var i=0; i<tinyMCELinkList.length; i++)
+		html += '<option value="' + tinyMCELinkList[i][1] + '">' + tinyMCELinkList[i][0] + '</option>';
+
+	html += '</select>';
+
+	return html;
+
+	// tinyMCE.debug('-- image list start --', html, '-- image list end --');
+}
+
+function getTargetListHTML(elm_id, target_form_element) {
+	var targets = tinyMCE.getParam('theme_advanced_link_targets', '').split(';');
+	var html = '';
+
+	html += '<select id="' + elm_id + '" name="' + elm_id + '" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value=';
+	html += 'this.options[this.selectedIndex].value;">';
+
+	html += '<option value="_self">' + tinyMCE.getLang('lang_advlink_target_same') + '</option>';
+	html += '<option value="_blank">' + tinyMCE.getLang('lang_advlink_target_blank') + ' (_blank)</option>';
+	html += '<option value="_parent">' + tinyMCE.getLang('lang_advlink_target_parent') + ' (_parent)</option>';
+	html += '<option value="_top">' + tinyMCE.getLang('lang_advlink_target_top') + ' (_top)</option>';
+
+	for (var i=0; i<targets.length; i++) {
+		var key, value;
+
+		if (targets[i] == "")
+			continue;
+
+		key = targets[i].split('=')[0];
+		value = targets[i].split('=')[1];
+
+		html += '<option value="' + key + '">' + value + ' (' + key + ')</option>';
+	}
+
+	html += '</select>';
+
+	return html;
+}
+
+// While loading
+preinit();
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advlink/langs/en.js
@@ -1,1 +1,47 @@
+// UK lang variables
 
+tinyMCE.addToLang('advlink',{
+general_tab : 'General',
+popup_tab : 'Popup',
+events_tab : 'Events',
+advanced_tab : 'Advanced',
+general_props : 'General properties',
+popup_props : 'Popup properties',
+event_props : 'Events',
+advanced_props : 'Advanced properties',
+popup_opts : 'Options',
+anchor_names : 'Anchors',
+target_same : 'Open in this window / frame',
+target_parent : 'Open in parent window / frame',
+target_top : 'Open in top frame (replaces all frames)',
+target_blank : 'Open in new window',
+popup : 'Javascript popup',
+popup_url : 'Popup URL',
+popup_name : 'Window name',
+popup_return : 'Insert \'return false\'',
+popup_scrollbars : 'Show scrollbars',
+popup_statusbar : 'Show status bar',
+popup_toolbar : 'Show toolbars',
+popup_menubar : 'Show menu bar',
+popup_location : 'Show location bar',
+popup_resizable : 'Make window resizable',
+popup_dependent : 'Dependent (Mozilla/Firefox only)',
+popup_size : 'Size',
+popup_position : 'Position (X/Y)',
+id : 'Id',
+style: 'Style',
+classes : 'Classes',
+target_name : 'Target name',
+langdir : 'Language direction',
+target_langcode : 'Target language',
+langcode : 'Language code',
+encoding : 'Target character encoding',
+mime : 'Target MIME type',
+rel : 'Relationship page to target',
+rev : 'Relationship target to page',
+tabindex : 'Tabindex',
+accesskey : 'Accesskey',
+ltr : 'Left to right',
+rtl : 'Right to left'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advlink/langs/en_dlg.js
@@ -1,1 +1,52 @@
-
+tinyMCE.addI18n('en.advlink_dlg',{
+title:"Insert/edit link",
+url:"Link URL",
+target:"Target",
+titlefield:"Title",
+is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",
+is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",
+list:"Link list",
+general_tab:"General",
+popup_tab:"Popup",
+events_tab:"Events",
+advanced_tab:"Advanced",
+general_props:"General properties",
+popup_props:"Popup properties",
+event_props:"Events",
+advanced_props:"Advanced properties",
+popup_opts:"Options",
+anchor_names:"Anchors",
+target_same:"Open in this window / frame",
+target_parent:"Open in parent window / frame",
+target_top:"Open in top frame (replaces all frames)",
+target_blank:"Open in new window",
+popup:"Javascript popup",
+popup_url:"Popup URL",
+popup_name:"Window name",
+popup_return:"Insert 'return false'",
+popup_scrollbars:"Show scrollbars",
+popup_statusbar:"Show status bar",
+popup_toolbar:"Show toolbars",
+popup_menubar:"Show menu bar",
+popup_location:"Show location bar",
+popup_resizable:"Make window resizable",
+popup_dependent:"Dependent (Mozilla/Firefox only)",
+popup_size:"Size",
+popup_position:"Position (X/Y)",
+id:"Id",
+style:"Style",
+classes:"Classes",
+target_name:"Target name",
+langdir:"Language direction",
+target_langcode:"Target language",
+langcode:"Language code",
+encoding:"Target character encoding",
+mime:"Target MIME type",
+rel:"Relationship page to target",
+rev:"Relationship target to page",
+tabindex:"Tabindex",
+accesskey:"Accesskey",
+ltr:"Left to right",
+rtl:"Right to left",
+link_list:"Link list"
+});

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advlink/link.htm
@@ -1,1 +1,340 @@
-
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#advlink_dlg.title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="../../utils/validate.js"></script>
+	<script type="text/javascript" src="js/advlink.js"></script>
+	<link href="css/advlink.css" rel="stylesheet" type="text/css" />
+	<base target="_self" />
+</head>
+<body id="advlink" style="display: none">
+    <form onsubmit="insertAction();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;">{#advlink_dlg.general_tab}</a></span></li>
+				<li id="popup_tab"><span><a href="javascript:mcTabs.displayTab('popup_tab','popup_panel');" onmousedown="return false;">{#advlink_dlg.popup_tab}</a></span></li>
+				<li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#advlink_dlg.events_tab}</a></span></li>
+				<li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#advlink_dlg.advanced_tab}</a></span></li>
+			</ul>
+		</div>
+
+		<div class="panel_wrapper">
+			<div id="general_panel" class="panel current">
+				<fieldset>
+					<legend>{#advlink_dlg.general_props}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+						  <td nowrap="nowrap"><label id="hreflabel" for="href">{#advlink_dlg.url}</label></td>
+						  <td><table border="0" cellspacing="0" cellpadding="0">
+								<tr>
+								  <td><input id="href" name="href" type="text" class="mceFocus" value="" onchange="selectByValue(this.form,'linklisthref',this.value);" /></td>
+								  <td id="hrefbrowsercontainer">&nbsp;</td>
+								</tr>
+							  </table></td>
+						</tr>
+						<tr id="linklisthrefrow">
+							<td class="column1"><label for="linklisthref">{#advlink_dlg.list}</label></td>
+							<td colspan="2" id="linklisthrefcontainer">&nbsp;</td>
+						</tr>
+						<tr>
+							<td class="column1"><label for="anchorlist">{#advlink_dlg.anchor_names}</label></td>
+							<td colspan="2" id="anchorlistcontainer">&nbsp;</td>
+						</tr>
+						<tr>
+							<td><label id="targetlistlabel" for="targetlist">{#advlink_dlg.target}</label></td>
+							<td id="targetlistcontainer">&nbsp;</td>
+						</tr>
+						<tr>
+							<td nowrap="nowrap"><label id="titlelabel" for="title">{#advlink_dlg.titlefield}</label></td>
+							<td><input id="title" name="title" type="text" value="" /></td>
+						</tr>
+						<tr>
+							<td><label id="classlabel" for="classlist">{#class_name}</label></td>
+							<td>
+								 <select id="classlist" name="classlist" onchange="changeClass();">
+									<option value="" selected>{#not_set}</option>
+								 </select>
+							</td>
+						</tr>
+					</table>
+				</fieldset>
+			</div>
+
+			<div id="popup_panel" class="panel">
+				<fieldset>
+					<legend>{#advlink_dlg.popup_props}</legend>
+
+					<input type="checkbox" id="ispopup" name="ispopup" class="radio" onclick="setPopupControlsDisabled(!this.checked);buildOnClick();" />
+					<label id="ispopuplabel" for="ispopup">{#advlink_dlg.popup}</label>
+
+					<table border="0" cellpadding="0" cellspacing="4">
+						<tr>
+							<td nowrap="nowrap"><label for="popupurl">{#advlink_dlg.popup_url}</label>&nbsp;</td>
+							<td>
+								<table border="0" cellspacing="0" cellpadding="0">
+									<tr>
+										<td><input type="text" name="popupurl" id="popupurl" value="" onchange="buildOnClick();" /></td>
+										<td id="popupurlbrowsercontainer">&nbsp;</td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+						<tr>
+							<td nowrap="nowrap"><label for="popupname">{#advlink_dlg.popup_name}</label>&nbsp;</td>
+							<td><input type="text" name="popupname" id="popupname" value="" onchange="buildOnClick();" /></td>
+						</tr>
+						<tr>
+							<td nowrap="nowrap"><label>{#advlink_dlg.popup_size}</label>&nbsp;</td>
+							<td nowrap="nowrap">
+								<input type="text" id="popupwidth" name="popupwidth" value="" onchange="buildOnClick();" /> x
+								<input type="text" id="popupheight" name="popupheight" value="" onchange="buildOnClick();" /> px
+							</td>
+						</tr>
+						<tr>
+							<td nowrap="nowrap" id="labelleft"><label>{#advlink_dlg.popup_position}</label>&nbsp;</td>
+							<td nowrap="nowrap">
+								<input type="text" id="popupleft" name="popupleft" value="" onchange="buildOnClick();" /> /                                
+								<input type="text" id="popuptop" name="popuptop" value="" onchange="buildOnClick();" /> (c /c = center)
+							</td>
+						</tr>
+					</table>
+
+					<fieldset>
+						<legend>{#advlink_dlg.popup_opts}</legend>
+
+						<table border="0" cellpadding="0" cellspacing="4">
+							<tr>
+								<td><input type="checkbox" id="popuplocation" name="popuplocation" class="checkbox" onchange="buildOnClick();" /></td>
+								<td nowrap="nowrap"><label id="popuplocationlabel" for="popuplocation">{#advlink_dlg.popup_location}</label></td>
+								<td><input type="checkbox" id="popupscrollbars" name="popupscrollbars" class="checkbox" onchange="buildOnClick();" /></td>
+								<td nowrap="nowrap"><label id="popupscrollbarslabel" for="popupscrollbars">{#advlink_dlg.popup_scrollbars}</label></td>
+							</tr>
+							<tr>
+								<td><input type="checkbox" id="popupmenubar" name="popupmenubar" class="checkbox" onchange="buildOnClick();" /></td>
+								<td nowrap="nowrap"><label id="popupmenubarlabel" for="popupmenubar">{#advlink_dlg.popup_menubar}</label></td>
+								<td><input type="checkbox" id="popupresizable" name="popupresizable" class="checkbox" onchange="buildOnClick();" /></td>
+								<td nowrap="nowrap"><label id="popupresizablelabel" for="popupresizable">{#advlink_dlg.popup_resizable}</label></td>
+							</tr>
+							<tr>
+								<td><input type="checkbox" id="popuptoolbar" name="popuptoolbar" class="checkbox" onchange="buildOnClick();" /></td>
+								<td nowrap="nowrap"><label id="popuptoolbarlabel" for="popuptoolbar">{#advlink_dlg.popup_toolbar}</label></td>
+								<td><input type="checkbox" id="popupdependent" name="popupdependent" class="checkbox" onchange="buildOnClick();" /></td>
+								<td nowrap="nowrap"><label id="popupdependentlabel" for="popupdependent">{#advlink_dlg.popup_dependent}</label></td>
+							</tr>
+							<tr>
+								<td><input type="checkbox" id="popupstatus" name="popupstatus" class="checkbox" onchange="buildOnClick();" /></td>
+								<td nowrap="nowrap"><label id="popupstatuslabel" for="popupstatus">{#advlink_dlg.popup_statusbar}</label></td>
+								<td><input type="checkbox" id="popupreturn" name="popupreturn" class="checkbox" onchange="buildOnClick();" checked="checked" /></td>
+								<td nowrap="nowrap"><label id="popupreturnlabel" for="popupreturn">{#advlink_dlg.popup_return}</label></td>
+							</tr>
+						</table>
+					</fieldset>
+				</fieldset>
+			</div>
+
+			<div id="advanced_panel" class="panel">
+			<fieldset>
+					<legend>{#advlink_dlg.advanced_props}</legend>
+
+					<table border="0" cellpadding="0" cellspacing="4">
+						<tr>
+							<td class="column1"><label id="idlabel" for="id">{#advlink_dlg.id}</label></td> 
+							<td><input id="id" name="id" type="text" value="" /></td> 
+						</tr>
+
+						<tr>
+							<td><label id="stylelabel" for="style">{#advlink_dlg.style}</label></td>
+							<td><input type="text" id="style" name="style" value="" /></td>
+						</tr>
+
+						<tr>
+							<td><label id="classeslabel" for="classes">{#advlink_dlg.classes}</label></td>
+							<td><input type="text" id="classes" name="classes" value="" onchange="selectByValue(this.form,'classlist',this.value,true);" /></td>
+						</tr>
+
+						<tr>
+							<td><label id="targetlabel" for="target">{#advlink_dlg.target_name}</label></td>
+							<td><input type="text" id="target" name="target" value="" onchange="selectByValue(this.form,'targetlist',this.value,true);" /></td>
+						</tr>
+
+						<tr>
+							<td class="column1"><label id="dirlabel" for="dir">{#advlink_dlg.langdir}</label></td> 
+							<td>
+								<select id="dir" name="dir"> 
+										<option value="">{#not_set}</option> 
+										<option value="ltr">{#advlink_dlg.ltr}</option> 
+										<option value="rtl">{#advlink_dlg.rtl}</option> 
+								</select>
+							</td> 
+						</tr>
+
+						<tr>
+							<td><label id="hreflanglabel" for="hreflang">{#advlink_dlg.target_langcode}</label></td>
+							<td><input type="text" id="hreflang" name="hreflang" value="" /></td>
+						</tr>
+
+						<tr>
+							<td class="column1"><label id="langlabel" for="lang">{#advlink_dlg.langcode}</label></td> 
+							<td>
+								<input id="lang" name="lang" type="text" value="" />
+							</td> 
+						</tr>
+
+						<tr>
+							<td><label id="charsetlabel" for="charset">{#advlink_dlg.encoding}</label></td>
+							<td><input type="text" id="charset" name="charset" value="" /></td>
+						</tr>
+
+						<tr>
+							<td><label id="typelabel" for="type">{#advlink_dlg.mime}</label></td>
+							<td><input type="text" id="type" name="type" value="" /></td>
+						</tr>
+
+						<tr>
+							<td><label id="rellabel" for="rel">{#advlink_dlg.rel}</label></td>
+							<td><select id="rel" name="rel"> 
+									<option value="">{#not_set}</option> 
+									<option value="lightbox">Lightbox</option> 
+									<option value="alternate">Alternate</option> 
+									<option value="designates">Designates</option> 
+									<option value="stylesheet">Stylesheet</option> 
+									<option value="start">Start</option> 
+									<option value="next">Next</option> 
+									<option value="prev">Prev</option> 
+									<option value="contents">Contents</option> 
+									<option value="index">Index</option> 
+									<option value="glossary">Glossary</option> 
+									<option value="copyright">Copyright</option> 
+									<option value="chapter">Chapter</option> 
+									<option value="subsection">Subsection</option> 
+									<option value="appendix">Appendix</option> 
+									<option value="help">Help</option> 
+									<option value="bookmark">Bookmark</option>
+									<option value="nofollow">No Follow</option>
+									<option value="tag">Tag</option>
+								</select> 
+							</td>
+						</tr>
+
+						<tr>
+							<td><label id="revlabel" for="rev">{#advlink_dlg.rev}</label></td>
+							<td><select id="rev" name="rev"> 
+									<option value="">{#not_set}</option> 
+									<option value="alternate">Alternate</option> 
+									<option value="designates">Designates</option> 
+									<option value="stylesheet">Stylesheet</option> 
+									<option value="start">Start</option> 
+									<option value="next">Next</option> 
+									<option value="prev">Prev</option> 
+									<option value="contents">Contents</option> 
+									<option value="index">Index</option> 
+									<option value="glossary">Glossary</option> 
+									<option value="copyright">Copyright</option> 
+									<option value="chapter">Chapter</option> 
+									<option value="subsection">Subsection</option> 
+									<option value="appendix">Appendix</option> 
+									<option value="help">Help</option> 
+									<option value="bookmark">Bookmark</option> 
+								</select> 
+							</td>
+						</tr>
+
+						<tr>
+							<td><label id="tabindexlabel" for="tabindex">{#advlink_dlg.tabindex}</label></td>
+							<td><input type="text" id="tabindex" name="tabindex" value="" /></td>
+						</tr>
+
+						<tr>
+							<td><label id="accesskeylabel" for="accesskey">{#advlink_dlg.accesskey}</label></td>
+							<td><input type="text" id="accesskey" name="accesskey" value="" /></td>
+						</tr>
+					</table>
+				</fieldset>
+			</div>
+
+			<div id="events_panel" class="panel">
+			<fieldset>
+					<legend>{#advlink_dlg.event_props}</legend>
+
+					<table border="0" cellpadding="0" cellspacing="4">
+						<tr>
+							<td class="column1"><label for="onfocus">onfocus</label></td> 
+							<td><input id="onfocus" name="onfocus" type="text" value="" /></td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="onblur">onblur</label></td> 
+							<td><input id="onblur" name="onblur" type="text" value="" /></td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="onclick">onclick</label></td> 
+							<td><input id="onclick" name="onclick" type="text" value="" /></td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="ondblclick">ondblclick</label></td> 
+							<td><input id="ondblclick" name="ondblclick" type="text" value="" /></td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="onmousedown">onmousedown</label></td> 
+							<td><input id="onmousedown" name="onmousedown" type="text" value="" /></td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="onmouseup">onmouseup</label></td> 
+							<td><input id="onmouseup" name="onmouseup" type="text" value="" /></td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="onmouseover">onmouseover</label></td> 
+							<td><input id="onmouseover" name="onmouseover" type="text" value="" /></td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="onmousemove">onmousemove</label></td> 
+							<td><input id="onmousemove" name="onmousemove" type="text" value="" /></td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="onmouseout">onmouseout</label></td> 
+							<td><input id="onmouseout" name="onmouseout" type="text" value="" /></td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="onkeypress">onkeypress</label></td> 
+							<td><input id="onkeypress" name="onkeypress" type="text" value="" /></td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="onkeydown">onkeydown</label></td> 
+							<td><input id="onkeydown" name="onkeydown" type="text" value="" /></td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="onkeyup">onkeyup</label></td> 
+							<td><input id="onkeyup" name="onkeyup" type="text" value="" /></td> 
+						</tr>
+					</table>
+				</fieldset>
+			</div>
+		</div>
+
+		<div class="mceActionPanel">
+			<div style="float: left">
+				<input type="submit" id="insert" name="insert" value="{#insert}" />
+			</div>
+
+			<div style="float: right">
+				<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+			</div>
+		</div>
+    </form>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/advlink/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/autosave/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.AutoSavePlugin',{init:function(ed,url){var t=this;t.editor=ed;window.onbeforeunload=tinymce.plugins.AutoSavePlugin._beforeUnloadHandler;},getInfo:function(){return{longname:'Auto save',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave',version:tinymce.majorVersion+"."+tinymce.minorVersion};},'static':{_beforeUnloadHandler:function(){var msg;tinymce.each(tinyMCE.editors,function(ed){if(ed.getParam("fullscreen_is_enabled"))return;if(ed.isDirty()){msg=ed.getLang("autosave.unload_msg");return false;}});return msg;}}});tinymce.PluginManager.add('autosave',tinymce.plugins.AutoSavePlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/autosave/editor_plugin_src.js
@@ -1,1 +1,51 @@
+/**
+ * $Id: editor_plugin_src.js 520 2008-01-07 16:30:32Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.AutoSavePlugin', {
+		init : function(ed, url) {
+			var t = this;
+
+			t.editor = ed;
+
+			window.onbeforeunload = tinymce.plugins.AutoSavePlugin._beforeUnloadHandler;
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Auto save',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		},
+
+		// Private plugin internal methods
+
+		'static' : {
+			_beforeUnloadHandler : function() {
+				var msg;
+
+				tinymce.each(tinyMCE.editors, function(ed) {
+					if (ed.getParam("fullscreen_is_enabled"))
+						return;
+
+					if (ed.isDirty()) {
+						msg = ed.getLang("autosave.unload_msg");
+						return false;
+					}
+				});
+
+				return msg;
+			}
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('autosave', tinymce.plugins.AutoSavePlugin);
+})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/autosave/langs/en.js
@@ -1,1 +1,6 @@
+// EN lang variables
 
+tinyMCE.addToLang('',{
+autosave_unload_msg : 'The changes you made will be lost if you navigate away from this page.'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/autosave/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.BBCodePlugin',{init:function(ed,url){var t=this,dialect=ed.getParam('bbcode_dialect','punbb').toLowerCase();ed.onBeforeSetContent.add(function(ed,o){o.content=t['_'+dialect+'_bbcode2html'](o.content);});ed.onPostProcess.add(function(ed,o){if(o.set)o.content=t['_'+dialect+'_bbcode2html'](o.content);if(o.get)o.content=t['_'+dialect+'_html2bbcode'](o.content);});},getInfo:function(){return{longname:'BBCode Plugin',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_punbb_html2bbcode:function(s){s=tinymce.trim(s);function rep(re,str){s=s.replace(re,str);};rep(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");rep(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");rep(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");rep(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");rep(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");rep(/<span style=\"color: ?(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]");rep(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]");rep(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]");rep(/<font>(.*?)<\/font>/gi,"$1");rep(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");rep(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]");rep(/<span class=\"quoteStyle\">(.*?)<\/span>/gi,"[quote]$1[/quote]");rep(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]");rep(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]");rep(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]");rep(/<em class=\"quoteStyle\">(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]");rep(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]");rep(/<u class=\"quoteStyle\">(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]");rep(/<\/(strong|b)>/gi,"[/b]");rep(/<(strong|b)>/gi,"[b]");rep(/<\/(em|i)>/gi,"[/i]");rep(/<(em|i)>/gi,"[i]");rep(/<\/u>/gi,"[/u]");rep(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]");rep(/<u>/gi,"[u]");rep(/<blockquote[^>]*>/gi,"[quote]");rep(/<\/blockquote>/gi,"[/quote]");rep(/<br \/>/gi,"\n");rep(/<br\/>/gi,"\n");rep(/<br>/gi,"\n");rep(/<p>/gi,"");rep(/<\/p>/gi,"\n");rep(/&nbsp;/gi," ");rep(/&quot;/gi,"\"");rep(/&lt;/gi,"<");rep(/&gt;/gi,">");rep(/&amp;/gi,"&");return s;},_punbb_bbcode2html:function(s){s=tinymce.trim(s);function rep(re,str){s=s.replace(re,str);};rep(/\n/gi,"<br />");rep(/\[b\]/gi,"<strong>");rep(/\[\/b\]/gi,"</strong>");rep(/\[i\]/gi,"<em>");rep(/\[\/i\]/gi,"</em>");rep(/\[u\]/gi,"<u>");rep(/\[\/u\]/gi,"</u>");rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"<a href=\"$1\">$2</a>");rep(/\[url\](.*?)\[\/url\]/gi,"<a href=\"$1\">$1</a>");rep(/\[img\](.*?)\[\/img\]/gi,"<img src=\"$1\" />");rep(/\[color=(.*?)\](.*?)\[\/color\]/gi,"<font color=\"$1\">$2</font>");rep(/\[code\](.*?)\[\/code\]/gi,"<span class=\"codeStyle\">$1</span>&nbsp;");rep(/\[quote.*?\](.*?)\[\/quote\]/gi,"<span class=\"quoteStyle\">$1</span>&nbsp;");return s;}});tinymce.PluginManager.add('bbcode',tinymce.plugins.BBCodePlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js
@@ -1,1 +1,117 @@
+/**
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.BBCodePlugin', {
+		init : function(ed, url) {
+			var t = this, dialect = ed.getParam('bbcode_dialect', 'punbb').toLowerCase();
+
+			ed.onBeforeSetContent.add(function(ed, o) {
+				o.content = t['_' + dialect + '_bbcode2html'](o.content);
+			});
+
+			ed.onPostProcess.add(function(ed, o) {
+				if (o.set)
+					o.content = t['_' + dialect + '_bbcode2html'](o.content);
+
+				if (o.get)
+					o.content = t['_' + dialect + '_html2bbcode'](o.content);
+			});
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'BBCode Plugin',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		},
+
+		// Private methods
+
+		// HTML -> BBCode in PunBB dialect
+		_punbb_html2bbcode : function(s) {
+			s = tinymce.trim(s);
+
+			function rep(re, str) {
+				s = s.replace(re, str);
+			};
+
+			// example: <strong> to [b]
+			rep(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");
+			rep(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");
+			rep(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");
+			rep(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");
+			rep(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");
+			rep(/<span style=\"color: ?(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]");
+			rep(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]");
+			rep(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]");
+			rep(/<font>(.*?)<\/font>/gi,"$1");
+			rep(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");
+			rep(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]");
+			rep(/<span class=\"quoteStyle\">(.*?)<\/span>/gi,"[quote]$1[/quote]");
+			rep(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]");
+			rep(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]");
+			rep(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]");
+			rep(/<em class=\"quoteStyle\">(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]");
+			rep(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]");
+			rep(/<u class=\"quoteStyle\">(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]");
+			rep(/<\/(strong|b)>/gi,"[/b]");
+			rep(/<(strong|b)>/gi,"[b]");
+			rep(/<\/(em|i)>/gi,"[/i]");
+			rep(/<(em|i)>/gi,"[i]");
+			rep(/<\/u>/gi,"[/u]");
+			rep(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]");
+			rep(/<u>/gi,"[u]");
+			rep(/<blockquote[^>]*>/gi,"[quote]");
+			rep(/<\/blockquote>/gi,"[/quote]");
+			rep(/<br \/>/gi,"\n");
+			rep(/<br\/>/gi,"\n");
+			rep(/<br>/gi,"\n");
+			rep(/<p>/gi,"");
+			rep(/<\/p>/gi,"\n");
+			rep(/&nbsp;/gi," ");
+			rep(/&quot;/gi,"\"");
+			rep(/&lt;/gi,"<");
+			rep(/&gt;/gi,">");
+			rep(/&amp;/gi,"&");
+
+			return s; 
+		},
+
+		// BBCode -> HTML from PunBB dialect
+		_punbb_bbcode2html : function(s) {
+			s = tinymce.trim(s);
+
+			function rep(re, str) {
+				s = s.replace(re, str);
+			};
+
+			// example: [b] to <strong>
+			rep(/\n/gi,"<br />");
+			rep(/\[b\]/gi,"<strong>");
+			rep(/\[\/b\]/gi,"</strong>");
+			rep(/\[i\]/gi,"<em>");
+			rep(/\[\/i\]/gi,"</em>");
+			rep(/\[u\]/gi,"<u>");
+			rep(/\[\/u\]/gi,"</u>");
+			rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"<a href=\"$1\">$2</a>");
+			rep(/\[url\](.*?)\[\/url\]/gi,"<a href=\"$1\">$1</a>");
+			rep(/\[img\](.*?)\[\/img\]/gi,"<img src=\"$1\" />");
+			rep(/\[color=(.*?)\](.*?)\[\/color\]/gi,"<font color=\"$1\">$2</font>");
+			rep(/\[code\](.*?)\[\/code\]/gi,"<span class=\"codeStyle\">$1</span>&nbsp;");
+			rep(/\[quote.*?\](.*?)\[\/quote\]/gi,"<span class=\"quoteStyle\">$1</span>&nbsp;");
+
+			return s; 
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('bbcode', tinymce.plugins.BBCodePlugin);
+})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/cleanup/editor_plugin.js

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/cleanup/editor_plugin_src.js
@@ -1,1 +1,11 @@
+/**
+ * $Id: editor_plugin_src.js 162 2007-01-03 16:16:52Z spocke $
+ *
+ * Experimental plugin for new Cleanup routine, this logic will be moved into the core ones it's stable enougth.
+ *
+ * @author Moxiecode

+ */
 
+/* Dummy file since cleanup is now moved to core */
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/cleanup/readme.txt
@@ -1,1 +1,2 @@
+Dummy plugin since cleanup is now moved into core.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/codeprotect/editor_plugin.js
@@ -1,1 +1,51 @@
+/* Import plugin specific language pack */
+tinyMCE.importPluginLanguagePack('codeprotect', 'en'); // <- Add a comma separated list of all supported languages
 
+/****
+ * 
+ * I'm not even gonna copyright this, that's just silly.
+ *
+ * Feel free to improve on this code and re-upload it.
+ * 
+ * Tijmen Schep, Holland, 9-10-2005
+ * 
+ * 
+ ****/
+
+
+
+/**
+ * Gets executed when contents is inserted / retrived.
+ */
+function TinyMCE_codeprotect_cleanup(type, content) {
+	switch (type) {
+		case "get_from_editor":
+
+content = content.replace(/<!--CODE/gi, "<?");
+content = content.replace(/CODE-->/gi, "?>");
+
+			break;
+
+		case "insert_to_editor":
+			
+content = content.replace(/<\?/gi, "<!--CODE");
+content = content.replace(/\?>/gi, "CODE-->");
+
+			break;
+
+		case "get_from_editor_dom":
+
+			// Do custom cleanup code here. THIS PLUGIN DOESN'T USE THIS
+
+			break;
+
+		case "insert_to_editor_dom":
+
+			// Do custom cleanup code here. BUT I LEFT IT IN ANYWAY..
+
+			break;
+	}
+
+	return content;
+}
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/codeprotect/images/codeprotect.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/codeprotect/langs/da.js
@@ -1,1 +1,9 @@
+// DK lang variables contributed by Jan Moelgaard
 
+/* Remember to namespace the language parameters lang_<your plugin>_<some name> */
+
+tinyMCE.addToLang('',{
+template_title : 'Dette er bare en pop-up-skabelon',
+template_desc : 'Dette er bare en testknap'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/codeprotect/langs/de.js
@@ -1,1 +1,10 @@
+// DE lang variables
 
+/* Remember to namespace the language parameters lang_<your plugin>_<some name> */

+
+tinyMCE.addToLang('',{
+template_title : 'Dies ist nur ein Beispiel-Popup',
+template_desc : 'Dies ist nur ein Beispiel-Button'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/codeprotect/langs/en.js
@@ -1,1 +1,9 @@
+// UK lang variables
 
+/* Remember to namespace the language parameters lang_<your plugin>_<some name> */
+
+tinyMCE.addToLang('',{
+template_title : 'codeprotect settings',
+template_desc : 'codeprotect'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/codeprotect/langs/fr_ca.js
@@ -1,1 +1,9 @@
+// Canadian French lang variables by Virtuelcom   last modification: 2005-06-15
 
+/* Remember to namespace the language parameters <your plugin>_<some name> */
+
+tinyMCE.addToLang('',{
+template_title : 'Ceci est un exmple pour le gabarit de popup',
+template_desc : 'Ceci est un exmple pour le gabarit d\'un bouton'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/codeprotect/langs/he.js
@@ -1,1 +1,9 @@
+// HE lang variables
 
+/* Remember to namespace the language parameters lang_<your plugin>_<some name> */
+
+tinyMCE.addToLang('',{


+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/codeprotect/langs/hu.js
@@ -1,1 +1,9 @@
+// HU lang variables
 
+/* Remember to namespace the language parameters lang_<your plugin>_<some name> */
+
+tinyMCE.addToLang('',{


+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/codeprotect/langs/zh_cn.js
@@ -1,1 +1,10 @@
+// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com)

 
+/* Remember to namespace the language parameters <your plugin>_<some name> */
+
+tinyMCE.addToLang('',{


+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/codeprotect/readme.txt
@@ -1,1 +1,25 @@
+ABOUT
 
+This simple plugin protects any code in the html you are editing, by turning 
+it's start- and end-tag into comment tags when the editor is started.
+
+<? becomes <!--CODE
+?> becomes CODE-->
+
+The plugin changes the tags back to normal when you save your html.
+
+If you need this plugin to be more complex, feel free to expand on this 
+plugin, it's easier than you think. If you do make it better, please 
+upload it to sourceforge.
+
+
+INSTALL
+
+To install, copy the codeprotect folder to the plugins directory and just 
+add the word "codeprotect" to the list of plugins in the "init" bit of your tinyMCE 
+page. The plugin doesn't have a button, so no need to worry about that.
+
+
+tested with tinyCME 2.0 rc3
+
+Tijmen Schep, 9 october 2005

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/compat2x/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each,is=tinymce.is;tinymce.create('tinymce.plugins.Compat2x',{getInfo:function(){return{longname:'Compat2x',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/compat2x',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion};}});(function(){tinymce.extend(tinyMCE,{addToLang:function(p,l){each(l,function(v,k){tinyMCE.i18n[(tinyMCE.settings.language||'en')+'.'+(p?p+'_':'')+k]=v;});},getInstanceById:function(n){return this.get(n);}});})();(function(){var EditorManager=tinymce.EditorManager;tinyMCE.instances={};tinyMCE.plugins={};tinymce.PluginManager.onAdd.add(function(pm,n,p){tinyMCE.plugins[n]=p;});tinyMCE.majorVersion=tinymce.majorVersion;tinyMCE.minorVersion=tinymce.minorVersion;tinyMCE.releaseDate=tinymce.releaseDate;tinyMCE.baseURL=tinymce.baseURL;tinyMCE.isIE=tinyMCE.isMSIE=tinymce.isIE||tinymce.isOpera;tinyMCE.isMSIE5=tinymce.isIE;tinyMCE.isMSIE5_0=tinymce.isIE;tinyMCE.isMSIE7=tinymce.isIE;tinyMCE.isGecko=tinymce.isGecko;tinyMCE.isSafari=tinymce.isWebKit;tinyMCE.isOpera=tinymce.isOpera;tinyMCE.isMac=false;tinyMCE.isNS7=false;tinyMCE.isNS71=false;tinyMCE.compat=true;TinyMCE_Engine=tinyMCE;tinymce.extend(tinyMCE,{getParam:function(n,dv){return this.activeEditor.getParam(n,dv);},addEvent:function(e,na,f,sc){tinymce.dom.Event.add(e,na,f,sc||this);},getControlHTML:function(n){return EditorManager.activeEditor.controlManager.createControl(n);},loadCSS:function(u){tinymce.DOM.loadCSS(u);},importCSS:function(doc,u){if(doc==document)this.loadCSS(u);else new tinymce.dom.DOMUtils(doc).loadCSS(u);},log:function(){console.debug.apply(console,arguments);},getLang:function(n,dv){var v=EditorManager.activeEditor.getLang(n.replace(/^lang_/g,''),dv);if(/^[0-9\-.]+$/g.test(v))return parseInt(v);return v;},isInstance:function(o){return o!=null&&typeof(o)=="object"&&o.execCommand;},triggerNodeChange:function(){EditorManager.activeEditor.nodeChanged();},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 tinymce.trim(s);},xmlEncode:function(s){return tinymce.DOM.encode(s);},explode:function(s,d){var o=[];tinymce.each(s.split(d),function(v){if(v!='')o.push(v);});return o;},switchClass:function(id,cls){var b;if(/^mceButton/.test(cls)){b=EditorManager.activeEditor.controlManager.get(id);if(!b)return;switch(cls){case"mceButtonNormal":b.setDisabled(false);b.setActive(false);return;case"mceButtonDisabled":b.setDisabled(true);return;case"mceButtonSelected":b.setActive(true);b.setDisabled(false);return;}}},addCSSClass:function(e,n,b){return tinymce.DOM.addClass(e,n,b);},hasCSSClass:function(e,n){return tinymce.DOM.hasClass(e,n);},removeCSSClass:function(e,n){return tinymce.DOM.removeClass(e,n);},getCSSClasses:function(){var cl=EditorManager.activeEditor.dom.getClasses(),o=[];each(cl,function(c){o.push(c['class']);});return o;},setWindowArg:function(n,v){EditorManager.activeEditor.windowManager.params[n]=v;},getWindowArg:function(n,dv){var wm=EditorManager.activeEditor.windowManager,v;v=wm.getParam(n);if(v==='')return'';return v||wm.getFeature(n)||dv;},getParentNode:function(n,f){return this._getDOM().getParent(n,f);},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;},getNodeTree:function(n,na,t,nn){return this.selectNodes(n,function(n){return(!t||n.nodeType==t)&&(!nn||n.nodeName==nn);},na?na:[]);},getAttrib:function(e,n,dv){return this._getDOM().getAttrib(e,n,dv);},setAttrib:function(e,n,v){return this._getDOM().setAttrib(e,n,v);},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;},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;},getContent:function(){return EditorManager.activeEditor.getContent();},getParentElement:function(n,na,f){if(na)na=new RegExp('^('+na.toUpperCase().replace(/,/g,'|')+')$','g');return this._getDOM().getParent(n,function(n){return n.nodeType==1&&(!na||na.test(n.nodeName))&&(!f||f(n));},this.activeEditor.getBody());},importPluginLanguagePack:function(n){tinymce.PluginManager.requireLangPack(n);},getButtonHTML:function(cn,lang,img,c,u,v){var ed=EditorManager.activeEditor;img=img.replace(/\{\$pluginurl\}/g,tinyMCE.pluginURL);img=img.replace(/\{\$themeurl\}/g,tinyMCE.themeURL);lang=lang.replace(/^lang_/g,'');return ed.controlManager.createButton(cn,{title:lang,command:c,ui:u,value:v,scope:this,'class':'compat',image:img});},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;},cancelEvent:function(e){return tinymce.dom.Event.cancel(e);},handleVisualAid:function(e){EditorManager.activeEditor.addVisual(e);},getAbsPosition:function(n,r){return tinymce.DOM.getPos(n,r);},cleanupEventStr:function(s){s=""+s;s=s.replace('function anonymous()\n{\n','');s=s.replace('\n}','');s=s.replace(/^return true;/gi,'');return s;},getVisualAidClass:function(s){return s;},parseStyle:function(s){return this._getDOM().parseStyle(s);},serializeStyle:function(s){return this._getDOM().serializeStyle(s);},openWindow:function(tpl,args){var ed=EditorManager.activeEditor,o={},n;for(n in tpl)o[n]=tpl[n];tpl=o;args=args||{};tpl.url=new tinymce.util.URI(tinymce.ThemeManager.themeURLs[ed.settings.theme]).toAbsolute(tpl.file);tpl.inline=tpl.inline||args.inline;ed.windowManager.open(tpl,args);},closeWindow:function(win){EditorManager.activeEditor.windowManager.close(win);},getOuterHTML:function(e){return tinymce.DOM.getOuterHTML(e);},setOuterHTML:function(e,h,d){return tinymce.DOM.setOuterHTML(e,h,d);},hasPlugin:function(n){return tinymce.PluginManager.get(n)!=null;},_setEventsEnabled:function(){},addPlugin:function(pn,f){var t=this;function PluginWrapper(ed){tinyMCE.selectedInstance=ed;ed.onInit.add(function(){t.settings=ed.settings;t.settings['base_href']=tinyMCE.documentBasePath;tinyMCE.settings=t.settings;tinyMCE.documentBasePath=ed.documentBasePath;if(f.initInstance)f.initInstance(ed);ed.contentDocument=ed.getDoc();ed.contentWindow=ed.getWin();ed.undoRedo=ed.undoManager;ed.startContent=ed.getContent({format:'raw'});tinyMCE.instances[ed.id]=ed;tinyMCE.loadedFiles=[];});ed.onActivate.add(function(){tinyMCE.settings=ed.settings;tinyMCE.selectedInstance=ed;});if(f.handleNodeChange){ed.onNodeChange.add(function(ed,cm,n){f.handleNodeChange(ed.id,n,0,0,false,!ed.selection.isCollapsed());});}if(f.onChange){ed.onChange.add(function(ed,n){return f.onChange(ed);});}if(f.cleanup){ed.onGetContent.add(function(){});}this.getInfo=function(){return f.getInfo();};this.createControl=function(n){tinyMCE.pluginURL=tinymce.baseURL+'/plugins/'+pn;tinyMCE.themeURL=tinymce.baseURL+'/themes/'+tinyMCE.activeEditor.settings.theme;if(f.getControlHTML)return f.getControlHTML(n);return null;};this.execCommand=function(cmd,ui,val){if(f.execCommand)return f.execCommand(ed.id,ed.getBody(),cmd,ui,val);return false;};};tinymce.PluginManager.add(pn,PluginWrapper);},_getDOM:function(){return tinyMCE.activeEditor?tinyMCE.activeEditor.dom:tinymce.DOM;},convertRelativeToAbsoluteURL:function(b,u){return new tinymce.util.URI(b).toAbsolute(u);},convertAbsoluteURLToRelativeURL:function(b,u){return new tinymce.util.URI(b).toRelative(u);}});tinymce.extend(tinymce.Editor.prototype,{getFocusElement:function(){return this.selection.getNode();},getData:function(n){if(!this.data)this.data=[];if(!this.data[n])this.data[n]=[];return this.data[n];},hasPlugin:function(n){return this.plugins[n]!=null;},getContainerWin:function(){return window;},getHTML:function(raw){return this.getContent({format:raw?'raw':'html'});},setHTML:function(h){this.setContent(h);},getSel:function(){return this.selection.getSel();},getRng:function(){return this.selection.getRng();},isHidden:function(){var s;if(!tinymce.isGecko)return false;s=this.getSel();return(!s||!s.rangeCount||s.rangeCount==0);},translate:function(s){var c=this.settings.language,o;if(!s)return s;o=tinymce.EditorManager.i18n[c+'.'+s]||s.replace(/{\#([^}]+)\}/g,function(a,b){return tinymce.EditorManager.i18n[c+'.'+b]||'{#'+b+'}';});o=o.replace(/{\$lang_([^}]+)\}/g,function(a,b){return tinymce.EditorManager.i18n[c+'.'+b]||'{$lang_'+b+'}';});return o;},repaint:function(){this.execCommand('mceRepaint');}});tinymce.extend(tinymce.dom.Selection.prototype,{getSelectedText:function(){return this.getContent({format:'text'});},getSelectedHTML:function(){return this.getContent({format:'html'});},getFocusElement:function(){return this.getNode();},selectNode:function(node,collapse,select_text_node,to_start){var t=this;t.select(node,select_text_node||0);if(!is(collapse))collapse=true;if(collapse){if(!is(to_start))to_start=true;t.collapse(to_start);}}});}).call(this);tinymce.PluginManager.add('compat2x',tinymce.plugins.Compat2x);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/compat2x/editor_plugin_src.js
@@ -1,1 +1,617 @@
-
+/**
+ * $Id: editor_plugin_src.js 264 2007-04-26 20:53:09Z spocke $
+ *
+ * @author Moxiecode

+ */
+
+(function() {
+	var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, is = tinymce.is;
+
+	tinymce.create('tinymce.plugins.Compat2x', {
+		getInfo : function() {
+			return {
+				longname : 'Compat2x',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/compat2x',
+				version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
+			};
+		}
+	});
+
+	(function() {
+		// Extend tinyMCE/EditorManager
+		tinymce.extend(tinyMCE, {
+			addToLang : function(p, l) {
+				each(l, function(v, k) {
+					tinyMCE.i18n[(tinyMCE.settings.language || 'en') + '.' + (p ? p + '_' : '') + k] = v;
+				});
+			},
+
+			getInstanceById : function(n) {
+				return this.get(n);
+			}
+		});
+	})();
+
+	(function() {
+		var EditorManager = tinymce.EditorManager;
+
+		tinyMCE.instances = {};
+		tinyMCE.plugins = {};
+		tinymce.PluginManager.onAdd.add(function(pm, n, p) {
+			tinyMCE.plugins[n] = p;
+		});
+
+		tinyMCE.majorVersion = tinymce.majorVersion;
+		tinyMCE.minorVersion = tinymce.minorVersion;
+		tinyMCE.releaseDate = tinymce.releaseDate;
+		tinyMCE.baseURL = tinymce.baseURL;
+		tinyMCE.isIE = tinyMCE.isMSIE = tinymce.isIE || tinymce.isOpera;
+		tinyMCE.isMSIE5 = tinymce.isIE;
+		tinyMCE.isMSIE5_0 = tinymce.isIE;
+		tinyMCE.isMSIE7 = tinymce.isIE;
+		tinyMCE.isGecko = tinymce.isGecko;
+		tinyMCE.isSafari = tinymce.isWebKit;
+		tinyMCE.isOpera = tinymce.isOpera;
+		tinyMCE.isMac = false;
+		tinyMCE.isNS7 = false;
+		tinyMCE.isNS71 = false;
+		tinyMCE.compat = true;
+
+		// Extend tinyMCE class
+		TinyMCE_Engine = tinyMCE;
+		tinymce.extend(tinyMCE, {
+			getParam : function(n, dv) {
+				return this.activeEditor.getParam(n, dv);
+			},
+
+			addEvent : function(e, na, f, sc) {
+				tinymce.dom.Event.add(e, na, f, sc || this);
+			},
+
+			getControlHTML : function(n) {
+				return EditorManager.activeEditor.controlManager.createControl(n);
+			},
+
+			loadCSS : function(u) {
+				tinymce.DOM.loadCSS(u);
+			},
+
+			importCSS : function(doc, u) {
+				if (doc == document)
+					this.loadCSS(u);
+				else
+					new tinymce.dom.DOMUtils(doc).loadCSS(u);
+			},
+
+			log : function() {
+				console.debug.apply(console, arguments);
+			},
+
+			getLang : function(n, dv) {
+				var v = EditorManager.activeEditor.getLang(n.replace(/^lang_/g, ''), dv);
+
+				// Is number
+				if (/^[0-9\-.]+$/g.test(v))
+					return parseInt(v);
+
+				return v;
+			},
+
+			isInstance : function(o) {
+				return o != null && typeof(o) == "object" && o.execCommand;
+			},
+
+			triggerNodeChange : function() {
+				EditorManager.activeEditor.nodeChanged();
+			},
+
+			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 tinymce.trim(s);
+			},
+
+			xmlEncode : function(s) {
+				return tinymce.DOM.encode(s);
+			},
+
+			explode : function(s, d) {
+				var o = [];
+
+				tinymce.each(s.split(d), function(v) {
+					if (v != '')
+						o.push(v);
+				});
+
+				return o;
+			},
+
+			switchClass : function(id, cls) {
+				var b;
+
+				if (/^mceButton/.test(cls)) {
+					b = EditorManager.activeEditor.controlManager.get(id);
+
+					if (!b)
+						return;
+
+					switch (cls) {
+						case "mceButtonNormal":
+							b.setDisabled(false);
+							b.setActive(false);
+							return;
+
+						case "mceButtonDisabled":
+							b.setDisabled(true);
+							return;
+
+						case "mceButtonSelected":
+							b.setActive(true);
+							b.setDisabled(false);
+							return;
+					}
+				}
+			},
+
+			addCSSClass : function(e, n, b) {
+				return tinymce.DOM.addClass(e, n, b);
+			},
+
+			hasCSSClass : function(e, n) {
+				return tinymce.DOM.hasClass(e, n);
+			},
+
+			removeCSSClass : function(e, n) {
+				return tinymce.DOM.removeClass(e, n);
+			},
+
+			getCSSClasses : function() {
+				var cl = EditorManager.activeEditor.dom.getClasses(), o = [];
+
+				each(cl, function(c) {
+					o.push(c['class']);
+				});
+
+				return o;
+			},
+
+			setWindowArg : function(n, v) {
+				EditorManager.activeEditor.windowManager.params[n] = v;
+			},
+
+			getWindowArg : function(n, dv) {
+				var wm = EditorManager.activeEditor.windowManager, v;
+
+				v = wm.getParam(n);
+				if (v === '')
+					return '';
+
+				return v || wm.getFeature(n) || dv;
+			},
+
+			getParentNode : function(n, f) {
+				return this._getDOM().getParent(n, f);
+			},
+
+			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;
+			},
+
+			getNodeTree : function(n, na, t, nn) {
+				return this.selectNodes(n, function(n) {
+					return (!t || n.nodeType == t) && (!nn || n.nodeName == nn);
+				}, na ? na : []);
+			},
+
+			getAttrib : function(e, n, dv) {
+				return this._getDOM().getAttrib(e, n, dv);
+			},
+
+			setAttrib : function(e, n, v) {
+				return this._getDOM().setAttrib(e, n, v);
+			},
+
+			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;
+			},
+
+			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;
+			},
+
+			getContent : function() {
+				return EditorManager.activeEditor.getContent();
+			},
+
+			getParentElement : function(n, na, f) {
+				if (na)
+					na = new RegExp('^(' + na.toUpperCase().replace(/,/g, '|') + ')$', 'g');
+
+				return this._getDOM().getParent(n, function(n) {
+					return n.nodeType == 1 && (!na || na.test(n.nodeName)) && (!f || f(n));
+				}, this.activeEditor.getBody());
+			},
+
+			importPluginLanguagePack : function(n) {
+				tinymce.PluginManager.requireLangPack(n);
+			},
+
+			getButtonHTML : function(cn, lang, img, c, u, v) {
+				var ed = EditorManager.activeEditor;
+
+				img = img.replace(/\{\$pluginurl\}/g, tinyMCE.pluginURL);
+				img = img.replace(/\{\$themeurl\}/g, tinyMCE.themeURL);
+				lang = lang.replace(/^lang_/g, '');
+
+				return ed.controlManager.createButton(cn, {
+					title : lang,
+					command : c,
+					ui : u,
+					value : v,
+					scope : this,
+					'class' : 'compat',
+					image : img
+				});
+			},
+
+			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;
+			},
+
+			cancelEvent : function(e) {
+				return tinymce.dom.Event.cancel(e);
+			},
+
+			handleVisualAid : function(e) {
+				EditorManager.activeEditor.addVisual(e);
+			},
+
+			getAbsPosition : function(n, r) {
+				return tinymce.DOM.getPos(n, r);
+			},
+
+			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;
+			},
+
+			getVisualAidClass : function(s) {
+				// TODO: Implement
+				return s;
+			},
+
+			parseStyle : function(s) {
+				return this._getDOM().parseStyle(s);
+			},
+
+			serializeStyle : function(s) {
+				return this._getDOM().serializeStyle(s);
+			},
+
+			openWindow : function(tpl, args) {
+				var ed = EditorManager.activeEditor, o = {}, n;
+
+				// Convert name/value array to object
+				for (n in tpl)
+					o[n] = tpl[n];
+
+				tpl = o;
+
+				args = args || {};
+				tpl.url = new tinymce.util.URI(tinymce.ThemeManager.themeURLs[ed.settings.theme]).toAbsolute(tpl.file);
+				tpl.inline = tpl.inline || args.inline;
+
+				ed.windowManager.open(tpl, args);
+			},
+
+			closeWindow : function(win) {
+				EditorManager.activeEditor.windowManager.close(win);
+			},
+
+			getOuterHTML : function(e) {
+				return tinymce.DOM.getOuterHTML(e);
+			},
+
+			setOuterHTML : function(e, h, d) {
+				return tinymce.DOM.setOuterHTML(e, h, d);
+			},
+
+			hasPlugin : function(n) {
+				return tinymce.PluginManager.get(n) != null;
+			},
+
+			_setEventsEnabled : function() {
+				// Ignore it!!
+			},
+
+			addPlugin : function(pn, f) {
+				var t = this;
+
+				function PluginWrapper(ed) {
+					tinyMCE.selectedInstance = ed;
+
+					ed.onInit.add(function() {
+						t.settings = ed.settings;
+						t.settings['base_href'] = tinyMCE.documentBasePath;
+						tinyMCE.settings = t.settings;
+						tinyMCE.documentBasePath = ed.documentBasePath;
+						//ed.formElement = DOM.get(ed.id);
+
+						if (f.initInstance)
+							f.initInstance(ed);
+
+						ed.contentDocument = ed.getDoc();
+						ed.contentWindow = ed.getWin();
+						ed.undoRedo = ed.undoManager;
+						ed.startContent = ed.getContent({format : 'raw'});
+
+						tinyMCE.instances[ed.id] = ed;
+						tinyMCE.loadedFiles = [];
+					});
+
+					ed.onActivate.add(function() {
+						tinyMCE.settings = ed.settings;
+						tinyMCE.selectedInstance = ed;
+					});
+
+				/*	if (f.removeInstance) {
+						ed.onDestroy.add(function() {
+							return f.removeInstance(ed.id);
+						});
+					}*/
+
+					if (f.handleNodeChange) {
+						ed.onNodeChange.add(function(ed, cm, n) {
+							f.handleNodeChange(ed.id, n, 0, 0, false, !ed.selection.isCollapsed());
+						});
+					}
+
+					if (f.onChange) {
+						ed.onChange.add(function(ed, n) {
+							return f.onChange(ed);
+						});
+					}
+
+					if (f.cleanup) {
+						ed.onGetContent.add(function() {
+							//f.cleanup(type, content, inst);
+						});
+					}
+
+					this.getInfo = function() {
+						return f.getInfo();
+					};
+
+					this.createControl = function(n) {
+						tinyMCE.pluginURL = tinymce.baseURL + '/plugins/' + pn;
+						tinyMCE.themeURL = tinymce.baseURL + '/themes/' + tinyMCE.activeEditor.settings.theme;
+
+						if (f.getControlHTML)
+							return f.getControlHTML(n);
+
+						return null;
+					};
+
+					this.execCommand = function(cmd, ui, val) {
+						if (f.execCommand)
+							return f.execCommand(ed.id, ed.getBody(), cmd, ui, val);
+
+						return false;
+					};
+				};
+
+				tinymce.PluginManager.add(pn, PluginWrapper);
+			},
+
+			_getDOM : function() {
+				return tinyMCE.activeEditor ? tinyMCE.activeEditor.dom : tinymce.DOM;
+			},
+
+			convertRelativeToAbsoluteURL : function(b, u) {
+				return new tinymce.util.URI(b).toAbsolute(u);
+			},
+
+			convertAbsoluteURLToRelativeURL : function(b, u) {
+				return new tinymce.util.URI(b).toRelative(u);
+			}
+		});
+
+		// Extend Editor class
+		tinymce.extend(tinymce.Editor.prototype, {
+			getFocusElement : function() {
+				return this.selection.getNode();
+			},
+
+			getData : function(n) {
+				if (!this.data)
+					this.data = [];
+
+				if (!this.data[n])
+					this.data[n] = [];
+
+				return this.data[n];
+			},
+
+			hasPlugin : function(n) {
+				return this.plugins[n] != null;
+			},
+
+			getContainerWin : function() {
+				return window;
+			},
+
+			getHTML : function(raw) {
+				return this.getContent({ format : raw ? 'raw' : 'html'});
+			},
+
+			setHTML : function(h) {
+				this.setContent(h);
+			},
+
+			getSel : function() {
+				return this.selection.getSel();
+			},
+
+			getRng : function() {
+				return this.selection.getRng();
+			},
+
+			isHidden : function() {
+				var s;
+
+				if (!tinymce.isGecko)
+					return false;
+
+				s = this.getSel();
+
+				// Weird, wheres that cursor selection?
+				return (!s || !s.rangeCount || s.rangeCount == 0);
+			},
+
+			translate : function(s) {
+				var c = this.settings.language, o;
+
+				if (!s)
+					return s;
+
+				o = tinymce.EditorManager.i18n[c + '.' + s] || s.replace(/{\#([^}]+)\}/g, function(a, b) {
+					return tinymce.EditorManager.i18n[c + '.' + b] || '{#' + b + '}';
+				});
+
+				o = o.replace(/{\$lang_([^}]+)\}/g, function(a, b) {
+					return tinymce.EditorManager.i18n[c + '.' + b] || '{$lang_' + b + '}';
+				});
+
+				return o;
+			},
+
+			repaint : function() {
+				this.execCommand('mceRepaint');
+			}
+		});
+
+		// Extend selection
+		tinymce.extend(tinymce.dom.Selection.prototype, {
+			getSelectedText : function() {
+				return this.getContent({format : 'text'});
+			},
+
+			getSelectedHTML : function() {
+				return this.getContent({format : 'html'});
+			},
+
+			getFocusElement : function() {
+				return this.getNode();
+			},
+
+			selectNode : function(node, collapse, select_text_node, to_start) {
+				var t = this;
+
+				t.select(node, select_text_node || 0);
+
+				if (!is(collapse))
+					collapse = true;
+
+				if (collapse) {
+					if (!is(to_start))
+						to_start = true;
+
+					t.collapse(to_start);
+				}
+			}
+		});
+	}).call(this);
+
+	// Register plugin
+	tinymce.PluginManager.add('compat2x', tinymce.plugins.Compat2x);
+})();
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/contextmenu/contextmenu.css
@@ -1,1 +1,61 @@
+.contextMenuIEPopup {
+	padding: 0px;
+	margin: 0px;
+	border: 0px;
+	overflow: hidden;
+}
 
+.contextMenu {
+	position: absolute;
+	cursor: default;
+	z-index: 1000;
+	border: 1px solid #D4D0C8;
+	background-color: #FFFFFF;
+}
+
+.contextMenuItem, .contextMenuItemOver {
+}
+
+.contextMenuItemOver {
+	background-color: #B6BDD2;
+}
+
+.contextMenuSeparator {
+	width: 100%;
+	background-color: #D4D0C8;
+	border: 0px;
+}
+
+.contextMenuImage, .contextMenuItemDisabled {
+	border: 0px;
+}
+
+.contextMenuIcon {
+	background-color: #F0F0EE;
+}
+
+.contextMenuItemOver .contextMenuIcon {
+	background-color: #B6BDD2;
+}
+
+.contextMenuIcon {
+	background-color: #F0F0EE;
+}
+
+.contextMenuItemDisabled img {
+	filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);
+	-moz-opacity:0.3;
+	opacity: 0.3;
+}
+
+.contextMenuText {
+	font-family: Tahoma, Verdana, Arial, Helvetica;
+	font-size: 11px;
+	margin-left: 5px;
+	margin-right: 10px;
+}
+
+.contextMenuItemDisabled {
+	color: #AAAAAA;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/contextmenu/css/contextmenu.css
@@ -1,1 +1,75 @@
+.contextMenuIEPopup {
+	padding: 0;
+	margin: 0;
+	border: 0;
+	overflow: hidden;
+}
 
+.contextMenu {
+	position: absolute;
+	cursor: default;
+	z-index: 1000;
+	border: 1px solid #D4D0C8;
+	background-color: #FFFFFF;
+}
+
+.contextMenuItem, .contextMenuItemOver {
+}
+
+.contextMenuSeparator {
+	width: 100%;
+	background-color: #D4D0C8;
+	border: 0;
+}
+
+.contextMenuImage, .contextMenuItemDisabled {
+	border: 0;
+}
+
+.contextMenuIcon {
+	background-color: #F0F0EE;
+}
+
+.contextMenuItemOver .contextMenuIcon {
+	background-color: #B6BDD2;
+}
+
+.contextMenuIcon {
+	background-color: #F0F0EE;
+}
+
+.contextMenuItemDisabled img {
+	filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);
+	-moz-opacity:0.3;
+	opacity: 0.3;
+}
+
+.contextMenuText {
+	font-family: Tahoma, Verdana, Arial, Helvetica;
+	font-size: 11px;
+	line-height: 20px;
+}
+
+.contextMenuItemDisabled {
+	color: #AAAAAA;
+}
+
+.contextMenuText a {
+	display: block;
+	line-height: 20px;
+	width: 100%;
+	text-decoration: none;
+	color: black;
+	font-weight: normal;
+	margin: 0;
+	padding: 0;
+}
+
+.contextMenuText a:hover {
+	background-color: #B6BDD2;
+	text-decoration: none !important;
+	font-weight: normal;
+	margin: 0;
+	padding: 0;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/contextmenu/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){var Event=tinymce.dom.Event,each=tinymce.each,DOM=tinymce.DOM;tinymce.create('tinymce.plugins.ContextMenu',{init:function(ed){var t=this;t.editor=ed;t.onContextMenu=new tinymce.util.Dispatcher(this);ed.onContextMenu.add(function(ed,e){if(!e.ctrlKey){t._getMenu(ed).showMenu(e.clientX,e.clientY);Event.add(ed.getDoc(),'click',hide);Event.cancel(e);}});function hide(){if(t._menu){t._menu.removeAll();t._menu.destroy();Event.remove(ed.getDoc(),'click',hide);}};ed.onMouseDown.add(hide);ed.onKeyDown.add(hide);},getInfo:function(){return{longname:'Contextmenu',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_getMenu:function(ed){var t=this,m=t._menu,se=ed.selection,col=se.isCollapsed(),el=se.getNode()||ed.getBody(),am,p1,p2;if(m){m.removeAll();m.destroy();}p1=DOM.getPos(ed.getContentAreaContainer());p2=DOM.getPos(ed.getContainer());m=ed.controlManager.createDropMenu('contextmenu',{offset_x:p1.x+ed.getParam('contextmenu_offset_x',0),offset_y:p1.y+ed.getParam('contextmenu_offset_y',0),constrain:1});t._menu=m;m.add({title:'advanced.cut_desc',icon:'cut',cmd:'Cut'}).setDisabled(col);m.add({title:'advanced.copy_desc',icon:'copy',cmd:'Copy'}).setDisabled(col);m.add({title:'advanced.paste_desc',icon:'paste',cmd:'Paste'});if((el.nodeName=='A'&&!ed.dom.getAttrib(el,'name'))||!col){m.addSeparator();m.add({title:'advanced.link_desc',icon:'link',cmd:ed.plugins.advlink?'mceAdvLink':'mceLink',ui:true});m.add({title:'advanced.unlink_desc',icon:'unlink',cmd:'UnLink'});}m.addSeparator();m.add({title:'advanced.image_desc',icon:'image',cmd:ed.plugins.advimage?'mceAdvImage':'mceImage',ui:true});m.addSeparator();am=m.addMenu({title:'contextmenu.align'});am.add({title:'contextmenu.left',icon:'justifyleft',cmd:'JustifyLeft'});am.add({title:'contextmenu.center',icon:'justifycenter',cmd:'JustifyCenter'});am.add({title:'contextmenu.right',icon:'justifyright',cmd:'JustifyRight'});am.add({title:'contextmenu.full',icon:'justifyfull',cmd:'JustifyFull'});t.onContextMenu.dispatch(t,m,el,col);return m;}});tinymce.PluginManager.add('contextmenu',tinymce.plugins.ContextMenu);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js
@@ -1,1 +1,95 @@
+/**
+ * $Id: editor_plugin_src.js 848 2008-05-15 11:54:40Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	var Event = tinymce.dom.Event, each = tinymce.each, DOM = tinymce.DOM;
+
+	tinymce.create('tinymce.plugins.ContextMenu', {
+		init : function(ed) {
+			var t = this;
+
+			t.editor = ed;
+			t.onContextMenu = new tinymce.util.Dispatcher(this);
+
+			ed.onContextMenu.add(function(ed, e) {
+				if (!e.ctrlKey) {
+					t._getMenu(ed).showMenu(e.clientX, e.clientY);
+					Event.add(ed.getDoc(), 'click', hide);
+					Event.cancel(e);
+				}
+			});
+
+			function hide() {
+				if (t._menu) {
+					t._menu.removeAll();
+					t._menu.destroy();
+					Event.remove(ed.getDoc(), 'click', hide);
+				}
+			};
+
+			ed.onMouseDown.add(hide);
+			ed.onKeyDown.add(hide);
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Contextmenu',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		},
+
+		_getMenu : function(ed) {
+			var t = this, m = t._menu, se = ed.selection, col = se.isCollapsed(), el = se.getNode() || ed.getBody(), am, p1, p2;
+
+			if (m) {
+				m.removeAll();
+				m.destroy();
+			}
+
+			p1 = DOM.getPos(ed.getContentAreaContainer());
+			p2 = DOM.getPos(ed.getContainer());
+
+			m = ed.controlManager.createDropMenu('contextmenu', {
+				offset_x : p1.x + ed.getParam('contextmenu_offset_x', 0),
+				offset_y : p1.y + ed.getParam('contextmenu_offset_y', 0),
+				constrain : 1
+			});
+
+			t._menu = m;
+
+			m.add({title : 'advanced.cut_desc', icon : 'cut', cmd : 'Cut'}).setDisabled(col);
+			m.add({title : 'advanced.copy_desc', icon : 'copy', cmd : 'Copy'}).setDisabled(col);
+			m.add({title : 'advanced.paste_desc', icon : 'paste', cmd : 'Paste'});
+
+			if ((el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) || !col) {
+				m.addSeparator();
+				m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true});
+				m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'});
+			}
+
+			m.addSeparator();
+			m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true});
+
+			m.addSeparator();
+			am = m.addMenu({title : 'contextmenu.align'});
+			am.add({title : 'contextmenu.left', icon : 'justifyleft', cmd : 'JustifyLeft'});
+			am.add({title : 'contextmenu.center', icon : 'justifycenter', cmd : 'JustifyCenter'});
+			am.add({title : 'contextmenu.right', icon : 'justifyright', cmd : 'JustifyRight'});
+			am.add({title : 'contextmenu.full', icon : 'justifyfull', cmd : 'JustifyFull'});
+
+			t.onContextMenu.dispatch(t, m, el, col);
+
+			return m;
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('contextmenu', tinymce.plugins.ContextMenu);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/contextmenu/images/spacer.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/contextmenu/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/devkit/css/devkit.css
@@ -1,1 +1,118 @@
+body {
+	overflow: hidden;
+}
 
+h1 {
+	font-size: 14px;
+	margin: 0 0 10px 0;
+}
+
+h2 {
+	font-size: 12px;
+	margin: 3px 0 3px 0;
+}
+
+h3 {
+	font-size: 11px;
+	margin: 3px 0 3px 0;
+}
+
+#log {
+	font-family: Verdana;
+	border: 1px solid gray;
+	width: 100%; height: 240px;
+	overflow: scroll;
+	white-space: nowrap;
+}
+
+#log span {
+	display: block;
+}
+
+#log span.msg {
+	float: left;
+}
+
+#log span.time {
+	float: left;
+}
+
+#log br {
+	clear: both;
+}
+
+#logfilter {
+	width: 350px;
+}
+
+#logenabled {
+	border: 0;
+}
+
+#settings_panel span, #info_panel span, #content_panel span, #command_states_panel span, #undo_redo_panel span {
+	display: block;
+	margin: 5px 0 5px 0;
+}
+
+div.data {
+	width: 100%; height: 240px;
+	overflow: scroll;
+	border: 1px solid gray;
+}
+
+#misc_panel div.data {
+	height: 270px;
+}
+
+.data input {
+	width: 265px;
+	border: 0;
+}
+
+.data h2 {
+	margin-left: 5px;
+}
+
+.data h3 {
+	margin-left: 7px;
+}
+
+.data div {
+	margin-left: 7px;
+}
+
+.data table {
+	margin: 0 0 15px 15px;
+}
+
+.data p {
+	margin: 0; padding: 0;
+	margin-top: 5px;
+	margin-left: 5px;
+}
+
+table, td {
+	border: 1px solid gray;
+	border-collapse: collapse;
+}
+
+#flip {
+	position: absolute;
+	left: 295; top: 384px;
+}
+
+.bspec {
+	color: gray;
+}
+
+.dep {
+	color: #880000;
+}
+
+.col1 {
+	width: 265px;
+}
+
+div.undodata {
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/devkit/css/devkit_ui.css
@@ -1,1 +1,16 @@
+#devkit {
+	position: absolute;
+	top: -385px; right: 0;
+	width: 640px; height: 390px;
+	border: 1px solid black;
+	z-index: 10000;
+}
 
+.devkitup {
+	top: -385px !important;
+}
+
+.devkitdown {
+	top: 0 !important;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/devkit/devkit.htm
@@ -1,1 +1,141 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{$lang_devkit_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/devkit.js"></script>
+	<script language="javascript" type="text/javascript" src="jscripts/diff.js"></script>
+	<link href="css/devkit.css" rel="stylesheet" type="text/css" />
+	<base target="_self" />
+</head>
+<body id="devkit" onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
+    <form action="#">
+		<h1>{$lang_devkit_title}</h1>
 
+		<div class="tabs">
+			<ul>
+				<li id="log_tab" class="current"><span><a href="javascript:mcTabs.displayTab('log_tab','log_panel');" onmousedown="return false;">{$lang_devkit_log_tab}</a></span></li>
+				<li id="info_tab"><span><a href="javascript:mcTabs.displayTab('info_tab','info_panel');" onmousedown="return false;">{$lang_devkit_info_tab}</a></span></li>
+				<li id="settings_tab"><span><a href="javascript:mcTabs.displayTab('settings_tab','settings_panel');" onmousedown="return false;">{$lang_devkit_settings_tab}</a></span></li>
+				<li id="content_tab"><span><a href="javascript:mcTabs.displayTab('content_tab','content_panel');" onmousedown="return false;">{$lang_devkit_content_tab}</a></span></li>
+				<!-- <li id="command_states_tab"><span><a href="javascript:mcTabs.displayTab('command_states_tab','command_states_panel');" onmousedown="return false;">{$lang_devkit_command_states_tab}</a></span></li> -->
+				<li id="undo_redo_tab"><span><a href="javascript:mcTabs.displayTab('undo_redo_tab','undo_redo_panel');" onmousedown="return false;">{$lang_devkit_undo_redo_tab}</a></span></li>
+				<li id="misc_tab"><span><a href="javascript:mcTabs.displayTab('misc_tab','misc_panel');" onmousedown="return false;">{$lang_devkit_misc_tab}</a></span></li>
+			</ul>
+		</div>
+
+		<div class="panel_wrapper">
+			<div id="log_panel" class="panel current">
+				<fieldset>
+					<legend>{$lang_devkit_log_tab}</legend>
+
+					<div style="float: left">
+						<label>{$lang_devkit_filter} </label><input type="text" id="logfilter" name="logfilter" value="" onchange="changeFilter(this.value);" />
+					</div>
+
+					<div style="float: left">
+						<input type="checkbox" id="logenabled" name="logenabled" value="true" checked="checked" onclick="toggleLog(this.checked);" />
+					</div>
+
+					<div style="float: right">
+						<a href="javascript:clearLog();">[{$lang_devkit_clear_log}]</a>
+					</div>
+
+					<br style="clear: both" />
+
+					<div id="log">
+					</div>
+
+					<input type="checkbox" id="debug_events" name="debug_events" class="checkbox" onclick="toggleDebugEvents(this.checked);" /><label for="debug_events" onclick="toggleDebugEvents(this.form.debug_events.checked);">{$lang_devkit_debug_events}</label>
+				</fieldset>
+			</div>
+
+			<div id="info_panel" class="panel">
+				<fieldset>
+					<legend>{$lang_devkit_info_tab}</legend>
+
+					<span><a href="javascript:renderInfo();">[{$lang_devkit_refresh}]</a></span>
+
+					<div id="info" class="data">
+						<p>{$lang_devkit_info_help}</p>
+					</div>
+				</fieldset>
+			</div>
+
+			<div id="settings_panel" class="panel">
+			<fieldset>
+					<legend>{$lang_devkit_settings_tab}</legend>
+
+					<span><a href="javascript:renderSettings();">[{$lang_devkit_refresh}]</a></span>
+
+					<div id="settings" class="data">
+						<p>{$lang_devkit_settings_help}</p>
+					</div>
+				</fieldset>
+			</div>
+
+			<div id="content_panel" class="panel">
+			<fieldset>
+					<legend>{$lang_devkit_content_tab}</legend>
+
+					<span><a href="javascript:renderContent();">[{$lang_devkit_refresh}]</a></span>
+
+					<div id="content" class="data">
+						<p>{$lang_devkit_content_help}</p>
+					</div>
+				</fieldset>
+			</div>
+
+			<div id="command_states_panel" class="panel">
+			<fieldset>
+					<legend>{$lang_devkit_command_states_tab}</legend>
+
+					<span><a href="javascript:renderCommandStates();">[{$lang_devkit_refresh}]</a></span>
+
+					<div id="command_states" class="data">
+						<p>{$lang_devkit_command_states_help}</p>
+					</div>
+				</fieldset>
+			</div>
+
+			<div id="undo_redo_panel" class="panel">
+				<fieldset>
+					<legend>{$lang_devkit_undo_redo_tab}</legend>
+
+					<span><a href="javascript:renderUndoRedo();">[{$lang_devkit_refresh}]</a></span>
+
+					<div id="undo_redo" class="data">
+						<p>{$lang_devkit_undo_redo_help}</p>
+					</div>
+
+					<input type="checkbox" id="undo_diff" name="undo_diff" class="checkbox" /><label for="undo_diff">{$lang_devkit_undo_diff}</label>
+				</fieldset>
+			</div>
+
+			<div id="misc_panel" class="panel">
+				<fieldset>
+					<legend>{$lang_devkit_misc_tab}</legend>
+
+					<div class="data">
+						<p>{$lang_devkit_misc_help}</p>
+						<hr />
+						<p>Selection: <a href="#" onmousedown="return storeSelection();">[Store selection]</a> <a href="#" onmousedown="return restoreSelection();">[Restore selection]</a></p>
+						<hr />
+						<div><strong>Insert custom HTML content</strong></div>
+						<div><textarea id="htmlcont" name="htmlcont" style="width: 90%" rows="5"></textarea></div>
+						<div><a href="#" onclick="return tinyMCE.execCommand('mceInsertContent',false,document.getElementById('htmlcont').value);">[Insert content]</a></div>
+						<hr />
+						<div><strong>Eval JS:</strong></div>
+						<div><textarea id="jscont" name="jscont" style="width: 90%" rows="5">tinyMCE.execCommand('Bold',false,null);</textarea></div>
+						<div><a href="#" onclick="return parent.window.eval(document.getElementById('jscont').value);">[Evaluate]</a></div>
+					</div>
+				</fieldset>
+			</div>
+		</div>
+    </form>
+
+	<div id="flip"><a href="javascript:toggleFlip();" onmousedown="return false;"><img id="flipbtn" src="images/flip_down.gif" border="0" /></a></div>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/devkit/editor_plugin.js
@@ -1,1 +1,1 @@
-
+tinyMCE.importPluginLanguagePack('devkit');var TinyMCE_DevKitPlugin={_logFilter:'\\[(importCSS|execCommand|execInstanceCommand|debug)\\]',_logPadding:'',_startTime:null,_benchMark:false,_winLoaded:false,_isDebugEvents:false,getInfo:function(){return{longname:'Development Kit',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/devkit',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){this._setup()},_setup:function(){if(this._loaded)return;this._loaded=true;document.___TinyMCE=tinyMCE;this._logFilter=tinyMCE.getParam('devkit_log_filter',this._logFilter);this._benchMark=tinyMCE.getParam('devkit_bench_mark',false);var ifr=document.createElement('iframe');ifr.setAttribute("id","devkit");ifr.setAttribute("frameBorder","0");ifr.setAttribute("src",tinyMCE.baseURL+'/plugins/devkit/devkit.htm');document.body.appendChild(ifr);tinyMCE.importCSS(document,tinyMCE.baseURL+'/plugins/devkit/css/devkit_ui.css')},_start:function(){this._logPadding+='\u00a0';return new Date().getTime()},_end:function(st){if(this._logPadding.length>0)this._logPadding=this._logPadding.substring(0,this._logPadding.length-1);if(this._benchMark)this._log("benchmark","Execution time: "+(new Date().getTime()-st))},_log:function(t){var m,a,i,e=document.getElementById('devkit'),now=new Date().getTime();if(!this._startTime)this._startTime=now;m=(this._logPadding.length>1?this._logPadding:'')+'['+(now-this._startTime)+'] ['+t+'] ';a=this._log.arguments;for(i=1;i<a.length;i++){if(typeof(a[i])=='undefined')continue;if(i>1)m+=', ';m+=a[i]}if(!new RegExp(this._logFilter,'gi').test(m)){if(this._logPadding.length>0)this._logPadding=this._logPadding.substring(0,this._logPadding.length-1);return}if(!this._winLoaded)tinyMCE.log[tinyMCE.log.length]=m;else e.contentWindow.debug(m)},_debugEvents:function(s){var i,ld,inst,n,ev=['CheckboxStateChange','DOMAttrModified','DOMMenuItemActive','DOMMenuItemInactive','DOMMouseScroll','DOMNodeInserted','DOMNodeRemoved','RadioStateChange','blur','broadcast','change','click','close','command','commandupdate','contextmenu','dblclick','dragdrop','dragenter','dragexit','draggesture','dragover','focus','input','keydown','keypress','keyup','load','mousedown','mouseout','mouseover','mouseup','overflow','overflowchanged','popuphidden','popuphiding','popupshowing','popupshown','select','syncfrompreference','synctopreference','underflow','unload','abort','activate','afterprint','afterupdate','beforeactivate','beforecopy','beforecut','beforedeactivate','beforeeditfocus','beforepaste','beforeprint','beforeunload','beforeupdate','bounce','cellchange','controlselect','copy','cut','dataavailable','datasetchanged','datasetcomplete','deactivate','dragend','dragleave','dragstart','drop','error','errorupdate','filterchange','finish','focusin','focusout','help','layoutcomplete','losecapture','mouseenter','mouseleave','mousewheel','move','moveend','movestart','paste','propertychange','readystatechange','reset','resize','resizeend','resizestart','rowenter','rowexit','rowsdelete','rowsinserted','scroll','selectionchange','selectstart','start','stop','submit'];if(TinyMCE_DevKitPlugin._isDebugEvents==s)return;TinyMCE_DevKitPlugin._isDebugEvents=s;for(n in tinyMCE.instances){inst=tinyMCE.instances[n];if(!tinyMCE.isInstance(inst)||inst.getDoc()==ld)continue;ld=inst.getDoc();for(i=0;i<ev.length;i++){if(s)tinyMCE.addEvent(ld,ev[i],TinyMCE_DevKitPlugin._debugEvent);else tinyMCE.removeEvent(ld,ev[i],TinyMCE_DevKitPlugin._debugEvent)}}},_debugEvent:function(e){var t;e=e?e:tinyMCE.selectedInstance.getWin().event;t=e.srcElement?e.srcElement:e.target;tinyMCE.debug(e.type,t?t.nodeName:'')},_serialize:function(o){var i,v,s=TinyMCE_DevKitPlugin._serialize;if(o==null)return'null';switch(typeof o){case'string':v='\bb\tt\nn\ff\rr\""\'\'\\\\';return'"'+o.replace(new RegExp('([\u0080-\uFFFF\\x00-\\x1f\\"])','g'),function(a,b){i=v.indexOf(b);if(i+1)return'\\'+v.charAt(i+1);a=b.charCodeAt().toString(16);return'\\u'+'0000'.substring(a.length)+a})+'"';case'object':if(o instanceof Array){for(i=0,v='[';i<o.length;i++)v+=(i>0?',':'')+s(o[i]);return v+']'}v='{';for(i in o)v+=typeof o[i]!='function'?(v.length>1?',"':'"')+i+'":'+s(o[i]):'';return v+'}'}return''+o}};tinyMCE.__debug=tinyMCE.debug;tinyMCE.debug=function(){var a,i,m='',now=new Date().getTime(),start=TinyMCE_DevKitPlugin._startTime;if(!start)TinyMCE_DevKitPlugin._startTime=start=now;a=this.debug.arguments;for(i=0;i<a.length;i++){if(typeof(a[i])=='undefined')continue;if(i>0)m+=', ';m+=a[i]}TinyMCE_DevKitPlugin._log('debug',m)};tinyMCE.dump=function(o){tinyMCE.debug(TinyMCE_DevKitPlugin._serialize(o))};tinyMCE.sleep=function(t){var s=new Date().getTime(),b;while(new Date().getTime()-s<t)b=1};tinyMCE.__execCommand=tinyMCE.execCommand;tinyMCE.execCommand=function(command,user_interface,value){var r,st,dk=TinyMCE_DevKitPlugin;st=dk._start();dk._log('execCommand',command,user_interface,value);r=tinyMCE.__execCommand(command,user_interface,value);dk._end(st);return r};tinyMCE.__execInstanceCommand=tinyMCE.execInstanceCommand;tinyMCE.execInstanceCommand=function(editor_id,command,user_interface,value,focus){var r,st,dk=TinyMCE_DevKitPlugin;st=dk._start();dk._log('execInstanceCommand',editor_id,command,user_interface,value);r=tinyMCE.__execInstanceCommand(editor_id,command,user_interface,value);dk._end(st);return r};TinyMCE_Engine.prototype.__handleEvent=TinyMCE_Engine.prototype.handleEvent;TinyMCE_Engine.prototype.handleEvent=function(e){var r,st,dk=TinyMCE_DevKitPlugin;st=dk._start();dk._log('handleEvent',e.type);r=tinyMCE.__handleEvent(e);dk._end(st);return r};tinyMCE.__importCSS=tinyMCE.importCSS;tinyMCE.importCSS=function(doc,css){var r,st,dk=TinyMCE_DevKitPlugin;st=dk._start();dk._log('importCSS',doc,css);r=tinyMCE.__importCSS(doc,css);dk._end(st);return r};tinyMCE.__triggerNodeChange=tinyMCE.triggerNodeChange;tinyMCE.triggerNodeChange=function(focus,setup_content){var r,st,dk=TinyMCE_DevKitPlugin;st=dk._start();dk._log('triggerNodeChange',focus,setup_content);r=tinyMCE.__triggerNodeChange(focus,setup_content);dk._end(st);return r};tinyMCE.__dispatchCallback=tinyMCE.dispatchCallback;tinyMCE.dispatchCallback=function(i,p,n){var r,st,dk=TinyMCE_DevKitPlugin;st=dk._start();dk._log('dispatchCallback',i,p,n);r=tinyMCE.__dispatchCallback(i,p,n);dk._end(st);return r};tinyMCE.__executeCallback=tinyMCE.executeCallback;tinyMCE.executeCallback=function(i,p,n){var r,st,dk=TinyMCE_DevKitPlugin;st=dk._start();dk._log('executeCallback',i,p,n);r=tinyMCE.__executeCallback(i,p,n);dk._end(st);return r};tinyMCE.__execCommandCallback=tinyMCE.execCommandCallback;tinyMCE.execCommandCallback=function(i,p,n){var r,st,dk=TinyMCE_DevKitPlugin;st=dk._start();dk._log('execCommandCallback',i,p,n);r=tinyMCE.__execCommandCallback(i,p,n);dk._end(st);return r};tinyMCE.addPlugin("devkit",TinyMCE_DevKitPlugin);

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/devkit/editor_plugin_src.js
@@ -1,1 +1,326 @@
-
+/**
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $
+ *
+ * @author Moxiecode

+ */
+
+tinyMCE.importPluginLanguagePack('devkit');
+
+var TinyMCE_DevKitPlugin = {
+	_logFilter : '\\[(importCSS|execCommand|execInstanceCommand|debug)\\]',
+	_logPadding : '',
+	_startTime : null,
+	_benchMark : false,
+	_winLoaded : false,
+	_isDebugEvents : false,
+
+	getInfo : function() {
+		return {
+			longname : 'Development Kit',
+			author : 'Moxiecode Systems AB',
+			authorurl : 'http://tinymce.moxiecode.com',
+			infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/devkit',
+			version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
+		};
+	},
+
+	initInstance : function(inst) {
+		this._setup();
+	},
+
+	_setup : function() {
+		if (this._loaded)
+			return;
+
+		this._loaded = true;
+
+		// Register a document reference for more easy access in the FF DOM inspector
+		document.___TinyMCE = tinyMCE;
+
+		// Setup devkit by settings
+		this._logFilter = tinyMCE.getParam('devkit_log_filter', this._logFilter);
+		this._benchMark = tinyMCE.getParam('devkit_bench_mark', false);
+
+		var ifr = document.createElement('iframe');
+
+		ifr.setAttribute("id", "devkit");
+		ifr.setAttribute("frameBorder", "0");
+		ifr.setAttribute("src", tinyMCE.baseURL + '/plugins/devkit/devkit.htm');
+
+		document.body.appendChild(ifr);
+
+		// Workaround for strange IE reload bug
+		//if (tinyMCE.isRealIE)
+		//	document.getElementById('devkit').outerHTML = document.getElementById('devkit').outerHTML;
+
+		tinyMCE.importCSS(document, tinyMCE.baseURL + '/plugins/devkit/css/devkit_ui.css');
+	},
+
+	_start : function() {
+		this._logPadding += '\u00a0';
+
+		return new Date().getTime();
+	},
+
+	_end : function(st) {
+		if (this._logPadding.length > 0)
+			this._logPadding = this._logPadding.substring(0, this._logPadding.length - 1);
+
+		if (this._benchMark)
+			this._log("benchmark", "Execution time: " + (new Date().getTime() - st));
+	},
+
+	_log : function(t) {
+		var m, a, i, e = document.getElementById('devkit'), now = new Date().getTime();
+
+		if (!this._startTime)
+			this._startTime = now;
+
+		m = (this._logPadding.length > 1 ? this._logPadding : '') + '[' + (now - this._startTime) + '] [' + t + '] ';
+
+		a = this._log.arguments;
+		for (i=1; i<a.length; i++) {
+			if (typeof(a[i]) == 'undefined')
+				continue;
+
+			if (i > 1)
+				m += ', ';
+
+			m += a[i];
+		}
+
+		if (!new RegExp(this._logFilter, 'gi').test(m)) {
+			if (this._logPadding.length > 0)
+				this._logPadding = this._logPadding.substring(0, this._logPadding.length - 1);
+
+			return;
+		}
+
+		if (!this._winLoaded)
+			tinyMCE.log[tinyMCE.log.length] = m;
+		else
+			e.contentWindow.debug(m);
+	},
+
+	_debugEvents : function(s) {
+		var i, ld, inst, n, ev = ['CheckboxStateChange','DOMAttrModified','DOMMenuItemActive',
+				'DOMMenuItemInactive','DOMMouseScroll','DOMNodeInserted','DOMNodeRemoved',
+				'RadioStateChange','blur','broadcast','change','click','close','command',
+				'commandupdate','contextmenu','dblclick','dragdrop','dragenter','dragexit',
+				'draggesture','dragover','focus','input','keydown','keypress','keyup','load',
+				'mousedown','mouseout','mouseover','mouseup','overflow','overflowchanged','popuphidden',
+				'popuphiding','popupshowing','popupshown','select','syncfrompreference','synctopreference',
+				'underflow','unload','abort','activate','afterprint','afterupdate','beforeactivate',
+				'beforecopy','beforecut','beforedeactivate','beforeeditfocus','beforepaste','beforeprint',
+				'beforeunload','beforeupdate','bounce','cellchange','controlselect','copy','cut',
+				'dataavailable','datasetchanged','datasetcomplete','deactivate','dragend','dragleave',
+				'dragstart','drop','error','errorupdate','filterchange','finish','focusin','focusout',
+				'help','layoutcomplete','losecapture','mouseenter','mouseleave','mousewheel',
+				'move','moveend','movestart','paste','propertychange','readystatechange','reset','resize',
+				'resizeend','resizestart','rowenter','rowexit','rowsdelete','rowsinserted','scroll',
+				'selectionchange','selectstart','start','stop','submit'];
+		// mousemove
+
+		if (TinyMCE_DevKitPlugin._isDebugEvents == s)
+			return;
+
+		TinyMCE_DevKitPlugin._isDebugEvents = s;
+
+		for (n in tinyMCE.instances) {
+			inst = tinyMCE.instances[n];
+
+			if (!tinyMCE.isInstance(inst) || inst.getDoc() == ld)
+				continue;
+
+			ld = inst.getDoc();
+
+			for (i=0; i<ev.length; i++) {
+				if (s)
+					tinyMCE.addEvent(ld, ev[i], TinyMCE_DevKitPlugin._debugEvent);
+				else
+					tinyMCE.removeEvent(ld, ev[i], TinyMCE_DevKitPlugin._debugEvent);
+			}
+		}
+	},
+
+	_debugEvent : function(e) {
+		var t;
+
+		e = e ? e : tinyMCE.selectedInstance.getWin().event;
+		t = e.srcElement ? e.srcElement : e.target;
+
+		tinyMCE.debug(e.type, t ? t.nodeName : '');
+	},
+
+	_serialize : function(o) {
+		var i, v, s = TinyMCE_DevKitPlugin._serialize;
+
+		if (o == null)
+			return 'null';
+
+		switch (typeof o) {
+			case 'string':
+				v = '\bb\tt\nn\ff\rr\""\'\'\\\\';
+
+				return '"' + o.replace(new RegExp('([\u0080-\uFFFF\\x00-\\x1f\\"])', 'g'), function(a, b) {
+					i = v.indexOf(b);
+
+					if (i+1)
+						return '\\' + v.charAt(i + 1);
+
+					a = b.charCodeAt().toString(16);
+
+					return '\\u' + '0000'.substring(a.length) + a;
+				}) + '"';
+
+			case 'object':
+				if (o instanceof Array) {
+					for (i=0, v = '['; i<o.length; i++)
+						v += (i > 0 ? ',' : '') + s(o[i]);
+
+					return v + ']';
+				}
+
+				v = '{';
+
+				for (i in o)
+					v += typeof o[i] != 'function' ? (v.length > 1 ? ',"' : '"') + i + '":' + s(o[i]) : '';
+
+				return v + '}';
+		}
+
+		return '' + o;
+	}
+};
+
+// Patch and piggy back functions
+tinyMCE.__debug = tinyMCE.debug;
+tinyMCE.debug = function() {
+	var a, i, m = '', now = new Date().getTime(), start = TinyMCE_DevKitPlugin._startTime;
+
+	if (!start)
+		TinyMCE_DevKitPlugin._startTime = start = now;
+
+	a = this.debug.arguments;
+	for (i=0; i<a.length; i++) {
+		if (typeof(a[i]) == 'undefined')
+			continue;
+
+		if (i > 0)
+			m += ', ';
+
+		m += a[i];
+	}
+
+	TinyMCE_DevKitPlugin._log('debug', m);
+};
+
+tinyMCE.dump = function(o) {
+	tinyMCE.debug(TinyMCE_DevKitPlugin._serialize(o));
+};
+
+tinyMCE.sleep = function(t) {
+	var s = new Date().getTime(), b;
+
+	while (new Date().getTime() - s < t) b=1;
+};
+
+tinyMCE.__execCommand = tinyMCE.execCommand;
+tinyMCE.execCommand = function(command, user_interface, value) {
+	var r, st, dk = TinyMCE_DevKitPlugin;
+
+	st = dk._start();
+	dk._log('execCommand', command, user_interface, value);
+	r = tinyMCE.__execCommand(command, user_interface, value);
+	dk._end(st);
+
+	return r;
+};
+
+tinyMCE.__execInstanceCommand = tinyMCE.execInstanceCommand;
+tinyMCE.execInstanceCommand = function(editor_id, command, user_interface, value, focus) {
+	var r, st, dk = TinyMCE_DevKitPlugin;
+
+	st = dk._start();
+	dk._log('execInstanceCommand', editor_id, command, user_interface, value);
+	r = tinyMCE.__execInstanceCommand(editor_id, command, user_interface, value);
+	dk._end(st);
+
+	return r;
+};
+
+TinyMCE_Engine.prototype.__handleEvent = TinyMCE_Engine.prototype.handleEvent;
+TinyMCE_Engine.prototype.handleEvent = function(e) {
+	var r, st, dk = TinyMCE_DevKitPlugin;
+
+	st = dk._start();
+	dk._log('handleEvent', e.type);
+	r = tinyMCE.__handleEvent(e);
+	dk._end(st);
+
+	return r;
+};
+
+tinyMCE.__importCSS = tinyMCE.importCSS;
+tinyMCE.importCSS = function(doc, css) {
+	var r, st, dk = TinyMCE_DevKitPlugin;
+
+	st = dk._start();
+	dk._log('importCSS', doc, css);
+	r = tinyMCE.__importCSS(doc, css);
+	dk._end(st);
+
+	return r;
+};
+
+tinyMCE.__triggerNodeChange = tinyMCE.triggerNodeChange;
+tinyMCE.triggerNodeChange = function(focus, setup_content) {
+	var r, st, dk = TinyMCE_DevKitPlugin;
+
+	st = dk._start();
+	dk._log('triggerNodeChange', focus, setup_content);
+	r = tinyMCE.__triggerNodeChange(focus, setup_content);
+	dk._end(st);
+
+	return r;
+};
+
+tinyMCE.__dispatchCallback = tinyMCE.dispatchCallback;
+tinyMCE.dispatchCallback = function(i, p, n) {
+	var r, st, dk = TinyMCE_DevKitPlugin;
+
+	st = dk._start();
+	dk._log('dispatchCallback', i, p, n);
+	r = tinyMCE.__dispatchCallback(i, p, n);
+	dk._end(st);
+
+	return r;
+};
+
+tinyMCE.__executeCallback = tinyMCE.executeCallback;
+tinyMCE.executeCallback = function(i, p, n) {
+	var r, st, dk = TinyMCE_DevKitPlugin;
+
+	st = dk._start();
+	dk._log('executeCallback', i, p, n);
+	r = tinyMCE.__executeCallback(i, p, n);
+	dk._end(st);
+
+	return r;
+};
+
+tinyMCE.__execCommandCallback = tinyMCE.execCommandCallback;
+tinyMCE.execCommandCallback = function(i, p, n) {
+	var r, st, dk = TinyMCE_DevKitPlugin;
+
+	st = dk._start();
+	dk._log('execCommandCallback', i, p, n);
+	r = tinyMCE.__execCommandCallback(i, p, n);
+	dk._end(st);
+
+	return r;
+};
+
+tinyMCE.addPlugin("devkit", TinyMCE_DevKitPlugin);
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/devkit/images/flip_down.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/devkit/images/flip_up.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/devkit/jscripts/devkit.js
@@ -1,1 +1,331 @@
-
+var devkit = parent.tinyMCE.plugins['devkit'], logEnabled = true, flip = false, book = null;
+
+function init() {
+	var log, i, f = document.forms[0];
+
+	devkit._winLoaded = true;
+
+	log = tinyMCE.log;
+
+	for (i=0; i<log.length; i++)
+		debug(log[i]);
+
+	f.logfilter.value = devkit._logFilter;
+}
+
+function changeFilter(f) {
+	devkit._logFilter = f;
+}
+
+function toggleLog(s) {
+	logEnabled = s;
+}
+
+function toggleFlip() {
+	document.getElementById('flipbtn').src = flip ? 'images/flip_down.gif' : 'images/flip_up.gif';
+
+	if (flip)
+		parent.document.getElementById('devkit').className = 'devkitup';
+	else
+		parent.document.getElementById('devkit').className = 'devkitdown';
+
+	flip = !flip;
+}
+
+function debug(s) {
+	var d, l, n;
+
+	if (!logEnabled || !new RegExp(devkit._logFilter, 'gi').test(s))
+		return;
+
+	d = document;
+	l = d.getElementById('log');
+	n = d.createElement('span');
+
+	n.innerHTML = tinyMCE.xmlEncode(s);
+
+	l.appendChild(n);
+	l.scrollTop = l.scrollHeight;
+}
+
+function renderInfo() {
+	var se = document.getElementById('info'), n, sn, inst, h = '', sel, rng, instCount = 0, rc;
+
+	h += '<h2>Browser info:</h2>';
+
+	h += '<table border="0" cellpadding="0" cellspacing="0" class="data">';
+	h += addRenderInfo('navigator.userAgent', navigator.userAgent);
+	h += addRenderInfo('navigator.appName', navigator.appName);
+	h += addRenderInfo('navigator.platform', navigator.platform);
+	h += addRenderInfo('navigator.language', navigator.language, 'bspec');
+	h += addRenderInfo('navigator.browserLanguage', navigator.browserLanguage, 'bspec');
+	h += addRenderInfo('navigator.systemLanguage', navigator.systemLanguage, 'bspec');
+	h += addRenderInfo('navigator.userLanguage', navigator.userLanguage, 'bspec');
+	h += addRenderInfo('opera.buildNumber("inconspicuous")', typeof(opera) != 'undefined' && opera.buildNumber ? opera.buildNumber('inconspicuous') : null, 'bspec');
+	h += addRenderInfo('window.innerWidth', parent.window.innerWidth, 'bspec');
+	h += addRenderInfo('window.innerHeight', parent.window.innerHeight, 'bspec');
+	h += addRenderInfo('document.body.offsetWidth', parent.document.body.offsetWidth);
+	h += addRenderInfo('document.body.offsetHeight', parent.document.body.offsetHeight);
+	h += addRenderInfo('screen.width', screen.width);
+	h += addRenderInfo('screen.height', screen.height);
+	h += addRenderInfo('screen.availWidth', screen.availWidth);
+	h += addRenderInfo('screen.availHeight', screen.availHeight);
+	h += addRenderInfo('screen.colorDepth', screen.colorDepth);
+	h += addRenderInfo('screen.pixelDepth', screen.pixelDepth, 'bspec');
+	h += addRenderInfo('document.contentType', document.contentType, 'bspec');
+	h += '</table>';
+
+	h += '<h2>TinyMCE_Engine info:</h2>';
+
+	h += '<table border="0" cellpadding="0" cellspacing="0" class="data">';
+	h += addRenderInfo('baseURL', tinyMCE.baseURL);
+	h += addRenderInfo('selectedInstance.editorId', tinyMCE.selectedInstance ? tinyMCE.selectedInstance.editorId : null);
+	h += addRenderInfo('selectedElement.nodeName', tinyMCE.selectedElement ? tinyMCE.selectedElement.nodeName : null, 'dep');
+	h += addRenderInfo('loadedFiles',tinyMCE.loadedFiles.join(','));
+	h += addRenderInfo('isMSIE', tinyMCE.isMSIE);
+	h += addRenderInfo('isMSIE5', tinyMCE.isMSIE5);
+	h += addRenderInfo('isMSIE5_0', tinyMCE.isMSIE5_0);
+	h += addRenderInfo('isMSIE7', tinyMCE.isMSIE7);
+	h += addRenderInfo('isGecko', tinyMCE.isGecko);
+	h += addRenderInfo('isSafari', tinyMCE.isSafari);
+	h += addRenderInfo('isOpera', tinyMCE.isOpera);
+	h += addRenderInfo('isMac', tinyMCE.isMac);
+	h += addRenderInfo('isNS7', tinyMCE.isNS7);
+	h += addRenderInfo('isNS71', tinyMCE.isNS71);
+	h += addRenderInfo('idCounter', tinyMCE.idCounter);
+	h += addRenderInfo('currentConfig', tinyMCE.currentConfig);
+	h += addRenderInfo('majorVersion', tinyMCE.majorVersion);
+	h += addRenderInfo('minorVersion', tinyMCE.minorVersion);
+	h += addRenderInfo('releaseDate', tinyMCE.releaseDate);
+	h += addRenderInfo('documentBasePath', tinyMCE.documentBasePath);
+	h += addRenderInfo('documentURL', tinyMCE.documentURL);
+	h += '</table>';
+
+	for (n in tinyMCE.instances) {
+		inst = tinyMCE.instances[n];
+
+		if (!tinyMCE.isInstance(inst))
+			continue;
+
+		sel = inst.selection.getSel();
+		rng = inst.selection.getRng();
+
+		h += '<h2>TinyMCE_Control(' + (instCount++) + ') id: ' + inst.editorId + '</h2>';
+		h += '<table border="0" cellpadding="0" cellspacing="0" class="data">';
+
+		h += addRenderInfo('editorId', inst.editorId);
+		h += addRenderInfo('visualAid', inst.visualAid);
+		h += addRenderInfo('foreColor', inst.foreColor);
+		h += addRenderInfo('backColor', inst.backColor);
+		h += addRenderInfo('formTargetElementId', inst.formTargetElementId);
+		h += addRenderInfo('formElement', inst.formElement ? inst.formElement.nodeName : null);
+		h += addRenderInfo('oldTargetElement', inst.oldTargetElement ? inst.oldTargetElement.nodeName : null);
+		h += addRenderInfo('linkElement', inst.linkElement ? inst.linkElement.nodeName : null, 'dep');
+		h += addRenderInfo('imgElement', inst.imgElement ? inst.imgElement.nodeName : null, 'dep');
+		h += addRenderInfo('selectedNode', inst.selectedNode ? inst.selectedNode.nodeName : null, 'dep');
+		h += addRenderInfo('targetElement', inst.targetElement ? inst.targetElement.nodeName : null);
+		h += addRenderInfo('getBody().nodeName', inst.getBody() ? inst.getBody().nodeName : null);
+		h += addRenderInfo('getBody().getAttribute("id")', inst.getBody() ? inst.getBody().getAttribute("id") : null);
+		h += addRenderInfo('getDoc().location', inst.getDoc() ? inst.getDoc().location : null);
+		h += addRenderInfo('startContent', inst.startContent);
+		h += addRenderInfo('isHidden()', inst.isHidden());
+		h += addRenderInfo('isDirty()', inst.isDirty());
+		h += addRenderInfo('undoRedo.undoLevels.length', inst.undoRedo.undoLevels.length);
+		h += addRenderInfo('undoRedo.undoIndex', inst.undoRedo.undoIndex);
+		h += addRenderInfo('selection.getSelectedHTML()', inst.selection.getSelectedHTML());
+		h += addRenderInfo('selection.isCollapsed()', inst.selection.isCollapsed() || 'false');
+		h += addRenderInfo('selection.getSelectedText()', inst.selection.getSelectedText());
+		h += addRenderInfo('selection.getFocusElement().nodeName', inst.selection.getFocusElement().nodeName);
+		h += addRenderInfo('selection.getFocusElement().outerHTML', tinyMCE.getOuterHTML(inst.selection.getFocusElement()));
+
+		if ((tinyMCE.isGecko || tinyMCE.isOpera) && sel && rng) {
+			h += addRenderInfo('selection.getSel().anchorNode.nodeName', sel.anchorNode ? sel.anchorNode.nodeName : null, 'bspec');
+			h += addRenderInfo('selection.getSel().anchorOffset', sel.anchorOffset, 'bspec');
+			h += addRenderInfo('selection.getSel().focusNode.nodeName', sel.focusNode ? sel.focusNode.nodeName : null, 'bspec');
+			h += addRenderInfo('selection.getSel().focusOffset', sel.focusOffset, 'bspec');
+			h += addRenderInfo('selection.getRng().startContainer.nodeName', rng.startContainer ? rng.startContainer.nodeName : null, 'bspec');
+			h += addRenderInfo('selection.getRng().startOffset', rng.startOffset, 'bspec');
+			h += addRenderInfo('selection.getRng().endContainer.nodeName', rng.endContainer ? rng.endContainer.nodeName : null, 'bspec');
+			h += addRenderInfo('selection.getRng().endOffset', rng.endOffset, 'bspec');
+		}
+
+		if (typeof(rng.item) != 'undefined' || typeof(rng.htmlText) != 'undefined') {
+			if (!rng.item) {
+				h += addRenderInfo('selection.getSel().type', sel.type, 'bspec');
+				h += addRenderInfo('selection.getRng().htmlText', rng.htmlText, 'bspec');
+				h += addRenderInfo('selection.getRng().text', rng.text, 'bspec');
+			} else
+				h += addRenderInfo('selection.getRng().item(0).nodeName', rng.item(0).nodeName, 'bspec');
+		}
+
+		h += '</table>';
+	}
+
+	h += '<p>Fields marked in <strong class="bspec">gray</strong> is not cross browser and should be used with care.</p>';
+	h += '<p>Fields marked <strong class="dep">red</strong> are marked deprecated and will be removed in the future.</p><br />';
+
+	se.innerHTML = h;
+}
+
+function addRenderInfo(n, v, c) {
+	return '<tr><td' + (c ? ' class="' + c + '"' : '')+ '>' + n + '</td><td><input type="text" value="' + tinyMCE.xmlEncode(v != null ? ('' + v).replace(/[\r\n]/g, '') : 'null') + '" /></td></tr>';
+}
+
+function renderSettings() {
+	var se = document.getElementById('settings'), n, sn, inst, h = '', v;
+
+	for (n in tinyMCE.instances) {
+		inst = tinyMCE.instances[n];
+
+		if (!tinyMCE.isInstance(inst))
+			continue;
+
+		h += '<h2>Instance id: ' + inst.editorId + '</h2>';
+		h += '<table border="0" cellpadding="0" cellspacing="0" class="data">';
+
+		for (sn in inst.settings) {
+			v = inst.settings[sn];
+
+			h += '<tr><td class="col1">' + tinyMCE.xmlEncode(sn) + '</td><td><input type="text" value="' + tinyMCE.xmlEncode(v) + '" /></td></tr>';
+		}
+
+		h += '</table>';
+	}
+
+	se.innerHTML = h;
+}
+
+function renderContent() {
+	var se = document.getElementById('content'), n, inst, h = '';
+
+	for (n in tinyMCE.instances) {
+		inst = tinyMCE.instances[n];
+
+		if (!tinyMCE.isInstance(inst))
+			continue;
+
+		h += '<h2>Instance id: ' + inst.editorId + '</h2>';
+
+		h += '<h3>Start content - inst.startContent:</h3>';
+		h += '<div>' + tinyMCE.xmlEncode(inst.startContent) + '</div>';
+
+		h += '<h3>Raw content - inst.getBody().innerHTML or inst.getHTML(true):</h3>';
+		h += '<div>' + tinyMCE.xmlEncode(inst.getHTML(true)) + '</div>';
+
+		h += '<h3>Cleaned content - inst.getHTML():</h3>';
+		h += '<div>' + tinyMCE.xmlEncode(inst.getHTML()) + '</div>';
+
+		if (inst.serializedHTML) {
+			h += '<h3>Serialized HTML content - inst.serializedHTML:</h3>';
+			h += '<div>' + tinyMCE.xmlEncode(inst.serializedHTML) + '</div>';
+		}
+	}
+
+	se.innerHTML = h;
+}
+
+function renderCommandStates() {
+	var se = document.getElementById('command_states'), n, inst, h = '', v, ex;
+	var cmds = new Array('2D-Position','AbsolutePosition','BackColor','BlockDirLTR','BlockDirRTL','Bold','BrowseMode','Copy','CreateBookmark','CreateLink','Cut','Delete','DirLTR','DirRTL','EditMode','enableInlineTableEditing','enableObjectResizing','FontName','FontSize','ForeColor','FormatBlock','Indent','InsertButton','InsertFieldset','InsertHorizontalRule','InsertIFrame','InsertImage','InsertInputButton','InsertInputCheckbox','InsertInputFileUpload','InsertInputHidden','InsertInputImage','InsertInputPassword','InsertInputRadio','InsertInputReset','InsertInputSubmit','InsertInputText','InsertMarquee','InsertOrderedList','InsertParagraph','InsertSelectDropdown','InsertSelectListbox','InsertTextArea','InsertUnorderedList','Italic','JustifyCenter','JustifyFull','JustifyLeft','JustifyNone','JustifyRight','LiveResize','MultipleSelection','Open','Outdent','OverWrite','Paste','PlayImage','Redo','Refresh','RemoveFormat','SaveAs','SelectAll','SizeToControl','SizeToControlHeight','SizeToControlWidth','Stop','StopImage','StrikeThrough','styleWithCSS','Subscript','Superscript','UnBookmark','Underline','Undo','Unlink','Unselect'), i;
+
+	for (n in tinyMCE.instances) {
+		inst = tinyMCE.instances[n];
+
+		if (!tinyMCE.isInstance(inst))
+			continue;
+
+		h += '<h2>Instance id: ' + inst.editorId + '</h2>';
+		h += '<table border="0" cellpadding="0" cellspacing="0" class="data">';
+
+		for (i=0; i<cmds.length; i++) {
+			v = null;
+
+			try {
+				v = tinyMCE.isGecko || inst.getDoc().queryCommandSupported(cmds[i]);
+				v = v ? inst.queryCommandState(cmds[i]) : 'Not supported';
+			} catch (ex) {
+				v = 'Not supported';
+			}
+
+			h += '<tr><td><input type="text" value="' + tinyMCE.xmlEncode(cmds[i]) + '" /></td><td><input type="text" value="' + tinyMCE.xmlEncode(v) + '" /></td></tr>';
+		}
+
+		h += '</table>';
+	}
+
+	se.innerHTML = h;
+}
+
+function renderUndoRedo() {
+	var se = document.getElementById('undo_redo'), inst, n, h = '', i, le, id, d, ur;
+	var f = document.forms[0];	
+
+	if (tinyMCE.undoLevels) {
+		le = tinyMCE.undoLevels;
+
+		h += '<h2>Global undo/redo</h2>';
+		h += '<table border="0" cellpadding="0" cellspacing="0" width="50%" class="data">';
+		h += '<tr><td>undoLevels.length</td><td>' + le.length + '</td></tr>';
+		h += '<tr><td>undoIndex</td><td>' + tinyMCE.undoIndex + '</td></tr>';
+		h += '</table>';
+
+		for (i=0; i<le.length; i++)
+			h += '<h3>Level: ' + i + ', Instance: ' + (le[i] ? le[i].editorId : 'null') + '</h3>';
+	}
+
+	for (n in tinyMCE.instances) {
+		inst = tinyMCE.instances[n];
+
+		if (!tinyMCE.isInstance(inst))
+			continue;
+
+		ur = inst.undoRedo;
+		le = ur.undoLevels;
+
+		h += '<hr /><h2>Instance id: ' + inst.editorId + '</h2>';
+		h += '<table border="0" cellpadding="0" cellspacing="0" width="50%" class="data">';
+		h += '<tr><td>undoLevels.length</td><td>' + le.length + '</td></tr>';
+		h += '<tr><td>undoIndex</td><td>' + ur.undoIndex + '</td></tr>';
+		h += '<tr><td>typingUndoIndex</td><td>' + ur.typingUndoIndex + '</td></tr>';
+		h += '<tr><td>undoRedo</td><td>' + ur.undoRedo + '</td></tr>';
+		h += '</table>';
+
+		for (i=0; i<le.length; i++) {
+			h += '<h3>Level: ' + i + (!le[i].bookmark ? "" : " [bookmark]") + '</h3>';
+			h += '<div class="undodata">' + tinyMCE.xmlEncode(le[i].content) + '</div>';
+
+			if (i > 0 && f.undo_diff.checked) {
+				d = diff_main(i > 0 ? le[i-1].content.replace(/[\r\n]+/g, '') : null, le[i].content.replace(/[\r\n]+/g, ''), false);
+				diff_cleanup_semantic(d);
+				h += '<h3>Diff ' + (i-1) + ',' + i + '</h3><div class="undodata">' + diff_prettyhtml(d) + '</div>';
+			}
+		}
+	}
+
+	se.innerHTML = h;
+}
+
+function clearLog() {
+	document.getElementById('log').innerHTML = '';
+	devkit._startTime = null;
+}
+
+function cancelAction() {
+	parent.document.getElementById('devkit').style.display = 'none';
+}
+
+function toggleDebugEvents(s) {
+	devkit._debugEvents(s);
+}
+
+function storeSelection() {
+	book = tinyMCE.selectedInstance.selection.getBookmark();
+
+	return false;
+}
+
+function restoreSelection() {
+	tinyMCE.selectedInstance.selection.moveToBookmark(book);
+
+	return false;
+}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/devkit/jscripts/diff.js
@@ -1,1 +1,1193 @@
-
+// Diff_Match_Patch v1.3
+// Computes the difference between two texts to create a patch.
+// Applies the patch onto another text, allowing for errors.
+// Copyright (C) 2006 Neil Fraser
+// http://neil.fraser.name/software/diff_match_patch/
+
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation.
+
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License (www.gnu.org) for more details.
+
+
+// Constants.
+// Redefine these in your program to override the defaults.
+
+// Number of seconds to map a diff before giving up.  (0 for infinity)
+var DIFF_TIMEOUT = 1.0;
+// Cost of an empty edit operation in terms of edit characters.
+var DIFF_EDIT_COST = 4;
+// Tweak the relative importance (0.0 = accuracy, 1.0 = proximity)
+var MATCH_BALANCE = 0.5;
+// At what point is no match declared (0.0 = perfection, 1.0 = very loose)
+var MATCH_THRESHOLD = 0.5;
+// The min and max cutoffs used when computing text lengths.
+var MATCH_MINLENGTH = 100;
+var MATCH_MAXLENGTH = 1000;
+// Chunk size for context length.
+var PATCH_MARGIN = 4;
+
+
+  //////////////////////////////////////////////////////////////////////
+ //  Diff                                                            //
+//////////////////////////////////////////////////////////////////////
+
+// The data structure representing a diff is an array of tuples:
+// [[-1, "Hello"], [1, "Goodbye"], [0, " world."]]
+// which means: delete "Hello", add "Goodbye" and keep " world."
+
+
+function diff_main(text1, text2, checklines) {
+  // Find the differences between two texts.  Return an array of changes.
+  // If checklines is present and false, then don't run a line-level diff first to identify the changed areas.
+  // Check for equality (speedup)
+  if (text1 == text2)
+    return [[0, text1]];
+
+  if (typeof checklines == 'undefined')
+    checklines = true;
+
+  var a;
+  // Trim off common prefix (speedup)
+  a = diff_prefix(text1, text2);
+  text1 = a[0];
+  text2 = a[1];
+  var commonprefix = a[2];
+
+  // Trim off common suffix (speedup)
+  a = diff_suffix(text1, text2);
+  text1 = a[0];
+  text2 = a[1];
+  var commonsuffix = a[2];
+
+  var diff, i;
+  var longtext = text1.length > text2.length ? text1 : text2;
+  var shorttext = text1.length > text2.length ? text2 : text1;
+
+  if (!text1) {  // Just add some text (speedup)
+    diff = [[1, text2]];
+  } else if (!text2) { // Just delete some text (speedup)
+    diff = [[-1, text1]];
+  } else if ((i = longtext.indexOf(shorttext)) != -1) {
+    // Shorter text is inside the longer text (speedup)
+    diff = [[1, longtext.substring(0, i)], [0, shorttext], [1, longtext.substring(i+shorttext.length)]];
+    // Swap insertions for deletions if diff is reversed.
+    if (text1.length > text2.length)
+      diff[0][0] = diff[2][0] = -1;
+  } else {
+    longtext = shorttext = null; // Garbage collect
+    // Check to see if the problem can be split in two.
+    var hm = diff_halfmatch(text1, text2);
+    if (hm) {
+      // A half-match was found, sort out the return data.
+      var text1_a = hm[0];
+      var text1_b = hm[1];
+      var text2_a = hm[2];
+      var text2_b = hm[3];
+      var mid_common = hm[4];
+      // Send both pairs off for separate processing.
+      var diff_a = diff_main(text1_a, text2_a, checklines);
+      var diff_b = diff_main(text1_b, text2_b, checklines);
+      // Merge the results.
+      diff = diff_a.concat([[0, mid_common]], diff_b);
+    } else {
+      // Perform a real diff.
+      if (checklines && text1.length + text2.length < 250)
+        checklines = false; // Too trivial for the overhead.
+      if (checklines) {
+        // Scan the text on a line-by-line basis first.
+        a = diff_lines2chars(text1, text2);
+        text1 = a[0];
+        text2 = a[1];
+        var linearray = a[2];
+      }
+      diff = diff_map(text1, text2);
+      if (!diff) // No acceptable result.
+        diff = [[-1, text1], [1, text2]];
+      if (checklines) {
+        diff_chars2lines(diff, linearray); // Convert the diff back to original text.
+        diff_cleanup_semantic(diff); // Eliminate freak matches (e.g. blank lines)
+
+        // Rediff any replacement blocks, this time on character-by-character basis.
+        diff.push([0, '']);  // Add a dummy entry at the end.
+        var pointer = 0;
+        var count_delete = 0;
+        var count_insert = 0;
+        var text_delete = '';
+        var text_insert = '';
+        while(pointer < diff.length) {
+          if (diff[pointer][0] == 1) {
+            count_insert++;
+            text_insert += diff[pointer][1];
+          } else if (diff[pointer][0] == -1) {
+            count_delete++;
+            text_delete += diff[pointer][1];
+          } else {  // Upon reaching an equality, check for prior redundancies.
+            if (count_delete >= 1 && count_insert >= 1) {
+              // Delete the offending records and add the merged ones.
+              a = diff_main(text_delete, text_insert, false);
+              diff.splice(pointer - count_delete - count_insert, count_delete + count_insert);
+              pointer = pointer - count_delete - count_insert;
+              for (i=a.length-1; i>=0; i--)
+                diff.splice(pointer, 0, a[i]);
+              pointer = pointer + a.length;
+            }
+            count_insert = 0;
+            count_delete = 0;
+            text_delete = '';
+            text_insert = '';
+          }
+          pointer++;
+        }
+        diff.pop();  // Remove the dummy entry at the end.
+
+      }
+    }
+  }
+
+  if (commonprefix)
+    diff.unshift([0, commonprefix]);
+  if (commonsuffix)
+    diff.push([0, commonsuffix]);
+  diff_cleanup_merge(diff);
+  return diff;
+}
+
+
+function diff_lines2chars(text1, text2) {
+  // Split text into an array of strings.
+  // Reduce the texts to a string of hashes where each character represents one line.
+  var linearray = new Array();  // linearray[4] == "Hello\n"
+  var linehash = new Object();  // linehash["Hello\n"] == 4
+
+  // "\x00" is a valid JavaScript character, but the Venkman debugger doesn't like it (bug 335098)
+  // So we'll insert a junk entry to avoid generating a null character.
+  linearray.push('');
+
+  function diff_lines2chars_munge(text) {
+    // My first ever closure!
+    var i, line;
+    var chars = '';
+    while (text) {
+      i = text.indexOf('\n');
+      if (i == -1)
+        i = text.length;
+      line = text.substring(0, i+1);
+      text = text.substring(i+1);
+      if (linehash.hasOwnProperty ? linehash.hasOwnProperty(line) : (linehash[line] !== undefined)) {
+        chars += String.fromCharCode(linehash[line]);
+      } else {
+        linearray.push(line);
+        linehash[line] = linearray.length - 1;
+        chars += String.fromCharCode(linearray.length - 1);
+      }
+    }
+    return chars;
+  }
+
+  var chars1 = diff_lines2chars_munge(text1);
+  var chars2 = diff_lines2chars_munge(text2);
+  return [chars1, chars2, linearray];
+}
+
+
+function diff_chars2lines(diff, linearray) {
+  // Rehydrate the text in a diff from a string of line hashes to real lines of text.
+  var chars, text;
+  for (var x=0; x<diff.length; x++) {
+    chars = diff[x][1];
+    text = '';
+    for (var y=0; y<chars.length; y++)
+      text += linearray[chars.charCodeAt(y)];
+    diff[x][1] = text;
+  }
+}
+
+
+function diff_map(text1, text2) {
+  // Explore the intersection points between the two texts.
+  var now = new Date();
+  var ms_end = now.getTime() + DIFF_TIMEOUT * 1000; // Don't run for too long.
+  var max = (text1.length + text2.length) / 2;
+  var v_map1 = new Array();
+  var v_map2 = new Array();
+  var v1 = new Object();
+  var v2 = new Object();
+  v1[1] = 0;
+  v2[1] = 0;
+  var x, y;
+  var footstep; // Used to track overlapping paths.
+  var footsteps = new Object();
+  var done = false;
+  var hasOwnProperty = !!(footsteps.hasOwnProperty);
+  // If the total number of characters is odd, then the front path will collide with the reverse path.
+  var front = (text1.length + text2.length) % 2;
+  for (var d=0; d<max; d++) {
+    now = new Date();
+    if (DIFF_TIMEOUT > 0 && now.getTime() > ms_end) // Timeout reached
+      return null;
+
+    // Walk the front path one step.
+    v_map1[d] = new Object();
+    for (var k=-d; k<=d; k+=2) {
+      if (k == -d || k != d && v1[k-1] < v1[k+1])
+        x = v1[k+1];
+      else
+        x = v1[k-1]+1;
+      y = x - k;
+      footstep = x+","+y;
+      if (front && (hasOwnProperty ? footsteps.hasOwnProperty(footstep) : (footsteps[footstep] !== undefined)))
+        done = true;
+      if (!front)
+        footsteps[footstep] = d;
+      while (!done && x < text1.length && y < text2.length && text1.charAt(x) == text2.charAt(y)) {
+        x++; y++;
+        footstep = x+","+y;
+        if (front && (hasOwnProperty ? footsteps.hasOwnProperty(footstep) : (footsteps[footstep] !== undefined)))
+          done = true;
+        if (!front)
+          footsteps[footstep] = d;
+      }
+      v1[k] = x;
+      v_map1[d][x+","+y] = true;
+      if (done) {
+        // Front path ran over reverse path.
+        v_map2 = v_map2.slice(0, footsteps[footstep]+1);
+        var a = diff_path1(v_map1, text1.substring(0, x), text2.substring(0, y));
+        return a.concat(diff_path2(v_map2, text1.substring(x), text2.substring(y)));
+      }
+    }
+
+    // Walk the reverse path one step.
+    v_map2[d] = new Object();
+    for (var k=-d; k<=d; k+=2) {
+      if (k == -d || k != d && v2[k-1] < v2[k+1])
+        x = v2[k+1];
+      else
+        x = v2[k-1]+1;
+      y = x - k;
+      footstep = (text1.length-x)+","+(text2.length-y);
+      if (!front && (hasOwnProperty ? footsteps.hasOwnProperty(footstep) : (footsteps[footstep] !== undefined)))
+        done = true;
+      if (front)
+        footsteps[footstep] = d;
+      while (!done && x < text1.length && y < text2.length && text1.charAt(text1.length-x-1) == text2.charAt(text2.length-y-1)) {
+        x++; y++;
+        footstep = (text1.length-x)+","+(text2.length-y);
+        if (!front && (hasOwnProperty ? footsteps.hasOwnProperty(footstep) : (footsteps[footstep] !== undefined)))
+          done = true;
+        if (front)
+          footsteps[footstep] = d;
+      }
+      v2[k] = x;
+      v_map2[d][x+","+y] = true;
+      if (done) {
+        // Reverse path ran over front path.
+        v_map1 = v_map1.slice(0, footsteps[footstep]+1);
+        var a = diff_path1(v_map1, text1.substring(0, text1.length-x), text2.substring(0, text2.length-y));
+        return a.concat(diff_path2(v_map2, text1.substring(text1.length-x), text2.substring(text2.length-y)));
+      }
+    }
+  }
+  // Number of diffs equals number of characters, no commonality at all.
+  return null;
+}
+
+
+function diff_path1(v_map, text1, text2) {
+  // Work from the middle back to the start to determine the path.
+  var path = [];
+  var x = text1.length;
+  var y = text2.length;
+  var last_op = null;
+  for (var d=v_map.length-2; d>=0; d--) {
+    while(1) {
+      if (v_map[d].hasOwnProperty ? v_map[d].hasOwnProperty((x-1)+","+y) : (v_map[d][(x-1)+","+y] !== undefined)) {
+        x--;
+        if (last_op === -1)
+          path[0][1] = text1.charAt(x) + path[0][1];
+        else
+          path.unshift([-1, text1.charAt(x)]);
+        last_op = -1;
+        break;
+      } else if (v_map[d].hasOwnProperty ? v_map[d].hasOwnProperty(x+","+(y-1)) : (v_map[d][x+","+(y-1)] !== undefined)) {
+        y--;
+        if (last_op === 1)
+          path[0][1] = text2.charAt(y) + path[0][1];
+        else
+          path.unshift([1, text2.charAt(y)]);
+        last_op = 1;
+        break;
+      } else {
+        x--;
+        y--;
+        //if (text1.charAt(x) != text2.charAt(y))
+        //  return alert("No diagonal.  Can't happen. (diff_path1)");
+        if (last_op === 0)
+          path[0][1] = text1.charAt(x) + path[0][1];
+        else
+          path.unshift([0, text1.charAt(x)]);
+        last_op = 0;
+      }
+    }
+  }
+  return path;
+}
+
+
+function diff_path2(v_map, text1, text2) {
+  // Work from the middle back to the end to determine the path.
+  var path = [];
+  var x = text1.length;
+  var y = text2.length;
+  var last_op = null;
+  for (var d=v_map.length-2; d>=0; d--) {
+    while(1) {
+      if (v_map[d].hasOwnProperty ? v_map[d].hasOwnProperty((x-1)+","+y) : (v_map[d][(x-1)+","+y] !== undefined)) {
+        x--;
+        if (last_op === -1)
+          path[path.length-1][1] += text1.charAt(text1.length-x-1);
+        else
+          path.push([-1, text1.charAt(text1.length-x-1)]);
+        last_op = -1;
+        break;
+      } else if (v_map[d].hasOwnProperty ? v_map[d].hasOwnProperty(x+","+(y-1)) : (v_map[d][x+","+(y-1)] !== undefined)) {
+        y--;
+        if (last_op === 1)
+          path[path.length-1][1] += text2.charAt(text2.length-y-1);
+        else
+          path.push([1, text2.charAt(text2.length-y-1)]);
+        last_op = 1;
+        break;
+      } else {
+        x--;
+        y--;
+        //if (text1.charAt(text1.length-x-1) != text2.charAt(text2.length-y-1))
+        //  return alert("No diagonal.  Can't happen. (diff_path2)");
+        if (last_op === 0)
+          path[path.length-1][1] += text1.charAt(text1.length-x-1);
+        else
+          path.push([0, text1.charAt(text1.length-x-1)]);
+        last_op = 0;
+      }
+    }
+  }
+  return path;
+}
+
+
+function diff_prefix(text1, text2) {
+  // Trim off common prefix
+  var pointermin = 0;
+  var pointermax = Math.min(text1.length, text2.length);
+  var pointermid = pointermax;
+  while(pointermin < pointermid) {
+    if (text1.substring(0, pointermid) == text2.substring(0, pointermid))
+      pointermin = pointermid;
+    else
+      pointermax = pointermid;
+    pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);
+  }
+  var commonprefix = text1.substring(0, pointermid);
+  text1 = text1.substring(pointermid);
+  text2 = text2.substring(pointermid);
+  return [text1, text2, commonprefix];
+}
+
+
+function diff_suffix(text1, text2) {
+  // Trim off common suffix
+  var pointermin = 0;
+  var pointermax = Math.min(text1.length, text2.length);
+  var pointermid = pointermax;
+  while(pointermin < pointermid) {
+    if (text1.substring(text1.length-pointermid) == text2.substring(text2.length-pointermid))
+      pointermin = pointermid;
+    else
+      pointermax = pointermid;
+    pointermid = Math.floor((pointermax - pointermin) / 2 + pointermin);
+  }
+  var commonsuffix = text1.substring(text1.length-pointermid);
+  text1 = text1.substring(0, text1.length-pointermid);
+  text2 = text2.substring(0, text2.length-pointermid);
+  return [text1, text2, commonsuffix];
+}
+
+
+function diff_halfmatch(text1, text2) {
+  // Do the two texts share a substring which is at least half the length of the longer text?
+  var longtext = text1.length > text2.length ? text1 : text2;
+  var shorttext = text1.length > text2.length ? text2 : text1;
+  if (longtext.length < 10 || shorttext.length < 1)
+    return null; // Pointless.
+
+  function diff_halfmatch_i(longtext, shorttext, i) {
+    // Start with a 1/4 length substring at position i as a seed.
+    var seed = longtext.substring(i, i+Math.floor(longtext.length/4));
+    var j = -1;
+    var best_common = '';
+    var best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b;
+    while ((j = shorttext.indexOf(seed, j+1)) != -1) {
+      var my_prefix = diff_prefix(longtext.substring(i), shorttext.substring(j));
+      var my_suffix = diff_suffix(longtext.substring(0, i), shorttext.substring(0, j));
+      if (best_common.length < (my_suffix[2] + my_prefix[2]).length) {
+        best_common = my_suffix[2] + my_prefix[2];
+        best_longtext_a = my_suffix[0];
+        best_longtext_b = my_prefix[0];
+        best_shorttext_a = my_suffix[1];
+        best_shorttext_b = my_prefix[1];
+      }
+    }
+    if (best_common.length >= longtext.length/2)
+      return [best_longtext_a, best_longtext_b, best_shorttext_a, best_shorttext_b, best_common];
+    else
+      return null;
+  }
+
+  // First check if the second quarter is the seed for a half-match.
+  var hm1 = diff_halfmatch_i(longtext, shorttext, Math.ceil(longtext.length/4));
+  // Check again based on the third quarter.
+  var hm2 = diff_halfmatch_i(longtext, shorttext, Math.ceil(longtext.length/2));
+  var hm;
+  if (!hm1 && !hm2)
+    return null;
+  else if (!hm2)
+    hm = hm1;
+  else if (!hm1)
+    hm = hm2;
+  else // Both matched.  Select the longest.
+    hm = hm1[4].length > hm2[4].length ? hm1 : hm2;
+
+  // A half-match was found, sort out the return data.
+  if (text1.length > text2.length) {
+    var text1_a = hm[0];
+    var text1_b = hm[1];
+    var text2_a = hm[2];
+    var text2_b = hm[3];
+  } else {
+    var text2_a = hm[0];
+    var text2_b = hm[1];
+    var text1_a = hm[2];
+    var text1_b = hm[3];
+  }
+  var mid_common = hm[4];
+  return [text1_a, text1_b, text2_a, text2_b, mid_common];
+}
+
+
+function diff_cleanup_semantic(diff) {
+  // Reduce the number of edits by eliminating semantically trivial equalities.
+  var changes = false;
+  var equalities = []; // Stack of indices where equalities are found.
+  var lastequality = null; // Always equal to equalities[equalities.length-1][1]
+  var pointer = 0; // Index of current position.
+  var length_changes1 = 0; // Number of characters that changed prior to the equality.
+  var length_changes2 = 0; // Number of characters that changed after the equality.
+  while (pointer < diff.length) {
+    if (diff[pointer][0] == 0) { // equality found
+      equalities.push(pointer);
+      length_changes1 = length_changes2;
+      length_changes2 = 0;
+      lastequality = diff[pointer][1];
+    } else { // an insertion or deletion
+      length_changes2 += diff[pointer][1].length;
+      if (lastequality != null && (lastequality.length <= length_changes1) && (lastequality.length <= length_changes2)) {
+        //alert("Splitting: '"+lastequality+"'");
+        diff.splice(equalities[equalities.length-1], 0, [-1, lastequality]); // Duplicate record
+        diff[equalities[equalities.length-1]+1][0] = 1; // Change second copy to insert.
+        equalities.pop();  // Throw away the equality we just deleted;
+        equalities.pop();  // Throw away the previous equality;
+        pointer = equalities.length ? equalities[equalities.length-1] : -1;
+        length_changes1 = 0; // Reset the counters.
+        length_changes2 = 0;
+        lastequality = null;
+        changes = true;
+      }
+    }
+    pointer++;
+  }
+
+  if (changes)
+    diff_cleanup_merge(diff);
+}
+
+
+function diff_cleanup_efficiency(diff) {
+  // Reduce the number of edits by eliminating operationally trivial equalities.
+  var changes = false;
+  var equalities = []; // Stack of indices where equalities are found.
+  var lastequality = ''; // Always equal to equalities[equalities.length-1][1]
+  var pointer = 0; // Index of current position.
+  var pre_ins = false; // Is there an insertion operation before the last equality.
+  var pre_del = false; // Is there an deletion operation before the last equality.
+  var post_ins = false; // Is there an insertion operation after the last equality.
+  var post_del = false; // Is there an deletion operation after the last equality.
+  while (pointer < diff.length) {
+    if (diff[pointer][0] == 0) { // equality found
+      if (diff[pointer][1].length < DIFF_EDIT_COST && (post_ins || post_del)) {
+        // Candidate found.
+        equalities.push(pointer);
+        pre_ins = post_ins;
+        pre_del = post_del;
+        lastequality = diff[pointer][1];
+      } else {
+        // Not a candidate, and can never become one.
+        equalities = [];
+        lastequality = '';
+      }
+      post_ins = post_del = false;
+    } else { // an insertion or deletion
+      if (diff[pointer][0] == -1)
+        post_del = true;
+      else
+        post_ins = true;
+      // Five types to be split:
+      // <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>
+      // <ins>A</ins>X<ins>C</ins><del>D</del>
+      // <ins>A</ins><del>B</del>X<ins>C</ins>
+      // <ins>A</del>X<ins>C</ins><del>D</del>
+      // <ins>A</ins><del>B</del>X<del>C</del>
+      if (lastequality && ((pre_ins && pre_del && post_ins && post_del) || ((lastequality.length < DIFF_EDIT_COST/2) && (pre_ins + pre_del + post_ins + post_del) == 3))) {
+        //alert("Splitting: '"+lastequality+"'");
+        diff.splice(equalities[equalities.length-1], 0, [-1, lastequality]); // Duplicate record
+        diff[equalities[equalities.length-1]+1][0] = 1; // Change second copy to insert.
+        equalities.pop();  // Throw away the equality we just deleted;
+        lastequality = '';
+        if (pre_ins && pre_del) {
+          // No changes made which could affect previous entry, keep going.
+          post_ins = post_del = true;
+          equalities = [];
+        } else {
+          equalities.pop();  // Throw away the previous equality;
+          pointer = equalities.length ? equalities[equalities.length-1] : -1;
+          post_ins = post_del = false;
+        }
+        changes = true;
+      }
+    }
+    pointer++;
+  }
+
+  if (changes)
+    diff_cleanup_merge(diff);
+}
+
+
+function diff_cleanup_merge(diff) {
+  // Reorder and merge like edit sections.  Merge equalities.
+  // Any edit section can move as long as it doesn't cross an equality.
+  diff.push([0, '']);  // Add a dummy entry at the end.
+  var pointer = 0;
+  var count_delete = 0;
+  var count_insert = 0;
+  var text_delete = '';
+  var text_insert = '';
+  var record_insert, record_delete;
+  var my_xfix;
+  while(pointer < diff.length) {
+    if (diff[pointer][0] == 1) {
+      count_insert++;
+      text_insert += diff[pointer][1];
+      pointer++;
+    } else if (diff[pointer][0] == -1) {
+      count_delete++;
+      text_delete += diff[pointer][1];
+      pointer++;
+    } else {  // Upon reaching an equality, check for prior redundancies.
+      if (count_delete > 1 || count_insert > 1) {
+        if (count_delete > 1 && count_insert > 1) {
+          // Factor out any common prefixies.
+          my_xfix = diff_prefix(text_insert, text_delete);
+          if (my_xfix[2] != '') {
+            if ((pointer - count_delete - count_insert) > 0 && diff[pointer - count_delete - count_insert - 1][0] == 0) {
+              text_insert = my_xfix[0];
+              text_delete = my_xfix[1];
+              diff[pointer - count_delete - count_insert - 1][1] += my_xfix[2];
+            }
+          }
+          // Factor out any common suffixies.
+          my_xfix = diff_suffix(text_insert, text_delete);
+          if (my_xfix[2] != '') {
+            text_insert = my_xfix[0];
+            text_delete = my_xfix[1];
+            diff[pointer][1] = my_xfix[2] + diff[pointer][1];
+          }
+        }
+        // Delete the offending records and add the merged ones.
+        if (count_delete == 0)
+          diff.splice(pointer - count_delete - count_insert, count_delete + count_insert, [1, text_insert]);
+        else if (count_insert == 0)
+          diff.splice(pointer - count_delete - count_insert, count_delete + count_insert, [-1, text_delete]);
+        else
+          diff.splice(pointer - count_delete - count_insert, count_delete + count_insert, [-1, text_delete], [1, text_insert]);
+        pointer = pointer - count_delete - count_insert + (count_delete ? 1 : 0) + (count_insert ? 1 : 0) + 1;
+      } else if (pointer != 0 && diff[pointer-1][0] == 0) {
+        // Merge this equality with the previous one.
+        diff[pointer-1][1] += diff[pointer][1];
+        diff.splice(pointer, 1);
+      } else {
+        pointer++;
+      }
+      count_insert = 0;
+      count_delete = 0;
+      text_delete = '';
+      text_insert = '';
+    }
+  }
+  if (diff[diff.length-1][1] == '')
+    diff.pop();  // Remove the dummy entry at the end.
+}
+
+
+function diff_addindex(diff) {
+  // Add an index to each tuple, represents where the tuple is located in text2.
+  // e.g. [[-1, 'h', 0], [1, 'c', 0], [0, 'at', 1]]
+  var i = 0;
+  for (var x=0; x<diff.length; x++) {
+    diff[x].push(i);
+    if (diff[x][0] != -1)
+      i += diff[x][1].length;
+  }
+}
+
+
+function diff_xindex(diff, loc) {
+  // loc is a location in text1, compute and return the equivalent location in text2.
+  // e.g. "The cat" vs "The big cat", 1->1, 5->8
+  var chars1 = 0;
+  var chars2 = 0;
+  var last_chars1 = 0;
+  var last_chars2 = 0;
+  for (var x=0; x<diff.length; x++) {
+    if (diff[x][0] != 1) // Equality or deletion.
+      chars1 += diff[x][1].length;
+    if (diff[x][0] != -1) // Equality or insertion.
+      chars2 += diff[x][1].length;
+    if (chars1 > loc) // Overshot the location.
+      break;
+    last_chars1 = chars1;
+    last_chars2 = chars2;
+  }
+  if (diff.length != x && diff[x][0] == -1) // The location was deleted.
+    return last_chars2;
+  // Add the remaining character length.
+  return last_chars2 + (loc - last_chars1);
+}
+
+
+function diff_prettyhtml(diff) {
+  // Convert a diff array into a pretty HTML report.
+  diff_addindex(diff);
+  var html = '';
+  for (var x=0; x<diff.length; x++) {
+    var m = diff[x][0]; // Mode (-1=delete, 0=copy, 1=add)
+    var t = diff[x][1]; // Text of change.
+    var i = diff[x][2]; // Index of change.
+    t = t.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
+    t = t.replace(/\n/g, "&para;<BR>");
+    if (m == -1)
+      html += "<DEL STYLE='background:#FFE6E6;' TITLE='i="+i+"'>"+t+"</DEL>";
+    else if (m == 1)
+      html += "<INS STYLE='background:#E6FFE6;' TITLE='i="+i+"'>"+t+"</INS>";
+    else
+      html += "<SPAN TITLE='i="+i+"'>"+t+"</SPAN>";
+  }
+  return html;
+}
+
+
+  //////////////////////////////////////////////////////////////////////
+ //  Match                                                           //
+//////////////////////////////////////////////////////////////////////
+
+
+function match_getmaxbits() {
+  // Compute the number of bits in an int.
+  // The normal answer for JavaScript is 32.
+  var maxbits = 0;
+  var oldi = 1;
+  var newi = 2;
+  while (oldi != newi) {
+    maxbits++;
+    oldi = newi;
+    newi = newi << 1;
+  }
+  return maxbits;
+}
+var MATCH_MAXBITS = match_getmaxbits();
+
+
+function match_main(text, pattern, loc) {
+  // Locate the best instance of 'pattern' in 'text' near 'loc'.
+  loc = Math.max(0, Math.min(loc, text.length-pattern.length));
+  if (text == pattern) {
+    // Shortcut (potentially not guaranteed by the algorithm)
+    return 0;
+  } else if (text.length == 0) {
+    // Nothing to match.
+    return null;
+  } else if (text.substring(loc, loc + pattern.length) == pattern) {
+    // Perfect match at the perfect spot!  (Includes case of null pattern)
+    return loc;
+  } else {
+    // Do a fuzzy compare.
+    var match = match_bitap(text, pattern, loc);
+    return match;
+  }
+}
+
+
+function match_bitap(text, pattern, loc) {
+  // Locate the best instance of 'pattern' in 'text' near 'loc' using the Bitap algorithm.
+  if (pattern.length > MATCH_MAXBITS)
+    return alert("Pattern too long for this browser.");
+
+  // Initialise the alphabet.
+  var s = match_alphabet(pattern);
+
+  var score_text_length = text.length;
+  // Coerce the text length between reasonable maximums and minimums.
+  score_text_length = Math.max(score_text_length, MATCH_MINLENGTH);
+  score_text_length = Math.min(score_text_length, MATCH_MAXLENGTH);
+
+  function match_bitap_score (e, x) {
+    // Compute and return the score for a match with e errors and x location.
+    var d = Math.abs(loc-x);
+    return (e / pattern.length / MATCH_BALANCE) + (d / score_text_length / (1.0 - MATCH_BALANCE));
+  }
+
+  // Highest score beyond which we give up.
+  var score_threshold = MATCH_THRESHOLD;
+  // Is there a nearby exact match? (speedup)
+  var best_loc = text.indexOf(pattern, loc);
+  if (best_loc != -1)
+    score_threshold = Math.min(match_bitap_score(0, best_loc), score_threshold);
+  // What about in the other direction? (speedup)
+  best_loc = text.lastIndexOf(pattern, loc+pattern.length);
+  if (best_loc != -1)
+    score_threshold = Math.min(match_bitap_score(0, best_loc), score_threshold);
+
+  // Initialise the bit arrays.
+  var r = Array();
+  var d = -1;
+  var matchmask = Math.pow(2, pattern.length-1);
+  best_loc = null;
+
+  var bin_min, bin_mid;
+  var bin_max = Math.max(loc+loc, text.length);
+  var last_rd;
+  for (var d=0; d<pattern.length; d++) {
+    // Scan for the best match; each iteration allows for one more error.
+    var rd = Array(text.length);
+
+    // Run a binary search to determine how far from 'loc' we can stray at this error level.
+    bin_min = loc;
+    bin_mid = bin_max;
+    while(bin_min < bin_mid) {
+      if (match_bitap_score(d, bin_mid) < score_threshold)
+        bin_min = bin_mid;
+      else
+        bin_max = bin_mid;
+      bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min);
+    }
+    bin_max = bin_mid; // Use the result from this iteration as the maximum for the next.
+    var start = Math.max(0, loc - (bin_mid - loc) - 1);
+    var finish = Math.min(text.length-1, pattern.length + bin_mid);
+
+    if (text.charAt(finish) == pattern.charAt(pattern.length-1))
+      rd[finish] = Math.pow(2, d+1)-1;
+    else
+      rd[finish] = Math.pow(2, d)-1;
+    for (var j=finish-1; j>=start; j--) {
+      // The alphabet (s) is a sparse hash, so the following lines generate warnings.
+      if (d == 0) // First pass: exact match.
+        rd[j] = ((rd[j+1] << 1) | 1) & s[text.charAt(j)];
+      else // Subsequent passes: fuzzy match.
+        rd[j] = ((rd[j+1] << 1) | 1) & s[text.charAt(j)] | ((last_rd[j+1] << 1) | 1) | ((last_rd[j] << 1) | 1) | last_rd[j+1];
+      if (rd[j] & matchmask) {
+        var score = match_bitap_score(d, j);
+        // This match will almost certainly be better than any existing match.  But check anyway.
+        if (score <= score_threshold) {
+          // Told you so.
+          score_threshold = score;
+          best_loc = j;
+          if (j > loc) {
+            // When passing loc, don't exceed our current distance from loc.
+            start = Math.max(0, loc - (j - loc));
+          } else {
+            // Already passed loc, downhill from here on in.
+            break;
+          }
+        }
+      }
+    }
+    if (match_bitap_score(d+1, loc) > score_threshold) // No hope for a (better) match at greater error levels.
+      break;
+    last_rd = rd;
+  }
+  return best_loc;
+}
+
+
+function match_alphabet(pattern) {
+  // Initialise the alphabet for the Bitap algorithm.
+  var s = Object();
+  for (var i=0; i<pattern.length; i++)
+    s[pattern.charAt(i)] = 0;
+  for (var i=0; i<pattern.length; i++)
+    s[pattern.charAt(i)] |= Math.pow(2, pattern.length-i-1);
+  return s;
+}
+
+
+  //////////////////////////////////////////////////////////////////////
+ //  Patch                                                           //
+//////////////////////////////////////////////////////////////////////
+
+
+function patch_obj() {
+  // Constructor for a patch object.
+  this.diffs = [];
+  this.start1 = null;
+  this.start2 = null;
+  this.length1 = 0;
+  this.length2 = 0;
+
+  this.toString = function() {
+    // Emmulate GNU diff's format.
+    // Header: @@ -382,8 +481,9 @@
+    // Indicies are printed as 1-based, not 0-based.
+    var coords1, coords2;
+    if (this.length1 == 0)
+      coords1 = this.start1+",0";
+    else if (this.length1 == 1)
+      coords1 = this.start1+1;
+    else
+      coords1 = (this.start1+1)+","+this.length1;
+    if (this.length2 == 0)
+      coords2 = this.start2+",0";
+    else if (this.length2 == 1)
+      coords2 = this.start2+1;
+    else
+      coords2 = (this.start2+1)+","+this.length2;
+    var txt = "@@ -"+coords1+" +"+coords2+" @@\n";
+    // Escape the body of the patch with %xx notation.
+    for (var x=0; x<this.diffs.length; x++)
+      txt += ("- +".charAt(this.diffs[x][0]+1)) + encodeURI(this.diffs[x][1]) + "\n";
+    return txt.replace(/%20/g, ' ');
+  }
+
+  this.text1 = function() {
+    // Compute and return the source text (all equalities and deletions).
+    var txt = '';
+    for (var x=0; x<this.diffs.length; x++)
+      if (this.diffs[x][0] == 0 || this.diffs[x][0] == -1)
+        txt += this.diffs[x][1];
+    return txt;
+  }
+
+  this.text2 = function() {
+    // Compute and return the destination text (all equalities and insertions).
+    var txt = '';
+    for (var x=0; x<this.diffs.length; x++)
+      if (this.diffs[x][0] == 0 || this.diffs[x][0] == 1)
+        txt += this.diffs[x][1];
+    return txt;
+  }
+}
+
+
+function patch_addcontext(patch, text) {
+  var pattern = text.substring(patch.start2, patch.start2+patch.length1);
+  var padding = 0;
+  // Increase the context until we're unique (but don't let the pattern expand beyond MATCH_MAXBITS).
+  while (text.indexOf(pattern) != text.lastIndexOf(pattern) && pattern.length < MATCH_MAXBITS-PATCH_MARGIN-PATCH_MARGIN) {
+    padding += PATCH_MARGIN;
+    pattern = text.substring(patch.start2 - padding, patch.start2+patch.length1 + padding);
+  }
+  // Add one chunk for good luck.
+  padding += PATCH_MARGIN;
+  // Add the prefix.
+  var prefix = text.substring(patch.start2 - padding, patch.start2);
+  if (prefix != '')
+    patch.diffs.unshift([0, prefix]);
+  // Add the suffix
+  var suffix = text.substring(patch.start2+patch.length1, patch.start2+patch.length1 + padding);
+  if (suffix != '')
+    patch.diffs.push([0, suffix]);
+
+  // Roll back the start points.
+  patch.start1 -= prefix.length;
+  patch.start2 -= prefix.length;
+  // Extend the lengths.
+  patch.length1 += prefix.length + suffix.length;
+  patch.length2 += prefix.length + suffix.length;
+}
+
+
+function patch_make(text1, text2, diff) {
+  // Compute a list of patches to turn text1 into text2.
+  // Use diff if provided, otherwise compute it ourselves.
+  if (typeof diff == 'undefined') {
+    diff = diff_main(text1, text2, true);
+    if (diff.length > 2) {
+      diff_cleanup_semantic(diff);
+      diff_cleanup_efficiency(diff);
+    }
+  }
+  if (diff.length == 0)
+    return []; // Get rid of the null case.
+  var patches = [];
+  var patch = new patch_obj();
+  var char_count1 = 0; // Number of characters into the text1 string.
+  var char_count2 = 0; // Number of characters into the text2 string.
+  var last_type = null;
+  var prepatch_text = text1; // Recreate the patches to determine context info.
+  var postpatch_text = text1;
+  for (var x=0; x<diff.length; x++) {
+    var diff_type = diff[x][0];
+    var diff_text = diff[x][1];
+
+    if (patch.diffs.length == 0 && diff_type != 0) {
+      // A new patch starts here.
+      patch.start1 = char_count1;
+      patch.start2 = char_count2;
+    }
+
+    if (diff_type == 1) {
+      // Insertion
+      patch.diffs.push(diff[x]);
+      patch.length2 += diff_text.length;
+      postpatch_text = postpatch_text.substring(0, char_count2) + diff_text + postpatch_text.substring(char_count2);
+    } else if (diff_type == -1) {
+      // Deletion.
+      patch.length1 += diff_text.length;
+      patch.diffs.push(diff[x]);
+      postpatch_text = postpatch_text.substring(0, char_count2) + postpatch_text.substring(char_count2 + diff_text.length);
+    } else if (diff_type == 0 && diff_text.length <= 2*PATCH_MARGIN && patch.diffs.length != 0 && diff.length != x+1) {
+      // Small equality inside a patch.
+      patch.diffs.push(diff[x]);
+      patch.length1 += diff_text.length;
+      patch.length2 += diff_text.length;
+    }
+
+    last_type = diff_type;
+    if (diff_type == 0 && diff_text.length >= 2*PATCH_MARGIN) {
+      // Time for a new patch.
+      if (patch.diffs.length != 0) {
+        patch_addcontext(patch, prepatch_text);
+        patches.push(patch);
+        var patch = new patch_obj();
+        last_type = null;
+        prepatch_text = postpatch_text;
+      }
+    }
+
+    // Update the current character count.
+    if (diff_type != 1)
+      char_count1 += diff_text.length;
+    if (diff_type != -1)
+      char_count2 += diff_text.length;
+  }
+  // Pick up the leftover patch if not empty.
+  if (patch.diffs.length != 0) {
+    patch_addcontext(patch, prepatch_text);
+    patches.push(patch);
+  }
+
+  return patches;
+}
+
+
+function patch_apply(patches, text) {
+  // Merge a set of patches onto the text.
+  // Return a patched text, as well as a list of true/false values indicating which patches were applied.
+  patch_splitmax(patches);
+  var results = [];
+  var delta = 0;
+  var expected_loc, start_loc;
+  var text1, text2;
+  var diff, mod, index1, index2;
+  for (var x=0; x<patches.length; x++) {
+    expected_loc = patches[x].start2 + delta;
+    text1 = patches[x].text1();
+    start_loc = match_main(text, text1, expected_loc);
+    if (start_loc == null) {
+      // No match found.  :(
+      results.push(false);
+    } else {
+      // Found a match.  :)
+      results.push(true);
+      delta = start_loc - expected_loc;
+      text2 = text.substring(start_loc, start_loc + text1.length);
+      if (text1 == text2) {
+        // Perfect match, just shove the replacement text in.
+        text = text.substring(0, start_loc) + patches[x].text2() + text.substring(start_loc + text1.length);
+      } else {
+        // Imperfect match.  Run a diff to get a framework of equivalent indicies.
+        diff = diff_main(text1, text2, false);
+        index1 = 0;
+        for (var y=0; y<patches[x].diffs.length; y++) {
+          mod = patches[x].diffs[y];
+          if (mod[0] != 0)
+            index2 = diff_xindex(diff, index1);
+          if (mod[0] == 1) // Insertion
+            text = text.substring(0, start_loc + index2) + mod[1] + text.substring(start_loc + index2);
+          else if (mod[0] == -1) // Deletion
+            text = text.substring(0, start_loc + index2) + text.substring(start_loc + diff_xindex(diff, index1 + mod[1].length));
+          if (mod[0] != -1)
+            index1 += mod[1].length;
+        }
+      }
+    }
+  }
+  return [text, results];
+}
+
+
+function patch_splitmax(patches) {
+  // Look through the patches and break up any which are longer than the maximum limit of the match algorithm.
+  var bigpatch, patch, patch_size, start1, start2, diff_type, diff_text, precontext, postcontext, empty;
+  for (var x=0; x<patches.length; x++) {
+    if (patches[x].length1 > MATCH_MAXBITS) {
+      bigpatch = patches[x];
+      // Remove the big old patch.
+      patches.splice(x, 1);
+      patch_size = MATCH_MAXBITS;
+      start1 = bigpatch.start1;
+      start2 = bigpatch.start2;
+      precontext = '';
+      while (bigpatch.diffs.length != 0) {
+        // Create one of several smaller patches.
+        patch = new patch_obj();
+        empty = true;
+        patch.start1 = start1 - precontext.length;
+        patch.start2 = start2 - precontext.length;
+        if (precontext  != '') {
+          patch.length1 = patch.length2 = precontext.length;
+          patch.diffs.push([0, precontext]);
+        }
+        while (bigpatch.diffs.length != 0 && patch.length1 < patch_size - PATCH_MARGIN) {
+          diff_type = bigpatch.diffs[0][0];
+          diff_text = bigpatch.diffs[0][1];
+          if (diff_type == 1) {
+            // Insertions are harmless.
+            patch.length2 += diff_text.length;
+            start2 += diff_text.length;
+            patch.diffs.push(bigpatch.diffs.shift());
+            empty = false;
+          } else {
+            // Deletion or equality.  Only take as much as we can stomach.
+            diff_text = diff_text.substring(0, patch_size - patch.length1 - PATCH_MARGIN);
+            patch.length1 += diff_text.length;
+            start1 += diff_text.length;
+            if (diff_type == 0) {
+              patch.length2 += diff_text.length;
+              start2 += diff_text.length;
+            } else {
+              empty = false;
+            }
+            patch.diffs.push([diff_type, diff_text]);
+            if (diff_text == bigpatch.diffs[0][1])
+              bigpatch.diffs.shift();
+            else
+              bigpatch.diffs[0][1] = bigpatch.diffs[0][1].substring(diff_text.length);
+          }
+        }
+        // Compute the head context for the next patch.
+        precontext = patch.text2();
+        precontext = precontext.substring(precontext.length - PATCH_MARGIN);
+        // Append the end context for this patch.
+        postcontext = bigpatch.text1().substring(0, PATCH_MARGIN);
+        if (postcontext  != '') {
+          patch.length1 += postcontext.length;
+          patch.length2 += postcontext.length;
+          if (patch.diffs.length > 0 && patch.diffs[patch.diffs.length-1][0] == 0)
+            patch.diffs[patch.diffs.length-1][1] += postcontext;
+          else
+            patch.diffs.push([0, postcontext]);
+        }
+        if (!empty)
+          patches.splice(x++, 0, patch);
+      }
+    }
+  }
+}
+
+
+function patch_totext(patches) {
+  // Take a list of patches and return a textual representation.
+  var text = '';
+  for (var x=0; x<patches.length; x++)
+    text += patches[x];
+  return text;
+}
+
+
+function patch_fromtext(text) {
+  // Take a textual representation of patches and return a list of patch objects.
+  var patches = [];
+  text = text.split('\n');
+  var patch, m, chars1, chars2, sign, line;
+  while (text.length != 0) {
+    m = text[0].match(/^@@ -(\d+),?(\d*) \+(\d+),?(\d*) @@$/);
+    if (!m)
+      return alert("Invalid patch string:\n"+text[0]);
+    patch = new patch_obj();
+    patches.push(patch);
+    patch.start1 = parseInt(m[1]);
+    if (m[2] == '') {
+      patch.start1--;
+      patch.length1 = 1;
+    } else if (m[2] == '0') {
+      patch.length1 = 0;
+    } else {
+      patch.start1--;
+      patch.length1 = parseInt(m[2]);
+    }
+
+    patch.start2 = parseInt(m[3]);
+    if (m[4] == '') {
+      patch.start2--;
+      patch.length2 = 1;
+    } else if (m[4] == '0') {
+      patch.length2 = 0;
+    } else {
+      patch.start2--;
+      patch.length2 = parseInt(m[4]);
+    }
+    text.shift();
+
+    while (text.length != 0) {
+      sign = text[0].charAt(0);
+      line = decodeURIComponent(text[0].substring(1));
+      if (sign == '-') {
+        // Deletion.
+        patch.diffs.push([-1, line]);
+      } else if (sign == '+') {
+        // Insertion.
+        patch.diffs.push([1, line]);
+      } else if (sign == ' ') {
+        // Minor equality.
+        patch.diffs.push([0, line]);
+      } else if (sign == '@') {
+        // Start of next patch.
+        break;
+      } else if (sign == '') {
+        // Blank line?  Whatever.
+      } else {
+        // WTF?
+        return alert("Invalid patch mode: '"+sign+"'\n"+line);
+      }
+      text.shift();
+    }
+  }
+  return patches;
+}
+
+// EOF
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/devkit/langs/en.js
@@ -1,1 +1,24 @@
+// UK lang variables
 
+tinyMCE.addToLang('devkit',{
+title : 'TinyMCE Development Kit',
+info_tab : 'Info',
+settings_tab : 'Settings',
+log_tab : 'Log',
+content_tab : 'Content',
+command_states_tab : 'Commands',
+undo_redo_tab : 'Undo/Redo',
+misc_tab : 'Misc',
+filter : 'Filter:',
+clear_log : 'Clear log',
+refresh : 'Refresh',
+info_help : 'Press Refresh to view info.',
+settings_help : 'Press Refresh to display the settings array for each TinyMCE_Control instance.',
+content_help : 'Press Refresh to display the raw and cleaned HTML content for each TinyMCE_Control instance.',
+command_states_help : 'Press Refresh to display the current command states from inst.queryCommandState. This list will also mark unsupported commands.',
+undo_redo_help : 'Press Refresh to display the global and instance undo/redo levels.',
+misc_help : 'Here are various tools for debugging and development purposes.',
+debug_events : 'Debug events',
+undo_diff : 'Diff undo levels'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/directionality/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.Directionality',{init:function(ed,url){var t=this;t.editor=ed;ed.addCommand('mceDirectionLTR',function(){var e=ed.dom.getParent(ed.selection.getNode(),ed.dom.isBlock);if(e){if(ed.dom.getAttrib(e,"dir")!="ltr")ed.dom.setAttrib(e,"dir","ltr");else ed.dom.setAttrib(e,"dir","");}ed.nodeChanged();});ed.addCommand('mceDirectionRTL',function(){var e=ed.dom.getParent(ed.selection.getNode(),ed.dom.isBlock);if(e){if(ed.dom.getAttrib(e,"dir")!="rtl")ed.dom.setAttrib(e,"dir","rtl");else ed.dom.setAttrib(e,"dir","");}ed.nodeChanged();});ed.addButton('ltr',{title:'directionality.ltr_desc',cmd:'mceDirectionLTR'});ed.addButton('rtl',{title:'directionality.rtl_desc',cmd:'mceDirectionRTL'});ed.onNodeChange.add(t._nodeChange,t);},getInfo:function(){return{longname:'Directionality',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_nodeChange:function(ed,cm,n){var dom=ed.dom,dir;n=dom.getParent(n,dom.isBlock);if(!n){cm.setDisabled('ltr',1);cm.setDisabled('rtl',1);return;}dir=dom.getAttrib(n,'dir');cm.setActive('ltr',dir=="ltr");cm.setDisabled('ltr',0);cm.setActive('rtl',dir=="rtl");cm.setDisabled('rtl',0);}});tinymce.PluginManager.add('directionality',tinymce.plugins.Directionality);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/directionality/editor_plugin_src.js
@@ -1,1 +1,79 @@
+/**
+ * $Id: editor_plugin_src.js 520 2008-01-07 16:30:32Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.Directionality', {
+		init : function(ed, url) {
+			var t = this;
+
+			t.editor = ed;
+
+			ed.addCommand('mceDirectionLTR', function() {
+				var e = ed.dom.getParent(ed.selection.getNode(), ed.dom.isBlock);
+
+				if (e) {
+					if (ed.dom.getAttrib(e, "dir") != "ltr")
+						ed.dom.setAttrib(e, "dir", "ltr");
+					else
+						ed.dom.setAttrib(e, "dir", "");
+				}
+
+				ed.nodeChanged();
+			});
+
+			ed.addCommand('mceDirectionRTL', function() {
+				var e = ed.dom.getParent(ed.selection.getNode(), ed.dom.isBlock);
+
+				if (e) {
+					if (ed.dom.getAttrib(e, "dir") != "rtl")
+						ed.dom.setAttrib(e, "dir", "rtl");
+					else
+						ed.dom.setAttrib(e, "dir", "");
+				}
+
+				ed.nodeChanged();
+			});
+
+			ed.addButton('ltr', {title : 'directionality.ltr_desc', cmd : 'mceDirectionLTR'});
+			ed.addButton('rtl', {title : 'directionality.rtl_desc', cmd : 'mceDirectionRTL'});
+
+			ed.onNodeChange.add(t._nodeChange, t);
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Directionality',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		},
+
+		// Private methods
+
+		_nodeChange : function(ed, cm, n) {
+			var dom = ed.dom, dir;
+
+			n = dom.getParent(n, dom.isBlock);
+			if (!n) {
+				cm.setDisabled('ltr', 1);
+				cm.setDisabled('rtl', 1);
+				return;
+			}
+
+			dir = dom.getAttrib(n, 'dir');
+			cm.setActive('ltr', dir == "ltr");
+			cm.setDisabled('ltr', 0);
+			cm.setActive('rtl', dir == "rtl");
+			cm.setDisabled('rtl', 0);
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('directionality', tinymce.plugins.Directionality);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/directionality/images/ltr.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/directionality/images/rtl.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/directionality/langs/en.js
@@ -1,1 +1,7 @@
+// UK lang variables
 
+tinyMCE.addToLang('',{
+directionality_ltr_desc : 'Direction left to right',
+directionality_rtl_desc : 'Direction right to left'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/directionality/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/emotions/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.EmotionsPlugin',{init:function(ed,url){ed.addCommand('mceEmotion',function(){ed.windowManager.open({file:url+'/emotions.htm',width:250+parseInt(ed.getLang('emotions.delta_width',0)),height:160+parseInt(ed.getLang('emotions.delta_height',0)),inline:1},{plugin_url:url});});ed.addButton('emotions',{title:'emotions.emotions_desc',cmd:'mceEmotion'});},getInfo:function(){return{longname:'Emotions',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.PluginManager.add('emotions',tinymce.plugins.EmotionsPlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/emotions/editor_plugin_src.js
@@ -1,1 +1,40 @@
+/**
+ * $Id: editor_plugin_src.js 520 2008-01-07 16:30:32Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.EmotionsPlugin', {
+		init : function(ed, url) {
+			// Register commands
+			ed.addCommand('mceEmotion', function() {
+				ed.windowManager.open({
+					file : url + '/emotions.htm',
+					width : 250 + parseInt(ed.getLang('emotions.delta_width', 0)),
+					height : 160 + parseInt(ed.getLang('emotions.delta_height', 0)),
+					inline : 1
+				}, {
+					plugin_url : url
+				});
+			});
+
+			// Register buttons
+			ed.addButton('emotions', {title : 'emotions.emotions_desc', cmd : 'mceEmotion'});
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Emotions',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('emotions', tinymce.plugins.EmotionsPlugin);
+})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/emotions/emotions.htm
@@ -1,1 +1,42 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#emotions_dlg.title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="js/emotions.js"></script>
+	<base target="_self" />
+</head>
+<body style="display: none">
+	<div align="center">
+		<div class="title">{#emotions_dlg.title}:<br /><br /></div>
 
+		<table border="0" cellspacing="0" cellpadding="4">
+		  <tr>
+			<td><a href="javascript:EmotionsDialog.insert('smiley-cool.gif','emotions_dlg.cool');"><img src="img/smiley-cool.gif" width="18" height="18" border="0" alt="{#emotions_dlg.cool}" title="{#emotions_dlg.cool}" /></a></td>
+			<td><a href="javascript:EmotionsDialog.insert('smiley-cry.gif','emotions_dlg.cry');"><img src="img/smiley-cry.gif" width="18" height="18" border="0" alt="{#emotions_dlg.cry}" title="{#emotions_dlg.cry}" /></a></td>
+			<td><a href="javascript:EmotionsDialog.insert('smiley-embarassed.gif','emotions_dlg.embarassed');"><img src="img/smiley-embarassed.gif" width="18" height="18" border="0" alt="{#emotions_dlg.embarassed}" title="{#emotions_dlg.embarassed}" /></a></td>
+			<td><a href="javascript:EmotionsDialog.insert('smiley-foot-in-mouth.gif','emotions_dlg.foot_in_mouth');"><img src="img/smiley-foot-in-mouth.gif" width="18" height="18" border="0" alt="{#emotions_dlg.foot_in_mouth}" title="{#emotions_dlg.foot_in_mouth}" /></a></td>
+		  </tr>
+		  <tr>
+			<td><a href="javascript:EmotionsDialog.insert('smiley-frown.gif','emotions_dlg.frown');"><img src="img/smiley-frown.gif" width="18" height="18" border="0" alt="{#emotions_dlg.frown}" title="{#emotions_dlg.frown}" /></a></td>
+			<td><a href="javascript:EmotionsDialog.insert('smiley-innocent.gif','emotions_dlg.innocent');"><img src="img/smiley-innocent.gif" width="18" height="18" border="0" alt="{#emotions_dlg.innocent}" title="{#emotions_dlg.innocent}" /></a></td>
+			<td><a href="javascript:EmotionsDialog.insert('smiley-kiss.gif','emotions_dlg.kiss');"><img src="img/smiley-kiss.gif" width="18" height="18" border="0" alt="{#emotions_dlg.kiss}" title="{#emotions_dlg.kiss}" /></a></td>
+			<td><a href="javascript:EmotionsDialog.insert('smiley-laughing.gif','emotions_dlg.laughing');"><img src="img/smiley-laughing.gif" width="18" height="18" border="0" alt="{#emotions_dlg.laughing}" title="{#emotions_dlg.laughing}" /></a></td>
+		  </tr>
+		  <tr>
+			<td><a href="javascript:EmotionsDialog.insert('smiley-money-mouth.gif','emotions_dlg.money_mouth');"><img src="img/smiley-money-mouth.gif" width="18" height="18" border="0" alt="{#emotions_dlg.money_mouth}" title="{#emotions_dlg.money_mouth}" /></a></td>
+			<td><a href="javascript:EmotionsDialog.insert('smiley-sealed.gif','emotions_dlg.sealed');"><img src="img/smiley-sealed.gif" width="18" height="18" border="0" alt="{#emotions_dlg.sealed}" title="{#emotions_dlg.sealed}" /></a></td>
+			<td><a href="javascript:EmotionsDialog.insert('smiley-smile.gif','emotions_dlg.smile');"><img src="img/smiley-smile.gif" width="18" height="18" border="0" alt="{#emotions_dlg.smile}" title="{#emotions_dlg.smile}" /></a></td>
+			<td><a href="javascript:EmotionsDialog.insert('smiley-surprised.gif','emotions_dlg.surprised');"><img src="img/smiley-surprised.gif" width="18" height="18" border="0" alt="{#emotions_dlg.surprised}" title="{#emotions_dlg.surprised}" /></a></td>
+		  </tr>
+		  <tr>
+			<td><a href="javascript:EmotionsDialog.insert('smiley-tongue-out.gif','emotions_dlg.tongue_out');"><img src="img/smiley-tongue-out.gif" width="18" height="18" border="0" alt="{#emotions_dlg.tongue-out}" title="{#emotions_dlg.tongue_out}" /></a></td>
+			<td><a href="javascript:EmotionsDialog.insert('smiley-undecided.gif','emotions_dlg.undecided');"><img src="img/smiley-undecided.gif" width="18" height="18" border="0" alt="{#emotions_dlg.undecided}" title="{#emotions_dlg.undecided}" /></a></td>
+			<td><a href="javascript:EmotionsDialog.insert('smiley-wink.gif','emotions_dlg.wink');"><img src="img/smiley-wink.gif" width="18" height="18" border="0" alt="{#emotions_dlg.wink}" title="{#emotions_dlg.wink}" /></a></td>
+			<td><a href="javascript:EmotionsDialog.insert('smiley-yell.gif','emotions_dlg.yell');"><img src="img/smiley-yell.gif" width="18" height="18" border="0" alt="{#emotions_dlg.yell}" title="{#emotions_dlg.yell}" /></a></td>
+		  </tr>
+		</table>
+	</div>
+</body>
+</html>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/images/emotions.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/emotions/images/readme.txt
@@ -1,1 +1,3 @@
+These emotions where taken from Mozilla Thunderbird.
+I hope they don't get angry if I use them here after all this is a open source project aswell.
 

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-cool.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-cry.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-embarassed.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-foot-in-mouth.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-frown.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-innocent.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-kiss.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-laughing.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-money-mouth.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-sealed.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-smile.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-surprised.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-tongue-out.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-undecided.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-wink.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/images/smiley-yell.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-cool.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-cry.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-embarassed.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-frown.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-innocent.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-kiss.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-laughing.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-sealed.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-smile.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-surprised.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-undecided.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-wink.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-yell.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/emotions/js/emotions.js
@@ -1,1 +1,23 @@
+tinyMCEPopup.requireLangPack();
 
+var EmotionsDialog = {
+	init : function(ed) {
+		tinyMCEPopup.resizeToInnerSize();
+	},
+
+	insert : function(file, title) {
+		var ed = tinyMCEPopup.editor, dom = ed.dom;
+
+		tinyMCEPopup.execCommand('mceInsertContent', false, dom.createHTML('img', {
+			src : tinyMCEPopup.getWindowArg('plugin_url') + '/img/' + file,
+			alt : ed.getLang(title),
+			title : ed.getLang(title),
+			border : 0
+		}));
+
+		tinyMCEPopup.close();
+	}
+};
+
+tinyMCEPopup.onInit.add(EmotionsDialog.init, EmotionsDialog);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/emotions/jscripts/functions.js
@@ -1,1 +1,22 @@
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+}
 
+function insertEmotion(file_name, title) {
+	title = tinyMCE.getLang(title);
+
+	if (title == null)
+		title = "";
+
+	// XML encode
+	title = title.replace(/&/g, '&amp;');
+	title = title.replace(/\"/g, '&quot;');
+	title = title.replace(/</g, '&lt;');
+	title = title.replace(/>/g, '&gt;');
+
+	var html = '<img src="' + tinyMCE.baseURL + "/plugins/emotions/images/" + file_name + '" mce_src="' + tinyMCE.baseURL + "/plugins/emotions/images/" + file_name + '" border="0" alt="' + title + '" title="' + title + '" />';
+
+	tinyMCE.execCommand('mceInsertContent', false, html);
+	tinyMCEPopup.close();
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/emotions/langs/en.js
@@ -1,1 +1,23 @@
+// UK lang variables
 
+tinyMCE.addToLang('emotions',{
+title : 'Insert emotion',
+desc : 'Emotions',
+cool : 'Cool',
+cry : 'Cry',
+embarassed : 'Embarassed',
+foot_in_mouth : 'Foot in mouth',
+frown : 'Frown',
+innocent : 'Innocent',
+kiss : 'Kiss',
+laughing : 'Laughing',
+money_mouth : 'Money mouth',
+sealed : 'Sealed',
+smile : 'Smile',
+surprised : 'Surprised',
+tongue_out : 'Tongue out',
+undecided : 'Undecided',
+wink : 'Wink',
+yell : 'Yell'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/emotions/langs/en_dlg.js
@@ -1,1 +1,20 @@
-
+tinyMCE.addI18n('en.emotions_dlg',{
+title:"Insert emotion",
+desc:"Emotions",
+cool:"Cool",
+cry:"Cry",
+embarassed:"Embarassed",
+foot_in_mouth:"Foot in mouth",
+frown:"Frown",
+innocent:"Innocent",
+kiss:"Kiss",
+laughing:"Laughing",
+money_mouth:"Money mouth",
+sealed:"Sealed",
+smile:"Smile",
+surprised:"Surprised",
+tongue_out:"Tongue out",
+undecided:"Undecided",
+wink:"Wink",
+yell:"Yell"
+});

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/emotions/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/example/dialog.htm
@@ -1,1 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#example_dlg.title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="js/dialog.js"></script>
+</head>
+<body>
 
+<form onsubmit="ExampleDialog.insert();return false;" action="#">
+	<p>Here is a example dialog.</p>
+	<p>Selected text: <input id="someval" name="someval" type="text" class="text" /></p>
+	<p>Custom arg: <input id="somearg" name="somearg" type="text" class="text" /></p>
+
+	<div class="mceActionPanel">
+		<div style="float: left">
+			<input type="button" id="insert" name="insert" value="{#insert}" onclick="ExampleDialog.insert();" />
+		</div>
+
+		<div style="float: right">
+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+		</div>
+	</div>
+</form>
+
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/example/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.PluginManager.requireLangPack('example');tinymce.create('tinymce.plugins.ExamplePlugin',{init:function(ed,url){ed.addCommand('mceExample',function(){ed.windowManager.open({file:url+'/dialog.htm',width:320+parseInt(ed.getLang('example.delta_width',0)),height:120+parseInt(ed.getLang('example.delta_height',0)),inline:1},{plugin_url:url,some_custom_arg:'custom arg'});});ed.addButton('example',{title:'example.desc',cmd:'mceExample',image:url+'/img/example.gif'});ed.onNodeChange.add(function(ed,cm,n){cm.setActive('example',n.nodeName=='IMG');});},createControl:function(n,cm){return null;},getInfo:function(){return{longname:'Example plugin',author:'Some author',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example',version:"1.0"};}});tinymce.PluginManager.add('example',tinymce.plugins.ExamplePlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/example/editor_plugin_src.js
@@ -1,1 +1,81 @@
+/**
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	// Load plugin specific language pack
+	tinymce.PluginManager.requireLangPack('example');
+
+	tinymce.create('tinymce.plugins.ExamplePlugin', {
+		/**
+		 * Initializes the plugin, this will be executed after the plugin has been created.
+		 * This call is done before the editor instance has finished it's initialization so use the onInit event
+		 * of the editor instance to intercept that event.
+		 *
+		 * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
+		 * @param {string} url Absolute URL to where the plugin is located.
+		 */
+		init : function(ed, url) {
+			// Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample');
+			ed.addCommand('mceExample', function() {
+				ed.windowManager.open({
+					file : url + '/dialog.htm',
+					width : 320 + parseInt(ed.getLang('example.delta_width', 0)),
+					height : 120 + parseInt(ed.getLang('example.delta_height', 0)),
+					inline : 1
+				}, {
+					plugin_url : url, // Plugin absolute URL
+					some_custom_arg : 'custom arg' // Custom argument
+				});
+			});
+
+			// Register example button
+			ed.addButton('example', {
+				title : 'example.desc',
+				cmd : 'mceExample',
+				image : url + '/img/example.gif'
+			});
+
+			// Add a node change handler, selects the button in the UI when a image is selected
+			ed.onNodeChange.add(function(ed, cm, n) {
+				cm.setActive('example', n.nodeName == 'IMG');
+			});
+		},
+
+		/**
+		 * Creates control instances based in the incomming name. This method is normally not
+		 * needed since the addButton method of the tinymce.Editor class is a more easy way of adding buttons
+		 * but you sometimes need to create more complex controls like listboxes, split buttons etc then this
+		 * method can be used to create those.
+		 *
+		 * @param {String} n Name of the control to create.
+		 * @param {tinymce.ControlManager} cm Control manager to use inorder to create new control.
+		 * @return {tinymce.ui.Control} New control instance or null if no control was created.
+		 */
+		createControl : function(n, cm) {
+			return null;
+		},
+
+		/**
+		 * Returns information about the plugin as a name/value array.
+		 * The current keys are longname, author, authorurl, infourl and version.
+		 *
+		 * @return {Object} Name/value array containing information about the plugin.
+		 */
+		getInfo : function() {
+			return {
+				longname : 'Example plugin',
+				author : 'Some author',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example',
+				version : "1.0"
+			};
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('example', tinymce.plugins.ExamplePlugin);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/example/img/example.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/example/js/dialog.js
@@ -1,1 +1,20 @@
+tinyMCEPopup.requireLangPack();
 
+var ExampleDialog = {
+	init : function() {
+		var f = document.forms[0];
+
+		// Get the selected contents as text and place it in the input
+		f.someval.value = tinyMCEPopup.editor.selection.getContent({format : 'text'});
+		f.somearg.value = tinyMCEPopup.getWindowArg('some_custom_arg');
+	},
+
+	insert : function() {
+		// Insert the contents from the input into the document
+		tinyMCEPopup.editor.execCommand('mceInsertContent', false, document.forms[0].someval.value);
+		tinyMCEPopup.close();
+	}
+};
+
+tinyMCEPopup.onInit.add(ExampleDialog.init, ExampleDialog);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/example/langs/en.js
@@ -1,1 +1,4 @@
+tinyMCE.addI18n('en.example',{
+	desc : 'This is just a template button'
+});
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/example/langs/en_dlg.js
@@ -1,1 +1,4 @@
+tinyMCE.addI18n('en.example_dlg',{
+	title : 'This is just a example title'
+});
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/flash/css/content.css
@@ -1,1 +1,8 @@
+.mceItemFlash {
+	border: 1px dotted #cc0000;
+	background-image: url('../images/flash.gif');
+	background-position: center;
+	background-repeat: no-repeat;
+	background-color: #ffffcc;
+}
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/flash/css/flash.css
@@ -1,1 +1,12 @@
+.panel_wrapper div.current {
+	height: 100px;
+}
 
+#width, #height {
+	width: 50px;
+}
+
+#file {
+	width: 250px;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/flash/editor_plugin.js
@@ -1,1 +1,1 @@
-
+tinyMCE.importPluginLanguagePack('flash');var TinyMCE_FlashPlugin={getInfo:function(){return{longname:'Flash',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/flash',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},initInstance:function(inst){if(!tinyMCE.settings['flash_skip_plugin_css'])tinyMCE.importCSS(inst.getDoc(),tinyMCE.baseURL+"/plugins/flash/css/content.css")},getControlHTML:function(cn){switch(cn){case"flash":return tinyMCE.getButtonHTML(cn,'lang_flash_desc','{$pluginurl}/images/flash.gif','mceFlash')}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceFlash":var name="",swffile="",swfwidth="",swfheight="",action="insert";var template=new Array();var inst=tinyMCE.getInstanceById(editor_id);var focusElm=inst.getFocusElement();template['file']='../../plugins/flash/flash.htm';template['width']=430;template['height']=175;template['width']+=tinyMCE.getLang('lang_flash_delta_width',0);template['height']+=tinyMCE.getLang('lang_flash_delta_height',0);if(focusElm!=null&&focusElm.nodeName.toLowerCase()=="img"){name=tinyMCE.getAttrib(focusElm,'class');if(name.indexOf('mceItemFlash')==-1)return true;swffile=tinyMCE.getAttrib(focusElm,'alt');if(tinyMCE.getParam('convert_urls'))swffile=eval(tinyMCE.settings['urlconverter_callback']+"(swffile, null, true);");swfwidth=tinyMCE.getAttrib(focusElm,'width');swfheight=tinyMCE.getAttrib(focusElm,'height');action="update"}tinyMCE.openWindow(template,{editor_id:editor_id,inline:"yes",swffile:swffile,swfwidth:swfwidth,swfheight:swfheight,action:action});return true}return false},cleanup:function(type,content){switch(type){case"insert_to_editor_dom":if(tinyMCE.getParam('convert_urls')){var imgs=content.getElementsByTagName("img");for(var i=0;i<imgs.length;i++){if(tinyMCE.getAttrib(imgs[i],"class")=="mceItemFlash"){var src=tinyMCE.getAttrib(imgs[i],"alt");if(tinyMCE.getParam('convert_urls'))src=eval(tinyMCE.settings['urlconverter_callback']+"(src, null, true);");imgs[i].setAttribute('alt',src);imgs[i].setAttribute('title',src)}}}break;case"get_from_editor_dom":var imgs=content.getElementsByTagName("img");for(var i=0;i<imgs.length;i++){if(tinyMCE.getAttrib(imgs[i],"class")=="mceItemFlash"){var src=tinyMCE.getAttrib(imgs[i],"alt");if(tinyMCE.getParam('convert_urls'))src=eval(tinyMCE.settings['urlconverter_callback']+"(src, null, true);");imgs[i].setAttribute('alt',src);imgs[i].setAttribute('title',src)}}break;case"insert_to_editor":var startPos=0;var embedList=new Array();content=content.replace(new RegExp('<[ ]*embed','gi'),'<embed');content=content.replace(new RegExp('<[ ]*/embed[ ]*>','gi'),'</embed>');content=content.replace(new RegExp('<[ ]*object','gi'),'<object');content=content.replace(new RegExp('<[ ]*/object[ ]*>','gi'),'</object>');while((startPos=content.indexOf('<embed',startPos+1))!=-1){var endPos=content.indexOf('>',startPos);var attribs=TinyMCE_FlashPlugin._parseAttributes(content.substring(startPos+6,endPos));embedList[embedList.length]=attribs}var index=0;while((startPos=content.indexOf('<object',startPos))!=-1){if(index>=embedList.length)break;var attribs=embedList[index];endPos=content.indexOf('</object>',startPos);endPos+=9;var contentAfter=content.substring(endPos);content=content.substring(0,startPos);content+='<img width="'+attribs["width"]+'" height="'+attribs["height"]+'"';content+=' src="'+(tinyMCE.getParam("theme_href")+'/images/spacer.gif')+'" title="'+attribs["src"]+'"';content+=' alt="'+attribs["src"]+'" class="mceItemFlash" />'+content.substring(endPos);content+=contentAfter;index++;startPos++}var index=0;while((startPos=content.indexOf('<embed',startPos))!=-1){if(index>=embedList.length)break;var attribs=embedList[index];endPos=content.indexOf('>',startPos);endPos+=9;var contentAfter=content.substring(endPos);content=content.substring(0,startPos);content+='<img width="'+attribs["width"]+'" height="'+attribs["height"]+'"';content+=' src="'+(tinyMCE.getParam("theme_href")+'/images/spacer.gif')+'" title="'+attribs["src"]+'"';content+=' alt="'+attribs["src"]+'" class="mceItemFlash" />'+content.substring(endPos);content+=contentAfter;index++;startPos++}break;case"get_from_editor":var startPos=-1;while((startPos=content.indexOf('<img',startPos+1))!=-1){var endPos=content.indexOf('/>',startPos);var attribs=TinyMCE_FlashPlugin._parseAttributes(content.substring(startPos+4,endPos));if(attribs['class']!="mceItemFlash")continue;endPos+=2;var embedHTML='';var wmode=tinyMCE.getParam("flash_wmode","");var quality=tinyMCE.getParam("flash_quality","high");var menu=tinyMCE.getParam("flash_menu","false");embedHTML+='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"';embedHTML+=' codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"';embedHTML+=' width="'+attribs["width"]+'" height="'+attribs["height"]+'">';embedHTML+='<param name="movie" value="'+attribs["title"]+'" />';embedHTML+='<param name="quality" value="'+quality+'" />';embedHTML+='<param name="menu" value="'+menu+'" />';embedHTML+='<param name="wmode" value="'+wmode+'" />';embedHTML+='<embed src="'+attribs["title"]+'" wmode="'+wmode+'" quality="'+quality+'" menu="'+menu+'" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="'+attribs["width"]+'" height="'+attribs["height"]+'"></embed></object>';chunkBefore=content.substring(0,startPos);chunkAfter=content.substring(endPos);content=chunkBefore+embedHTML+chunkAfter}break}return content},handleNodeChange:function(editor_id,node,undo_index,undo_levels,visual_aid,any_selection){if(node==null)return;do{if(node.nodeName=="IMG"&&tinyMCE.getAttrib(node,'class').indexOf('mceItemFlash')==0){tinyMCE.switchClass(editor_id+'_flash','mceButtonSelected');return true}}while((node=node.parentNode));tinyMCE.switchClass(editor_id+'_flash','mceButtonNormal');return true},_parseAttributes:function(attribute_string){var attributeName="";var attributeValue="";var withInName;var withInValue;var attributes=new Array();var whiteSpaceRegExp=new RegExp('^[ \n\r\t]+','g');if(attribute_string==null||attribute_string.length<2)return null;withInName=withInValue=false;for(var i=0;i<attribute_string.length;i++){var chr=attribute_string.charAt(i);if((chr=='"'||chr=="'")&&!withInValue)withInValue=true;else if((chr=='"'||chr=="'")&&withInValue){withInValue=false;var pos=attributeName.lastIndexOf(' ');if(pos!=-1)attributeName=attributeName.substring(pos+1);attributes[attributeName.toLowerCase()]=attributeValue.substring(1);attributeName="";attributeValue=""}else if(!whiteSpaceRegExp.test(chr)&&!withInName&&!withInValue)withInName=true;if(chr=='='&&withInName)withInName=false;if(withInName)attributeName+=chr;if(withInValue)attributeValue+=chr}return attributes}};tinyMCE.addPlugin("flash",TinyMCE_FlashPlugin);

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/flash/editor_plugin_src.js
@@ -1,1 +1,286 @@
-
+/**
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
+ *
+ * @author Moxiecode

+ */
+
+/* Import plugin specific language pack */
+tinyMCE.importPluginLanguagePack('flash');
+
+var TinyMCE_FlashPlugin = {
+	getInfo : function() {
+		return {
+			longname : 'Flash',
+			author : 'Moxiecode Systems AB',
+			authorurl : 'http://tinymce.moxiecode.com',
+			infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/flash',
+			version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
+		};
+	},
+
+	initInstance : function(inst) {
+		if (!tinyMCE.settings['flash_skip_plugin_css'])
+			tinyMCE.importCSS(inst.getDoc(), tinyMCE.baseURL + "/plugins/flash/css/content.css");
+	},
+
+	getControlHTML : function(cn) {
+		switch (cn) {
+			case "flash":
+				return tinyMCE.getButtonHTML(cn, 'lang_flash_desc', '{$pluginurl}/images/flash.gif', 'mceFlash');
+		}
+
+		return "";
+	},
+
+	execCommand : function(editor_id, element, command, user_interface, value) {
+		// Handle commands
+		switch (command) {
+			case "mceFlash":
+				var name = "", swffile = "", swfwidth = "", swfheight = "", action = "insert";
+				var template = new Array();
+				var inst = tinyMCE.getInstanceById(editor_id);
+				var focusElm = inst.getFocusElement();
+
+				template['file']   = '../../plugins/flash/flash.htm'; // Relative to theme
+				template['width']  = 430;
+				template['height'] = 175;
+
+				template['width'] += tinyMCE.getLang('lang_flash_delta_width', 0);
+				template['height'] += tinyMCE.getLang('lang_flash_delta_height', 0);
+
+				// Is selection a image
+				if (focusElm != null && focusElm.nodeName.toLowerCase() == "img") {
+					name = tinyMCE.getAttrib(focusElm, 'class');
+
+					if (name.indexOf('mceItemFlash') == -1) // Not a Flash
+						return true;
+
+					// Get rest of Flash items
+					swffile = tinyMCE.getAttrib(focusElm, 'alt');
+
+					if (tinyMCE.getParam('convert_urls'))
+						swffile = eval(tinyMCE.settings['urlconverter_callback'] + "(swffile, null, true);");
+
+					swfwidth = tinyMCE.getAttrib(focusElm, 'width');
+					swfheight = tinyMCE.getAttrib(focusElm, 'height');
+					action = "update";
+				}
+
+				tinyMCE.openWindow(template, {editor_id : editor_id, inline : "yes", swffile : swffile, swfwidth : swfwidth, swfheight : swfheight, action : action});
+			return true;
+	   }
+
+	   // Pass to next handler in chain
+	   return false;
+	},
+
+	cleanup : function(type, content) {
+		switch (type) {
+			case "insert_to_editor_dom":
+				// Force relative/absolute
+				if (tinyMCE.getParam('convert_urls')) {
+					var imgs = content.getElementsByTagName("img");
+					for (var i=0; i<imgs.length; i++) {
+						if (tinyMCE.getAttrib(imgs[i], "class") == "mceItemFlash") {
+							var src = tinyMCE.getAttrib(imgs[i], "alt");
+
+							if (tinyMCE.getParam('convert_urls'))
+								src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, null, true);");
+
+							imgs[i].setAttribute('alt', src);
+							imgs[i].setAttribute('title', src);
+						}
+					}
+				}
+				break;
+
+			case "get_from_editor_dom":
+				var imgs = content.getElementsByTagName("img");
+				for (var i=0; i<imgs.length; i++) {
+					if (tinyMCE.getAttrib(imgs[i], "class") == "mceItemFlash") {
+						var src = tinyMCE.getAttrib(imgs[i], "alt");
+
+						if (tinyMCE.getParam('convert_urls'))
+							src = eval(tinyMCE.settings['urlconverter_callback'] + "(src, null, true);");
+
+						imgs[i].setAttribute('alt', src);
+						imgs[i].setAttribute('title', src);
+					}
+				}
+				break;
+
+			case "insert_to_editor":
+				var startPos = 0;
+				var embedList = new Array();
+
+				// Fix the embed and object elements
+				content = content.replace(new RegExp('<[ ]*embed','gi'),'<embed');
+				content = content.replace(new RegExp('<[ ]*/embed[ ]*>','gi'),'</embed>');
+				content = content.replace(new RegExp('<[ ]*object','gi'),'<object');
+				content = content.replace(new RegExp('<[ ]*/object[ ]*>','gi'),'</object>');
+
+				// Parse all embed tags
+				while ((startPos = content.indexOf('<embed', startPos+1)) != -1) {
+					var endPos = content.indexOf('>', startPos);
+					var attribs = TinyMCE_FlashPlugin._parseAttributes(content.substring(startPos + 6, endPos));
+					embedList[embedList.length] = attribs;
+				}
+
+				// Parse all object tags and replace them with images from the embed data
+				var index = 0;
+				while ((startPos = content.indexOf('<object', startPos)) != -1) {
+					if (index >= embedList.length)
+						break;
+
+					var attribs = embedList[index];
+
+					// Find end of object
+					endPos = content.indexOf('</object>', startPos);
+					endPos += 9;
+
+					// Insert image
+					var contentAfter = content.substring(endPos);
+					content = content.substring(0, startPos);
+					content += '<img width="' + attribs["width"] + '" height="' + attribs["height"] + '"';
+					content += ' src="' + (tinyMCE.getParam("theme_href") + '/images/spacer.gif') + '" title="' + attribs["src"] + '"';
+					content += ' alt="' + attribs["src"] + '" class="mceItemFlash" />' + content.substring(endPos);
+					content += contentAfter;
+					index++;
+
+					startPos++;
+				}
+
+				// Parse all embed tags and replace them with images from the embed data
+				var index = 0;
+				while ((startPos = content.indexOf('<embed', startPos)) != -1) {
+					if (index >= embedList.length)
+						break;
+
+					var attribs = embedList[index];
+
+					// Find end of embed
+					endPos = content.indexOf('>', startPos);
+					endPos += 9;
+
+					// Insert image
+					var contentAfter = content.substring(endPos);
+					content = content.substring(0, startPos);
+					content += '<img width="' + attribs["width"] + '" height="' + attribs["height"] + '"';
+					content += ' src="' + (tinyMCE.getParam("theme_href") + '/images/spacer.gif') + '" title="' + attribs["src"] + '"';
+					content += ' alt="' + attribs["src"] + '" class="mceItemFlash" />' + content.substring(endPos);
+					content += contentAfter;
+					index++;
+
+					startPos++;
+				}
+
+				break;
+
+			case "get_from_editor":
+				// Parse all img tags and replace them with object+embed
+				var startPos = -1;
+
+				while ((startPos = content.indexOf('<img', startPos+1)) != -1) {
+					var endPos = content.indexOf('/>', startPos);
+					var attribs = TinyMCE_FlashPlugin._parseAttributes(content.substring(startPos + 4, endPos));
+
+					// Is not flash, skip it
+					if (attribs['class'] != "mceItemFlash")
+						continue;
+
+					endPos += 2;
+
+					var embedHTML = '';
+					var wmode = tinyMCE.getParam("flash_wmode", "");
+					var quality = tinyMCE.getParam("flash_quality", "high");
+					var menu = tinyMCE.getParam("flash_menu", "false");
+
+					// Insert object + embed
+					embedHTML += '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"';
+					embedHTML += ' codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0"';
+					embedHTML += ' width="' + attribs["width"] + '" height="' + attribs["height"] + '">';
+					embedHTML += '<param name="movie" value="' + attribs["title"] + '" />';
+					embedHTML += '<param name="quality" value="' + quality + '" />';
+					embedHTML += '<param name="menu" value="' + menu + '" />';
+					embedHTML += '<param name="wmode" value="' + wmode + '" />';
+					embedHTML += '<embed src="' + attribs["title"] + '" wmode="' + wmode + '" quality="' + quality + '" menu="' + menu + '" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="' + attribs["width"] + '" height="' + attribs["height"] + '"></embed></object>';
+
+					// Insert embed/object chunk
+					chunkBefore = content.substring(0, startPos);
+					chunkAfter = content.substring(endPos);
+					content = chunkBefore + embedHTML + chunkAfter;
+				}
+				break;
+		}
+
+		// Pass through to next handler in chain
+		return content;
+	},
+
+	handleNodeChange : function(editor_id, node, undo_index, undo_levels, visual_aid, any_selection) {
+		if (node == null)
+			return;
+
+		do {
+			if (node.nodeName == "IMG" && tinyMCE.getAttrib(node, 'class').indexOf('mceItemFlash') == 0) {
+				tinyMCE.switchClass(editor_id + '_flash', 'mceButtonSelected');
+				return true;
+			}
+		} while ((node = node.parentNode));
+
+		tinyMCE.switchClass(editor_id + '_flash', 'mceButtonNormal');
+
+		return true;
+	},
+
+	// Private plugin internal functions
+
+	_parseAttributes : function(attribute_string) {
+		var attributeName = "";
+		var attributeValue = "";
+		var withInName;
+		var withInValue;
+		var attributes = new Array();
+		var whiteSpaceRegExp = new RegExp('^[ \n\r\t]+', 'g');
+
+		if (attribute_string == null || attribute_string.length < 2)
+			return null;
+
+		withInName = withInValue = false;
+
+		for (var i=0; i<attribute_string.length; i++) {
+			var chr = attribute_string.charAt(i);
+
+			if ((chr == '"' || chr == "'") && !withInValue)
+				withInValue = true;
+			else if ((chr == '"' || chr == "'") && withInValue) {
+				withInValue = false;
+
+				var pos = attributeName.lastIndexOf(' ');
+				if (pos != -1)
+					attributeName = attributeName.substring(pos+1);
+
+				attributes[attributeName.toLowerCase()] = attributeValue.substring(1);
+
+				attributeName = "";
+				attributeValue = "";
+			} else if (!whiteSpaceRegExp.test(chr) && !withInName && !withInValue)
+				withInName = true;
+
+			if (chr == '=' && withInName)
+				withInName = false;
+
+			if (withInName)
+				attributeName += chr;
+
+			if (withInValue)
+				attributeValue += chr;
+		}
+
+		return attributes;
+	}
+};
+
+tinyMCE.addPlugin("flash", TinyMCE_FlashPlugin);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/flash/flash.htm
@@ -1,1 +1,71 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{$lang_flash_title}</title>
+	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script language="javascript" type="text/javascript" src="jscripts/flash.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>
+	<link href="css/flash.css" rel="stylesheet" type="text/css" />
+	<base target="_self" />
+</head>
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none">
+    <form onsubmit="insertFlash();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_flash_general}</a></span></li>
+			</ul>
+		</div>
 
+		<div class="panel_wrapper">
+			<div id="general_panel" class="panel current">
+				<fieldset>
+					<legend>{$lang_flash_general}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+							<tr>
+							<td nowrap="nowrap"><label for="file">{$lang_flash_file}</label></td>
+							  <td nowrap="nowrap">
+									<table border="0" cellspacing="0" cellpadding="0">
+									  <tr>
+										<td><input id="file" name="file" type="text" value="" onfocus="this.select();" /></td>
+										<td id="filebrowsercontainer">&nbsp;</td>
+									  </tr>
+									</table>
+								</td>
+							</tr>
+							<tr id="linklistrow">
+								<td><label for="linklist">{$lang_flash_list}</label></td>
+								<td id="linklistcontainer">&nbsp;</td>
+							</tr>
+							<tr>
+								<td nowrap="nowrap"><label>{$lang_flash_size}</label></td>
+								<td nowrap="nowrap">
+									<input type="text" id="width" name="width" value="" onfocus="this.select();" />
+									<select name="width2" id="width2" style="width: 50px">
+										<option value="">px</option>
+										<option value="%">%</option>
+									</select>&nbsp;x&nbsp;<input id="height" name="height" type="text"  value="" onfocus="this.select();" />
+									<select name="height2" id="height2" style="width: 50px">
+										<option value="">px</option>
+										<option value="%">%</option>
+									</select>
+								</td>
+							</tr>
+					</table>
+				</fieldset>
+			</div>
+		</div>
+
+		<div class="mceActionPanel">
+			<div style="float: left">
+				<input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertFlash();" />
+			</div>
+
+			<div style="float: right">
+				<input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="tinyMCEPopup.close();" />
+			</div>
+		</div>
+	</form>
+</body>
+</html>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/flash/images/flash.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/flash/jscripts/flash.js
@@ -1,1 +1,108 @@
+var url = tinyMCE.getParam("flash_external_list_url");
+if (url != null) {
+	// Fix relative
+	if (url.charAt(0) != '/' && url.indexOf('://') == -1)
+		url = tinyMCE.documentBasePath + "/" + url;
 
+	document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');
+}
+
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	document.getElementById("filebrowsercontainer").innerHTML = getBrowserHTML('filebrowser','file','flash','flash');
+
+	// Image list outsrc
+	var html = getFlashListHTML('filebrowser','file','flash','flash');
+	if (html == "")
+		document.getElementById("linklistrow").style.display = 'none';
+	else
+		document.getElementById("linklistcontainer").innerHTML = html;
+
+	var formObj = document.forms[0];
+	var swffile   = tinyMCE.getWindowArg('swffile');
+	var swfwidth  = '' + tinyMCE.getWindowArg('swfwidth');
+	var swfheight = '' + tinyMCE.getWindowArg('swfheight');
+
+	if (swfwidth.indexOf('%')!=-1) {
+		formObj.width2.value = "%";
+		formObj.width.value  = swfwidth.substring(0,swfwidth.length-1);
+	} else {
+		formObj.width2.value = "px";
+		formObj.width.value  = swfwidth;
+	}
+
+	if (swfheight.indexOf('%')!=-1) {
+		formObj.height2.value = "%";
+		formObj.height.value  = swfheight.substring(0,swfheight.length-1);
+	} else {
+		formObj.height2.value = "px";
+		formObj.height.value  = swfheight;
+	}
+
+	formObj.file.value = swffile;
+	formObj.insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true);
+
+	selectByValue(formObj, 'linklist', swffile);
+
+	// Handle file browser
+	if (isVisible('filebrowser'))
+		document.getElementById('file').style.width = '230px';
+
+	// Auto select flash in list
+	if (typeof(tinyMCEFlashList) != "undefined" && tinyMCEFlashList.length > 0) {
+		for (var i=0; i<formObj.linklist.length; i++) {
+			if (formObj.linklist.options[i].value == tinyMCE.getWindowArg('swffile'))
+				formObj.linklist.options[i].selected = true;
+		}
+	}
+}
+
+function getFlashListHTML() {
+	if (typeof(tinyMCEFlashList) != "undefined" && tinyMCEFlashList.length > 0) {
+		var html = "";
+
+		html += '<select id="linklist" name="linklist" style="width: 250px" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.file.value=this.options[this.selectedIndex].value;">';
+		html += '<option value="">---</option>';
+
+		for (var i=0; i<tinyMCEFlashList.length; i++)
+			html += '<option value="' + tinyMCEFlashList[i][1] + '">' + tinyMCEFlashList[i][0] + '</option>';
+
+		html += '</select>';
+
+		return html;
+	}
+
+	return "";
+}
+
+function insertFlash() {
+	var formObj = document.forms[0];
+	var html      = '';
+	var file      = formObj.file.value;
+	var width     = formObj.width.value;
+	var height    = formObj.height.value;
+	if (formObj.width2.value=='%') {
+		width = width + '%';
+	}
+	if (formObj.height2.value=='%') {
+		height = height + '%';
+	}
+
+	if (width == "")
+		width = 100;
+
+	if (height == "")
+		height = 100;
+
+	html += ''
+		+ '<img src="' + (tinyMCE.getParam("theme_href") + "/images/spacer.gif") + '" mce_src="' + (tinyMCE.getParam("theme_href") + "/images/spacer.gif") + '" '
+		+ 'width="' + width + '" height="' + height + '" '
+		+ 'border="0" alt="' + file + '" title="' + file + '" class="mceItemFlash" />';
+
+	tinyMCEPopup.execCommand("mceInsertContent", true, html);
+	tinyMCE.selectedInstance.repaint();
+
+	tinyMCEPopup.close();
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/flash/langs/en.js
@@ -1,1 +1,12 @@
+// UK lang variables
 
+tinyMCE.addToLang('flash',{
+title : 'Insert / edit Flash Movie',
+desc : 'Insert / edit Flash Movie',
+file : 'Flash-File (.swf)',
+size : 'Size',
+list : 'Flash files',
+props : 'Flash properties',
+general : 'General'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/flash/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/fullpage/blank.htm
@@ -1,1 +1,10 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>blank_page</title>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+</head>
+<body onload="parent.setupIframe(document);">
 
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/fullpage/css/fullpage.css
@@ -1,1 +1,182 @@
+/* Hide the advanced tab */
+#advanced_tab {
+	display: none;
+}
 
+#metatitle, #metakeywords, #metadescription, #metaauthor, #metacopyright {
+	width: 280px;
+}
+
+#doctype, #docencoding {
+	width: 200px;
+}
+
+#langcode {
+	width: 30px;
+}
+
+#bgimage {
+	width: 220px;	
+}
+
+#fontface {
+	width: 240px;
+}
+
+#leftmargin, #rightmargin, #topmargin, #bottommargin {
+	width: 50px;
+}
+
+.panel_wrapper div.current {
+	height: 400px;
+}
+
+#stylesheet, #style {
+	width: 240px;
+}
+
+/* Head list classes */
+
+.headlistwrapper {
+	width: 100%;
+}
+
+.addbutton, .removebutton, .moveupbutton, .movedownbutton {
+	border-top: 1px solid;
+	border-left: 1px solid;
+	border-bottom: 1px solid;
+	border-right: 1px solid;
+	border-color: #F0F0EE;
+	cursor: default;
+	display: block;
+	width: 20px;
+	height: 20px;
+}
+
+#doctypes {
+	width: 200px;
+}
+
+.addbutton:hover, .removebutton:hover, .moveupbutton:hover, .movedownbutton:hover {
+	border: 1px solid #0A246A;
+	background-color: #B6BDD2;
+}
+
+.addbutton {
+	background-image: url('../images/add.gif');
+	float: left;
+	margin-right: 3px;
+}
+
+.removebutton {
+	background-image: url('../images/remove.gif');
+	float: left;
+}
+
+.moveupbutton {
+	background-image: url('../images/move_up.gif');
+	float: left;
+	margin-right: 3px;
+}
+
+.movedownbutton {
+	background-image: url('../images/move_down.gif');
+	float: left;
+}
+
+.selected {
+	border: 1px solid #0A246A;
+	background-color: #B6BDD2;
+}
+
+.toolbar {
+	width: 100%;
+}
+
+#headlist {
+	width: 100%;
+	margin-top: 3px;
+	font-size: 11px;
+}
+
+#info, #title_element, #meta_element, #script_element, #style_element, #base_element, #link_element, #comment_element, #unknown_element {
+	display: none;
+}
+
+#addmenu {
+	position: absolute;
+	border: 1px solid gray;
+	display: none;
+	z-index: 100;
+	background-color: white;
+}
+
+#addmenu a {
+	display: block;
+	width: 100%;
+	line-height: 20px;
+	text-decoration: none;
+	background-color: white;
+}
+
+#addmenu a:hover {
+	background-color: #B6BDD2;
+	color: black;
+}
+
+#addmenu span {
+	padding-left: 10px;
+	padding-right: 10px;
+}
+
+#updateElementPanel {
+	display: none;
+}
+
+#script_element .panel_wrapper div.current {
+	height: 108px;
+}
+
+#style_element .panel_wrapper div.current {
+	height: 108px;
+}
+
+#link_element  .panel_wrapper div.current {
+	height: 140px;
+}
+
+#element_script_value {
+	width: 100%;
+	height: 100px;
+}
+
+#element_comment_value {
+	width: 100%;
+	height: 120px;
+}
+
+#element_style_value {
+	width: 100%;
+	height: 100px;
+}
+
+#element_title, #element_script_src, #element_meta_name, #element_meta_content, #element_base_href, #element_link_href, #element_link_title {
+	width: 250px;
+}
+
+.updateElementButton {
+	margin-top: 3px;
+}
+
+/* MSIE specific styles */
+
+* html .addbutton, * html .removebutton, * html .moveupbutton, * html .movedownbutton {
+	width: 22px;
+	height: 22px;
+}
+
+textarea {
+	height: 55px;
+}
+
+.panel_wrapper div.current {height:420px;}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/fullpage/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.FullPagePlugin',{init:function(ed,url){var t=this;t.editor=ed;ed.addCommand('mceFullPageProperties',function(){ed.windowManager.open({file:url+'/fullpage.htm',width:430+parseInt(ed.getLang('fullpage.delta_width',0)),height:495+parseInt(ed.getLang('fullpage.delta_height',0)),inline:1},{plugin_url:url,head_html:t.head});});ed.addButton('fullpage',{title:'fullpage.desc',cmd:'mceFullPageProperties'});ed.onBeforeSetContent.add(t._setContent,t);ed.onSetContent.add(t._setBodyAttribs,t);ed.onGetContent.add(t._getContent,t);},getInfo:function(){return{longname:'Fullpage',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullpage',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_setBodyAttribs:function(ed,o){var bdattr,i,len,kv,k,v,t,attr=this.head.match(/body(.*?)>/i);if(attr&&attr[1]){bdattr=attr[1].match(/\s*(\w+\s*=\s*".*?"|\w+\s*=\s*'.*?'|\w+\s*=\s*\w+|\w+)\s*/g);for(i=0,len=bdattr.length;i<len;i++){kv=bdattr[i].split('=');k=kv[0].replace(/\s/,'');v=kv[1];if(v){v=v.replace(/^\s+/,'').replace(/\s+$/,'');t=v.match(/^["'](.*)["']$/);if(t)v=t[1];}else v=k;ed.dom.setAttrib(ed.getBody(),'style',v);}}},_createSerializer:function(){return new tinymce.dom.Serializer({dom:this.editor.dom,apply_source_formatting:true});},_setContent:function(ed,o){var t=this,sp,ep,c=o.content,v,st='';c=c.replace(/<(\/?)BODY/gi,'<$1body');sp=c.indexOf('<body');if(sp!=-1){sp=c.indexOf('>',sp);t.head=c.substring(0,sp+1);ep=c.indexOf('</body',sp);if(ep==-1)ep=c.indexOf('</body',ep);o.content=c.substring(sp+1,ep);t.foot=c.substring(ep);function low(s){return s.replace(/<\/?[A-Z]+/g,function(a){return a.toLowerCase();})};t.head=low(t.head);t.foot=low(t.foot);}else{t.head='';if(ed.getParam('fullpage_default_xml_pi'))t.head+='<?xml version="1.0" encoding="'+ed.getParam('fullpage_default_encoding','ISO-8859-1')+'" ?>\n';t.head+=ed.getParam('fullpage_default_doctype','<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');t.head+='\n<html>\n<head>\n<title>'+ed.getParam('fullpage_default_title','Untitled document')+'</title>\n';if(v=ed.getParam('fullpage_default_encoding'))t.head+='<meta http-equiv="Content-Type" content="'+v+'" />\n';if(v=ed.getParam('fullpage_default_font_family'))st+='font-family: '+v+';';if(v=ed.getParam('fullpage_default_font_size'))st+='font-size: '+v+';';if(v=ed.getParam('fullpage_default_text_color'))st+='color: '+v+';';t.head+='</head>\n<body'+(st?' style="'+st+'"':'')+'>\n';t.foot='\n</body>\n</html>';}},_getContent:function(ed,o){var t=this;o.content=tinymce.trim(t.head)+'\n'+tinymce.trim(o.content)+'\n'+tinymce.trim(t.foot);}});tinymce.PluginManager.add('fullpage',tinymce.plugins.FullPagePlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/fullpage/editor_plugin_src.js
@@ -1,1 +1,140 @@
+/**
+ * $Id: editor_plugin_src.js 827 2008-04-29 15:02:42Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.FullPagePlugin', {
+		init : function(ed, url) {
+			var t = this;
+
+			t.editor = ed;
+
+			// Register commands
+			ed.addCommand('mceFullPageProperties', function() {
+				ed.windowManager.open({
+					file : url + '/fullpage.htm',
+					width : 430 + parseInt(ed.getLang('fullpage.delta_width', 0)),
+					height : 495 + parseInt(ed.getLang('fullpage.delta_height', 0)),
+					inline : 1
+				}, {
+					plugin_url : url,
+					head_html : t.head
+				});
+			});
+
+			// Register buttons
+			ed.addButton('fullpage', {title : 'fullpage.desc', cmd : 'mceFullPageProperties'});
+
+			ed.onBeforeSetContent.add(t._setContent, t);
+			ed.onSetContent.add(t._setBodyAttribs, t);
+			ed.onGetContent.add(t._getContent, t);
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Fullpage',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullpage',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		},
+
+		// Private plugin internal methods
+
+		_setBodyAttribs : function(ed, o) {
+			var bdattr, i, len, kv, k, v, t, attr = this.head.match(/body(.*?)>/i);
+
+			if (attr && attr[1]) {
+				bdattr = attr[1].match(/\s*(\w+\s*=\s*".*?"|\w+\s*=\s*'.*?'|\w+\s*=\s*\w+|\w+)\s*/g);
+
+				for(i = 0, len = bdattr.length; i < len; i++) {
+					kv = bdattr[i].split('=');
+					k = kv[0].replace(/\s/,'');
+					v = kv[1];
+
+					if (v) {
+						v = v.replace(/^\s+/,'').replace(/\s+$/,'');
+						t = v.match(/^["'](.*)["']$/);
+
+						if (t)
+							v = t[1];
+					} else
+						v = k;
+
+					ed.dom.setAttrib(ed.getBody(), 'style', v);
+				}
+			}
+		},
+
+		_createSerializer : function() {
+			return new tinymce.dom.Serializer({
+				dom : this.editor.dom,
+				apply_source_formatting : true
+			});
+		},
+
+		_setContent : function(ed, o) {
+			var t = this, sp, ep, c = o.content, v, st = '';
+
+			// Parse out head, body and footer
+			c = c.replace(/<(\/?)BODY/gi, '<$1body');
+			sp = c.indexOf('<body');
+
+			if (sp != -1) {
+				sp = c.indexOf('>', sp);
+				t.head = c.substring(0, sp + 1);
+
+				ep = c.indexOf('</body', sp);
+				if (ep == -1)
+					ep = c.indexOf('</body', ep);
+
+				o.content = c.substring(sp + 1, ep);
+				t.foot = c.substring(ep);
+
+				function low(s) {
+					return s.replace(/<\/?[A-Z]+/g, function(a) {
+						return a.toLowerCase();
+					})
+				};
+
+				t.head = low(t.head);
+				t.foot = low(t.foot);
+			} else {
+				t.head = '';
+				if (ed.getParam('fullpage_default_xml_pi'))
+					t.head += '<?xml version="1.0" encoding="' + ed.getParam('fullpage_default_encoding', 'ISO-8859-1') + '" ?>\n';
+
+				t.head += ed.getParam('fullpage_default_doctype', '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');
+				t.head += '\n<html>\n<head>\n<title>' + ed.getParam('fullpage_default_title', 'Untitled document') + '</title>\n';
+
+				if (v = ed.getParam('fullpage_default_encoding'))
+					t.head += '<meta http-equiv="Content-Type" content="' + v + '" />\n';
+
+				if (v = ed.getParam('fullpage_default_font_family'))
+					st += 'font-family: ' + v + ';';
+
+				if (v = ed.getParam('fullpage_default_font_size'))
+					st += 'font-size: ' + v + ';';
+
+				if (v = ed.getParam('fullpage_default_text_color'))
+					st += 'color: ' + v + ';';
+
+				t.head += '</head>\n<body' + (st ? ' style="' + st + '"' : '') + '>\n';
+				t.foot = '\n</body>\n</html>';
+			}
+		},
+
+		_getContent : function(ed, o) {
+			var t = this;
+
+			o.content = tinymce.trim(t.head) + '\n' + tinymce.trim(o.content) + '\n' + tinymce.trim(t.foot);
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('fullpage', tinymce.plugins.FullPagePlugin);
+})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/fullpage/fullpage.htm
@@ -1,1 +1,578 @@
-
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#fullpage_dlg.title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="js/fullpage.js"></script>
+	<link href="css/fullpage.css" rel="stylesheet" type="text/css" />
+	<base target="_self" />
+</head>
+<body id="advlink" style="display: none">
+    <form onsubmit="updateAction();return false;" name="fullpage" action="#">
+		<div class="tabs">
+			<ul>
+				<li id="meta_tab" class="current"><span><a href="javascript:mcTabs.displayTab('meta_tab','meta_panel');" onmousedown="return false;">{#fullpage_dlg.meta_tab}</a></span></li>
+				<li id="appearance_tab"><span><a href="javascript:mcTabs.displayTab('appearance_tab','appearance_panel');" onmousedown="return false;">{#fullpage_dlg.appearance_tab}</a></span></li>
+				<li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#fullpage_dlg.advanced_tab}</a></span></li>
+			</ul>
+		</div>
+
+		<div class="panel_wrapper">
+			<div id="meta_panel" class="panel current">
+				<fieldset>
+					<legend>{#fullpage_dlg.meta_props}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td nowrap="nowrap"><label for="metatitle">{#fullpage_dlg.meta_title}</label>&nbsp;</td>
+							<td><input type="text" id="metatitle" name="metatitle" value="" class="mceFocus" /></td>
+						</tr>
+						<tr>
+							<td nowrap="nowrap"><label for="metakeywords">{#fullpage_dlg.meta_keywords}</label>&nbsp;</td>
+							<td><textarea id="metakeywords" name="metakeywords" rows="4"></textarea></td>
+						</tr>
+						<tr>
+							<td nowrap="nowrap"><label for="metadescription">{#fullpage_dlg.meta_description}</label>&nbsp;</td>
+							<td><textarea id="metadescription" name="metadescription" rows="4"></textarea></td>
+						</tr>
+						<tr>
+							<td nowrap="nowrap"><label for="metaauthor">{#fullpage_dlg.author}</label>&nbsp;</td>
+							<td><input type="text" id="metaauthor" name="metaauthor" value="" /></td>
+						</tr>
+						<tr>
+							<td nowrap="nowrap"><label for="metacopyright">{#fullpage_dlg.copyright}</label>&nbsp;</td>
+							<td><input type="text" id="metacopyright" name="metacopyright" value="" /></td>
+						</tr>
+						<tr>
+							<td nowrap="nowrap"><label for="metarobots">{#fullpage_dlg.meta_robots}</label>&nbsp;</td>
+							<td>
+								<select id="metarobots" name="metarobots">
+											<option value="">{#not_set}</option> 
+											<option value="index,follow">{#fullpage_dlg.meta_index_follow}</option>
+											<option value="index,nofollow">{#fullpage_dlg.meta_index_nofollow}</option>
+											<option value="noindex,follow">{#fullpage_dlg.meta_noindex_follow}</option>
+											<option value="noindex,nofollow">{#fullpage_dlg.meta_noindex_nofollow}</option>
+								</select>
+							</td>
+						</tr>
+					</table>
+				</fieldset>
+
+				<fieldset>
+					<legend>{#fullpage_dlg.langprops}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td class="column1"><label for="docencoding">{#fullpage_dlg.encoding}</label></td> 
+							<td>
+								<select id="docencoding" name="docencoding"> 
+										<option value="">{#not_set}</option>
+								</select>
+							</td> 
+						</tr>
+						<tr>
+							<td nowrap="nowrap"><label for="doctypes">{#fullpage_dlg.doctypes}</label>&nbsp;</td>
+							<td>
+								<select id="doctypes" name="doctypes">
+										<option value="">{#not_set}</option>
+								</select>
+							</td>
+						</tr>
+						<tr>
+							<td nowrap="nowrap"><label for="langcode">{#fullpage_dlg.langcode}</label>&nbsp;</td>
+							<td><input type="text" id="langcode" name="langcode" value="" /></td>
+						</tr>
+						<tr>
+							<td class="column1"><label for="langdir">{#fullpage_dlg.langdir}</label></td> 
+							<td>
+								<select id="langdir" name="langdir"> 
+										<option value="">{#not_set}</option> 
+										<option value="ltr">{#fullpage_dlg.ltr}</option> 
+										<option value="rtl">{#fullpage_dlg.rtl}</option> 
+								</select>
+							</td> 
+						</tr>
+						<tr>
+							<td nowrap="nowrap"><label for="xml_pi">{#fullpage_dlg.xml_pi}</label>&nbsp;</td>
+							<td><input type="checkbox" id="xml_pi" name="xml_pi" class="checkbox" /></td>
+						</tr>
+					</table>
+				</fieldset>
+			</div>
+
+			<div id="appearance_panel" class="panel">
+				<fieldset>
+					<legend>{#fullpage_dlg.appearance_textprops}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td class="column1"><label for="fontface">{#fullpage_dlg.fontface}</label></td> 
+							<td>
+								<select id="fontface" name="fontface" onchange="changedStyleField(this);">
+										<option value="">{#not_set}</option>
+								</select>
+							</td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="fontsize">{#fullpage_dlg.fontsize}</label></td> 
+							<td>
+								<select id="fontsize" name="fontsize" onchange="changedStyleField(this);">
+										<option value="">{#not_set}</option>
+								</select>
+							</td>
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="textcolor">{#fullpage_dlg.textcolor}</label></td> 
+							<td>
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="textcolor" name="textcolor" type="text" value="" size="9" onchange="updateColor('textcolor_pick','textcolor');changedStyleField(this);" /></td>
+										<td id="textcolor_pickcontainer">&nbsp;</td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+					</table>
+				</fieldset>
+
+				<fieldset>
+					<legend>{#fullpage_dlg.appearance_bgprops}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td class="column1"><label for="bgimage">{#fullpage_dlg.bgimage}</label></td> 
+							<td>
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="bgimage" name="bgimage" type="text" value="" onchange="changedStyleField(this);" /></td>
+										<td id="bgimage_pickcontainer">&nbsp;</td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+						<tr>
+							<td class="column1"><label for="bgcolor">{#fullpage_dlg.bgcolor}</label></td> 
+							<td>
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedStyleField(this);" /></td>
+										<td id="bgcolor_pickcontainer">&nbsp;</td>
+									</tr>
+								</table>
+							</td> 
+						</tr>
+					</table>
+				</fieldset>
+
+				<fieldset>
+					<legend>{#fullpage_dlg.appearance_marginprops}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td class="column1"><label for="leftmargin">{#fullpage_dlg.left_margin}</label></td> 
+							<td><input id="leftmargin" name="leftmargin" type="text" value="" onchange="changedStyleField(this);" /></td>
+							<td class="column1"><label for="rightmargin">{#fullpage_dlg.right_margin}</label></td> 
+							<td><input id="rightmargin" name="rightmargin" type="text" value="" onchange="changedStyleField(this);" /></td>
+						</tr>
+						<tr>
+							<td class="column1"><label for="topmargin">{#fullpage_dlg.top_margin}</label></td> 
+							<td><input id="topmargin" name="topmargin" type="text" value="" onchange="changedStyleField(this);" /></td>
+							<td class="column1"><label for="bottommargin">{#fullpage_dlg.bottom_margin}</label></td> 
+							<td><input id="bottommargin" name="bottommargin" type="text" value="" onchange="changedStyleField(this);" /></td>
+						</tr>
+					</table>
+				</fieldset>
+
+				<fieldset>
+					<legend>{#fullpage_dlg.appearance_linkprops}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td class="column1"><label for="link_color">{#fullpage_dlg.link_color}</label></td> 
+							<td>
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="link_color" name="link_color" type="text" value="" size="9" onchange="updateColor('link_color_pick','link_color');changedStyleField(this);" /></td>
+										<td id="link_color_pickcontainer">&nbsp;</td>
+									</tr>
+								</table>
+							</td>
+
+							<td class="column1"><label for="visited_color">{#fullpage_dlg.visited_color}</label></td> 
+							<td>
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="visited_color" name="visited_color" type="text" value="" size="9" onchange="updateColor('visited_color_pick','visited_color');changedStyleField(this);" /></td>
+										<td id="visited_color_pickcontainer">&nbsp;</td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="active_color">{#fullpage_dlg.active_color}</label></td> 
+							<td>
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="active_color" name="active_color" type="text" value="" size="9" onchange="updateColor('active_color_pick','active_color');changedStyleField(this);" /></td>
+										<td id="active_color_pickcontainer">&nbsp;</td>
+									</tr>
+								</table>
+							</td>
+
+							<td>&nbsp;</td>
+							<td>&nbsp;</td>
+
+<!--							<td class="column1"><label for="hover_color">{#fullpage_dlg.hover_color}</label></td> 
+							<td>
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="hover_color" name="hover_color" type="text" value="" size="9" onchange="changedStyleField(this);" /></td>
+										<td id="hover_color_pickcontainer">&nbsp;</td>
+									</tr>
+								</table>
+							</td> -->
+						</tr>
+					</table>
+				</fieldset>
+
+				<fieldset>
+					<legend>{#fullpage_dlg.appearance_style}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td class="column1"><label for="stylesheet">{#fullpage_dlg.stylesheet}</label></td> 
+							<td><table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="stylesheet" name="stylesheet" type="text" value="" /></td>
+										<td id="stylesheet_browsercontainer">&nbsp;</td>
+									</tr>
+								</table></td>
+						</tr>
+						<tr>
+							<td class="column1"><label for="style">{#fullpage_dlg.style}</label></td> 
+							<td><input id="style" name="style" type="text" value="" onchange="changedStyleField(this);" /></td>
+						</tr>
+					</table>
+				</fieldset>
+			</div>
+
+			<div id="advanced_panel" class="panel">
+				<div id="addmenu">
+					<table border="0" cellpadding="0" cellspacing="0">
+						<tr><td><a href="javascript:addHeadElm('title');" onmousedown="return false;"><span>{#fullpage_dlg.add_title}</span></a></td></tr>
+						<tr><td><a href="javascript:addHeadElm('meta');" onmousedown="return false;"><span>{#fullpage_dlg.add_meta}</span></a></td></tr>
+						<tr><td><a href="javascript:addHeadElm('script');" onmousedown="return false;"><span>{#fullpage_dlg.add_script}</span></a></td></tr>
+						<tr><td><a href="javascript:addHeadElm('style');" onmousedown="return false;"><span>{#fullpage_dlg.add_style}</span></a></td></tr>
+						<tr><td><a href="javascript:addHeadElm('link');" onmousedown="return false;"><span>{#fullpage_dlg.add_link}</span></a></td></tr>
+						<tr><td><a href="javascript:addHeadElm('base');" onmousedown="return false;"><span>{#fullpage_dlg.add_base}</span></a></td></tr>
+						<tr><td><a href="javascript:addHeadElm('comment');" onmousedown="return false;"><span>{#fullpage_dlg.add_comment}</span></a></td></tr>
+					</table>
+				</div>
+
+				<fieldset>
+					<legend>{#fullpage_dlg.head_elements}</legend>
+
+					<div class="headlistwrapper">
+						<div class="toolbar">
+							<div style="float: left">
+								<a id="addbutton" href="javascript:showAddMenu();" onmousedown="return false;" class="addbutton" title="{#fullpage_dlg.add}"></a>
+								<a href="#" onmousedown="return false;" class="removebutton" title="{#fullpage_dlg.remove}"></a>
+							</div>
+							<div style="float: right">
+								<a href="#" onmousedown="return false;" class="moveupbutton" title="{#fullpage_dlg.moveup}"></a>
+								<a href="#" onmousedown="return false;" class="movedownbutton" title="{#fullpage_dlg.movedown}"></a>
+							</div>
+							<br style="clear: both" />
+						</div>
+						<select id="headlist" size="26" onchange="updateHeadElm(this.options[this.selectedIndex].value);">
+							<option value="title_0">&lt;title&gt;Some title bla bla bla&lt;/title&gt;</option>
+							<option value="meta_1">&lt;meta name="keywords"&gt;Some bla bla bla&lt;/meta&gt;</option>
+							<option value="meta_2">&lt;meta name="description"&gt;Some bla bla bla bla bla bla bla bla bla&lt;/meta&gt;</option>
+							<option value="script_3">&lt;script language=&quot;javascript&quot;&gt;...&lt;/script&gt;</option>
+							<option value="style_4">&lt;style&gt;...&lt;/style&gt;</option>
+							<option value="base_5">&lt;base href="." /&gt;</option>
+							<option value="comment_6">&lt;!-- ... --&gt;</option>
+							<option value="link_7">&lt;link href="." /&gt;</option>
+						</select>
+					</div>
+				</fieldset>
+
+				<fieldset id="meta_element">
+					<legend>{#fullpage_dlg.meta_element}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td class="column1"><label for="element_meta_type">{#fullpage_dlg.type}</label></td> 
+							<td><select id="element_meta_type">
+										<option value="name">name</option>
+										<option value="http-equiv">http-equiv</option>
+								</select></td>
+						</tr>
+						<tr>
+							<td class="column1"><label for="element_meta_name">{#fullpage_dlg.name}</label></td> 
+							<td><input id="element_meta_name" name="element_meta_name" type="text" value="" /></td>
+						</tr>
+						<tr>
+							<td class="column1"><label for="element_meta_content">{#fullpage_dlg.content}</label></td> 
+							<td><input id="element_meta_content" name="element_meta_content" type="text" value="" /></td>
+						</tr>
+					</table>
+
+					<input type="button" id="meta_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
+				</fieldset>
+
+				<fieldset id="title_element">
+					<legend>{#fullpage_dlg.title_element}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td class="column1"><label for="element_title">{#fullpage_dlg.meta_title}</label></td> 
+							<td><input id="element_title" name="element_title" type="text" value="" /></td>
+						</tr>
+					</table>
+
+					<input type="button" id="title_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
+				</fieldset>
+
+				<fieldset id="script_element">
+					<legend>{#fullpage_dlg.script_element}</legend>
+
+					<div class="tabs">
+						<ul>
+							<li id="script_props_tab" class="current"><span><a href="javascript:mcTabs.displayTab('script_props_tab','script_props_panel');" onmousedown="return false;">{#fullpage_dlg.properties}</a></span></li>
+							<li id="script_value_tab"><span><a href="javascript:mcTabs.displayTab('script_value_tab','script_value_panel');" onmousedown="return false;">{#fullpage_dlg.value}</a></span></li>
+						</ul>
+					</div>
+
+					<br style="clear: both" />
+
+					<div class="panel_wrapper">
+						<div id="script_props_panel" class="panel current">
+							<table border="0" cellpadding="4" cellspacing="0">
+								<tr>
+									<td class="column1"><label for="element_script_type">{#fullpage_dlg.type}</label></td> 
+									<td><select id="element_script_type">
+										<option value="text/javascript">text/javascript</option>
+										<option value="text/jscript">text/jscript</option>
+										<option value="text/vbscript">text/vbscript</option>
+										<option value="text/vbs">text/vbs</option>
+										<option value="text/ecmascript">text/ecmascript</option>
+										<option value="text/xml">text/xml</option>
+									</select></td>
+								</tr>
+								<tr>
+									<td class="column1"><label for="element_script_src">{#fullpage_dlg.src}</label></td> 
+									<td><table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="element_script_src" name="element_script_src" type="text" value="" /></td>
+										<td id="script_src_pickcontainer">&nbsp;</td>
+									</tr>
+								</table></td>
+								</tr>
+								<tr>
+									<td class="column1"><label for="element_script_charset">{#fullpage_dlg.charset}</label></td> 
+									<td><select id="element_script_charset"><option value="">{#not_set}</option></select></td>
+								</tr>
+								<tr>
+									<td class="column1"><label for="element_script_defer">{#fullpage_dlg.defer}</label></td> 
+									<td><input type="checkbox" id="element_script_defer" name="element_script_defer" class="checkbox" /></td>
+								</tr>
+							</table>
+						</div>
+
+						<div id="script_value_panel" class="panel">
+							<textarea id="element_script_value"></textarea>
+						</div>
+					</div>
+
+					<input type="button" id="script_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
+				</fieldset>
+
+				<fieldset id="style_element">
+					<legend>{#fullpage_dlg.style_element}</legend>
+
+					<div class="tabs">
+						<ul>
+							<li id="style_props_tab" class="current"><span><a href="javascript:mcTabs.displayTab('style_props_tab','style_props_panel');" onmousedown="return false;">{#fullpage_dlg.properties}</a></span></li>
+							<li id="style_value_tab"><span><a href="javascript:mcTabs.displayTab('style_value_tab','style_value_panel');" onmousedown="return false;">{#fullpage_dlg.value}</a></span></li>
+						</ul>
+					</div>
+
+					<br style="clear: both" />
+
+					<div class="panel_wrapper">
+						<div id="style_props_panel" class="panel current">
+							<table border="0" cellpadding="4" cellspacing="0">
+								<tr>
+									<td class="column1"><label for="element_style_type">{#fullpage_dlg.type}</label></td> 
+									<td><select id="element_style_type">
+										<option value="text/css">text/css</option>
+									</select></td>
+								</tr>
+								<tr>
+									<td class="column1"><label for="element_style_media">{#fullpage_dlg.media}</label></td> 
+									<td><select id="element_style_media"></select></td>
+								</tr>
+							</table>
+						</div>
+
+						<div id="style_value_panel" class="panel">
+							<textarea id="element_style_value"></textarea>
+						</div>
+					</div>
+
+					<input type="button" id="style_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
+				</fieldset>
+
+				<fieldset id="base_element">
+					<legend>{#fullpage_dlg.base_element}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td class="column1"><label for="element_base_href">{#fullpage_dlg.href}</label></td> 
+							<td><input id="element_base_href" name="element_base_href" type="text" value="" /></td>
+						</tr>
+						<tr>
+							<td class="column1"><label for="element_base_target">{#fullpage_dlg.target}</label></td> 
+							<td><input id="element_base_target" name="element_base_target" type="text" value="" /></td>
+						</tr>
+					</table>
+
+					<input type="button" id="base_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
+				</fieldset>
+
+				<fieldset id="link_element">
+					<legend>{#fullpage_dlg.link_element}</legend>
+
+					<div class="tabs">
+						<ul>
+							<li id="link_general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('link_general_tab','link_general_panel');" onmousedown="return false;">{#fullpage_dlg.general_props}</a></span></li>
+							<li id="link_advanced_tab"><span><a href="javascript:mcTabs.displayTab('link_advanced_tab','link_advanced_panel');" onmousedown="return false;">{#fullpage_dlg.advanced_props}</a></span></li>
+						</ul>
+					</div>
+
+					<br style="clear: both" />
+
+					<div class="panel_wrapper">
+						<div id="link_general_panel" class="panel current">
+							<table border="0" cellpadding="4" cellspacing="0">
+								<tr>
+									<td class="column1"><label for="element_link_href">{#fullpage_dlg.href}</label></td> 
+									<td><table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="element_link_href" name="element_link_href" type="text" value="" /></td>
+										<td id="link_href_pickcontainer">&nbsp;</td>
+									</tr>
+								</table></td>
+								</tr>
+								<tr>
+									<td class="column1"><label for="element_link_title">{#fullpage_dlg.meta_title}</label></td> 
+									<td><input id="element_link_title" name="element_link_title" type="text" value="" /></td>
+								</tr>
+								<tr>
+									<td class="column1"><label for="element_link_type">{#fullpage_dlg.type}</label></td> 
+									<td><select id="element_link_type" name="element_link_type">
+										<option value="text/css">text/css</option>
+										<option value="text/javascript">text/javascript</option>
+									</select></td>
+								</tr>
+								<tr>
+									<td class="column1"><label for="element_link_media">{#fullpage_dlg.media}</label></td> 
+									<td><select id="element_link_media" name="element_link_media"></select></td>
+								</tr>
+								<tr>
+									<td><label for="element_style_rel">{#fullpage_dlg.rel}</label></td>
+									<td><select id="element_style_rel" name="element_style_rel"> 
+											<option value="">{#not_set}</option> 
+											<option value="stylesheet">Stylesheet</option>
+											<option value="alternate">Alternate</option>
+											<option value="designates">Designates</option>
+											<option value="start">Start</option>
+											<option value="next">Next</option>
+											<option value="prev">Prev</option>
+											<option value="contents">Contents</option>
+											<option value="index">Index</option>
+											<option value="glossary">Glossary</option>
+											<option value="copyright">Copyright</option>
+											<option value="chapter">Chapter</option>
+											<option value="subsection">Subsection</option>
+											<option value="appendix">Appendix</option>
+											<option value="help">Help</option>
+											<option value="bookmark">Bookmark</option>
+										</select> 
+									</td>
+								</tr>
+							</table>
+						</div>
+
+						<div id="link_advanced_panel" class="panel">
+							<table border="0" cellpadding="4" cellspacing="0">
+								<tr>
+									<td class="column1"><label for="element_link_charset">{#fullpage_dlg.charset}</label></td> 
+									<td><select id="element_link_charset"><option value="">{#not_set}</option></select></td>
+								</tr>
+								<tr>
+									<td class="column1"><label for="element_link_hreflang">{#fullpage_dlg.hreflang}</label></td> 
+									<td><input id="element_link_hreflang" name="element_link_hreflang" type="text" value="" /></td>
+								</tr>
+								<tr>
+									<td class="column1"><label for="element_link_target">{#fullpage_dlg.target}</label></td> 
+									<td><input id="element_link_target" name="element_link_target" type="text" value="" /></td>
+								</tr>
+								<tr>
+									<td><label for="element_style_rev">{#fullpage_dlg.rev}</label></td>
+									<td><select id="element_style_rev" name="element_style_rev"> 
+											<option value="">{#not_set}</option> 
+											<option value="alternate">Alternate</option> 
+											<option value="designates">Designates</option> 
+											<option value="stylesheet">Stylesheet</option> 
+											<option value="start">Start</option> 
+											<option value="next">Next</option> 
+											<option value="prev">Prev</option> 
+											<option value="contents">Contents</option> 
+											<option value="index">Index</option> 
+											<option value="glossary">Glossary</option> 
+											<option value="copyright">Copyright</option> 
+											<option value="chapter">Chapter</option> 
+											<option value="subsection">Subsection</option> 
+											<option value="appendix">Appendix</option> 
+											<option value="help">Help</option> 
+											<option value="bookmark">Bookmark</option> 
+										</select> 
+									</td>
+								</tr>
+							</table>
+						</div>
+					</div>
+
+					<input type="button" id="link_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
+				</fieldset>
+
+				<fieldset id="comment_element">
+					<legend>{#fullpage_dlg.comment_element}</legend>
+
+					<textarea id="element_comment_value"></textarea>
+
+					<input type="button" id="comment_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />
+				</fieldset>
+			</div>
+		</div>
+
+		<div class="mceActionPanel">
+			<div style="float: left">
+				<input type="submit" id="insert" name="update" value="{#update}" />
+			</div>
+
+			<div style="float: right">
+				<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+			</div>
+		</div>
+    </form>
+</body>
+</html>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/fullpage/images/add.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/fullpage/images/fullpage.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/fullpage/images/move_down.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/fullpage/images/move_up.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/fullpage/images/remove.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/fullpage/js/fullpage.js
@@ -1,1 +1,463 @@
-
+tinyMCEPopup.requireLangPack();
+
+var doc;
+
+var defaultDocTypes = 
+	'XHTML 1.0 Transitional=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">,' +
+	'XHTML 1.0 Frameset=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">,' +
+	'XHTML 1.0 Strict=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">,' +
+	'XHTML 1.1=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">,' +
+	'HTML 4.01 Transitional=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">,' +
+	'HTML 4.01 Strict=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">,' +
+	'HTML 4.01 Frameset=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">';
+
+var defaultEncodings = 
+	'Western european (iso-8859-1)=iso-8859-1,' +
+	'Central European (iso-8859-2)=iso-8859-2,' +
+	'Unicode (UTF-8)=utf-8,' +
+	'Chinese traditional (Big5)=big5,' +
+	'Cyrillic (iso-8859-5)=iso-8859-5,' +
+	'Japanese (iso-2022-jp)=iso-2022-jp,' +
+	'Greek (iso-8859-7)=iso-8859-7,' +
+	'Korean (iso-2022-kr)=iso-2022-kr,' +
+	'ASCII (us-ascii)=us-ascii';
+
+var defaultMediaTypes = 
+	'all=all,' +
+	'screen=screen,' +
+	'print=print,' +
+	'tty=tty,' +
+	'tv=tv,' +
+	'projection=projection,' +
+	'handheld=handheld,' +
+	'braille=braille,' +
+	'aural=aural';
+
+var defaultFontNames = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings';
+var defaultFontSizes = '10px,11px,12px,13px,14px,15px,16px';
+
+function init() {
+	var f = document.forms['fullpage'], el = f.elements, e, i, p, doctypes, encodings, mediaTypes, fonts, ed = tinyMCEPopup.editor, dom = tinyMCEPopup.dom, style;
+
+	// Setup doctype select box
+	doctypes = ed.getParam("fullpage_doctypes", defaultDocTypes).split(',');
+	for (i=0; i<doctypes.length; i++) {
+		p = doctypes[i].split('=');
+
+		if (p.length > 1)
+			addSelectValue(f, 'doctypes', p[0], p[1]);
+	}
+
+	// Setup fonts select box
+	fonts = ed.getParam("fullpage_fonts", defaultFontNames).split(';');
+	for (i=0; i<fonts.length; i++) {
+		p = fonts[i].split('=');
+
+		if (p.length > 1)
+			addSelectValue(f, 'fontface', p[0], p[1]);
+	}
+
+	// Setup fontsize select box
+	fonts = ed.getParam("fullpage_fontsizes", defaultFontSizes).split(',');
+	for (i=0; i<fonts.length; i++)
+		addSelectValue(f, 'fontsize', fonts[i], fonts[i]);
+
+	// Setup mediatype select boxs
+	mediaTypes = ed.getParam("fullpage_media_types", defaultMediaTypes).split(',');
+	for (i=0; i<mediaTypes.length; i++) {
+		p = mediaTypes[i].split('=');
+
+		if (p.length > 1) {
+			addSelectValue(f, 'element_style_media', p[0], p[1]);
+			addSelectValue(f, 'element_link_media', p[0], p[1]);
+		}
+	}
+
+	// Setup encodings select box
+	encodings = ed.getParam("fullpage_encodings", defaultEncodings).split(',');
+	for (i=0; i<encodings.length; i++) {
+		p = encodings[i].split('=');
+
+		if (p.length > 1) {
+			addSelectValue(f, 'docencoding', p[0], p[1]);
+			addSelectValue(f, 'element_script_charset', p[0], p[1]);
+			addSelectValue(f, 'element_link_charset', p[0], p[1]);
+		}
+	}
+
+	document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
+	document.getElementById('link_color_pickcontainer').innerHTML = getColorPickerHTML('link_color_pick','link_color');
+	//document.getElementById('hover_color_pickcontainer').innerHTML = getColorPickerHTML('hover_color_pick','hover_color');
+	document.getElementById('visited_color_pickcontainer').innerHTML = getColorPickerHTML('visited_color_pick','visited_color');
+	document.getElementById('active_color_pickcontainer').innerHTML = getColorPickerHTML('active_color_pick','active_color');
+	document.getElementById('textcolor_pickcontainer').innerHTML = getColorPickerHTML('textcolor_pick','textcolor');
+	document.getElementById('stylesheet_browsercontainer').innerHTML = getBrowserHTML('stylesheetbrowser','stylesheet','file','fullpage');
+	document.getElementById('link_href_pickcontainer').innerHTML = getBrowserHTML('link_href_browser','element_link_href','file','fullpage');
+	document.getElementById('script_src_pickcontainer').innerHTML = getBrowserHTML('script_src_browser','element_script_src','file','fullpage');
+	document.getElementById('bgimage_pickcontainer').innerHTML = getBrowserHTML('bgimage_browser','bgimage','image','fullpage');
+
+	// Resize some elements
+	if (isVisible('stylesheetbrowser'))
+		document.getElementById('stylesheet').style.width = '220px';
+
+	if (isVisible('link_href_browser'))
+		document.getElementById('element_link_href').style.width = '230px';
+
+	if (isVisible('bgimage_browser'))
+		document.getElementById('bgimage').style.width = '210px';
+
+	// Add iframe
+	dom.add(document.body, 'iframe', {id : 'documentIframe', src : 'javascript:""', style : {display : 'none'}});
+	doc = dom.get('documentIframe').contentWindow.document;
+	h = tinyMCEPopup.getWindowArg('head_html');
+
+	// Preprocess the HTML disable scripts and urls
+	h = h.replace(/<script>/gi, '<script type="text/javascript">');
+	h = h.replace(/type=([\"\'])?/gi, 'type=$1-mce-');
+	h = h.replace(/(src=|href=)/g, 'mce_$1');
+
+	// Write in the content in the iframe
+	doc.write(h + '</body></html>');
+	doc.close();
+
+	// Parse xml and doctype
+	xmlVer = getReItem(/<\?\s*?xml.*?version\s*?=\s*?"(.*?)".*?\?>/gi, h, 1);
+	xmlEnc = getReItem(/<\?\s*?xml.*?encoding\s*?=\s*?"(.*?)".*?\?>/gi, h, 1);
+	docType = getReItem(/<\!DOCTYPE.*?>/gi, h, 0);
+	f.langcode.value = getReItem(/lang="(.*?)"/gi, h, 1);
+
+	// Parse title
+	if (e = doc.getElementsByTagName('title')[0])
+		el.metatitle.value = e.textContent || e.text;
+
+	// Parse meta
+	tinymce.each(doc.getElementsByTagName('meta'), function(n) {
+		var na = (n.getAttribute('name', 2) || '').toLowerCase(), va = n.getAttribute('content', 2), eq = n.getAttribute('httpEquiv', 2) || '';
+
+		e = el['meta' + na];
+
+		if (na == 'robots') {
+			selectByValue(f, 'metarobots', tinymce.trim(va), true, true);
+			return;
+		}
+
+		switch (eq.toLowerCase()) {
+			case "content-type":
+				tmp = getReItem(/charset\s*=\s*(.*)\s*/gi, value, 1);
+
+				// Override XML encoding
+				if (tmp != "")
+					xmlEnc = tmp;
+
+				return;
+		}
+
+		if (e)
+			e.value = va;
+	});
+
+	selectByValue(f, 'doctypes', docType, true, true);
+	selectByValue(f, 'docencoding', xmlEnc, true, true);
+	selectByValue(f, 'langdir', doc.body.getAttribute('dir', 2) || '', true, true);
+
+	if (xmlVer != '')
+		el.xml_pi.checked = true;
+
+	// Parse appearance
+
+	// Parse primary stylesheet
+	tinymce.each(doc.getElementsByTagName("link"), function(l) {
+		var m = l.getAttribute('media', 2) || '', t = l.getAttribute('type', 2) || '';
+
+		if (t == "-mce-text/css" && (m == "" || m == "screen" || m == "all") && (l.getAttribute('rel', 2) || '') == "stylesheet") {
+			f.stylesheet.value = l.getAttribute('mce_href', 2) || '';
+			return false;
+		}
+	});
+
+	// Get from style elements
+	tinymce.each(doc.getElementsByTagName("style"), function(st) {
+		var tmp = parseStyleElement(st);
+
+		for (x=0; x<tmp.length; x++) {
+			if (tmp[x].rule.indexOf('a:visited') != -1 && tmp[x].data['color'])
+				f.visited_color.value = tmp[x].data['color'];
+
+			if (tmp[x].rule.indexOf('a:link') != -1 && tmp[x].data['color'])
+				f.link_color.value = tmp[x].data['color'];
+
+			if (tmp[x].rule.indexOf('a:active') != -1 && tmp[x].data['color'])
+				f.active_color.value = tmp[x].data['color'];
+		}
+	});
+
+	f.textcolor.value = tinyMCEPopup.dom.getAttrib(doc.body, "text");
+	f.active_color.value = tinyMCEPopup.dom.getAttrib(doc.body, "alink");
+	f.link_color.value = tinyMCEPopup.dom.getAttrib(doc.body, "link");
+	f.visited_color.value = tinyMCEPopup.dom.getAttrib(doc.body, "vlink");
+	f.bgcolor.value = tinyMCEPopup.dom.getAttrib(doc.body, "bgcolor");
+	f.bgimage.value = tinyMCEPopup.dom.getAttrib(doc.body, "background");
+
+	// Get from style info
+	style = tinyMCEPopup.dom.parseStyle(tinyMCEPopup.dom.getAttrib(doc.body, 'style'));
+
+	if (style['font-family'])
+		selectByValue(f, 'fontface', style['font-family'], true, true);
+	else
+		selectByValue(f, 'fontface', ed.getParam("fullpage_default_fontface", ""), true, true);
+
+	if (style['font-size'])
+		selectByValue(f, 'fontsize', style['font-size'], true, true);
+	else
+		selectByValue(f, 'fontsize', ed.getParam("fullpage_default_fontsize", ""), true, true);
+
+	if (style['color'])
+		f.textcolor.value = convertRGBToHex(style['color']);
+
+	if (style['background-image'])
+		f.bgimage.value = style['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+
+	if (style['background-color'])
+		f.bgcolor.value = style['background-color'];
+
+	if (style['margin']) {
+		tmp = style['margin'].replace(/[^0-9 ]/g, '');
+		tmp = tmp.split(/ +/);
+		f.topmargin.value = tmp.length > 0 ? tmp[0] : '';
+		f.rightmargin.value = tmp.length > 1 ? tmp[1] : tmp[0];
+		f.bottommargin.value = tmp.length > 2 ? tmp[2] : tmp[0];
+		f.leftmargin.value = tmp.length > 3 ? tmp[3] : tmp[0];
+	}
+
+	if (style['margin-left'])
+		f.leftmargin.value = style['margin-left'].replace(/[^0-9]/g, '');
+
+	if (style['margin-right'])
+		f.rightmargin.value = style['margin-right'].replace(/[^0-9]/g, '');
+
+	if (style['margin-top'])
+		f.topmargin.value = style['margin-top'].replace(/[^0-9]/g, '');
+
+	if (style['margin-bottom'])
+		f.bottommargin.value = style['margin-bottom'].replace(/[^0-9]/g, '');
+
+	f.style.value = tinyMCEPopup.dom.serializeStyle(style);
+
+	// Update colors
+	updateColor('textcolor_pick', 'textcolor');
+	updateColor('bgcolor_pick', 'bgcolor');
+	updateColor('visited_color_pick', 'visited_color');
+	updateColor('active_color_pick', 'active_color');
+	updateColor('link_color_pick', 'link_color');
+}
+
+function getReItem(r, s, i) {
+	var c = r.exec(s);
+
+	if (c && c.length > i)
+		return c[i];
+
+	return '';
+}
+
+function updateAction() {
+	var f = document.forms[0], nl, i, h, v, s, head, html, l, tmp, addlink = true, ser;
+
+	head = doc.getElementsByTagName('head')[0];
+
+	// Fix scripts without a type
+	nl = doc.getElementsByTagName('script');
+	for (i=0; i<nl.length; i++) {
+		if (tinyMCEPopup.dom.getAttrib(nl[i], 'mce_type') == '')
+			nl[i].setAttribute('mce_type', 'text/javascript');
+	}
+
+	// Get primary stylesheet
+	nl = doc.getElementsByTagName("link");
+	for (i=0; i<nl.length; i++) {
+		l = nl[i];
+
+		tmp = tinyMCEPopup.dom.getAttrib(l, 'media');
+
+		if (tinyMCEPopup.dom.getAttrib(l, 'mce_type') == "text/css" && (tmp == "" || tmp == "screen" || tmp == "all") && tinyMCEPopup.dom.getAttrib(l, 'rel') == "stylesheet") {
+			addlink = false;
+
+			if (f.stylesheet.value == '')
+				l.parentNode.removeChild(l);
+			else
+				l.setAttribute('mce_href', f.stylesheet.value);
+
+			break;
+		}
+	}
+
+	// Add new link
+	if (f.stylesheet.value != '') {
+		l = doc.createElement('link');
+
+		l.setAttribute('type', 'text/css');
+		l.setAttribute('mce_href', f.stylesheet.value);
+		l.setAttribute('rel', 'stylesheet');
+
+		head.appendChild(l);
+	}
+
+	setMeta(head, 'keywords', f.metakeywords.value);
+	setMeta(head, 'description', f.metadescription.value);
+	setMeta(head, 'author', f.metaauthor.value);
+	setMeta(head, 'copyright', f.metacopyright.value);
+	setMeta(head, 'robots', getSelectValue(f, 'metarobots'));
+	setMeta(head, 'Content-Type', getSelectValue(f, 'docencoding'));
+
+	doc.body.dir = getSelectValue(f, 'langdir');
+	doc.body.style.cssText = f.style.value;
+
+	doc.body.setAttribute('vLink', f.visited_color.value);
+	doc.body.setAttribute('link', f.link_color.value);
+	doc.body.setAttribute('text', f.textcolor.value);
+	doc.body.setAttribute('aLink', f.active_color.value);
+
+	doc.body.style.fontFamily = getSelectValue(f, 'fontface');
+	doc.body.style.fontSize = getSelectValue(f, 'fontsize');
+	doc.body.style.backgroundColor = f.bgcolor.value;
+
+	if (f.leftmargin.value != '')
+		doc.body.style.marginLeft = f.leftmargin.value + 'px';
+
+	if (f.rightmargin.value != '')
+		doc.body.style.marginRight = f.rightmargin.value + 'px';
+
+	if (f.bottommargin.value != '')
+		doc.body.style.marginBottom = f.bottommargin.value + 'px';
+
+	if (f.topmargin.value != '')
+		doc.body.style.marginTop = f.topmargin.value + 'px';
+
+	html = doc.getElementsByTagName('html')[0];
+	html.setAttribute('lang', f.langcode.value);
+	html.setAttribute('xml:lang', f.langcode.value);
+
+	if (f.bgimage.value != '')
+		doc.body.style.backgroundImage = "url('" + f.bgimage.value + "')";
+	else
+		doc.body.style.backgroundImage = '';
+
+	ser = tinyMCEPopup.editor.plugins.fullpage._createSerializer();
+	ser.setRules('-title,meta[http-equiv|name|content],base[href|target],link[href|rel|type|title|media],style[type],script[type|language|src],html[lang|xml::lang|xmlns],body[style|dir|vlink|link|text|alink],head');
+
+	h = ser.serialize(doc.documentElement);
+	h = h.substring(0, h.lastIndexOf('</body>'));
+
+	if (h.indexOf('<title>') == -1)
+		h = h.replace(/<head.*?>/, '$&\n' + '<title>' + tinyMCEPopup.dom.encode(f.metatitle.value) + '</title>');
+	else
+		h = h.replace(/<title>(.*?)<\/title>/, '<title>' + tinyMCEPopup.dom.encode(f.metatitle.value) + '</title>');
+
+	if ((v = getSelectValue(f, 'doctypes')) != '')
+		h = v + '\n' + h;
+
+	if (f.xml_pi.checked) {
+		s = '<?xml version="1.0"';
+
+		if ((v = getSelectValue(f, 'docencoding')) != '')
+			s += ' encoding="' + v + '"';
+
+		s += '?>\n';
+		h = s + h;
+	}
+
+	h = h.replace(/type=\"\-mce\-/gi, 'type="');
+
+	tinyMCEPopup.editor.plugins.fullpage.head = h;
+	tinyMCEPopup.editor.plugins.fullpage._setBodyAttribs(tinyMCEPopup.editor, {});
+	tinyMCEPopup.close();
+}
+
+function changedStyleField(field) {
+	//alert(field.id);
+}
+
+function setMeta(he, k, v) {
+	var nl, i, m;
+
+	nl = he.getElementsByTagName('meta');
+	for (i=0; i<nl.length; i++) {
+		if (k == 'Content-Type' && tinyMCEPopup.dom.getAttrib(nl[i], 'http-equiv') == k) {
+			if (v == '')
+				nl[i].parentNode.removeChild(nl[i]);
+			else
+				nl[i].setAttribute('content', "text/html; charset=" + v);
+
+			return;
+		}
+
+		if (tinyMCEPopup.dom.getAttrib(nl[i], 'name') == k) {
+			if (v == '')
+				nl[i].parentNode.removeChild(nl[i]);
+			else
+				nl[i].setAttribute('content', v);
+			return;
+		}
+	}
+
+	if (v == '')
+		return;
+
+	m = doc.createElement('meta');
+
+	if (k == 'Content-Type')
+		m.httpEquiv = k;
+	else
+		m.setAttribute('name', k);
+
+	m.setAttribute('content', v);
+	he.appendChild(m);
+}
+
+function parseStyleElement(e) {
+	var v = e.innerHTML;
+	var p, i, r;
+
+	v = v.replace(/<!--/gi, '');
+	v = v.replace(/-->/gi, '');
+	v = v.replace(/[\n\r]/gi, '');
+	v = v.replace(/\s+/gi, ' ');
+
+	r = [];
+	p = v.split(/{|}/);
+
+	for (i=0; i<p.length; i+=2) {
+		if (p[i] != "")
+			r[r.length] = {rule : tinymce.trim(p[i]), data : tinyMCEPopup.dom.parseStyle(p[i+1])};
+	}
+
+	return r;
+}
+
+function serializeStyleElement(d) {
+	var i, s, st;
+
+	s = '<!--\n';
+
+	for (i=0; i<d.length; i++) {
+		s += d[i].rule + ' {\n';
+
+		st = tinyMCE.serializeStyle(d[i].data);
+
+		if (st != '')
+			st += ';';
+
+		s += st.replace(/;/g, ';\n');
+		s += '}\n';
+
+		if (i != d.length - 1)
+			s += '\n';
+	}
+
+	s += '\n-->';
+
+	return s;
+}
+
+tinyMCEPopup.onInit.add(init);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/fullpage/jscripts/fullpage.js
@@ -1,1 +1,580 @@
-
+//
+
+var defaultDocTypes = 
+	'XHTML 1.0 Transitional=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">,' +
+	'XHTML 1.0 Frameset=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">,' +
+	'XHTML 1.0 Strict=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">,' +
+	'XHTML 1.1=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">">,' +
+	'HTML 4.01 Transitional=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">,' +
+	'HTML 4.01 Strict=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">,' +
+	'HTML 4.01 Frameset=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">';
+
+var defaultEncodings = 
+	'Western european (iso-8859-1)=iso-8859-1,' +
+	'Central European (iso-8859-2)=iso-8859-2,' +
+	'Unicode (UTF-8)=utf-8,' +
+	'Chinese traditional (Big5)=big5,' +
+	'Cyrillic (iso-8859-5)=iso-8859-5,' +
+	'Japanese (iso-2022-jp)=iso-2022-jp,' +
+	'Greek (iso-8859-7)=iso-8859-7,' +
+	'Korean (iso-2022-kr)=iso-2022-kr,' +
+	'ASCII (us-ascii)=us-ascii';
+
+var defaultMediaTypes = 
+	'all=all,' +
+	'screen=screen,' +
+	'print=print,' +
+	'tty=tty,' +
+	'tv=tv,' +
+	'projection=projection,' +
+	'handheld=handheld,' +
+	'braille=braille,' +
+	'aural=aural';
+
+var defaultFontNames = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings';
+var defaultFontSizes = '10px,11px,12px,13px,14px,15px,16px';
+
+var addMenuLayer = new MCLayer("addmenu");
+var lastElementType = null;
+var topDoc;
+
+function init() {
+	var f = document.forms['fullpage'];
+	var i, p, doctypes, encodings, mediaTypes, fonts;
+	var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
+
+	// Setup doctype select box
+	doctypes = tinyMCE.getParam("fullpage_doctypes", defaultDocTypes).split(',');
+	for (i=0; i<doctypes.length; i++) {
+		p = doctypes[i].split('=');
+
+		if (p.length > 1)
+			addSelectValue(f, 'doctypes', p[0], p[1]);
+	}
+
+	// Setup fonts select box
+	fonts = tinyMCE.getParam("fullpage_fonts", defaultFontNames).split(';');
+	for (i=0; i<fonts.length; i++) {
+		p = fonts[i].split('=');
+
+		if (p.length > 1)
+			addSelectValue(f, 'fontface', p[0], p[1]);
+	}
+
+	// Setup fontsize select box
+	fonts = tinyMCE.getParam("fullpage_fontsizes", defaultFontSizes).split(',');
+	for (i=0; i<fonts.length; i++)
+		addSelectValue(f, 'fontsize', fonts[i], fonts[i]);
+
+	// Setup mediatype select boxs
+	mediaTypes = tinyMCE.getParam("fullpage_media_types", defaultMediaTypes).split(',');
+	for (i=0; i<mediaTypes.length; i++) {
+		p = mediaTypes[i].split('=');
+
+		if (p.length > 1) {
+			addSelectValue(f, 'element_style_media', p[0], p[1]);
+			addSelectValue(f, 'element_link_media', p[0], p[1]);
+		}
+	}
+
+	// Setup encodings select box
+	encodings = tinyMCE.getParam("fullpage_encodings", defaultEncodings).split(',');
+	for (i=0; i<encodings.length; i++) {
+		p = encodings[i].split('=');
+
+		if (p.length > 1) {
+			addSelectValue(f, 'docencoding', p[0], p[1]);
+			addSelectValue(f, 'element_script_charset', p[0], p[1]);
+			addSelectValue(f, 'element_link_charset', p[0], p[1]);
+		}
+	}
+
+	document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
+	document.getElementById('link_color_pickcontainer').innerHTML = getColorPickerHTML('link_color_pick','link_color');
+	//document.getElementById('hover_color_pickcontainer').innerHTML = getColorPickerHTML('hover_color_pick','hover_color');
+	document.getElementById('visited_color_pickcontainer').innerHTML = getColorPickerHTML('visited_color_pick','visited_color');
+	document.getElementById('active_color_pickcontainer').innerHTML = getColorPickerHTML('active_color_pick','active_color');
+	document.getElementById('textcolor_pickcontainer').innerHTML = getColorPickerHTML('textcolor_pick','textcolor');
+	document.getElementById('stylesheet_browsercontainer').innerHTML = getBrowserHTML('stylesheetbrowser','stylesheet','file','fullpage');
+	document.getElementById('link_href_pickcontainer').innerHTML = getBrowserHTML('link_href_browser','element_link_href','file','fullpage');
+	document.getElementById('script_src_pickcontainer').innerHTML = getBrowserHTML('script_src_browser','element_script_src','file','fullpage');
+	document.getElementById('bgimage_pickcontainer').innerHTML = getBrowserHTML('bgimage_browser','bgimage','image','fullpage');
+
+	// Resize some elements
+	if (isVisible('stylesheetbrowser'))
+		document.getElementById('stylesheet').style.width = '220px';
+
+	if (isVisible('link_href_browser'))
+		document.getElementById('element_link_href').style.width = '230px';
+
+	if (isVisible('bgimage_browser'))
+		document.getElementById('bgimage').style.width = '210px';
+
+	// Create iframe
+	var iframe = document.createElement('iframe');
+
+	iframe.id = 'tempFrame';
+	iframe.style.display = 'none';
+	iframe.src = tinyMCE.baseURL + "/plugins/fullpage/blank.htm";
+
+	document.body.appendChild(iframe);
+
+	tinyMCEPopup.resizeToInnerSize();
+}
+
+function setupIframe(doc) {
+	var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
+	var hc = inst.fullpageTopContent;
+	var f = document.forms[0];
+	var xmlVer, xmlEnc, docType;
+	var nodes, i, x, name, value, tmp, l;
+
+	// Keep it from not loading/executing stuff
+	hc = hc.replace(/<script>/gi, '<script type="text/javascript">');
+	hc = hc.replace(/\ssrc=/gi, " mce_src=");
+	hc = hc.replace(/\shref=/gi, " mce_href=");
+	hc = hc.replace(/\stype=/gi, " mce_type=");
+	hc = hc.replace(/<script/gi, '<script type="text/unknown" ');
+
+	// Add end to make it DOM parseable
+	hc += '</body></html>';
+
+	topDoc = doc;
+	doc.open();
+	doc.write(hc);
+	doc.close();
+
+	// ------- Setup options for genral tab
+
+	// Parse xml and doctype
+	xmlVer = getReItem(/<\?\s*?xml.*?version\s*?=\s*?"(.*?)".*?\?>/gi, hc, 1);
+	xmlEnc = getReItem(/<\?\s*?xml.*?encoding\s*?=\s*?"(.*?)".*?\?>/gi, hc, 1);
+	docType = getReItem(/<\!DOCTYPE.*?>/gi, hc, 0);
+	f.langcode.value = getReItem(/lang="(.*?)"/gi, hc, 1);
+
+	// Get title
+	f.metatitle.value = tinyMCE.entityDecode(getReItem(/<title>(.*?)<\/title>/gi, hc, 1));
+
+	// Check for meta encoding
+	nodes = doc.getElementsByTagName("meta");
+	for (i=0; i<nodes.length; i++) {
+		name = tinyMCE.getAttrib(nodes[i], 'name');
+		value = tinyMCE.getAttrib(nodes[i], 'content');
+		httpEquiv = tinyMCE.getAttrib(nodes[i], 'httpEquiv');
+
+		switch (name.toLowerCase()) {
+			case "keywords":
+				f.metakeywords.value = value;
+				break;
+
+			case "description":
+				f.metadescription.value = value;
+				break;
+
+			case "author":
+				f.metaauthor.value = value;
+				break;
+
+			case "copyright":
+				f.metacopyright.value = value;
+				break;
+
+			case "robots":
+				selectByValue(f, 'metarobots', value, true, true);
+				break;
+		}
+
+		switch (httpEquiv.toLowerCase()) {
+			case "content-type":
+				tmp = getReItem(/charset\s*=\s*(.*)\s*/gi, value, 1);
+
+				// Override XML encoding
+				if (tmp != "")
+					xmlEnc = tmp;
+
+				break;
+		}
+	}
+
+	selectByValue(f, 'doctypes', docType, true, true);
+	selectByValue(f, 'docencoding', xmlEnc, true, true);
+	selectByValue(f, 'langdir', tinyMCE.getAttrib(doc.body, 'dir'), true, true);
+
+	if (xmlVer != '')
+		f.xml_pi.checked = true;
+
+	// ------- Setup options for appearance tab
+
+	// Get primary stylesheet
+	nodes = doc.getElementsByTagName("link");
+	for (i=0; i<nodes.length; i++) {
+		l = nodes[i];
+		tmp = tinyMCE.getAttrib(l, 'media');
+
+		if (tinyMCE.getAttrib(l, 'mce_type') == "text/css" && (tmp == "" || tmp == "screen" || tmp == "all") && tinyMCE.getAttrib(l, 'rel') == "stylesheet") {
+			f.stylesheet.value = tinyMCE.getAttrib(l, 'mce_href');
+			break;
+		}
+	}
+
+	// Get from style elements
+	nodes = doc.getElementsByTagName("style");
+	for (i=0; i<nodes.length; i++) {
+		tmp = parseStyleElement(nodes[i]);
+
+		for (x=0; x<tmp.length; x++) {
+		//	if (tmp[x].rule.indexOf('a:hover') != -1 && tmp[x].data['color'])
+		//		f.hover_color.value = tmp[x].data['color'];
+
+			if (tmp[x].rule.indexOf('a:visited') != -1 && tmp[x].data['color'])
+				f.visited_color.value = tmp[x].data['color'];
+
+			if (tmp[x].rule.indexOf('a:link') != -1 && tmp[x].data['color'])
+				f.link_color.value = tmp[x].data['color'];
+
+			if (tmp[x].rule.indexOf('a:active') != -1 && tmp[x].data['color'])
+				f.active_color.value = tmp[x].data['color'];
+		}
+	}
+
+	// Get from body attribs
+
+/*	f.leftmargin.value = tinyMCE.getAttrib(doc.body, "leftmargin");
+	f.rightmargin.value = tinyMCE.getAttrib(doc.body, "rightmargin");
+	f.topmargin.value = tinyMCE.getAttrib(doc.body, "topmargin");
+	f.bottommargin.value = tinyMCE.getAttrib(doc.body, "bottommargin");*/
+	f.textcolor.value = convertRGBToHex(tinyMCE.getAttrib(doc.body, "text"));
+	f.active_color.value = convertRGBToHex(tinyMCE.getAttrib(doc.body, "alink"));
+	f.link_color.value = convertRGBToHex(tinyMCE.getAttrib(doc.body, "link"));
+	f.visited_color.value = convertRGBToHex(tinyMCE.getAttrib(doc.body, "vlink"));
+	f.bgcolor.value = convertRGBToHex(tinyMCE.getAttrib(doc.body, "bgcolor"));
+	f.bgimage.value = convertRGBToHex(tinyMCE.getAttrib(doc.body, "background"));
+
+	// Get from style info
+	var style = tinyMCE.parseStyle(tinyMCE.getAttrib(doc.body, 'style'));
+
+	if (style['font-family'])
+		selectByValue(f, 'fontface', style['font-family'], true, true);
+	else
+		selectByValue(f, 'fontface', tinyMCE.getParam("fullpage_default_fontface", ""), true, true);
+
+	if (style['font-size'])
+		selectByValue(f, 'fontsize', style['font-size'], true, true);
+	else
+		selectByValue(f, 'fontsize', tinyMCE.getParam("fullpage_default_fontsize", ""), true, true);
+
+	if (style['color'])
+		f.textcolor.value = convertRGBToHex(style['color']);
+
+	if (style['background-image'])
+		f.bgimage.value = style['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+
+	if (style['background-color'])
+		f.bgcolor.value = convertRGBToHex(style['background-color']);
+
+	if (style['margin']) {
+		tmp = style['margin'].replace(/[^0-9 ]/g, '');
+		tmp = tmp.split(/ +/);
+		f.topmargin.value = tmp.length > 0 ? tmp[0] : '';
+		f.rightmargin.value = tmp.length > 1 ? tmp[1] : tmp[0];
+		f.bottommargin.value = tmp.length > 2 ? tmp[2] : tmp[0];
+		f.leftmargin.value = tmp.length > 3 ? tmp[3] : tmp[0];
+	}
+
+	if (style['margin-left'])
+		f.leftmargin.value = style['margin-left'].replace(/[^0-9]/g, '');
+
+	if (style['margin-right'])
+		f.rightmargin.value = style['margin-right'].replace(/[^0-9]/g, '');
+
+	if (style['margin-top'])
+		f.topmargin.value = style['margin-top'].replace(/[^0-9]/g, '');
+
+	if (style['margin-bottom'])
+		f.bottommargin.value = style['margin-bottom'].replace(/[^0-9]/g, '');
+
+	f.style.value = tinyMCE.serializeStyle(style);
+
+	updateColor('textcolor_pick', 'textcolor');
+	updateColor('bgcolor_pick', 'bgcolor');
+	updateColor('visited_color_pick', 'visited_color');
+	updateColor('active_color_pick', 'active_color');
+	updateColor('link_color_pick', 'link_color');
+	//updateColor('hover_color_pick', 'hover_color');
+}
+
+function updateAction() {
+	var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
+	var f = document.forms[0];
+	var nl, i, h, v, s, head, html, l, tmp, addlink = true;
+
+	head = topDoc.getElementsByTagName('head')[0];
+
+	// Fix scripts without a type
+	nl = topDoc.getElementsByTagName('script');
+	for (i=0; i<nl.length; i++) {
+		if (tinyMCE.getAttrib(nl[i], 'mce_type') == '')
+			nl[i].setAttribute('mce_type', 'text/javascript');
+	}
+
+	// Get primary stylesheet
+	nl = topDoc.getElementsByTagName("link");
+	for (i=0; i<nl.length; i++) {
+		l = nl[i];
+
+		tmp = tinyMCE.getAttrib(l, 'media');
+
+		if (tinyMCE.getAttrib(l, 'mce_type') == "text/css" && (tmp == "" || tmp == "screen" || tmp == "all") && tinyMCE.getAttrib(l, 'rel') == "stylesheet") {
+			addlink = false;
+
+			if (f.stylesheet.value == '')
+				l.parentNode.removeChild(l);
+			else
+				l.setAttribute('mce_href', f.stylesheet.value);
+
+			break;
+		}
+	}
+
+	// Add new link
+	if (f.stylesheet.value != '') {
+		l = topDoc.createElement('link');
+
+		l.setAttribute('mce_type', 'text/css');
+		l.setAttribute('mce_href', f.stylesheet.value);
+		l.setAttribute('rel', 'stylesheet');
+
+		head.appendChild(l);
+	}
+
+	setMeta(head, 'keywords', f.metakeywords.value);
+	setMeta(head, 'description', f.metadescription.value);
+	setMeta(head, 'author', f.metaauthor.value);
+	setMeta(head, 'copyright', f.metacopyright.value);
+	setMeta(head, 'robots', getSelectValue(f, 'metarobots'));
+	setMeta(head, 'Content-Type', getSelectValue(f, 'docencoding'));
+
+	topDoc.body.dir = getSelectValue(f, 'langdir');
+	topDoc.body.style.cssText = f.style.value;
+
+	topDoc.body.setAttribute('vLink', f.visited_color.value);
+	topDoc.body.setAttribute('link', f.link_color.value);
+	topDoc.body.setAttribute('text', f.textcolor.value);
+	topDoc.body.setAttribute('aLink', f.active_color.value);
+
+	topDoc.body.style.fontFamily = getSelectValue(f, 'fontface');
+	topDoc.body.style.fontSize = getSelectValue(f, 'fontsize');
+	topDoc.body.style.backgroundColor = f.bgcolor.value;
+
+	if (f.leftmargin.value != '')
+		topDoc.body.style.marginLeft = f.leftmargin.value + 'px';
+
+	if (f.rightmargin.value != '')
+		topDoc.body.style.marginRight = f.rightmargin.value + 'px';
+
+	if (f.bottommargin.value != '')
+		topDoc.body.style.marginBottom = f.bottommargin.value + 'px';
+
+	if (f.topmargin.value != '')
+		topDoc.body.style.marginTop = f.topmargin.value + 'px';
+
+	html = topDoc.getElementsByTagName('html')[0];
+	html.setAttribute('lang', f.langcode.value);
+	html.setAttribute('xml:lang', f.langcode.value);
+
+	if (f.bgimage.value != '')
+		topDoc.body.style.backgroundImage = "url('" + f.bgimage.value + "')";
+	else
+		topDoc.body.style.backgroundImage = '';
+
+	inst.cleanup.addRuleStr('-title,meta[http-equiv|name|content],base[href|target],link[href|rel|type|title|media],style[type],script[type|language|src],html[lang|xml:lang|xmlns],body[style|dir|vlink|link|text|alink],head');
+
+	h = inst.cleanup.serializeNodeAsHTML(topDoc.documentElement);
+
+	h = h.substring(0, h.lastIndexOf('</body>'));
+
+	if (h.indexOf('<title>') == -1)
+		h = h.replace(/<head.*?>/, '$&\n' + '<title>' + inst.cleanup.xmlEncode(f.metatitle.value) + '</title>');
+	else
+		h = h.replace(/<title>(.*?)<\/title>/, '<title>' + inst.cleanup.xmlEncode(f.metatitle.value) + '</title>');
+
+	if ((v = getSelectValue(f, 'doctypes')) != '')
+		h = v + '\n' + h;
+
+	if (f.xml_pi.checked) {
+		s = '<?xml version="1.0"';
+
+		if ((v = getSelectValue(f, 'docencoding')) != '')
+			s += ' encoding="' + v + '"';
+
+		s += '?>\n';
+		h = s + h;
+	}
+
+	inst.fullpageTopContent = h;
+
+	tinyMCEPopup.execCommand('mceFullPageUpdate', false, '');
+	tinyMCEPopup.close();
+}
+
+function setMeta(he, k, v) {
+	var nl, i, m;
+
+	nl = he.getElementsByTagName('meta');
+	for (i=0; i<nl.length; i++) {
+		if (k == 'Content-Type' && tinyMCE.getAttrib(nl[i], 'http-equiv') == k) {
+			if (v == '')
+				nl[i].parentNode.removeChild(nl[i]);
+			else
+				nl[i].setAttribute('content', "text/html; charset=" + v);
+
+			return;
+		}
+
+		if (tinyMCE.getAttrib(nl[i], 'name') == k) {
+			if (v == '')
+				nl[i].parentNode.removeChild(nl[i]);
+			else
+				nl[i].setAttribute('content', v);
+			return;
+		}
+	}
+
+	if (v == '')
+		return;
+
+	m = topDoc.createElement('meta');
+
+	if (k == 'Content-Type')
+		m.httpEquiv = k;
+	else
+		m.setAttribute('name', k);
+
+	m.setAttribute('content', v);
+	he.appendChild(m);
+}
+
+function parseStyleElement(e) {
+	var v = e.innerHTML;
+	var p, i, r;
+
+	v = v.replace(/<!--/gi, '');
+	v = v.replace(/-->/gi, '');
+	v = v.replace(/[\n\r]/gi, '');
+	v = v.replace(/\s+/gi, ' ');
+
+	r = new Array();
+	p = v.split(/{|}/);
+
+	for (i=0; i<p.length; i+=2) {
+		if (p[i] != "")
+			r[r.length] = {rule : tinyMCE.trim(p[i]), data : tinyMCE.parseStyle(p[i+1])};
+	}
+
+	return r;
+}
+
+function serializeStyleElement(d) {
+	var i, s, st;
+
+	s = '<!--\n';
+
+	for (i=0; i<d.length; i++) {
+		s += d[i].rule + ' {\n';
+
+		st = tinyMCE.serializeStyle(d[i].data);
+
+		if (st != '')
+			st += ';';
+
+		s += st.replace(/;/g, ';\n');
+		s += '}\n';
+
+		if (i != d.length - 1)
+			s += '\n';
+	}
+
+	s += '\n-->';
+
+	return s;
+}
+
+function getReItem(r, s, i) {
+	var c = r.exec(s);
+
+	if (c && c.length > i)
+		return c[i];
+
+	return '';
+}
+
+function changedStyleField(field) {
+	//alert(field.id);
+}
+
+function showAddMenu() {
+	var re = document.getElementById('addbutton');
+
+	addMenuLayer.moveRelativeTo(re, 'tr');
+	if (addMenuLayer.isMSIE)
+		addMenuLayer.moveBy(2, 0);
+
+	addMenuLayer.show();
+	addMenuLayer.setAutoHide(true, hideAddMenu);
+	addMenuLayer.addCSSClass(re, 'selected');
+}
+
+function hideAddMenu(l, e, mx, my) {
+	var re = document.getElementById('addbutton');
+	addMenuLayer.removeCSSClass(re, 'selected');
+}
+
+function addHeadElm(type) {
+	var le = document.getElementById('headlist');
+	var re = document.getElementById('addbutton');
+	var te = document.getElementById(type + '_element');
+
+	if (lastElementType)
+		lastElementType.style.display = 'none';
+
+	te.style.display = 'block';
+
+	lastElementType = te;
+
+	addMenuLayer.hide();
+	addMenuLayer.removeCSSClass(re, 'selected');
+
+	document.getElementById(type + '_updateelement').value = tinyMCE.getLang('lang_insert', 'Insert', true);
+
+	le.size = 10;
+}
+
+function updateHeadElm(item) {
+	var type = item.substring(0, item.indexOf('_'));
+	var le = document.getElementById('headlist');
+	var re = document.getElementById('addbutton');
+	var te = document.getElementById(type + '_element');
+
+	if (lastElementType)
+		lastElementType.style.display = 'none';
+
+	te.style.display = 'block';
+
+	lastElementType = te;
+
+	addMenuLayer.hide();
+	addMenuLayer.removeCSSClass(re, 'selected');
+
+	document.getElementById(type + '_updateelement').value = tinyMCE.getLang('lang_update', 'Update', true);
+
+	le.size = 10;
+}
+
+function cancelElementUpdate() {
+	var le = document.getElementById('headlist');
+
+	if (lastElementType)
+		lastElementType.style.display = 'none';
+
+	le.size = 26;
+}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/en.js
@@ -1,1 +1,93 @@
+// UK lang variables
 
+tinyMCE.addToLang('fullpage',{
+	title : 'Document properties',
+	desc : 'Document properties',
+	meta_tab : 'General',
+	appearance_tab : 'Appearance',
+	advanced_tab : 'Advanced',
+	meta_props : 'Meta information',
+	langprops : 'Language and encoding',
+	meta_title : 'Title',
+	meta_keywords : 'Keywords',
+	meta_description : 'Description',
+	meta_robots : 'Robots',
+	doctypes : 'Doctype',
+	langcode : 'Language code',
+	langdir : 'Language direction',
+	ltr : 'Left to right',
+	rtl : 'Right to left',
+	xml_pi : 'XML declaration',
+	encoding : 'Character encoding',
+	appearance_bgprops : 'Background properties',
+	appearance_marginprops : 'Body margins',
+	appearance_linkprops : 'Link colors',
+	appearance_textprops : 'Text properties',
+	bgcolor : 'Background color',
+	bgimage : 'Background image',
+	left_margin : 'Left margin',
+	right_margin : 'Right margin',
+	top_margin : 'Top margin',
+	bottom_margin : 'Bottom margin',
+	text_color : 'Text color',
+	font_size : 'Font size',
+	font_face : 'Font face',
+	link_color : 'Link color',
+	hover_color : 'Hover color',
+	visited_color : 'Visited color',
+	active_color : 'Active color',
+	textcolor : 'Color',
+	fontsize : 'Font size',
+	fontface : 'Font family',
+	meta_index_follow : 'Index and follow the links',
+	meta_index_nofollow : 'Index and don\'t follow the links',
+	meta_noindex_follow : 'Do not index but follow the links',
+	meta_noindex_nofollow : 'Do not index and don\'t follow the links',
+	appearance_style : 'Stylesheet and style properties',
+	stylesheet : 'Stylesheet',
+	style : 'Style',
+	author : 'Author',
+	copyright : 'Copyright',
+	add : 'Add new element',
+	remove : 'Remove selected element',
+	moveup : 'Move selected element up',
+	movedown : 'Move selected element down',
+	head_elements : 'Head elements',
+	info : 'Information',
+	info_text : '',
+	add_title : 'Title element',
+	add_meta : 'Meta element',
+	add_script : 'Script element',
+	add_style : 'Style element',
+	add_link : 'Link element',
+	add_base : 'Base element',
+	add_comment : 'Comment node',
+	title_element : 'Title element',
+	script_element : 'Script element',
+	style_element : 'Style element',
+	base_element : 'Base element',
+	link_element : 'Link element',
+	meta_element : 'Meta element',
+	comment_element : 'Comment',
+	src : 'Src',
+	language : 'Language',
+	href : 'Href',
+	target : 'Target',
+	rel : 'Rel',
+	type : 'Type',
+	charset : 'Charset',
+	defer : 'Defer',
+	media : 'Media',
+	properties : 'Properties',
+	name : 'Name',
+	value : 'Value',
+	content : 'Content',
+	rel : 'Rel',
+	rev : 'Rev',
+	hreflang : 'Href lang',
+	general_props : 'General',
+	advanced_props : 'Advanced',
+	delta_width : 0,
+	delta_height : 0
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/en_dlg.js
@@ -1,1 +1,85 @@
-
+tinyMCE.addI18n('en.fullpage_dlg',{
+title:"Document properties",
+meta_tab:"General",
+appearance_tab:"Appearance",
+advanced_tab:"Advanced",
+meta_props:"Meta information",
+langprops:"Language and encoding",
+meta_title:"Title",
+meta_keywords:"Keywords",
+meta_description:"Description",
+meta_robots:"Robots",
+doctypes:"Doctype",
+langcode:"Language code",
+langdir:"Language direction",
+ltr:"Left to right",
+rtl:"Right to left",
+xml_pi:"XML declaration",
+encoding:"Character encoding",
+appearance_bgprops:"Background properties",
+appearance_marginprops:"Body margins",
+appearance_linkprops:"Link colors",
+appearance_textprops:"Text properties",
+bgcolor:"Background color",
+bgimage:"Background image",
+left_margin:"Left margin",
+right_margin:"Right margin",
+top_margin:"Top margin",
+bottom_margin:"Bottom margin",
+text_color:"Text color",
+font_size:"Font size",
+font_face:"Font face",
+link_color:"Link color",
+hover_color:"Hover color",
+visited_color:"Visited color",
+active_color:"Active color",
+textcolor:"Color",
+fontsize:"Font size",
+fontface:"Font family",
+meta_index_follow:"Index and follow the links",
+meta_index_nofollow:"Index and don't follow the links",
+meta_noindex_follow:"Do not index but follow the links",
+meta_noindex_nofollow:"Do not index and don\'t follow the links",
+appearance_style:"Stylesheet and style properties",
+stylesheet:"Stylesheet",
+style:"Style",
+author:"Author",
+copyright:"Copyright",
+add:"Add new element",
+remove:"Remove selected element",
+moveup:"Move selected element up",
+movedown:"Move selected element down",
+head_elements:"Head elements",
+info:"Information",
+add_title:"Title element",
+add_meta:"Meta element",
+add_script:"Script element",
+add_style:"Style element",
+add_link:"Link element",
+add_base:"Base element",
+add_comment:"Comment node",
+title_element:"Title element",
+script_element:"Script element",
+style_element:"Style element",
+base_element:"Base element",
+link_element:"Link element",
+meta_element:"Meta element",
+comment_element:"Comment",
+src:"Src",
+language:"Language",
+href:"Href",
+target:"Target",
+type:"Type",
+charset:"Charset",
+defer:"Defer",
+media:"Media",
+properties:"Properties",
+name:"Name",
+value:"Value",
+content:"Content",
+rel:"Rel",
+rev:"Rev",
+hreflang:"Href lang",
+general_props:"General",
+advanced_props:"Advanced"
+});

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/fullscreen/css/content.css
@@ -1,1 +1,4 @@
+.mceItemFullScreenHidden {
+	display: none !important;
+}
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/fullscreen/css/page.css
@@ -1,1 +1,22 @@
+/* This class restores all CSS properties to that absolute positioning of fullscreen mode is correct */
+.mceFullscreenPos {
+	display: block !important;
+	position: static !important;
+	left: 0 !important;
+	top: 0 !important;
+	bottom: auto !important;
+	right: auto !important;
+	width: auto !important;
+	height: auto !important;
+	margin: 0 !important;
+	padding: 0 !important;
+	border: 0 !important;
+	overflow: visible;
+	z-index: 1 !important;
+	clear: both;
+}
 
+body.mceFullscreen {
+	overflow: hidden !important;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/fullscreen/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){var DOM=tinymce.DOM;tinymce.create('tinymce.plugins.FullScreenPlugin',{init:function(ed,url){var t=this,s={},vp;t.editor=ed;ed.addCommand('mceFullScreen',function(){var win,de=DOM.doc.documentElement;if(ed.getParam('fullscreen_is_enabled')){if(ed.getParam('fullscreen_new_window'))closeFullscreen();else{DOM.win.setTimeout(function(){tinymce.dom.Event.remove(DOM.win,'resize',t.resizeFunc);tinyMCE.get(ed.getParam('fullscreen_editor_id')).setContent(ed.getContent({format:'raw'}),{format:'raw'});tinyMCE.remove(ed);DOM.remove('mce_fullscreen_container');de.style.overflow=ed.getParam('fullscreen_html_overflow');DOM.setStyle(DOM.doc.body,'overflow',ed.getParam('fullscreen_overflow'));DOM.win.scrollTo(ed.getParam('fullscreen_scrollx'),ed.getParam('fullscreen_scrolly'));tinyMCE.settings=tinyMCE.oldSettings;},10);}return;}if(ed.getParam('fullscreen_new_window')){win=DOM.win.open(url+"/fullscreen.htm","mceFullScreenPopup","fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width="+screen.availWidth+",height="+screen.availHeight);try{win.resizeTo(screen.availWidth,screen.availHeight);}catch(e){}}else{tinyMCE.oldSettings=tinyMCE.settings;s.fullscreen_overflow=DOM.getStyle(DOM.doc.body,'overflow',1)||'auto';s.fullscreen_html_overflow=DOM.getStyle(de,'overflow',1);vp=DOM.getViewPort();s.fullscreen_scrollx=vp.x;s.fullscreen_scrolly=vp.y;if(tinymce.isOpera&&s.fullscreen_overflow=='visible')s.fullscreen_overflow='auto';if(tinymce.isIE&&s.fullscreen_overflow=='scroll')s.fullscreen_overflow='auto';if(s.fullscreen_overflow=='0px')s.fullscreen_overflow='';DOM.setStyle(DOM.doc.body,'overflow','hidden');de.style.overflow='hidden';vp=DOM.getViewPort();DOM.win.scrollTo(0,0);if(tinymce.isIE)vp.h-=1;n=DOM.add(DOM.doc.body,'div',{id:'mce_fullscreen_container',style:'position:absolute;top:0;left:0;width:'+vp.w+'px;height:'+vp.h+'px;z-index:200000;'});DOM.add(n,'div',{id:'mce_fullscreen'});tinymce.each(ed.settings,function(v,n){s[n]=v;});s.id='mce_fullscreen';s.width=n.clientWidth;s.height=n.clientHeight-15;s.fullscreen_is_enabled=true;s.fullscreen_editor_id=ed.id;s.theme_advanced_resizing=false;s.save_onsavecallback=function(){ed.setContent(tinyMCE.get(s.id).getContent({format:'raw'}),{format:'raw'});ed.execCommand('mceSave');};tinymce.each(ed.getParam('fullscreen_settings'),function(v,k){s[k]=v;});if(s.theme_advanced_toolbar_location==='external')s.theme_advanced_toolbar_location='top';t.fullscreenEditor=new tinymce.Editor('mce_fullscreen',s);t.fullscreenEditor.onInit.add(function(){t.fullscreenEditor.setContent(ed.getContent());t.fullscreenEditor.focus();});t.fullscreenEditor.render();tinyMCE.add(t.fullscreenEditor);t.fullscreenElement=new tinymce.dom.Element('mce_fullscreen_container');t.fullscreenElement.update();t.resizeFunc=tinymce.dom.Event.add(DOM.win,'resize',function(){var vp=tinymce.DOM.getViewPort();t.fullscreenEditor.theme.resizeTo(vp.w,vp.h);});}});ed.addButton('fullscreen',{title:'fullscreen.desc',cmd:'mceFullScreen'});ed.onNodeChange.add(function(ed,cm){cm.setActive('fullscreen',ed.getParam('fullscreen_is_enabled'));});},getInfo:function(){return{longname:'Fullscreen',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.PluginManager.add('fullscreen',tinymce.plugins.FullScreenPlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js
@@ -1,1 +1,141 @@
+/**
+ * $Id: editor_plugin_src.js 766 2008-04-03 20:37:06Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	var DOM = tinymce.DOM;
+
+	tinymce.create('tinymce.plugins.FullScreenPlugin', {
+		init : function(ed, url) {
+			var t = this, s = {}, vp;
+
+			t.editor = ed;
+
+			// Register commands
+			ed.addCommand('mceFullScreen', function() {
+				var win, de = DOM.doc.documentElement;
+
+				if (ed.getParam('fullscreen_is_enabled')) {
+					if (ed.getParam('fullscreen_new_window'))
+						closeFullscreen(); // Call to close in new window
+					else {
+						DOM.win.setTimeout(function() {
+							tinymce.dom.Event.remove(DOM.win, 'resize', t.resizeFunc);
+							tinyMCE.get(ed.getParam('fullscreen_editor_id')).setContent(ed.getContent({format : 'raw'}), {format : 'raw'});
+							tinyMCE.remove(ed);
+							DOM.remove('mce_fullscreen_container');
+							de.style.overflow = ed.getParam('fullscreen_html_overflow');
+							DOM.setStyle(DOM.doc.body, 'overflow', ed.getParam('fullscreen_overflow'));
+							DOM.win.scrollTo(ed.getParam('fullscreen_scrollx'), ed.getParam('fullscreen_scrolly'));
+							tinyMCE.settings = tinyMCE.oldSettings; // Restore old settings
+						}, 10);
+					}
+
+					return;
+				}
+
+				if (ed.getParam('fullscreen_new_window')) {
+					win = DOM.win.open(url + "/fullscreen.htm", "mceFullScreenPopup", "fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width=" + screen.availWidth + ",height=" + screen.availHeight);
+					try {
+						win.resizeTo(screen.availWidth, screen.availHeight);
+					} catch (e) {
+						// Ignore
+					}
+				} else {
+					tinyMCE.oldSettings = tinyMCE.settings; // Store old settings
+					s.fullscreen_overflow = DOM.getStyle(DOM.doc.body, 'overflow', 1) || 'auto';
+					s.fullscreen_html_overflow = DOM.getStyle(de, 'overflow', 1);
+					vp = DOM.getViewPort();
+					s.fullscreen_scrollx = vp.x;
+					s.fullscreen_scrolly = vp.y;
+
+					// Fixes an Opera bug where the scrollbars doesn't reappear
+					if (tinymce.isOpera && s.fullscreen_overflow == 'visible')
+						s.fullscreen_overflow = 'auto';
+
+					// Fixes an IE bug where horizontal scrollbars would appear
+					if (tinymce.isIE && s.fullscreen_overflow == 'scroll')
+						s.fullscreen_overflow = 'auto';
+
+					if (s.fullscreen_overflow == '0px')
+						s.fullscreen_overflow = '';
+
+					DOM.setStyle(DOM.doc.body, 'overflow', 'hidden');
+					de.style.overflow = 'hidden'; //Fix for IE6/7
+					vp = DOM.getViewPort();
+					DOM.win.scrollTo(0, 0);
+
+					if (tinymce.isIE)
+						vp.h -= 1;
+
+					n = DOM.add(DOM.doc.body, 'div', {id : 'mce_fullscreen_container', style : 'position:absolute;top:0;left:0;width:' + vp.w + 'px;height:' + vp.h + 'px;z-index:200000;'});
+					DOM.add(n, 'div', {id : 'mce_fullscreen'});
+
+					tinymce.each(ed.settings, function(v, n) {
+						s[n] = v;
+					});
+
+					s.id = 'mce_fullscreen';
+					s.width = n.clientWidth;
+					s.height = n.clientHeight - 15;
+					s.fullscreen_is_enabled = true;
+					s.fullscreen_editor_id = ed.id;
+					s.theme_advanced_resizing = false;
+					s.save_onsavecallback = function() {
+						ed.setContent(tinyMCE.get(s.id).getContent({format : 'raw'}), {format : 'raw'});
+						ed.execCommand('mceSave');
+					};
+
+					tinymce.each(ed.getParam('fullscreen_settings'), function(v, k) {
+						s[k] = v;
+					});
+
+					if (s.theme_advanced_toolbar_location === 'external')
+						s.theme_advanced_toolbar_location = 'top';
+
+					t.fullscreenEditor = new tinymce.Editor('mce_fullscreen', s);
+					t.fullscreenEditor.onInit.add(function() {
+						t.fullscreenEditor.setContent(ed.getContent());
+						t.fullscreenEditor.focus();
+					});
+
+					t.fullscreenEditor.render();
+					tinyMCE.add(t.fullscreenEditor);
+
+					t.fullscreenElement = new tinymce.dom.Element('mce_fullscreen_container');
+					t.fullscreenElement.update();
+					//document.body.overflow = 'hidden';
+
+					t.resizeFunc = tinymce.dom.Event.add(DOM.win, 'resize', function() {
+						var vp = tinymce.DOM.getViewPort();
+
+						t.fullscreenEditor.theme.resizeTo(vp.w, vp.h);
+					});
+				}
+			});
+
+			// Register buttons
+			ed.addButton('fullscreen', {title : 'fullscreen.desc', cmd : 'mceFullScreen'});
+
+			ed.onNodeChange.add(function(ed, cm) {
+				cm.setActive('fullscreen', ed.getParam('fullscreen_is_enabled'));
+			});
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Fullscreen',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('fullscreen', tinymce.plugins.FullScreenPlugin);
+})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/fullscreen/fullscreen.htm
@@ -1,1 +1,112 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title></title>
+	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+	<script type="text/javascript" src="../../tiny_mce.js"></script>
+	<script type="text/javascript">
+		function patchCallback(settings, key) {
+			if (settings[key])
+				settings[key] = "window.opener." + settings[key];
+		}
 
+		var settings = {}, paSe = window.opener.tinyMCE.activeEditor.settings;
+
+		// Clone array
+		for (var n in paSe)
+			settings[n] = paSe[n];
+
+		// Override options for fullscreen
+		for (var n in paSe.fullscreen_settings)
+			settings[n] = paSe.fullscreen_settings[n];
+
+		// Patch callbacks, make them point to window.opener
+		patchCallback(settings, 'urlconverter_callback');
+		patchCallback(settings, 'insertlink_callback');
+		patchCallback(settings, 'insertimage_callback');
+		patchCallback(settings, 'setupcontent_callback');
+		patchCallback(settings, 'save_callback');
+		patchCallback(settings, 'onchange_callback');
+		patchCallback(settings, 'init_instance_callback');
+		patchCallback(settings, 'file_browser_callback');
+		patchCallback(settings, 'cleanup_callback');
+		patchCallback(settings, 'execcommand_callback');
+		patchCallback(settings, 'oninit');
+
+		// Set options
+		delete settings.id;
+		settings['mode'] = 'exact';
+		settings['elements'] = 'fullscreenarea';
+		settings['add_unload_trigger'] = false;
+		settings['ask'] = false;
+		settings['document_base_url'] = window.opener.tinyMCE.activeEditor.documentBaseURI.getURI();
+		settings['fullscreen_is_enabled'] = true;
+		settings['fullscreen_editor_id'] = window.opener.tinyMCE.activeEditor.id;
+		settings['theme_advanced_resizing'] = false;
+		settings['strict_loading_mode'] = true;
+
+		settings.save_onsavecallback = function() {
+			window.opener.tinyMCE.activeEditor.setContent(tinyMCE.get('fullscreenarea').getContent({format : 'raw'}), {format : 'raw'});
+			window.opener.tinyMCE.activeEditor.execCommand('mceSave');
+			window.close();
+		};
+
+		function unloadHandler(e) {
+			moveContent();
+		}
+
+		function moveContent() {
+			window.opener.tinyMCE.activeEditor.setContent(tinyMCE.activeEditor.getContent());
+		}
+
+		function closeFullscreen() {
+			moveContent();
+			window.close();
+		}
+
+		function doParentSubmit() {
+			moveContent();
+
+			if (window.opener.tinyMCE.selectedInstance.formElement.form)
+				window.opener.tinyMCE.selectedInstance.formElement.form.submit();
+
+			window.close();
+
+			return false;
+		}
+
+		function render() {
+			var e = document.getElementById('fullscreenarea'), vp, ed, ow, oh, dom = tinymce.DOM;
+
+			e.value = window.opener.tinyMCE.activeEditor.getContent();
+
+			vp = dom.getViewPort();
+			settings.width = vp.w;
+			settings.height = vp.h - 15;
+
+			tinymce.dom.Event.add(window, 'resize', function() {
+				var vp = dom.getViewPort();
+
+				tinyMCE.activeEditor.theme.resizeTo(vp.w, vp.h);
+			});
+
+			tinyMCE.init(settings);
+		}
+
+		// Add onunload
+		tinymce.dom.Event.add(window, "beforeunload", unloadHandler);
+	</script>
+	<base target="_self" />
+</head>
+<body style="margin:0;overflow:hidden;width:100%;height:100%" scrolling="no" scroll="no">
+<form onsubmit="doParentSubmit();">
+<textarea id="fullscreenarea" style="width:100%; height:100%"></textarea>
+</form>
+
+<script type="text/javascript">
+	render();
+</script>
+
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/fullscreen/images/_vti_cnf/fullscreen.gif
@@ -1,1 +1,11 @@
+vti_encoding:SR|utf8-nl
+vti_timelastmodified:TR|26 Sep 2005 18:01:40 -0000
+vti_extenderversion:SR|5.0.2.2623
+vti_author:SR|NORTHGRUM\\keefeta
+vti_modifiedby:SR|NORTHGRUM\\keefeta
+vti_timecreated:TR|26 Sep 2005 18:01:40 -0000
+vti_cacheddtm:TX|26 Sep 2005 18:01:40 -0000
+vti_filesize:IR|198
+vti_lineageid:SR|{EB09825D-4BD0-401B-B73F-A78E10C3AF3B}
+vti_backlinkinfo:VX|
 

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/fullscreen/images/fullscreen.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/fullscreen/langs/en.js
@@ -1,1 +1,6 @@
+// UK lang variables
 
+tinyMCE.addToLang('',{
+fullscreen_desc : 'Toggle fullscreen mode'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/fullscreen/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/iespell/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.IESpell',{init:function(ed,url){var t=this,sp;if(!tinymce.isIE)return;t.editor=ed;ed.addCommand('mceIESpell',function(){try{sp=new ActiveXObject("ieSpell.ieSpellExtension");sp.CheckDocumentNode(ed.getDoc().documentElement);}catch(e){if(e.number==-2146827859){ed.windowManager.confirm(ed.getLang("iespell.download"),function(s){if(s)window.open('http://www.iespell.com/download.php','ieSpellDownload','');});}else ed.windowManager.alert("Error Loading ieSpell: Exception "+e.number);}});ed.addButton('iespell',{title:'iespell.iespell_desc',cmd:'mceIESpell'});},getInfo:function(){return{longname:'IESpell (IE Only)',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/iespell',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.PluginManager.add('iespell',tinymce.plugins.IESpell);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/iespell/editor_plugin_src.js
@@ -1,1 +1,51 @@
+/**
+ * $Id: editor_plugin_src.js 520 2008-01-07 16:30:32Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.IESpell', {
+		init : function(ed, url) {
+			var t = this, sp;
+
+			if (!tinymce.isIE)
+				return;
+
+			t.editor = ed;
+
+			// Register commands
+			ed.addCommand('mceIESpell', function() {
+				try {
+					sp = new ActiveXObject("ieSpell.ieSpellExtension");
+					sp.CheckDocumentNode(ed.getDoc().documentElement);
+				} catch (e) {
+					if (e.number == -2146827859) {
+						ed.windowManager.confirm(ed.getLang("iespell.download"), function(s) {
+							if (s)
+								window.open('http://www.iespell.com/download.php', 'ieSpellDownload', '');
+						});
+					} else
+						ed.windowManager.alert("Error Loading ieSpell: Exception " + e.number);
+				}
+			});
+
+			// Register buttons
+			ed.addButton('iespell', {title : 'iespell.iespell_desc', cmd : 'mceIESpell'});
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'IESpell (IE Only)',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/iespell',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('iespell', tinymce.plugins.IESpell);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/iespell/images/iespell.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/iespell/langs/en.js
@@ -1,1 +1,8 @@
+// UK lang variables
 
+tinyMCE.addToLang('',{
+iespell_desc : 'Run spell checking',
+iespell_download : "ieSpell not detected. Click OK to go to download page."
+});
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/iespell/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/css/inlinepopup.css
@@ -1,1 +1,70 @@
+/* Window classes */
 
+.mceWindow {
+	position: absolute;
+	left: 0;
+	top: 0;
+	border: 1px solid black;
+	background-color: #D4D0C8;
+}
+
+.mceWindowHead {
+	background-color: #334F8D;
+	width: 100%;
+	height: 18px;
+	cursor: move;
+	overflow: hidden;
+}
+
+.mceWindowBody {
+	clear: both;
+	background-color: white;
+}
+
+.mceWindowStatusbar {
+	background-color: #D4D0C8;
+	height: 12px;
+	border-top: 1px solid black;
+}
+
+.mceWindowTitle {
+	float: left;
+	font-family: "MS Sans Serif";
+	font-size: 9pt;
+	font-weight: bold;
+	line-height: 18px;
+	color: white;
+	margin-left: 2px;
+	overflow: hidden;
+}
+
+.mceWindowHeadTools {
+	margin-right: 2px;
+}
+
+.mceWindowClose, .mceWindowMinimize, .mceWindowMaximize {
+	display: block;
+	float: right;
+	overflow: hidden;
+	margin-top: 2px;
+}
+
+.mceWindowClose {
+	margin-left: 2px;
+}
+
+.mceWindowMinimize {
+}
+
+.mceWindowMaximize {
+}
+
+.mceWindowResize {
+	display: block;
+	float: right;
+	overflow: hidden;
+	cursor: se-resize;
+	width: 12px;
+	height: 12px;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){var DOM=tinymce.DOM,Element=tinymce.dom.Element,Event=tinymce.dom.Event,each=tinymce.each,is=tinymce.is;tinymce.create('tinymce.plugins.InlinePopups',{init:function(ed,url){ed.onBeforeRenderUI.add(function(){ed.windowManager=new tinymce.InlineWindowManager(ed);DOM.loadCSS(url+'/skins/'+(ed.settings.inlinepopups_skin||'clearlooks2')+"/window.css");});},getInfo:function(){return{longname:'InlinePopups',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.create('tinymce.InlineWindowManager:tinymce.WindowManager',{InlineWindowManager:function(ed){var t=this;t.parent(ed);t.zIndex=300000;t.count=0;},open:function(f,p){var t=this,id,opt='',ed=t.editor,dw=0,dh=0,vp,po,mdf,clf,we,w,u;f=f||{};p=p||{};if(!f.inline)return t.parent(f,p);if(!f.type)t.bookmark=ed.selection.getBookmark('simple');id=DOM.uniqueId();vp=DOM.getViewPort();f.width=parseInt(f.width||320);f.height=parseInt(f.height||240)+(tinymce.isIE?8:0);f.min_width=parseInt(f.min_width||150);f.min_height=parseInt(f.min_height||100);f.max_width=parseInt(f.max_width||2000);f.max_height=parseInt(f.max_height||2000);f.left=f.left||Math.round(Math.max(vp.x,vp.x+(vp.w/ 2.0) - (f.width /2.0)));f.top=f.top||Math.round(Math.max(vp.y,vp.y+(vp.h/ 2.0) - (f.height /2.0)));f.movable=f.resizable=true;p.mce_width=f.width;p.mce_height=f.height;p.mce_inline=true;p.mce_window_id=id;p.mce_auto_focus=f.auto_focus;t.features=f;t.params=p;t.onOpen.dispatch(t,f,p);if(f.type){opt+=' mceModal';if(f.type)opt+=' mce'+f.type.substring(0,1).toUpperCase()+f.type.substring(1);f.resizable=false;}if(f.statusbar)opt+=' mceStatusbar';if(f.resizable)opt+=' mceResizable';if(f.minimizable)opt+=' mceMinimizable';if(f.maximizable)opt+=' mceMaximizable';if(f.movable)opt+=' mceMovable';t._addAll(DOM.doc.body,['div',{id:id,'class':ed.settings.inlinepopups_skin||'clearlooks2',style:'width:100px;height:100px'},['div',{id:id+'_wrapper','class':'mceWrapper'+opt},['div',{id:id+'_top','class':'mceTop'},['div',{'class':'mceLeft'}],['div',{'class':'mceCenter'}],['div',{'class':'mceRight'}],['span',{id:id+'_title'},f.title||'']],['div',{id:id+'_middle','class':'mceMiddle'},['div',{id:id+'_left','class':'mceLeft'}],['span',{id:id+'_content'}],['div',{id:id+'_right','class':'mceRight'}]],['div',{id:id+'_bottom','class':'mceBottom'},['div',{'class':'mceLeft'}],['div',{'class':'mceCenter'}],['div',{'class':'mceRight'}],['span',{id:id+'_status'},'Content']],['a',{'class':'mceMove',tabindex:'-1',href:'javascript:;'}],['a',{'class':'mceMin',tabindex:'-1',href:'javascript:;',onmousedown:'return false;'}],['a',{'class':'mceMax',tabindex:'-1',href:'javascript:;',onmousedown:'return false;'}],['a',{'class':'mceMed',tabindex:'-1',href:'javascript:;',onmousedown:'return false;'}],['a',{'class':'mceClose',tabindex:'-1',href:'javascript:;',onmousedown:'return false;'}],['a',{id:id+'_resize_n','class':'mceResize mceResizeN',tabindex:'-1',href:'javascript:;'}],['a',{id:id+'_resize_s','class':'mceResize mceResizeS',tabindex:'-1',href:'javascript:;'}],['a',{id:id+'_resize_w','class':'mceResize mceResizeW',tabindex:'-1',href:'javascript:;'}],['a',{id:id+'_resize_e','class':'mceResize mceResizeE',tabindex:'-1',href:'javascript:;'}],['a',{id:id+'_resize_nw','class':'mceResize mceResizeNW',tabindex:'-1',href:'javascript:;'}],['a',{id:id+'_resize_ne','class':'mceResize mceResizeNE',tabindex:'-1',href:'javascript:;'}],['a',{id:id+'_resize_sw','class':'mceResize mceResizeSW',tabindex:'-1',href:'javascript:;'}],['a',{id:id+'_resize_se','class':'mceResize mceResizeSE',tabindex:'-1',href:'javascript:;'}]]]);DOM.setStyles(id,{top:-10000,left:-10000});if(tinymce.isGecko)DOM.setStyle(id,'overflow','auto');if(!f.type){dw+=DOM.get(id+'_left').clientWidth;dw+=DOM.get(id+'_right').clientWidth;dh+=DOM.get(id+'_top').clientHeight;dh+=DOM.get(id+'_bottom').clientHeight;}DOM.setStyles(id,{top:f.top,left:f.left,width:f.width+dw,height:f.height+dh});u=f.url||f.file;if(u){if(tinymce.relaxedDomain)u+=(u.indexOf('?')==-1?'?':'&')+'mce_rdomain='+tinymce.relaxedDomain;u=tinymce._addVer(u);}if(!f.type){DOM.add(id+'_content','iframe',{id:id+'_ifr',src:'javascript:""',frameBorder:0,style:'border:0;width:10px;height:10px'});DOM.setStyles(id+'_ifr',{width:f.width,height:f.height});DOM.setAttrib(id+'_ifr','src',u);}else{DOM.add(id+'_wrapper','a',{id:id+'_ok','class':'mceButton mceOk',href:'javascript:;',onmousedown:'return false;'},'Ok');if(f.type=='confirm')DOM.add(id+'_wrapper','a',{'class':'mceButton mceCancel',href:'javascript:;',onmousedown:'return false;'},'Cancel');DOM.add(id+'_middle','div',{'class':'mceIcon'});DOM.setHTML(id+'_content',f.content.replace('\n','<br />'));}mdf=Event.add(id,'mousedown',function(e){var n=e.target,w,vp;w=t.windows[id];t.focus(id);if(n.nodeName=='A'||n.nodeName=='a'){if(n.className=='mceMax'){w.oldPos=w.element.getXY();w.oldSize=w.element.getSize();vp=DOM.getViewPort();vp.w-=2;vp.h-=2;w.element.moveTo(vp.x,vp.y);w.element.resizeTo(vp.w,vp.h);DOM.setStyles(id+'_ifr',{width:vp.w-w.deltaWidth,height:vp.h-w.deltaHeight});DOM.addClass(id+'_wrapper','mceMaximized');}else if(n.className=='mceMed'){w.element.moveTo(w.oldPos.x,w.oldPos.y);w.element.resizeTo(w.oldSize.w,w.oldSize.h);w.iframeElement.resizeTo(w.oldSize.w-w.deltaWidth,w.oldSize.h-w.deltaHeight);DOM.removeClass(id+'_wrapper','mceMaximized');}else if(n.className=='mceMove')return t._startDrag(id,e,n.className);else if(DOM.hasClass(n,'mceResize'))return t._startDrag(id,e,n.className.substring(13));}});clf=Event.add(id,'click',function(e){var n=e.target;t.focus(id);if(n.nodeName=='A'||n.nodeName=='a'){switch(n.className){case'mceClose':t.close(null,id);return Event.cancel(e);case'mceButton mceOk':case'mceButton mceCancel':f.button_func(n.className=='mceButton mceOk');return Event.cancel(e);}}});t.windows=t.windows||{};w=t.windows[id]={id:id,mousedown_func:mdf,click_func:clf,element:new Element(id,{blocker:1,container:ed.getContainer()}),iframeElement:new Element(id+'_ifr'),features:f,deltaWidth:dw,deltaHeight:dh};w.iframeElement.on('focus',function(){t.focus(id);});if(t.count==0&&t.editor.getParam('dialog_type')=='modal'){DOM.add(DOM.doc.body,'div',{id:'mceModalBlocker','class':(t.editor.settings.inlinepopups_skin||'clearlooks2')+'_modalBlocker',style:{left:vp.x,top:vp.y,zIndex:t.zIndex-1}});DOM.show('mceModalBlocker');}else DOM.setStyle('mceModalBlocker','z-index',t.zIndex-1);t.focus(id);t._fixIELayout(id,1);if(DOM.get(id+'_ok'))DOM.get(id+'_ok').focus();t.count++;return w;},focus:function(id){var t=this,w=t.windows[id];w.zIndex=this.zIndex++;w.element.setStyle('zIndex',w.zIndex);w.element.update();id=id+'_wrapper';DOM.removeClass(t.lastId,'mceFocus');DOM.addClass(id,'mceFocus');t.lastId=id;},_addAll:function(te,ne){var i,n,t=this,dom=tinymce.DOM;if(is(ne,'string'))te.appendChild(dom.doc.createTextNode(ne));else if(ne.length){te=te.appendChild(dom.create(ne[0],ne[1]));for(i=2;i<ne.length;i++)t._addAll(te,ne[i]);}},_startDrag:function(id,se,ac){var t=this,mu,mm,d=DOM.doc,eb,w=t.windows[id],we=w.element,sp=we.getXY(),p,sz,ph,cp,vp,sx,sy,sex,sey,dx,dy,dw,dh;cp={x:0,y:0};vp=DOM.getViewPort();vp.w-=2;vp.h-=2;sex=se.screenX;sey=se.screenY;dx=dy=dw=dh=0;mu=Event.add(d,'mouseup',function(e){Event.remove(d,'mouseup',mu);Event.remove(d,'mousemove',mm);if(eb)eb.remove();we.moveBy(dx,dy);we.resizeBy(dw,dh);sz=we.getSize();DOM.setStyles(id+'_ifr',{width:sz.w-w.deltaWidth,height:sz.h-w.deltaHeight});t._fixIELayout(id,1);return Event.cancel(e);});if(ac!='Move')startMove();function startMove(){if(eb)return;t._fixIELayout(id,0);DOM.add(d.body,'div',{id:'mceEventBlocker','class':'mceEventBlocker '+(t.editor.settings.inlinepopups_skin||'clearlooks2'),style:{left:vp.x,top:vp.y,zIndex:t.zIndex+1}});eb=new Element('mceEventBlocker');eb.update();p=we.getXY();sz=we.getSize();sx=cp.x+p.x-vp.x;sy=cp.y+p.y-vp.y;DOM.add(eb.get(),'div',{id:'mcePlaceHolder','class':'mcePlaceHolder',style:{left:sx,top:sy,width:sz.w,height:sz.h}});ph=new Element('mcePlaceHolder');};mm=Event.add(d,'mousemove',function(e){var x,y,v;startMove();x=e.screenX-sex;y=e.screenY-sey;switch(ac){case'ResizeW':dx=x;dw=0-x;break;case'ResizeE':dw=x;break;case'ResizeN':case'ResizeNW':case'ResizeNE':if(ac=="ResizeNW"){dx=x;dw=0-x;}else if(ac=="ResizeNE")dw=x;dy=y;dh=0-y;break;case'ResizeS':case'ResizeSW':case'ResizeSE':if(ac=="ResizeSW"){dx=x;dw=0-x;}else if(ac=="ResizeSE")dw=x;dh=y;break;case'mceMove':dx=x;dy=y;break;}if(dw<(v=w.features.min_width-sz.w)){if(dx!==0)dx+=dw-v;dw=v;}if(dh<(v=w.features.min_height-sz.h)){if(dy!==0)dy+=dh-v;dh=v;}dw=Math.min(dw,w.features.max_width-sz.w);dh=Math.min(dh,w.features.max_height-sz.h);dx=Math.max(dx,vp.x-(sx+vp.x));dy=Math.max(dy,vp.y-(sy+vp.y));dx=Math.min(dx,(vp.w+vp.x)-(sx+sz.w+vp.x));dy=Math.min(dy,(vp.h+vp.y)-(sy+sz.h+vp.y));if(dx+dy!==0){if(sx+dx<0)dx=0;if(sy+dy<0)dy=0;ph.moveTo(sx+dx,sy+dy);}if(dw+dh!==0)ph.resizeTo(sz.w+dw,sz.h+dh);return Event.cancel(e);});return Event.cancel(se);},resizeBy:function(dw,dh,id){var w=this.windows[id];if(w){w.element.resizeBy(dw,dh);w.iframeElement.resizeBy(dw,dh);}},close:function(win,id){var t=this,w,d=DOM.doc,ix=0,fw,id;id=t._findId(id||win);t.count--;if(t.count==0)DOM.remove('mceModalBlocker');if(!id&&win){t.parent(win);return;}if(w=t.windows[id]){t.onClose.dispatch(t);Event.remove(d,'mousedown',w.mousedownFunc);Event.remove(d,'click',w.clickFunc);Event.clear(id);Event.clear(id+'_ifr');DOM.setAttrib(id+'_ifr','src','javascript:""');w.element.remove();delete t.windows[id];each(t.windows,function(w){if(w.zIndex>ix){fw=w;ix=w.zIndex;}});if(fw)t.focus(fw.id);}},setTitle:function(w,ti){var e;w=this._findId(w);if(e=DOM.get(w+'_title'))e.innerHTML=DOM.encode(ti);},alert:function(txt,cb,s){var t=this,w;w=t.open({title:t,type:'alert',button_func:function(s){if(cb)cb.call(s||t,s);t.close(null,w.id);},content:DOM.encode(t.editor.getLang(txt,txt)),inline:1,width:400,height:130});},confirm:function(txt,cb,s){var t=this,w;w=t.open({title:t,type:'confirm',button_func:function(s){if(cb)cb.call(s||t,s);t.close(null,w.id);},content:DOM.encode(t.editor.getLang(txt,txt)),inline:1,width:400,height:130});},_findId:function(w){var t=this;if(typeof(w)=='string')return w;each(t.windows,function(wo){var ifr=DOM.get(wo.id+'_ifr');if(ifr&&w==ifr.contentWindow){w=wo.id;return false;}});return w;},_fixIELayout:function(id,s){var w,img;if(!tinymce.isIE6)return;each(['n','s','w','e','nw','ne','sw','se'],function(v){var e=DOM.get(id+'_resize_'+v);DOM.setStyles(e,{width:s?e.clientWidth:'',height:s?e.clientHeight:'',cursor:DOM.getStyle(e,'cursor',1)});DOM.setStyle(id+"_bottom",'bottom','-1px');e=0;});if(w=this.windows[id]){w.element.hide();w.element.show();each(DOM.select('div,a',id),function(e,i){if(e.currentStyle.backgroundImage!='none'){img=new Image();img.src=e.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/,'$1');}});DOM.get(id).style.filter='';}}});tinymce.PluginManager.add('inlinepopups',tinymce.plugins.InlinePopups);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js
@@ -1,1 +1,624 @@
-
+/**
+ * $Id: editor_plugin_src.js 809 2008-04-17 14:41:31Z spocke $
+ *
+ * @author Moxiecode

+ */
+
+(function() {
+	var DOM = tinymce.DOM, Element = tinymce.dom.Element, Event = tinymce.dom.Event, each = tinymce.each, is = tinymce.is;
+
+	tinymce.create('tinymce.plugins.InlinePopups', {
+		init : function(ed, url) {
+			// Replace window manager
+			ed.onBeforeRenderUI.add(function() {
+				ed.windowManager = new tinymce.InlineWindowManager(ed);
+				DOM.loadCSS(url + '/skins/' + (ed.settings.inlinepopups_skin || 'clearlooks2') + "/window.css");
+			});
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'InlinePopups',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		}
+	});
+
+	tinymce.create('tinymce.InlineWindowManager:tinymce.WindowManager', {
+		InlineWindowManager : function(ed) {
+			var t = this;
+
+			t.parent(ed);
+			t.zIndex = 300000;
+			t.count = 0;
+		},
+
+		open : function(f, p) {
+			var t = this, id, opt = '', ed = t.editor, dw = 0, dh = 0, vp, po, mdf, clf, we, w, u;
+
+			f = f || {};
+			p = p || {};
+
+			// Run native windows
+			if (!f.inline)
+				return t.parent(f, p);
+
+			// Only store selection if the type is a normal window
+			if (!f.type)
+				t.bookmark = ed.selection.getBookmark('simple');
+
+			id = DOM.uniqueId();
+			vp = DOM.getViewPort();
+			f.width = parseInt(f.width || 320);
+			f.height = parseInt(f.height || 240) + (tinymce.isIE ? 8 : 0);
+			f.min_width = parseInt(f.min_width || 150);
+			f.min_height = parseInt(f.min_height || 100);
+			f.max_width = parseInt(f.max_width || 2000);
+			f.max_height = parseInt(f.max_height || 2000);
+			f.left = f.left || Math.round(Math.max(vp.x, vp.x + (vp.w / 2.0) - (f.width / 2.0)));
+			f.top = f.top || Math.round(Math.max(vp.y, vp.y + (vp.h / 2.0) - (f.height / 2.0)));
+			f.movable = f.resizable = true;
+			p.mce_width = f.width;
+			p.mce_height = f.height;
+			p.mce_inline = true;
+			p.mce_window_id = id;
+			p.mce_auto_focus = f.auto_focus;
+
+			// Transpose
+//			po = DOM.getPos(ed.getContainer());
+//			f.left -= po.x;
+//			f.top -= po.y;
+
+			t.features = f;
+			t.params = p;
+			t.onOpen.dispatch(t, f, p);
+
+			if (f.type) {
+				opt += ' mceModal';
+
+				if (f.type)
+					opt += ' mce' + f.type.substring(0, 1).toUpperCase() + f.type.substring(1);
+
+				f.resizable = false;
+			}
+
+			if (f.statusbar)
+				opt += ' mceStatusbar';
+
+			if (f.resizable)
+				opt += ' mceResizable';
+
+			if (f.minimizable)
+				opt += ' mceMinimizable';
+
+			if (f.maximizable)
+				opt += ' mceMaximizable';
+
+			if (f.movable)
+				opt += ' mceMovable';
+
+			// Create DOM objects
+			t._addAll(DOM.doc.body, 
+				['div', {id : id, 'class' : ed.settings.inlinepopups_skin || 'clearlooks2', style : 'width:100px;height:100px'}, 
+					['div', {id : id + '_wrapper', 'class' : 'mceWrapper' + opt},
+						['div', {id : id + '_top', 'class' : 'mceTop'}, 
+							['div', {'class' : 'mceLeft'}],
+							['div', {'class' : 'mceCenter'}],
+							['div', {'class' : 'mceRight'}],
+							['span', {id : id + '_title'}, f.title || '']
+						],
+
+						['div', {id : id + '_middle', 'class' : 'mceMiddle'}, 
+							['div', {id : id + '_left', 'class' : 'mceLeft'}],
+							['span', {id : id + '_content'}],
+							['div', {id : id + '_right', 'class' : 'mceRight'}]
+						],
+
+						['div', {id : id + '_bottom', 'class' : 'mceBottom'},
+							['div', {'class' : 'mceLeft'}],
+							['div', {'class' : 'mceCenter'}],
+							['div', {'class' : 'mceRight'}],
+							['span', {id : id + '_status'}, 'Content']
+						],
+
+						['a', {'class' : 'mceMove', tabindex : '-1', href : 'javascript:;'}],
+						['a', {'class' : 'mceMin', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],
+						['a', {'class' : 'mceMax', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],
+						['a', {'class' : 'mceMed', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],
+						['a', {'class' : 'mceClose', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],
+						['a', {id : id + '_resize_n', 'class' : 'mceResize mceResizeN', tabindex : '-1', href : 'javascript:;'}],
+						['a', {id : id + '_resize_s', 'class' : 'mceResize mceResizeS', tabindex : '-1', href : 'javascript:;'}],
+						['a', {id : id + '_resize_w', 'class' : 'mceResize mceResizeW', tabindex : '-1', href : 'javascript:;'}],
+						['a', {id : id + '_resize_e', 'class' : 'mceResize mceResizeE', tabindex : '-1', href : 'javascript:;'}],
+						['a', {id : id + '_resize_nw', 'class' : 'mceResize mceResizeNW', tabindex : '-1', href : 'javascript:;'}],
+						['a', {id : id + '_resize_ne', 'class' : 'mceResize mceResizeNE', tabindex : '-1', href : 'javascript:;'}],
+						['a', {id : id + '_resize_sw', 'class' : 'mceResize mceResizeSW', tabindex : '-1', href : 'javascript:;'}],
+						['a', {id : id + '_resize_se', 'class' : 'mceResize mceResizeSE', tabindex : '-1', href : 'javascript:;'}]
+					]
+				]
+			);
+
+			DOM.setStyles(id, {top : -10000, left : -10000});
+
+			// Fix gecko rendering bug, where the editors iframe messed with window contents
+			if (tinymce.isGecko)
+				DOM.setStyle(id, 'overflow', 'auto');
+
+			// Measure borders
+			if (!f.type) {
+				dw += DOM.get(id + '_left').clientWidth;
+				dw += DOM.get(id + '_right').clientWidth;
+				dh += DOM.get(id + '_top').clientHeight;
+				dh += DOM.get(id + '_bottom').clientHeight;
+			}
+
+			// Resize window
+			DOM.setStyles(id, {top : f.top, left : f.left, width : f.width + dw, height : f.height + dh});
+
+			u = f.url || f.file;
+			if (u) {
+				if (tinymce.relaxedDomain)
+					u += (u.indexOf('?') == -1 ? '?' : '&') + 'mce_rdomain=' + tinymce.relaxedDomain;
+
+				u = tinymce._addVer(u);
+			}
+
+			if (!f.type) {
+				DOM.add(id + '_content', 'iframe', {id : id + '_ifr', src : 'javascript:""', frameBorder : 0, style : 'border:0;width:10px;height:10px'});
+				DOM.setStyles(id + '_ifr', {width : f.width, height : f.height});
+				DOM.setAttrib(id + '_ifr', 'src', u);
+			} else {
+				DOM.add(id + '_wrapper', 'a', {id : id + '_ok', 'class' : 'mceButton mceOk', href : 'javascript:;', onmousedown : 'return false;'}, 'Ok');
+
+				if (f.type == 'confirm')
+					DOM.add(id + '_wrapper', 'a', {'class' : 'mceButton mceCancel', href : 'javascript:;', onmousedown : 'return false;'}, 'Cancel');
+
+				DOM.add(id + '_middle', 'div', {'class' : 'mceIcon'});
+				DOM.setHTML(id + '_content', f.content.replace('\n', '<br />'));
+			}
+
+			// Register events
+			mdf = Event.add(id, 'mousedown', function(e) {
+				var n = e.target, w, vp;
+
+				w = t.windows[id];
+				t.focus(id);
+
+				if (n.nodeName == 'A' || n.nodeName == 'a') {
+					if (n.className == 'mceMax') {
+						w.oldPos = w.element.getXY();
+						w.oldSize = w.element.getSize();
+
+						vp = DOM.getViewPort();
+
+						// Reduce viewport size to avoid scrollbars
+						vp.w -= 2;
+						vp.h -= 2;
+
+						w.element.moveTo(vp.x, vp.y);
+						w.element.resizeTo(vp.w, vp.h);
+						DOM.setStyles(id + '_ifr', {width : vp.w - w.deltaWidth, height : vp.h - w.deltaHeight});
+						DOM.addClass(id + '_wrapper', 'mceMaximized');
+					} else if (n.className == 'mceMed') {
+						// Reset to old size
+						w.element.moveTo(w.oldPos.x, w.oldPos.y);
+						w.element.resizeTo(w.oldSize.w, w.oldSize.h);
+						w.iframeElement.resizeTo(w.oldSize.w - w.deltaWidth, w.oldSize.h - w.deltaHeight);
+
+						DOM.removeClass(id + '_wrapper', 'mceMaximized');
+					} else if (n.className == 'mceMove')
+						return t._startDrag(id, e, n.className);
+					else if (DOM.hasClass(n, 'mceResize'))
+						return t._startDrag(id, e, n.className.substring(13));
+				}
+			});
+
+			clf = Event.add(id, 'click', function(e) {
+				var n = e.target;
+
+				t.focus(id);
+
+				if (n.nodeName == 'A' || n.nodeName == 'a') {
+					switch (n.className) {
+						case 'mceClose':
+							t.close(null, id);
+							return Event.cancel(e);
+
+						case 'mceButton mceOk':
+						case 'mceButton mceCancel':
+							f.button_func(n.className == 'mceButton mceOk');
+							return Event.cancel(e);
+					}
+				}
+			});
+
+			// Add window
+			t.windows = t.windows || {};
+			w = t.windows[id] = {
+				id : id,
+				mousedown_func : mdf,
+				click_func : clf,
+				element : new Element(id, {blocker : 1, container : ed.getContainer()}),
+				iframeElement : new Element(id + '_ifr'),
+				features : f,
+				deltaWidth : dw,
+				deltaHeight : dh
+			};
+
+			w.iframeElement.on('focus', function() {
+				t.focus(id);
+			});
+
+			// Setup blocker
+			if (t.count == 0 && t.editor.getParam('dialog_type') == 'modal') {
+				DOM.add(DOM.doc.body, 'div', {
+					id : 'mceModalBlocker',
+					'class' : (t.editor.settings.inlinepopups_skin || 'clearlooks2') + '_modalBlocker',
+					style : {left : vp.x, top : vp.y, zIndex : t.zIndex - 1}
+				});
+
+				DOM.show('mceModalBlocker'); // Reduces flicker in IE
+			} else
+				DOM.setStyle('mceModalBlocker', 'z-index', t.zIndex - 1);
+
+			t.focus(id);
+			t._fixIELayout(id, 1);
+
+			// Focus ok button
+			if (DOM.get(id + '_ok'))
+				DOM.get(id + '_ok').focus();
+
+			t.count++;
+
+			return w;
+		},
+
+		focus : function(id) {
+			var t = this, w = t.windows[id];
+
+			w.zIndex = this.zIndex++;
+			w.element.setStyle('zIndex', w.zIndex);
+			w.element.update();
+
+			id = id + '_wrapper';
+			DOM.removeClass(t.lastId, 'mceFocus');
+			DOM.addClass(id, 'mceFocus');
+			t.lastId = id;
+		},
+
+		_addAll : function(te, ne) {
+			var i, n, t = this, dom = tinymce.DOM;
+
+			if (is(ne, 'string'))
+				te.appendChild(dom.doc.createTextNode(ne));
+			else if (ne.length) {
+				te = te.appendChild(dom.create(ne[0], ne[1]));
+
+				for (i=2; i<ne.length; i++)
+					t._addAll(te, ne[i]);
+			}
+		},
+
+		_startDrag : function(id, se, ac) {
+			var t = this, mu, mm, d = DOM.doc, eb, w = t.windows[id], we = w.element, sp = we.getXY(), p, sz, ph, cp, vp, sx, sy, sex, sey, dx, dy, dw, dh;
+
+			// Get positons and sizes
+//			cp = DOM.getPos(t.editor.getContainer());
+			cp = {x : 0, y : 0};
+			vp = DOM.getViewPort();
+
+			// Reduce viewport size to avoid scrollbars while dragging
+			vp.w -= 2;
+			vp.h -= 2;
+
+			sex = se.screenX;
+			sey = se.screenY;
+			dx = dy = dw = dh = 0;
+
+			// Handle mouse up
+			mu = Event.add(d, 'mouseup', function(e) {
+				Event.remove(d, 'mouseup', mu);
+				Event.remove(d, 'mousemove', mm);
+
+				if (eb)
+					eb.remove();
+
+				we.moveBy(dx, dy);
+				we.resizeBy(dw, dh);
+				sz = we.getSize();
+				DOM.setStyles(id + '_ifr', {width : sz.w - w.deltaWidth, height : sz.h - w.deltaHeight});
+				t._fixIELayout(id, 1);
+
+				return Event.cancel(e);
+			});
+
+			if (ac != 'Move')
+				startMove();
+
+			function startMove() {
+				if (eb)
+					return;
+
+				t._fixIELayout(id, 0);
+
+				// Setup event blocker
+				DOM.add(d.body, 'div', {
+					id : 'mceEventBlocker',
+					'class' : 'mceEventBlocker ' + (t.editor.settings.inlinepopups_skin || 'clearlooks2'),
+					style : {left : vp.x, top : vp.y, zIndex : t.zIndex + 1}
+				});
+				eb = new Element('mceEventBlocker');
+				eb.update();
+
+				// Setup placeholder
+				p = we.getXY();
+				sz = we.getSize();
+				sx = cp.x + p.x - vp.x;
+				sy = cp.y + p.y - vp.y;
+				DOM.add(eb.get(), 'div', {id : 'mcePlaceHolder', 'class' : 'mcePlaceHolder', style : {left : sx, top : sy, width : sz.w, height : sz.h}});
+				ph = new Element('mcePlaceHolder');
+			};
+
+			// Handle mouse move/drag
+			mm = Event.add(d, 'mousemove', function(e) {
+				var x, y, v;
+
+				startMove();
+
+				x = e.screenX - sex;
+				y = e.screenY - sey;
+
+				switch (ac) {
+					case 'ResizeW':
+						dx = x;
+						dw = 0 - x;
+						break;
+
+					case 'ResizeE':
+						dw = x;
+						break;
+
+					case 'ResizeN':
+					case 'ResizeNW':
+					case 'ResizeNE':
+						if (ac == "ResizeNW") {
+							dx = x;
+							dw = 0 - x;
+						} else if (ac == "ResizeNE")
+							dw = x;
+
+						dy = y;
+						dh = 0 - y;
+						break;
+
+					case 'ResizeS':
+					case 'ResizeSW':
+					case 'ResizeSE':
+						if (ac == "ResizeSW") {
+							dx = x;
+							dw = 0 - x;
+						} else if (ac == "ResizeSE")
+							dw = x;
+
+						dh = y;
+						break;
+
+					case 'mceMove':
+						dx = x;
+						dy = y;
+						break;
+				}
+
+				// Boundary check
+				if (dw < (v = w.features.min_width - sz.w)) {
+					if (dx !== 0)
+						dx += dw - v;
+
+					dw = v;
+				}
+	
+				if (dh < (v = w.features.min_height - sz.h)) {
+					if (dy !== 0)
+						dy += dh - v;
+
+					dh = v;
+				}
+
+				dw = Math.min(dw, w.features.max_width - sz.w);
+				dh = Math.min(dh, w.features.max_height - sz.h);
+				dx = Math.max(dx, vp.x - (sx + vp.x));
+				dy = Math.max(dy, vp.y - (sy + vp.y));
+				dx = Math.min(dx, (vp.w + vp.x) - (sx + sz.w + vp.x));
+				dy = Math.min(dy, (vp.h + vp.y) - (sy + sz.h + vp.y));
+
+				// Move if needed
+				if (dx + dy !== 0) {
+					if (sx + dx < 0)
+						dx = 0;
+	
+					if (sy + dy < 0)
+						dy = 0;
+
+					ph.moveTo(sx + dx, sy + dy);
+				}
+
+				// Resize if needed
+				if (dw + dh !== 0)
+					ph.resizeTo(sz.w + dw, sz.h + dh);
+
+				return Event.cancel(e);
+			});
+
+			return Event.cancel(se);
+		},
+
+		resizeBy : function(dw, dh, id) {
+			var w = this.windows[id];
+
+			if (w) {
+				w.element.resizeBy(dw, dh);
+				w.iframeElement.resizeBy(dw, dh);
+			}
+		},
+
+		close : function(win, id) {
+			var t = this, w, d = DOM.doc, ix = 0, fw, id;
+
+			id = t._findId(id || win);
+
+			t.count--;
+
+			if (t.count == 0)
+				DOM.remove('mceModalBlocker');
+
+			// Probably not inline
+			if (!id && win) {
+				t.parent(win);
+				return;
+			}
+
+			if (w = t.windows[id]) {
+				t.onClose.dispatch(t);
+				Event.remove(d, 'mousedown', w.mousedownFunc);
+				Event.remove(d, 'click', w.clickFunc);
+				Event.clear(id);
+				Event.clear(id + '_ifr');
+
+				DOM.setAttrib(id + '_ifr', 'src', 'javascript:""'); // Prevent leak
+				w.element.remove();
+				delete t.windows[id];
+
+				// Find front most window and focus that
+				each (t.windows, function(w) {
+					if (w.zIndex > ix) {
+						fw = w;
+						ix = w.zIndex;
+					}
+				});
+
+				if (fw)
+					t.focus(fw.id);
+			}
+		},
+
+		setTitle : function(w, ti) {
+			var e;
+
+			w = this._findId(w);
+
+			if (e = DOM.get(w + '_title'))
+				e.innerHTML = DOM.encode(ti);
+		},
+
+		alert : function(txt, cb, s) {
+			var t = this, w;
+
+			w = t.open({
+				title : t,
+				type : 'alert',
+				button_func : function(s) {
+					if (cb)
+						cb.call(s || t, s);
+
+					t.close(null, w.id);
+				},
+				content : DOM.encode(t.editor.getLang(txt, txt)),
+				inline : 1,
+				width : 400,
+				height : 130
+			});
+		},
+
+		confirm : function(txt, cb, s) {
+			var t = this, w;
+
+			w = t.open({
+				title : t,
+				type : 'confirm',
+				button_func : function(s) {
+					if (cb)
+						cb.call(s || t, s);
+
+					t.close(null, w.id);
+				},
+				content : DOM.encode(t.editor.getLang(txt, txt)),
+				inline : 1,
+				width : 400,
+				height : 130
+			});
+		},
+
+		// Internal functions
+
+		_findId : function(w) {
+			var t = this;
+
+			if (typeof(w) == 'string')
+				return w;
+
+			each(t.windows, function(wo) {
+				var ifr = DOM.get(wo.id + '_ifr');
+
+				if (ifr && w == ifr.contentWindow) {
+					w = wo.id;
+					return false;
+				}
+			});
+
+			return w;
+		},
+
+		_fixIELayout : function(id, s) {
+			var w, img;
+
+			if (!tinymce.isIE6)
+				return;
+
+			// Fixes the bug where hover flickers and does odd things in IE6
+			each(['n','s','w','e','nw','ne','sw','se'], function(v) {
+				var e = DOM.get(id + '_resize_' + v);
+
+				DOM.setStyles(e, {
+					width : s ? e.clientWidth : '',
+					height : s ? e.clientHeight : '',
+					cursor : DOM.getStyle(e, 'cursor', 1)
+				});
+
+				DOM.setStyle(id + "_bottom", 'bottom', '-1px');
+
+				e = 0;
+			});
+
+			// Fixes graphics glitch
+			if (w = this.windows[id]) {
+				// Fixes rendering bug after resize
+				w.element.hide();
+				w.element.show();
+
+				// Forced a repaint of the window
+				//DOM.get(id).style.filter = '';
+
+				// IE has a bug where images used in CSS won't get loaded
+				// sometimes when the cache in the browser is disabled
+				// This fix tries to solve it by loading the images using the image object
+				each(DOM.select('div,a', id), function(e, i) {
+					if (e.currentStyle.backgroundImage != 'none') {
+						img = new Image();
+						img.src = e.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/, '$1');
+					}
+				});
+
+				DOM.get(id).style.filter = '';
+			}
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('inlinepopups', tinymce.plugins.InlinePopups);
+})();
+
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/images/spacer.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/images/window_close.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/images/window_maximize.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/images/window_minimize.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/images/window_resize.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/jscripts/mcwindows.js
@@ -1,1 +1,454 @@
-
+/**
+ * $Id: mcwindows.js 18 2006-06-29 14:11:23Z spocke $
+ *
+ * Moxiecode DHTML Windows script.
+ *
+ * @author Moxiecode

+ */
+
+// Windows handler
+function MCWindows() {
+	this.settings = new Array();
+	this.windows = new Array();
+	this.isMSIE = (navigator.appName == "Microsoft Internet Explorer");
+	this.isGecko = navigator.userAgent.indexOf('Gecko') != -1;
+	this.isSafari = navigator.userAgent.indexOf('Safari') != -1;
+	this.isMac = navigator.userAgent.indexOf('Mac') != -1;
+	this.isMSIE5_0 = this.isMSIE && (navigator.userAgent.indexOf('MSIE 5.0') != -1);
+	this.action = "none";
+	this.selectedWindow = null;
+	this.zindex = 100;
+	this.mouseDownScreenX = 0;
+	this.mouseDownScreenY = 0;
+	this.mouseDownLayerX = 0;
+	this.mouseDownLayerY = 0;
+	this.mouseDownWidth = 0;
+	this.mouseDownHeight = 0;
+};
+
+MCWindows.prototype.init = function(settings) {
+	this.settings = settings;
+
+	if (this.isMSIE)
+		this.addEvent(document, "mousemove", mcWindows.eventDispatcher);
+	else
+		this.addEvent(window, "mousemove", mcWindows.eventDispatcher);
+
+	this.addEvent(document, "mouseup", mcWindows.eventDispatcher);
+};
+
+MCWindows.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;
+};
+
+MCWindows.prototype.eventDispatcher = function(e) {
+	e = typeof(e) == "undefined" ? window.event : e;
+
+	if (mcWindows.selectedWindow == null)
+		return;
+
+	// Switch focus
+	if (mcWindows.isGecko && e.type == "mousedown") {
+		var elm = e.currentTarget;
+
+		for (var n in mcWindows.windows) {
+			var win = mcWindows.windows[n];
+			if (typeof(win) == 'function')
+				continue;
+
+			if (win.headElement == elm || win.resizeElement == elm) {
+				win.focus();
+				break;
+			}
+		}
+	}
+
+	switch (e.type) {
+		case "mousemove":
+			mcWindows.selectedWindow.onMouseMove(e);
+			break;
+
+		case "mouseup":
+			mcWindows.selectedWindow.onMouseUp(e);
+			break;
+
+		case "mousedown":
+			mcWindows.selectedWindow.onMouseDown(e);
+			break;
+
+		case "focus":
+			mcWindows.selectedWindow.onFocus(e);
+			break;
+	}
+}
+
+MCWindows.prototype.addEvent = function(obj, name, handler) {
+	if (this.isMSIE)
+		obj.attachEvent("on" + name, handler);
+	else
+		obj.addEventListener(name, handler, true);
+};
+
+MCWindows.prototype.cancelEvent = function(e) {
+	if (this.isMSIE) {
+		e.returnValue = false;
+		e.cancelBubble = true;
+	} else
+		e.preventDefault();
+};
+
+MCWindows.prototype.parseFeatures = function(opts) {
+	// Cleanup the options
+	opts = opts.toLowerCase();
+	opts = opts.replace(/;/g, ",");
+	opts = opts.replace(/[^0-9a-z=,]/g, "");
+
+	var optionChunks = opts.split(',');
+	var options = new Array();
+
+	options['left'] = 10;
+	options['top'] = 10;
+	options['width'] = 300;
+	options['height'] = 300;
+	options['resizable'] = true;
+	options['minimizable'] = true;
+	options['maximizable'] = true;
+	options['close'] = true;
+	options['movable'] = true;
+
+	if (opts == "")
+		return options;
+
+	for (var i=0; i<optionChunks.length; i++) {
+		var parts = optionChunks[i].split('=');
+
+		if (parts.length == 2)
+			options[parts[0]] = parts[1];
+	}
+
+	return options;
+};
+
+MCWindows.prototype.open = function(url, name, features) {
+	var win = new MCWindow();
+	var winDiv, html = "", id;
+
+	features = this.parseFeatures(features);
+
+	// Create div
+	id = "mcWindow_" + name;
+
+	width = parseInt(features['width']);
+	height = parseInt(features['height'])-12-19;
+
+	if (this.isMSIE)
+		width -= 2;
+
+	// Setup first part of window
+	win.id = id;
+	win.url = url;
+	win.name = name;
+	win.features = features;
+	this.windows[name] = win;
+
+	iframeWidth = width;
+	iframeHeight = height;
+
+	// Create inner content
+	html += '<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">';
+	html += '<html>';
+	html += '<head>';
+	html += '<title>Wrapper iframe</title>';
+	html += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">';
+	html += '<link href="../jscripts/tiny_mce/themes/advanced/css/editor_ui.css" rel="stylesheet" type="text/css" />';
+	html += '</head>';
+	html += '<body onload="parent.mcWindows.onLoad(\'' + name + '\');">';
+
+	html += '<div id="' + id + '_container" class="mceWindow">';
+	html += '<div id="' + id + '_head" class="mceWindowHead" onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();">';
+	html += '  <div id="' + id + '_title" class="mceWindowTitle"';
+	html += '  onselectstart="return false;" unselectable="on" style="-moz-user-select: none !important;">No name window</div>';
+	html += '    <div class="mceWindowHeadTools">';
+	html += '      <a href="javascript:parent.mcWindows.windows[\'' + name + '\'].close();" onmousedown="return false;" class="mceWindowClose"><img border="0" src="../jscripts/tiny_mce/themes/advanced/images/window_close.gif" /></a>';
+//	html += '      <a href="javascript:mcWindows.windows[\'' + name + '\'].maximize();" onmousedown="return false;" class="mceWindowMaximize"></a>';
+//	html += '      <a href="javascript:mcWindows.windows[\'' + name + '\'].minimize();" onmousedown="return false;" class="mceWindowMinimize"></a>';
+	html += '    </div>';
+	html += '</div><div id="' + id + '_body" class="mceWindowBody" style="width: ' + width + 'px; height: ' + height + 'px;">';
+	html += '<iframe id="' + id + '_iframe" name="' + id + '_iframe" onfocus="parent.mcWindows.windows[\'' + name + '\'].focus();" frameborder="0" width="' + iframeWidth + '" height="' + iframeHeight + '" src="' + url + '" class="mceWindowBodyIframe"></iframe></div>';
+	html += '<div id="' + id + '_statusbar" class="mceWindowStatusbar" onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();">';
+	html += '<div id="' + id + '_resize" class="mceWindowResize"><img onmousedown="parent.mcWindows.windows[\'' + name + '\'].focus();" border="0" src="../jscripts/tiny_mce/themes/advanced/images/window_resize.gif" /></div>';
+	html += '</div>';
+	html += '</div>';
+
+	html += '</body>';
+	html += '</html>';
+
+	// Create iframe
+	this.createFloatingIFrame(id, features['left'], features['top'], features['width'], features['height'], html);
+};
+
+// Gets called when wrapper iframe is initialized
+MCWindows.prototype.onLoad = function(name) {
+	var win = mcWindows.windows[name];
+	var id = "mcWindow_" + name;
+	var wrapperIframe = window.frames[id + "_iframe"].frames[0];
+	var wrapperDoc = window.frames[id + "_iframe"].document;
+	var doc = window.frames[id + "_iframe"].document;
+	var winDiv = document.getElementById("mcWindow_" + name + "_div");
+	var realIframe = window.frames[id + "_iframe"].frames[0];
+
+	// Set window data
+	win.id = "mcWindow_" + name + "_iframe";
+	win.winElement = winDiv;
+	win.bodyElement = doc.getElementById(id + '_body');
+	win.iframeElement = doc.getElementById(id + '_iframe');
+	win.headElement = doc.getElementById(id + '_head');
+	win.titleElement = doc.getElementById(id + '_title');
+	win.resizeElement = doc.getElementById(id + '_resize');
+	win.containerElement = doc.getElementById(id + '_container');
+	win.left = win.features['left'];
+	win.top = win.features['top'];
+	win.frame = window.frames[id + '_iframe'].frames[0];
+	win.wrapperFrame = window.frames[id + '_iframe'];
+	win.wrapperIFrameElement = document.getElementById(id + "_iframe");
+
+	// Add event handlers
+	mcWindows.addEvent(win.headElement, "mousedown", mcWindows.eventDispatcher);
+	mcWindows.addEvent(win.resizeElement, "mousedown", mcWindows.eventDispatcher);
+
+	if (mcWindows.isMSIE) {
+		mcWindows.addEvent(realIframe.document, "mousemove", mcWindows.eventDispatcher);
+		mcWindows.addEvent(realIframe.document, "mouseup", mcWindows.eventDispatcher);
+	} else {
+		mcWindows.addEvent(realIframe, "mousemove", mcWindows.eventDispatcher);
+		mcWindows.addEvent(realIframe, "mouseup", mcWindows.eventDispatcher);
+		mcWindows.addEvent(realIframe, "focus", mcWindows.eventDispatcher);
+	}
+
+	for (var i=0; i<window.frames.length; i++) {
+		if (!window.frames[i]._hasMouseHandlers) {
+			if (mcWindows.isMSIE) {
+				mcWindows.addEvent(window.frames[i].document, "mousemove", mcWindows.eventDispatcher);
+				mcWindows.addEvent(window.frames[i].document, "mouseup", mcWindows.eventDispatcher);
+			} else {
+				mcWindows.addEvent(window.frames[i], "mousemove", mcWindows.eventDispatcher);
+				mcWindows.addEvent(window.frames[i], "mouseup", mcWindows.eventDispatcher);
+			}
+
+			window.frames[i]._hasMouseHandlers = true;
+		}
+	}
+
+	if (mcWindows.isMSIE) {
+		mcWindows.addEvent(win.frame.document, "mousemove", mcWindows.eventDispatcher);
+		mcWindows.addEvent(win.frame.document, "mouseup", mcWindows.eventDispatcher);
+	} else {
+		mcWindows.addEvent(win.frame, "mousemove", mcWindows.eventDispatcher);
+		mcWindows.addEvent(win.frame, "mouseup", mcWindows.eventDispatcher);
+		mcWindows.addEvent(win.frame, "focus", mcWindows.eventDispatcher);
+	}
+
+	this.selectedWindow = win;
+};
+
+MCWindows.prototype.createFloatingIFrame = function(id_prefix, left, top, width, height, html) {
+	var iframe = document.createElement("iframe");
+	var div = document.createElement("div");
+
+	width = parseInt(width);
+	height = parseInt(height)+1;
+
+	// Create wrapper div
+	div.setAttribute("id", id_prefix + "_div");
+	div.setAttribute("width", width);
+	div.setAttribute("height", (height));
+	div.style.position = "absolute";
+	div.style.left = left + "px";
+	div.style.top = top + "px";
+	div.style.width = width + "px";
+	div.style.height = (height) + "px";
+	div.style.backgroundColor = "white";
+	div.style.display = "none";
+
+	if (this.isGecko) {
+		iframeWidth = width + 2;
+		iframeHeight = height + 2;
+	} else {
+		iframeWidth = width;
+		iframeHeight = height + 1;
+	}
+
+	// Create iframe
+	iframe.setAttribute("id", id_prefix + "_iframe");
+	iframe.setAttribute("name", id_prefix + "_iframe");
+	iframe.setAttribute("border", "0");
+	iframe.setAttribute("frameBorder", "0");
+	iframe.setAttribute("marginWidth", "0");
+	iframe.setAttribute("marginHeight", "0");
+	iframe.setAttribute("leftMargin", "0");
+	iframe.setAttribute("topMargin", "0");
+	iframe.setAttribute("width", iframeWidth);
+	iframe.setAttribute("height", iframeHeight);
+//	iframe.setAttribute("src", "../jscripts/tiny_mce/blank.htm");
+	// iframe.setAttribute("allowtransparency", "false");
+	iframe.setAttribute("scrolling", "no");
+	iframe.style.width = iframeWidth + "px";
+	iframe.style.height = iframeHeight + "px";
+	iframe.style.backgroundColor = "white";
+	div.appendChild(iframe);
+
+	document.body.appendChild(div);
+
+	// Fixed MSIE 5.0 issue
+	div.innerHTML = div.innerHTML;
+
+	if (this.isSafari) {
+		// Give Safari some time to setup
+		window.setTimeout(function() {
+			doc = window.frames[id_prefix + '_iframe'].document;
+			doc.open();
+			doc.write(html);
+			doc.close();
+		}, 10);
+	} else {
+		doc = window.frames[id_prefix + '_iframe'].window.document
+		doc.open();
+		doc.write(html);
+		doc.close();
+	}
+
+	div.style.display = "block";
+
+	return div;
+};
+
+// Window instance
+function MCWindow() {
+};
+
+MCWindow.prototype.focus = function() {
+	this.winElement.style.zIndex = mcWindows.zindex++;
+	mcWindows.selectedWindow = this;
+};
+
+MCWindow.prototype.minimize = function() {
+};
+
+MCWindow.prototype.maximize = function() {
+	
+};
+
+MCWindow.prototype.startResize = function() {
+	mcWindows.action = "resize";
+};
+
+MCWindow.prototype.startMove = function(e) {
+	mcWindows.action = "move";
+};
+
+MCWindow.prototype.close = function() {
+	document.body.removeChild(this.winElement);
+	mcWindows.windows[this.name] = null;
+};
+
+MCWindow.prototype.onMouseMove = function(e) {
+	var scrollX = 0;//this.doc.body.scrollLeft;
+	var scrollY = 0;//this.doc.body.scrollTop;
+
+	// Calculate real X, Y
+	var dx = e.screenX - mcWindows.mouseDownScreenX;
+	var dy = e.screenY - mcWindows.mouseDownScreenY;
+
+	switch (mcWindows.action) {
+		case "resize":
+			width = mcWindows.mouseDownWidth + (e.screenX - mcWindows.mouseDownScreenX);
+			height = mcWindows.mouseDownHeight + (e.screenY - mcWindows.mouseDownScreenY);
+
+			width = width < 100 ? 100 : width;
+			height = height < 100 ? 100 : height;
+
+			this.wrapperIFrameElement.style.width = width+2;
+			this.wrapperIFrameElement.style.height = height+2;
+			this.wrapperIFrameElement.width = width+2;
+			this.wrapperIFrameElement.height = height+2;
+			this.winElement.style.width = width;
+			this.winElement.style.height = height;
+
+			height = height-12-19;
+
+			this.containerElement.style.width = width;
+
+			this.iframeElement.style.width = width;
+			this.iframeElement.style.height = height;
+			this.bodyElement.style.width = width;
+			this.bodyElement.style.height = height;
+			this.headElement.style.width = width;
+			//this.statusElement.style.width = width;
+
+			mcWindows.cancelEvent(e);
+			break;
+
+		case "move":
+			this.left = mcWindows.mouseDownLayerX + (e.screenX - mcWindows.mouseDownScreenX);
+			this.top = mcWindows.mouseDownLayerY + (e.screenY - mcWindows.mouseDownScreenY);
+			this.winElement.style.left = this.left + "px";
+			this.winElement.style.top = this.top + "px";
+
+			mcWindows.cancelEvent(e);
+			break;
+	}
+};
+
+MCWindow.prototype.onMouseUp = function(e) {
+	mcWindows.action = "none";
+};
+
+MCWindow.prototype.onFocus = function(e) {
+	// Gecko only handler
+	var winRef = e.currentTarget;
+
+	for (var n in mcWindows.windows) {
+		var win = mcWindows.windows[n];
+		if (typeof(win) == 'function')
+			continue;
+
+		if (winRef.name == win.id) {
+			win.focus();
+			return;
+		}
+	}
+};
+
+MCWindow.prototype.onMouseDown = function(e) {
+	var elm = mcWindows.isMSIE ? this.wrapperFrame.event.srcElement : e.target;
+
+	var scrollX = 0;//this.doc.body.scrollLeft;
+	var scrollY = 0;//this.doc.body.scrollTop;
+
+	mcWindows.mouseDownScreenX = e.screenX;
+	mcWindows.mouseDownScreenY = e.screenY;
+	mcWindows.mouseDownLayerX = this.left;
+	mcWindows.mouseDownLayerY = this.top;
+	mcWindows.mouseDownWidth = parseInt(this.winElement.style.width);
+	mcWindows.mouseDownHeight = parseInt(this.winElement.style.height);
+
+	if (elm == this.resizeElement.firstChild)
+		this.startResize(e);
+	else
+		this.startMove(e);
+
+	mcWindows.cancelEvent(e);
+};
+
+// Global instance
+var mcWindows = new MCWindows();
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/readme.txt

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css
@@ -1,1 +1,90 @@
+/* Clearlooks 2 */
 
+/* Reset */
+.clearlooks2, .clearlooks2 div, .clearlooks2 span, .clearlooks2 a {vertical-align:baseline; text-align:left; position:absolute; border:0; padding:0; margin:0; background:transparent; font-family:Arial,Verdana; font-size:11px; color:#000; text-decoration:none; font-weight:normal; width:auto; height:auto; overflow:hidden; display:block}
+
+/* General */
+.clearlooks2 {position:absolute; direction:ltr}
+.clearlooks2 .mceWrapper {position:static}
+.mceEventBlocker {position:absolute; left:0; top:0; background:url(img/horizontal.gif) no-repeat 0 -75px; width:100%; height:100%}
+.clearlooks2 .mcePlaceHolder {border:1px solid #000; background:#888; top:0; left:0; opacity:0.5; filter:alpha(opacity=50)}
+.clearlooks2_modalBlocker {position:absolute; left:0; top:0; width:100%; height:100%; background:#FFF; opacity:0.6; filter:alpha(opacity=60); display:none}
+
+/* Top */
+.clearlooks2 .mceTop, .clearlooks2 .mceTop div {top:0; width:100%; height:23px}
+.clearlooks2 .mceTop .mceLeft {width:6px; background:url(img/corners.gif)}
+.clearlooks2 .mceTop .mceCenter {right:6px; width:100%; height:23px; background:url(img/horizontal.gif) 12px 0; clip:rect(auto auto auto 12px)}
+.clearlooks2 .mceTop .mceRight {right:0; width:6px; height:23px; background:url(img/corners.gif) -12px 0}
+.clearlooks2 .mceTop span {width:100%; text-align:center; vertical-align:middle; line-height:23px; font-weight:bold}
+.clearlooks2 .mceFocus .mceTop .mceLeft {background:url(img/corners.gif) -6px 0}
+.clearlooks2 .mceFocus .mceTop .mceCenter {background:url(img/horizontal.gif) 0 -23px}
+.clearlooks2 .mceFocus .mceTop .mceRight {background:url(img/corners.gif) -18px 0}
+.clearlooks2 .mceFocus .mceTop span {color:#FFF}
+
+/* Middle */
+.clearlooks2 .mceMiddle, .clearlooks2 .mceMiddle div {top:0}
+.clearlooks2 .mceMiddle {width:100%; height:100%; clip:rect(23px auto auto auto)}
+.clearlooks2 .mceMiddle .mceLeft {left:0; width:5px; height:100%; background:url(img/vertical.gif) -5px 0}
+.clearlooks2 .mceMiddle span {top:23px; left:5px; width:100%; height:100%; background:#FFF}
+.clearlooks2 .mceMiddle .mceRight {right:0; width:5px; height:100%; background:url(img/vertical.gif)}
+
+/* Bottom */
+.clearlooks2 .mceBottom, .clearlooks2 .mceBottom div {height:6px}
+.clearlooks2 .mceBottom {left:0; bottom:0; width:100%}
+.clearlooks2 .mceBottom div {top:0}
+.clearlooks2 .mceBottom .mceLeft {left:0; width:5px; background:url(img/corners.gif) -34px -6px}
+.clearlooks2 .mceBottom .mceCenter {left:5px; width:100%; background:url(img/horizontal.gif) 0 -46px}
+.clearlooks2 .mceBottom .mceRight {right:0; width:5px; background: url(img/corners.gif) -34px 0}
+.clearlooks2 .mceBottom span {display:none}
+.clearlooks2 .mceStatusbar .mceBottom, .clearlooks2 .mceStatusbar .mceBottom div {height:23px}
+.clearlooks2 .mceStatusbar .mceBottom .mceLeft {background:url(img/corners.gif) -29px 0}
+.clearlooks2 .mceStatusbar .mceBottom .mceCenter {background:url(img/horizontal.gif) 0 -52px}
+.clearlooks2 .mceStatusbar .mceBottom .mceRight {background:url(img/corners.gif) -24px 0}
+.clearlooks2 .mceStatusbar .mceBottom span {display:block; left:7px; font-family:Arial, Verdana; font-size:11px; line-height:23px}
+
+/* Actions */
+.clearlooks2 a {width:29px; height:16px; top:3px;}
+.clearlooks2 .mceClose {right:6px; background:url(img/buttons.gif) -87px 0}
+.clearlooks2 .mceMin {display:none; right:68px; background:url(img/buttons.gif) 0 0}
+.clearlooks2 .mceMed {display:none; right:37px; background:url(img/buttons.gif) -29px 0}
+.clearlooks2 .mceMax {display:none; right:37px; background:url(img/buttons.gif) -58px 0}
+.clearlooks2 .mceMove {display:none;width:100%;cursor:move;background:url(img/corners.gif) no-repeat -100px -100px}
+.clearlooks2 .mceMovable .mceMove {display:block}
+.clearlooks2 .mceFocus .mceClose {right:6px; background:url(img/buttons.gif) -87px -16px}
+.clearlooks2 .mceFocus .mceMin {right:68px; background:url(img/buttons.gif) 0 -16px}
+.clearlooks2 .mceFocus .mceMed {right:37px; background:url(img/buttons.gif) -29px -16px}
+.clearlooks2 .mceFocus .mceMax {right:37px; background:url(img/buttons.gif) -58px -16px}
+.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px}
+.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px}
+.clearlooks2 .mceFocus .mceMin:hover {right:68px; background:url(img/buttons.gif) 0 -32px}
+.clearlooks2 .mceFocus .mceMed:hover {right:37px; background:url(img/buttons.gif) -29px -32px}
+.clearlooks2 .mceFocus .mceMax:hover {right:37px; background:url(img/buttons.gif) -58px -32px}
+
+/* Resize */
+.clearlooks2 .mceResize {top:auto; left:auto; display:none; width:5px; height:5px; background:url(img/horizontal.gif) no-repeat 0 -75px}
+.clearlooks2 .mceResizable .mceResize {display:block}
+.clearlooks2 .mceResizable .mceMin, .clearlooks2 .mceMax {display:none}
+.clearlooks2 .mceMinimizable .mceMin {display:block}
+.clearlooks2 .mceMaximizable .mceMax {display:block}
+.clearlooks2 .mceMaximized .mceMed {display:block}
+.clearlooks2 .mceMaximized .mceMax {display:none}
+.clearlooks2 a.mceResizeN {top:0; left:0; width:100%; cursor:n-resize}
+.clearlooks2 a.mceResizeNW {top:0; left:0; cursor:nw-resize}
+.clearlooks2 a.mceResizeNE {top:0; right:0; cursor:ne-resize}
+.clearlooks2 a.mceResizeW {top:0; left:0; height:100%; cursor:w-resize;}
+.clearlooks2 a.mceResizeE {top:0; right:0; height:100%; cursor:e-resize}
+.clearlooks2 a.mceResizeS {bottom:0; left:0; width:100%; cursor:s-resize}
+.clearlooks2 a.mceResizeSW {bottom:0; left:0; cursor:sw-resize}
+.clearlooks2 a.mceResizeSE {bottom:0; right:0; cursor:se-resize}
+
+/* Alert/Confirm */
+.clearlooks2 .mceButton {font-weight:bold; bottom:10px; width:80px; height:30px; background:url(img/button.gif); line-height:30px; vertical-align:middle; text-align:center; outline:0}
+.clearlooks2 .mceMiddle .mceIcon {left:15px; top:35px; width:32px; height:32px}
+.clearlooks2 .mceAlert .mceMiddle span, .clearlooks2 .mceConfirm .mceMiddle span {background:transparent;left:60px; top:35px; width:320px; height:50px; font-weight:bold; overflow:auto; white-space:normal}
+.clearlooks2 a:hover {font-weight:bold;}
+.clearlooks2 .mceAlert .mceMiddle, .clearlooks2 .mceConfirm .mceMiddle {background:#D6D7D5}
+.clearlooks2 .mceAlert .mceOk {left:50%; top:auto; margin-left: -40px}
+.clearlooks2 .mceAlert .mceIcon {background:url(img/alert.gif)}
+.clearlooks2 .mceConfirm .mceOk {left:50%; top:auto; margin-left: -90px}
+.clearlooks2 .mceConfirm .mceCancel {left:50%; top:auto}
+.clearlooks2 .mceConfirm .mceIcon {background:url(img/confirm.gif)} 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/inlinepopups/template.htm
@@ -1,1 +1,388 @@
-
+<!-- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -->
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Template for dialogs</title>
+<link rel="stylesheet" type="text/css" href="skins/clearlooks2/window.css" />
+</head>
+<body>
+
+<div class="mceEditor">
+	<div class="clearlooks2" style="width:400px; height:100px; left:10px;">
+		<div class="mceWrapper">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Blured</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>Content</span>
+				<div class="mceRight"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar text.</span>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceMin" href="#"></a>
+			<a class="mceMax" href="#"></a>
+			<a class="mceMed" href="#"></a>
+			<a class="mceClose" href="#"></a>
+			<a class="mceResize mceResizeN" href="#"></a>
+			<a class="mceResize mceResizeS" href="#"></a>
+			<a class="mceResize mceResizeW" href="#"></a>
+			<a class="mceResize mceResizeE" href="#"></a>
+			<a class="mceResize mceResizeNW" href="#"></a>
+			<a class="mceResize mceResizeNE" href="#"></a>
+			<a class="mceResize mceResizeSW" href="#"></a>
+			<a class="mceResize mceResizeSE" href="#"></a>
+		</div>
+	</div>
+
+	<div class="clearlooks2" style="width:400px; height:100px; left:420px;">
+		<div class="mceWrapper mceMovable mceFocus">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Focused</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>Content</span>
+				<div class="mceRight"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar text.</span>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceMin" href="#"></a>
+			<a class="mceMax" href="#"></a>
+			<a class="mceMed" href="#"></a>
+			<a class="mceClose" href="#"></a>
+			<a class="mceResize mceResizeN" href="#"></a>
+			<a class="mceResize mceResizeS" href="#"></a>
+			<a class="mceResize mceResizeW" href="#"></a>
+			<a class="mceResize mceResizeE" href="#"></a>
+			<a class="mceResize mceResizeNW" href="#"></a>
+			<a class="mceResize mceResizeNE" href="#"></a>
+			<a class="mceResize mceResizeSW" href="#"></a>
+			<a class="mceResize mceResizeSE" href="#"></a>
+		</div>
+	</div>
+
+	<div class="clearlooks2" style="width:400px; height:100px; left:10px; top:120px;">
+		<div class="mceWrapper mceMovable mceFocus mceStatusbar">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>Content</span>
+				<div class="mceRight"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar text.</span>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceMin" href="#"></a>
+			<a class="mceMax" href="#"></a>
+			<a class="mceMed" href="#"></a>
+			<a class="mceClose" href="#"></a>
+			<a class="mceResize mceResizeN" href="#"></a>
+			<a class="mceResize mceResizeS" href="#"></a>
+			<a class="mceResize mceResizeW" href="#"></a>
+			<a class="mceResize mceResizeE" href="#"></a>
+			<a class="mceResize mceResizeNW" href="#"></a>
+			<a class="mceResize mceResizeNE" href="#"></a>
+			<a class="mceResize mceResizeSW" href="#"></a>
+			<a class="mceResize mceResizeSE" href="#"></a>
+		</div>
+	</div>
+
+	<div class="clearlooks2" style="width:400px; height:100px; left:420px; top:120px;">
+		<div class="mceWrapper mceMovable mceFocus mceStatusbar mceResizable">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar, Resizable</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>Content</span>
+				<div class="mceRight"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar text.</span>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceMin" href="#"></a>
+			<a class="mceMax" href="#"></a>
+			<a class="mceMed" href="#"></a>
+			<a class="mceClose" href="#"></a>
+			<a class="mceResize mceResizeN" href="#"></a>
+			<a class="mceResize mceResizeS" href="#"></a>
+			<a class="mceResize mceResizeW" href="#"></a>
+			<a class="mceResize mceResizeE" href="#"></a>
+			<a class="mceResize mceResizeNW" href="#"></a>
+			<a class="mceResize mceResizeNE" href="#"></a>
+			<a class="mceResize mceResizeSW" href="#"></a>
+			<a class="mceResize mceResizeSE" href="#"></a>
+		</div>
+	</div>
+
+	<div class="clearlooks2" style="width:400px; height:100px; left:10px; top:230px;">
+		<div class="mceWrapper mceMovable mceFocus mceResizable mceMaximizable">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Resizable, Maximizable</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>Content</span>
+				<div class="mceRight"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar text.</span>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceMin" href="#"></a>
+			<a class="mceMax" href="#"></a>
+			<a class="mceMed" href="#"></a>
+			<a class="mceClose" href="#"></a>
+			<a class="mceResize mceResizeN" href="#"></a>
+			<a class="mceResize mceResizeS" href="#"></a>
+			<a class="mceResize mceResizeW" href="#"></a>
+			<a class="mceResize mceResizeE" href="#"></a>
+			<a class="mceResize mceResizeNW" href="#"></a>
+			<a class="mceResize mceResizeNE" href="#"></a>
+			<a class="mceResize mceResizeSW" href="#"></a>
+			<a class="mceResize mceResizeSE" href="#"></a>
+		</div>
+	</div>
+
+	<div class="clearlooks2" style="width:400px; height:100px; left:420px; top:230px;">
+		<div class="mceWrapper mceMovable mceStatusbar mceResizable mceMaximizable">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Blurred, Maximizable, Statusbar, Resizable</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>Content</span>
+				<div class="mceRight"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar text.</span>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceMin" href="#"></a>
+			<a class="mceMax" href="#"></a>
+			<a class="mceMed" href="#"></a>
+			<a class="mceClose" href="#"></a>
+			<a class="mceResize mceResizeN" href="#"></a>
+			<a class="mceResize mceResizeS" href="#"></a>
+			<a class="mceResize mceResizeW" href="#"></a>
+			<a class="mceResize mceResizeE" href="#"></a>
+			<a class="mceResize mceResizeNW" href="#"></a>
+			<a class="mceResize mceResizeNE" href="#"></a>
+			<a class="mceResize mceResizeSW" href="#"></a>
+			<a class="mceResize mceResizeSE" href="#"></a>
+		</div>
+	</div>
+
+	<div class="clearlooks2" style="width:400px; height:100px; left:10px; top:340px;">
+		<div class="mceWrapper mceMovable mceFocus mceResizable mceMaximized mceMinimizable mceMaximizable">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Maximized, Maximizable, Minimizable</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>Content</span>
+				<div class="mceRight"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar text.</span>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceMin" href="#"></a>
+			<a class="mceMax" href="#"></a>
+			<a class="mceMed" href="#"></a>
+			<a class="mceClose" href="#"></a>
+			<a class="mceResize mceResizeN" href="#"></a>
+			<a class="mceResize mceResizeS" href="#"></a>
+			<a class="mceResize mceResizeW" href="#"></a>
+			<a class="mceResize mceResizeE" href="#"></a>
+			<a class="mceResize mceResizeNW" href="#"></a>
+			<a class="mceResize mceResizeNE" href="#"></a>
+			<a class="mceResize mceResizeSW" href="#"></a>
+			<a class="mceResize mceResizeSE" href="#"></a>
+		</div>
+	</div>
+
+	<div class="clearlooks2" style="width:400px; height:100px; left:420px; top:340px;">
+		<div class="mceWrapper mceMovable mceStatusbar mceResizable mceMaximized mceMinimizable mceMaximizable">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Blured</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>Content</span>
+				<div class="mceRight"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Statusbar text.</span>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceMin" href="#"></a>
+			<a class="mceMax" href="#"></a>
+			<a class="mceMed" href="#"></a>
+			<a class="mceClose" href="#"></a>
+			<a class="mceResize mceResizeN" href="#"></a>
+			<a class="mceResize mceResizeS" href="#"></a>
+			<a class="mceResize mceResizeW" href="#"></a>
+			<a class="mceResize mceResizeE" href="#"></a>
+			<a class="mceResize mceResizeNW" href="#"></a>
+			<a class="mceResize mceResizeNE" href="#"></a>
+			<a class="mceResize mceResizeSW" href="#"></a>
+			<a class="mceResize mceResizeSE" href="#"></a>
+		</div>
+	</div>
+
+	<div class="clearlooks2" style="width:400px; height:130px; left:10px; top:450px;">
+		<div class="mceWrapper mceMovable mceFocus mceModal mceAlert">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Alert</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+				</span>
+				<div class="mceRight"></div>
+				<div class="mceIcon"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceButton mceOk" href="#">Ok</a>
+			<a class="mceClose" href="#"></a>
+		</div>
+	</div>
+
+	<div class="clearlooks2" style="width:400px; height:130px; left:420px; top:450px;">
+		<div class="mceWrapper mceMovable mceFocus mceModal mceConfirm">
+			<div class="mceTop">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+				<span>Confirm</span>
+			</div>
+
+			<div class="mceMiddle">
+				<div class="mceLeft"></div>
+				<span>
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+					This is a very long error message. This is a very long error message.
+					</span>
+				<div class="mceRight"></div>
+				<div class="mceIcon"></div>
+			</div>
+
+			<div class="mceBottom">
+				<div class="mceLeft"></div>
+				<div class="mceCenter"></div>
+				<div class="mceRight"></div>
+			</div>
+
+			<a class="mceMove" href="#"></a>
+			<a class="mceButton mceOk" href="#">Ok</a>
+			<a class="mceButton mceCancel" href="#">Cancel</a>
+			<a class="mceClose" href="#"></a>
+		</div>
+	</div>
+</div>
+
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.InsertDateTime',{init:function(ed,url){var t=this;t.editor=ed;ed.addCommand('mceInsertDate',function(){var str=t._getDateTime(new Date(),ed.getParam("plugin_insertdate_dateFormat",ed.getLang('insertdatetime.date_fmt')));ed.execCommand('mceInsertContent',false,str);});ed.addCommand('mceInsertTime',function(){var str=t._getDateTime(new Date(),ed.getParam("plugin_insertdate_timeFormat",ed.getLang('insertdatetime.time_fmt')));ed.execCommand('mceInsertContent',false,str);});ed.addButton('insertdate',{title:'insertdatetime.insertdate_desc',cmd:'mceInsertDate'});ed.addButton('inserttime',{title:'insertdatetime.inserttime_desc',cmd:'mceInsertTime'});},getInfo:function(){return{longname:'Insert date/time',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/insertdatetime',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_getDateTime:function(d,fmt){var ed=this.editor;function addZeros(value,len){value=""+value;if(value.length<len){for(var i=0;i<(len-value.length);i++)value="0"+value;}return value;};fmt=fmt.replace("%D","%m/%d/%y");fmt=fmt.replace("%r","%I:%M:%S %p");fmt=fmt.replace("%Y",""+d.getFullYear());fmt=fmt.replace("%y",""+d.getYear());fmt=fmt.replace("%m",addZeros(d.getMonth()+1,2));fmt=fmt.replace("%d",addZeros(d.getDate(),2));fmt=fmt.replace("%H",""+addZeros(d.getHours(),2));fmt=fmt.replace("%M",""+addZeros(d.getMinutes(),2));fmt=fmt.replace("%S",""+addZeros(d.getSeconds(),2));fmt=fmt.replace("%I",""+((d.getHours()+11)%12+1));fmt=fmt.replace("%p",""+(d.getHours()<12?"AM":"PM"));fmt=fmt.replace("%B",""+ed.getLang("insertdatetime.months_long").split(',')[d.getMonth()]);fmt=fmt.replace("%b",""+ed.getLang("insertdatetime.months_short").split(',')[d.getMonth()]);fmt=fmt.replace("%A",""+ed.getLang("insertdatetime.day_long").split(',')[d.getDay()]);fmt=fmt.replace("%a",""+ed.getLang("insertdatetime.day_short").split(',')[d.getDay()]);fmt=fmt.replace("%%","%");return fmt;}});tinymce.PluginManager.add('insertdatetime',tinymce.plugins.InsertDateTime);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin_src.js
@@ -1,1 +1,80 @@
+/**
+ * $Id: editor_plugin_src.js 520 2008-01-07 16:30:32Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.InsertDateTime', {
+		init : function(ed, url) {
+			var t = this;
+
+			t.editor = ed;
+
+			ed.addCommand('mceInsertDate', function() {
+				var str = t._getDateTime(new Date(), ed.getParam("plugin_insertdate_dateFormat", ed.getLang('insertdatetime.date_fmt')));
+
+				ed.execCommand('mceInsertContent', false, str);
+			});
+
+			ed.addCommand('mceInsertTime', function() {
+				var str = t._getDateTime(new Date(), ed.getParam("plugin_insertdate_timeFormat", ed.getLang('insertdatetime.time_fmt')));
+
+				ed.execCommand('mceInsertContent', false, str);
+			});
+
+			ed.addButton('insertdate', {title : 'insertdatetime.insertdate_desc', cmd : 'mceInsertDate'});
+			ed.addButton('inserttime', {title : 'insertdatetime.inserttime_desc', cmd : 'mceInsertTime'});
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Insert date/time',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/insertdatetime',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		},
+
+		// Private methods
+
+		_getDateTime : function(d, fmt) {
+			var ed = this.editor;
+
+			function addZeros(value, len) {
+				value = "" + value;
+
+				if (value.length < len) {
+					for (var i=0; i<(len-value.length); i++)
+						value = "0" + value;
+				}
+
+				return value;
+			};
+
+			fmt = fmt.replace("%D", "%m/%d/%y");
+			fmt = fmt.replace("%r", "%I:%M:%S %p");
+			fmt = fmt.replace("%Y", "" + d.getFullYear());
+			fmt = fmt.replace("%y", "" + d.getYear());
+			fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2));
+			fmt = fmt.replace("%d", addZeros(d.getDate(), 2));
+			fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2));
+			fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2));
+			fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2));
+			fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1));
+			fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM"));
+			fmt = fmt.replace("%B", "" + ed.getLang("insertdatetime.months_long").split(',')[d.getMonth()]);
+			fmt = fmt.replace("%b", "" + ed.getLang("insertdatetime.months_short").split(',')[d.getMonth()]);
+			fmt = fmt.replace("%A", "" + ed.getLang("insertdatetime.day_long").split(',')[d.getDay()]);
+			fmt = fmt.replace("%a", "" + ed.getLang("insertdatetime.day_short").split(',')[d.getDay()]);
+			fmt = fmt.replace("%%", "%");
+
+			return fmt;
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('insertdatetime', tinymce.plugins.InsertDateTime);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/insertdatetime/images/insertdate.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/insertdatetime/images/inserttime.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/insertdatetime/langs/en.js
@@ -1,1 +1,13 @@
+// UK lang variables
 
+tinyMCE.addToLang('',{
+insertdate_def_fmt : '%Y-%m-%d',
+inserttime_def_fmt : '%H:%M:%S',
+insertdate_desc : 'Insert date',
+inserttime_desc : 'Insert time',
+inserttime_months_long : new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"),
+inserttime_months_short : new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"),
+inserttime_day_long : new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"),
+inserttime_day_short : new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/insertdatetime/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/layer/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.Layer',{init:function(ed,url){var t=this;t.editor=ed;ed.addCommand('mceInsertLayer',t._insertLayer,t);ed.addCommand('mceMoveForward',function(){t._move(1);});ed.addCommand('mceMoveBackward',function(){t._move(-1);});ed.addCommand('mceMakeAbsolute',function(){t._toggleAbsolute();});ed.addButton('moveforward',{title:'layer.forward_desc',cmd:'mceMoveForward'});ed.addButton('movebackward',{title:'layer.backward_desc',cmd:'mceMoveBackward'});ed.addButton('absolute',{title:'layer.absolute_desc',cmd:'mceMakeAbsolute'});ed.addButton('insertlayer',{title:'layer.insertlayer_desc',cmd:'mceInsertLayer'});ed.onInit.add(function(){if(tinymce.isIE)ed.getDoc().execCommand('2D-Position',false,true);});ed.onNodeChange.add(t._nodeChange,t);ed.onVisualAid.add(t._visualAid,t);},getInfo:function(){return{longname:'Layer',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/layer',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_nodeChange:function(ed,cm,n){var le,p;le=this._getParentLayer(n);p=ed.dom.getParent(n,'DIV,P,IMG');if(!p){cm.setDisabled('absolute',1);cm.setDisabled('moveforward',1);cm.setDisabled('movebackward',1);}else{cm.setDisabled('absolute',0);cm.setDisabled('moveforward',!le);cm.setDisabled('movebackward',!le);cm.setActive('absolute',le&&le.style.position.toLowerCase()=="absolute");}},_visualAid:function(ed,e,s){var dom=ed.dom;tinymce.each(dom.select('div,p',e),function(e){if(/^(absolute|relative|static)$/i.test(e.style.position)){if(s)dom.addClass(e,'mceItemVisualAid');else dom.removeClass(e,'mceItemVisualAid');}});},_move:function(d){var ed=this.editor,i,z=[],le=this._getParentLayer(ed.selection.getNode()),ci=-1,fi=-1,nl;nl=[];tinymce.walk(ed.getBody(),function(n){if(n.nodeType==1&&/^(absolute|relative|static)$/i.test(n.style.position))nl.push(n);},'childNodes');for(i=0;i<nl.length;i++){z[i]=nl[i].style.zIndex?parseInt(nl[i].style.zIndex):0;if(ci<0&&nl[i]==le)ci=i;}if(d<0){for(i=0;i<z.length;i++){if(z[i]<z[ci]){fi=i;break;}}if(fi>-1){nl[ci].style.zIndex=z[fi];nl[fi].style.zIndex=z[ci];}else{if(z[ci]>0)nl[ci].style.zIndex=z[ci]-1;}}else{for(i=0;i<z.length;i++){if(z[i]>z[ci]){fi=i;break;}}if(fi>-1){nl[ci].style.zIndex=z[fi];nl[fi].style.zIndex=z[ci];}else nl[ci].style.zIndex=z[ci]+1;}ed.execCommand('mceRepaint');},_getParentLayer:function(n){return this.editor.dom.getParent(n,function(n){return n.nodeType==1&&/^(absolute|relative|static)$/i.test(n.style.position);});},_insertLayer:function(){var ed=this.editor,p=ed.dom.getPos(ed.dom.getParent(ed.selection.getNode(),'*'));ed.dom.add(ed.getBody(),'div',{style:{position:'absolute',left:p.x,top:(p.y>20?p.y:20),width:100,height:100},'class':'mceItemVisualAid'},ed.selection.getContent()||ed.getLang('layer.content'));},_toggleAbsolute:function(){var ed=this.editor,le=this._getParentLayer(ed.selection.getNode());if(!le)le=ed.dom.getParent(ed.selection.getNode(),'DIV,P,IMG');if(le){if(le.style.position.toLowerCase()=="absolute"){ed.dom.setStyles(le,{position:'',left:'',top:'',width:'',height:''});ed.dom.removeClass(le,'mceItemVisualAid');}else{if(le.style.left=="")le.style.left=20+'px';if(le.style.top=="")le.style.top=20+'px';if(le.style.width=="")le.style.width=le.width?(le.width+'px'):'100px';if(le.style.height=="")le.style.height=le.height?(le.height+'px'):'100px';le.style.position="absolute";ed.addVisual(ed.getBody());}ed.execCommand('mceRepaint');ed.nodeChanged();}}});tinymce.PluginManager.add('layer',tinymce.plugins.Layer);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/layer/editor_plugin_src.js
@@ -1,1 +1,209 @@
-
+/**
+ * $Id: editor_plugin_src.js 652 2008-02-29 13:09:46Z spocke $
+ *
+ * @author Moxiecode

+ */
+
+(function() {
+	tinymce.create('tinymce.plugins.Layer', {
+		init : function(ed, url) {
+			var t = this;
+
+			t.editor = ed;
+
+			// Register commands
+			ed.addCommand('mceInsertLayer', t._insertLayer, t);
+
+			ed.addCommand('mceMoveForward', function() {
+				t._move(1);
+			});
+
+			ed.addCommand('mceMoveBackward', function() {
+				t._move(-1);
+			});
+
+			ed.addCommand('mceMakeAbsolute', function() {
+				t._toggleAbsolute();
+			});
+
+			// Register buttons
+			ed.addButton('moveforward', {title : 'layer.forward_desc', cmd : 'mceMoveForward'});
+			ed.addButton('movebackward', {title : 'layer.backward_desc', cmd : 'mceMoveBackward'});
+			ed.addButton('absolute', {title : 'layer.absolute_desc', cmd : 'mceMakeAbsolute'});
+			ed.addButton('insertlayer', {title : 'layer.insertlayer_desc', cmd : 'mceInsertLayer'});
+
+			ed.onInit.add(function() {
+				if (tinymce.isIE)
+					ed.getDoc().execCommand('2D-Position', false, true);
+			});
+
+			ed.onNodeChange.add(t._nodeChange, t);
+			ed.onVisualAid.add(t._visualAid, t);
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Layer',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/layer',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		},
+
+		// Private methods
+
+		_nodeChange : function(ed, cm, n) {
+			var le, p;
+
+			le = this._getParentLayer(n);
+			p = ed.dom.getParent(n, 'DIV,P,IMG');
+
+			if (!p) {
+				cm.setDisabled('absolute', 1);
+				cm.setDisabled('moveforward', 1);
+				cm.setDisabled('movebackward', 1);
+			} else {
+				cm.setDisabled('absolute', 0);
+				cm.setDisabled('moveforward', !le);
+				cm.setDisabled('movebackward', !le);
+				cm.setActive('absolute', le && le.style.position.toLowerCase() == "absolute");
+			}
+		},
+
+		// Private methods
+
+		_visualAid : function(ed, e, s) {
+			var dom = ed.dom;
+
+			tinymce.each(dom.select('div,p', e), function(e) {
+				if (/^(absolute|relative|static)$/i.test(e.style.position)) {
+					if (s)
+						dom.addClass(e, 'mceItemVisualAid');
+					else
+						dom.removeClass(e, 'mceItemVisualAid');	
+				}
+			});
+		},
+
+		_move : function(d) {
+			var ed = this.editor, i, z = [], le = this._getParentLayer(ed.selection.getNode()), ci = -1, fi = -1, nl;
+
+			nl = [];
+			tinymce.walk(ed.getBody(), function(n) {
+				if (n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position))
+					nl.push(n); 
+			}, 'childNodes');
+
+			// Find z-indexes
+			for (i=0; i<nl.length; i++) {
+				z[i] = nl[i].style.zIndex ? parseInt(nl[i].style.zIndex) : 0;
+
+				if (ci < 0 && nl[i] == le)
+					ci = i;
+			}
+
+			if (d < 0) {
+				// Move back
+
+				// Try find a lower one
+				for (i=0; i<z.length; i++) {
+					if (z[i] < z[ci]) {
+						fi = i;
+						break;
+					}
+				}
+
+				if (fi > -1) {
+					nl[ci].style.zIndex = z[fi];
+					nl[fi].style.zIndex = z[ci];
+				} else {
+					if (z[ci] > 0)
+						nl[ci].style.zIndex = z[ci] - 1;
+				}
+			} else {
+				// Move forward
+
+				// Try find a higher one
+				for (i=0; i<z.length; i++) {
+					if (z[i] > z[ci]) {
+						fi = i;
+						break;
+					}
+				}
+
+				if (fi > -1) {
+					nl[ci].style.zIndex = z[fi];
+					nl[fi].style.zIndex = z[ci];
+				} else
+					nl[ci].style.zIndex = z[ci] + 1;
+			}
+
+			ed.execCommand('mceRepaint');
+		},
+
+		_getParentLayer : function(n) {
+			return this.editor.dom.getParent(n, function(n) {
+				return n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position);
+			});
+		},
+
+		_insertLayer : function() {
+			var ed = this.editor, p = ed.dom.getPos(ed.dom.getParent(ed.selection.getNode(), '*'));
+
+			ed.dom.add(ed.getBody(), 'div', {
+				style : {
+					position : 'absolute',
+					left : p.x,
+					top : (p.y > 20 ? p.y : 20),
+					width : 100,
+					height : 100
+				},
+				'class' : 'mceItemVisualAid'
+			}, ed.selection.getContent() || ed.getLang('layer.content'));
+		},
+
+		_toggleAbsolute : function() {
+			var ed = this.editor, le = this._getParentLayer(ed.selection.getNode());
+
+			if (!le)
+				le = ed.dom.getParent(ed.selection.getNode(), 'DIV,P,IMG');
+
+			if (le) {
+				if (le.style.position.toLowerCase() == "absolute") {
+					ed.dom.setStyles(le, {
+						position : '',
+						left : '',
+						top : '',
+						width : '',
+						height : ''
+					});
+
+					ed.dom.removeClass(le, 'mceItemVisualAid');
+				} else {
+					if (le.style.left == "")
+						le.style.left = 20 + 'px';
+
+					if (le.style.top == "")
+						le.style.top = 20 + 'px';
+
+					if (le.style.width == "")
+						le.style.width = le.width ? (le.width + 'px') : '100px';
+
+					if (le.style.height == "")
+						le.style.height = le.height ? (le.height + 'px') : '100px';
+
+					le.style.position = "absolute";
+					ed.addVisual(ed.getBody());
+				}
+
+				ed.execCommand('mceRepaint');
+				ed.nodeChanged();
+			}
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('layer', tinymce.plugins.Layer);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/layer/images/absolute.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/layer/images/backward.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/layer/images/forward.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/layer/images/insert_layer.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/layer/images/insertlayer.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/layer/images/movebackward.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/layer/images/moveforward.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/layer/langs/en.js
@@ -1,1 +1,10 @@
+// UK lang variables
 
+tinyMCE.addToLang('layer',{
+insertlayer_desc : 'Insert new layer',
+forward_desc : 'Move forward',
+backward_desc : 'Move backward',
+absolute_desc : 'Toggle absolute positioning',
+content : 'New layer...'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/layer/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/media/css/content.css
@@ -1,1 +1,7 @@
+.mceItemFlash, .mceItemShockWave, .mceItemQuickTime, .mceItemWindowsMedia, .mceItemRealMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc;}
+.mceItemShockWave {background-image: url(../img/shockwave.gif);}
+.mceItemFlash {background-image:url(../img/flash.gif);}
+.mceItemQuickTime {background-image:url(../img/quicktime.gif);}
+.mceItemWindowsMedia {background-image:url(../img/windowsmedia.gif);}
+.mceItemRealMedia {background-image:url(../img/realmedia.gif);}
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/media/css/media.css
@@ -1,1 +1,17 @@
+#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: 380px; 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 }
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/media/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){var each=tinymce.each;tinymce.create('tinymce.plugins.MediaPlugin',{init:function(ed,url){var t=this;t.editor=ed;t.url=url;function isMediaElm(n){return/^(mceItemFlash|mceItemShockWave|mceItemWindowsMedia|mceItemQuickTime|mceItemRealMedia)$/.test(n.className);};ed.addCommand('mceMedia',function(){ed.windowManager.open({file:url+'/media.htm',width:430+parseInt(ed.getLang('media.delta_width',0)),height:470+parseInt(ed.getLang('media.delta_height',0)),inline:1},{plugin_url:url});});ed.addButton('media',{title:'media.desc',cmd:'mceMedia'});ed.onNodeChange.add(function(ed,cm,n){cm.setActive('media',n.nodeName=='IMG'&&isMediaElm(n));});ed.onInit.add(function(){var lo={mceItemFlash:'flash',mceItemShockWave:'shockwave',mceItemWindowsMedia:'windowsmedia',mceItemQuickTime:'quicktime',mceItemRealMedia:'realmedia'};if(ed.settings.content_css!==false)ed.dom.loadCSS(url+"/css/content.css");if(ed.theme.onResolveName){ed.theme.onResolveName.add(function(th,o){if(o.name=='img'){each(lo,function(v,k){if(ed.dom.hasClass(o.node,k)){o.name=v;o.title=ed.dom.getAttrib(o.node,'title');return false;}});}});}if(ed&&ed.plugins.contextmenu){ed.plugins.contextmenu.onContextMenu.add(function(th,m,e){if(e.nodeName=='IMG'&&/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(e.className)){m.add({title:'media.edit',icon:'media',cmd:'mceMedia'});}});}});ed.onBeforeSetContent.add(function(ed,o){var h=o.content;h=h.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi,function(a,b,c){var o=t._parse(c);return'<img class="mceItem'+b+'" title="'+ed.dom.encode(c)+'" src="'+url+'/img/trans.gif" width="'+o.width+'" height="'+o.height+'" />'});h=h.replace(/<object([^>]*)>/gi,'<span class="mceItemObject" $1>');h=h.replace(/<embed([^>]*)>/gi,'<span class="mceItemEmbed" $1>');h=h.replace(/<\/(object|embed)([^>]*)>/gi,'</span>');h=h.replace(/<param([^>]*)>/gi,function(a,b){return'<span '+b.replace(/value=/gi,'_value=')+' class="mceItemParam"></span>'});h=h.replace(/\/ class=\"mceItemParam\"><\/span>/gi,'class="mceItemParam"></span>');o.content=h;});ed.onSetContent.add(function(){t._spansToImgs(ed.getBody());});ed.onPreProcess.add(function(ed,o){var dom=ed.dom;if(o.set){t._spansToImgs(o.node);each(dom.select('IMG',o.node),function(n){var p;if(isMediaElm(n)){p=t._parse(n.title);dom.setAttrib(n,'width',dom.getAttrib(n,'width',p.width||100));dom.setAttrib(n,'height',dom.getAttrib(n,'height',p.height||100));}});}if(o.get){each(dom.select('IMG',o.node),function(n){var ci,cb,mt;if(ed.getParam('media_use_script')){if(isMediaElm(n))n.className=n.className.replace(/mceItem/g,'mceTemp');return;}switch(n.className){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=ed.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(ci){dom.replace(t._buildObj({classid:ci,codebase:cb,type:mt},n),n);}});}});ed.onPostProcess.add(function(ed,o){o.content=o.content.replace(/_value=/g,'value=');});if(ed.getParam('media_use_script')){function getAttr(s,n){n=new RegExp(n+'=\"([^\"]+)\"','g').exec(s);return n?ed.dom.decode(n[1]):'';};ed.onPostProcess.add(function(ed,o){o.content=o.content.replace(/<img[^>]+>/g,function(im){var cl=getAttr(im,'class');if(/^(mceTempFlash|mceTempShockWave|mceTempWindowsMedia|mceTempQuickTime|mceTempRealMedia)$/.test(cl)){at=t._parse(getAttr(im,'title'));at.width=getAttr(im,'width');at.height=getAttr(im,'height');im='<script type="text/javascript">write'+cl.substring(7)+'({'+t._serialize(at)+'});</script>';}return im;});});}},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};},_buildObj:function(o,n){var ob,ed=this.editor,dom=ed.dom,p=this._parse(n.title);p.width=o.width=dom.getAttrib(n,'width')||100;p.height=o.height=dom.getAttrib(n,'height')||100;ob=dom.create('span',{mce_name:'object',classid:"clsid:"+o.classid,codebase:o.codebase,width:o.width,height:o.height});if(p.src)p.src=ed.convertURL(p.src,'src',n);each(p,function(v,k){if(!/^(width|height|codebase|classid)$/.test(k)){if(o.type=='application/x-mplayer2'&&k=='src')k='url';dom.add(ob,'span',{mce_name:'param',name:k,'_value':v});}});dom.add(ob,'span',tinymce.extend({mce_name:'embed',type:o.type},p));return ob;},_spansToImgs:function(p){var t=this,dom=t.editor.dom,im,ci;each(dom.select('span',p),function(n){if(dom.getAttrib(n,'class')=='mceItemObject'){ci=dom.getAttrib(n,"classid").toLowerCase().replace(/\s+/g,'');switch(ci){case'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000':dom.replace(t._createImg('mceItemFlash',n),n);break;case'clsid:166b1bca-3f9c-11cf-8075-444553540000':dom.replace(t._createImg('mceItemShockWave',n),n);break;case'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6':case'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95':case'clsid:05589fa1-c356-11ce-bf01-00aa0055595a':dom.replace(t._createImg('mceItemWindowsMedia',n),n);break;case'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b':dom.replace(t._createImg('mceItemQuickTime',n),n);break;case'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa':dom.replace(t._createImg('mceItemRealMedia',n),n);break;default:dom.replace(t._createImg('mceItemFlash',n),n);}return;}if(dom.getAttrib(n,'class')=='mceItemEmbed'){switch(dom.getAttrib(n,'type')){case'application/x-shockwave-flash':dom.replace(t._createImg('mceItemFlash',n),n);break;case'application/x-director':dom.replace(t._createImg('mceItemShockWave',n),n);break;case'application/x-mplayer2':dom.replace(t._createImg('mceItemWindowsMedia',n),n);break;case'video/quicktime':dom.replace(t._createImg('mceItemQuickTime',n),n);break;case'audio/x-pn-realaudio-plugin':dom.replace(t._createImg('mceItemRealMedia',n),n);break;default:dom.replace(t._createImg('mceItemFlash',n),n);}}});},_createImg:function(cl,n){var im,dom=this.editor.dom,pa={},ti='';im=dom.create('img',{src:this.url+'/img/trans.gif',width:dom.getAttrib(n,'width')||100,height:dom.getAttrib(n,'height')||100,'class':cl});each(['id','name','width','height','bgcolor','align','flashvars','src','wmode'],function(na){var v=dom.getAttrib(n,na);if(v)pa[na]=v;});each(dom.select('span',n),function(n){if(dom.hasClass(n,'mceItemParam'))pa[dom.getAttrib(n,'name')]=dom.getAttrib(n,'_value');});if(pa.movie){pa.src=pa.movie;delete pa.movie;}delete pa.width;delete pa.height;im.title=this._serialize(pa);return im;},_parse:function(s){return tinymce.util.JSON.parse('{'+s+'}');},_serialize:function(o){return tinymce.util.JSON.serialize(o).replace(/[{}]/g,'');}});tinymce.PluginManager.add('media',tinymce.plugins.MediaPlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/media/editor_plugin_src.js
@@ -1,1 +1,359 @@
-
+/**
+ * $Id: editor_plugin_src.js 763 2008-04-03 13:25:45Z spocke $
+ *
+ * @author Moxiecode

+ */
+
+(function() {
+	var each = tinymce.each;
+
+	tinymce.create('tinymce.plugins.MediaPlugin', {
+		init : function(ed, url) {
+			var t = this;
+			
+			t.editor = ed;
+			t.url = url;
+
+			function isMediaElm(n) {
+				return /^(mceItemFlash|mceItemShockWave|mceItemWindowsMedia|mceItemQuickTime|mceItemRealMedia)$/.test(n.className);
+			};
+
+			// Register commands
+			ed.addCommand('mceMedia', function() {
+				ed.windowManager.open({
+					file : url + '/media.htm',
+					width : 430 + parseInt(ed.getLang('media.delta_width', 0)),
+					height : 470 + parseInt(ed.getLang('media.delta_height', 0)),
+					inline : 1
+				}, {
+					plugin_url : url
+				});
+			});
+
+			// Register buttons
+			ed.addButton('media', {title : 'media.desc', cmd : 'mceMedia'});
+
+			ed.onNodeChange.add(function(ed, cm, n) {
+				cm.setActive('media', n.nodeName == 'IMG' && isMediaElm(n));
+			});
+
+			ed.onInit.add(function() {
+				var lo = {
+					mceItemFlash : 'flash',
+					mceItemShockWave : 'shockwave',
+					mceItemWindowsMedia : 'windowsmedia',
+					mceItemQuickTime : 'quicktime',
+					mceItemRealMedia : 'realmedia'
+				};
+
+				if (ed.settings.content_css !== false)
+					ed.dom.loadCSS(url + "/css/content.css");
+
+				if (ed.theme.onResolveName) {
+					ed.theme.onResolveName.add(function(th, o) {
+						if (o.name == 'img') {
+							each(lo, function(v, k) {
+								if (ed.dom.hasClass(o.node, k)) {
+									o.name = v;
+									o.title = ed.dom.getAttrib(o.node, 'title');
+									return false;
+								}
+							});
+						}
+					});
+				}
+
+				if (ed && ed.plugins.contextmenu) {
+					ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) {
+						if (e.nodeName == 'IMG' && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(e.className)) {
+							m.add({title : 'media.edit', icon : 'media', cmd : 'mceMedia'});
+						}
+					});
+				}
+			});
+
+			ed.onBeforeSetContent.add(function(ed, o) {
+				var h = o.content;
+
+				h = h.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi, function(a, b, c) {
+					var o = t._parse(c);
+
+					return '<img class="mceItem' + b + '" title="' + ed.dom.encode(c) + '" src="' + url + '/img/trans.gif" width="' + o.width + '" height="' + o.height + '" />'
+				});
+
+				h = h.replace(/<object([^>]*)>/gi, '<span class="mceItemObject" $1>');
+				h = h.replace(/<embed([^>]*)>/gi, '<span class="mceItemEmbed" $1>');
+				h = h.replace(/<\/(object|embed)([^>]*)>/gi, '</span>');
+				h = h.replace(/<param([^>]*)>/gi, function(a, b) {return '<span ' + b.replace(/value=/gi, '_value=') + ' class="mceItemParam"></span>'});
+				h = h.replace(/\/ class=\"mceItemParam\"><\/span>/gi, 'class="mceItemParam"></span>');
+
+				o.content = h;
+			});
+
+			ed.onSetContent.add(function() {
+				t._spansToImgs(ed.getBody());
+			});
+
+			ed.onPreProcess.add(function(ed, o) {
+				var dom = ed.dom;
+
+				if (o.set) {
+					t._spansToImgs(o.node);
+
+					each(dom.select('IMG', o.node), function(n) {
+						var p;
+
+						if (isMediaElm(n)) {
+							p = t._parse(n.title);
+							dom.setAttrib(n, 'width', dom.getAttrib(n, 'width', p.width || 100));
+							dom.setAttrib(n, 'height', dom.getAttrib(n, 'height', p.height || 100));
+						}
+					});
+				}
+
+				if (o.get) {
+					each(dom.select('IMG', o.node), function(n) {
+						var ci, cb, mt;
+
+						if (ed.getParam('media_use_script')) {
+							if (isMediaElm(n))
+								n.className = n.className.replace(/mceItem/g, 'mceTemp');
+
+							return;
+						}
+
+						switch (n.className) {
+							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 = ed.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 (ci) {
+							dom.replace(t._buildObj({
+								classid : ci,
+								codebase : cb,
+								type : mt
+							}, n), n);
+						}
+					});
+				}
+			});
+
+			ed.onPostProcess.add(function(ed, o) {
+				o.content = o.content.replace(/_value=/g, 'value=');
+			});
+
+			if (ed.getParam('media_use_script')) {
+				function getAttr(s, n) {
+					n = new RegExp(n + '=\"([^\"]+)\"', 'g').exec(s);
+
+					return n ? ed.dom.decode(n[1]) : '';
+				};
+
+				ed.onPostProcess.add(function(ed, o) {
+					o.content = o.content.replace(/<img[^>]+>/g, function(im) {
+						var cl = getAttr(im, 'class');
+
+						if (/^(mceTempFlash|mceTempShockWave|mceTempWindowsMedia|mceTempQuickTime|mceTempRealMedia)$/.test(cl)) {
+							at = t._parse(getAttr(im, 'title'));
+							at.width = getAttr(im, 'width');
+							at.height = getAttr(im, 'height');
+							im = '<script type="text/javascript">write' + cl.substring(7) + '({' + t._serialize(at) + '});</script>';
+						}
+
+						return im;
+					});
+				});
+			}
+		},
+
+		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
+			};
+		},
+
+		// Private methods
+
+		_buildObj : function(o, n) {
+			var ob, ed = this.editor, dom = ed.dom, p = this._parse(n.title);
+
+			p.width = o.width = dom.getAttrib(n, 'width') || 100;
+			p.height = o.height = dom.getAttrib(n, 'height') || 100;
+
+			ob = dom.create('span', {
+				mce_name : 'object',
+				classid : "clsid:" + o.classid,
+				codebase : o.codebase,
+				width : o.width,
+				height : o.height
+			});
+
+			if (p.src)
+				p.src = ed.convertURL(p.src, 'src', n);
+
+			each (p, function(v, k) {
+				if (!/^(width|height|codebase|classid)$/.test(k)) {
+					// Use url instead of src in IE for Windows media
+					if (o.type == 'application/x-mplayer2' && k == 'src')
+						k = 'url';
+
+					dom.add(ob, 'span', {mce_name : 'param', name : k, '_value' : v});
+				}
+			});
+
+			dom.add(ob, 'span', tinymce.extend({mce_name : 'embed', type : o.type}, p));
+
+			return ob;
+		},
+
+		_spansToImgs : function(p) {
+			var t = this, dom = t.editor.dom, im, ci;
+
+			each(dom.select('span', p), function(n) {
+				// Convert object into image
+				if (dom.getAttrib(n, 'class') == 'mceItemObject') {
+					ci = dom.getAttrib(n, "classid").toLowerCase().replace(/\s+/g, '');
+
+					switch (ci) {
+						case 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000':
+							dom.replace(t._createImg('mceItemFlash', n), n);
+							break;
+
+						case 'clsid:166b1bca-3f9c-11cf-8075-444553540000':
+							dom.replace(t._createImg('mceItemShockWave', n), n);
+							break;
+
+						case 'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6':
+						case 'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95':
+						case 'clsid:05589fa1-c356-11ce-bf01-00aa0055595a':
+							dom.replace(t._createImg('mceItemWindowsMedia', n), n);
+							break;
+
+						case 'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b':
+							dom.replace(t._createImg('mceItemQuickTime', n), n);
+							break;
+
+						case 'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa':
+							dom.replace(t._createImg('mceItemRealMedia', n), n);
+							break;
+
+						default:
+							dom.replace(t._createImg('mceItemFlash', n), n);
+					}
+					
+					return;
+				}
+
+				// Convert embed into image
+				if (dom.getAttrib(n, 'class') == 'mceItemEmbed') {
+					switch (dom.getAttrib(n, 'type')) {
+						case 'application/x-shockwave-flash':
+							dom.replace(t._createImg('mceItemFlash', n), n);
+							break;
+
+						case 'application/x-director':
+							dom.replace(t._createImg('mceItemShockWave', n), n);
+							break;
+
+						case 'application/x-mplayer2':
+							dom.replace(t._createImg('mceItemWindowsMedia', n), n);
+							break;
+
+						case 'video/quicktime':
+							dom.replace(t._createImg('mceItemQuickTime', n), n);
+							break;
+
+						case 'audio/x-pn-realaudio-plugin':
+							dom.replace(t._createImg('mceItemRealMedia', n), n);
+							break;
+
+						default:
+							dom.replace(t._createImg('mceItemFlash', n), n);
+					}
+				}			
+			});
+		},
+
+		_createImg : function(cl, n) {
+			var im, dom = this.editor.dom, pa = {}, ti = '';
+
+			// Create image
+			im = dom.create('img', {
+				src : this.url + '/img/trans.gif',
+				width : dom.getAttrib(n, 'width') || 100,
+				height : dom.getAttrib(n, 'height') || 100,
+				'class' : cl
+			});
+
+			// Setup base parameters
+			each(['id', 'name', 'width', 'height', 'bgcolor', 'align', 'flashvars', 'src', 'wmode'], function(na) {
+				var v = dom.getAttrib(n, na);
+
+				if (v)
+					pa[na] = v;
+			});
+
+			// Add optional parameters
+			each(dom.select('span', n), function(n) {
+				if (dom.hasClass(n, 'mceItemParam'))
+					pa[dom.getAttrib(n, 'name')] = dom.getAttrib(n, '_value');
+			});
+
+			// Use src not movie
+			if (pa.movie) {
+				pa.src = pa.movie;
+				delete pa.movie;
+			}
+
+			delete pa.width;
+			delete pa.height;
+
+			im.title = this._serialize(pa);
+
+			return im;
+		},
+
+		_parse : function(s) {
+			return tinymce.util.JSON.parse('{' + s + '}');
+		},
+
+		_serialize : function(o) {
+			return tinymce.util.JSON.serialize(o).replace(/[{}]/g, '');
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/media/images/flash.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/media/images/media.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/media/images/quicktime.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/media/images/realmedia.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/media/images/shockwave.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/media/images/windowsmedia.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/media/img/flash.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/media/img/flv_player.swf differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/media/img/quicktime.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/media/img/realmedia.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/media/img/shockwave.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/media/img/trans.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/media/img/windowsmedia.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/media/js/embed.js
@@ -1,1 +1,74 @@
+/**
+ * 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);
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/media/js/media.js
@@ -1,1 +1,629 @@
-
+tinyMCEPopup.requireLangPack();
+
+var oldWidth, oldHeight, ed, url;
+
+if (url = tinyMCEPopup.getParam("media_external_list_url"))
+	document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>');
+
+function init() {
+	var pl = "", f, val;
+	var type = "flash", fe, i;
+
+	ed = tinyMCEPopup.editor;
+
+	tinyMCEPopup.resizeToInnerSize();
+	f = document.forms[0]
+
+	fe = ed.selection.getNode();
+	if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(ed.dom.getAttrib(fe, 'class'))) {
+		pl = fe.title;
+
+		switch (ed.dom.getAttrib(fe, 'class')) {
+			case 'mceItemFlash':
+				type = 'flash';
+				break;
+
+			case 'mceItemFlashVideo':
+				type = 'flv';
+				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 = ed.getLang('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('medialist','src','media','media');
+	if (html == "")
+		document.getElementById("linklistrow").style.display = 'none';
+	else
+		document.getElementById("linklistcontainer").innerHTML = html;
+
+	// Resize some elements
+	if (isVisible('filebrowser'))
+		document.getElementById('src').style.width = '230px';
+
+	// Setup form
+	if (pl != "") {
+		pl = tinyMCEPopup.editor.plugins.media._parse(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 = ed.dom.getAttrib(fe, "width")) != "")
+			pl.width = f.width.value = val;
+
+		if ((val = ed.dom.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;
+
+	tinyMCEPopup.restoreSelection();
+
+	if (!AutoValidator.validate(f)) {
+		alert(ed.getLang('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 = ed.selection.getNode();
+	if (fe != null && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(ed.dom.getAttrib(fe, 'class'))) {
+		switch (f.media_type.options[f.media_type.selectedIndex].value) {
+			case "flash":
+				fe.className = "mceItemFlash";
+				break;
+
+			case "flv":
+				fe.className = "mceItemFlashVideo";
+				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)
+			ed.execCommand('mceRepaint');
+
+		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="' + tinyMCEPopup.getWindowArg("plugin_url") + '/img/trans.gif"' ;
+
+		switch (f.media_type.options[f.media_type.selectedIndex].value) {
+			case "flash":
+				h += ' class="mceItemFlash"';
+				break;
+
+			case "flv":
+				h += ' class="mceItemFlashVideo"';
+				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 += ' />';
+
+		ed.execCommand('mceInsertContent', false, h);
+	}
+
+	tinyMCEPopup.close();
+}
+
+function updatePreview() {
+	var f = document.forms[0], type;
+
+	f.width.value = f.width.value || '320';
+	f.height.value = f.height.value || '240';
+
+	type = getType(f.src.value);
+	selectByValue(f, 'media_type', type);
+	changedType(type);
+	generatePreview();
+}
+
+function getMediaListHTML() {
+	if (typeof(tinyMCEMediaList) != "undefined" && tinyMCEMediaList.length > 0) {
+		var html = "";
+
+		html += '<select id="linklist" name="linklist" style="width: 250px" onchange="this.form.src.value=this.options[this.selectedIndex].value;updatePreview();">';
+		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 = ed.getParam("media_types", "flash=swf;flv=flv;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.match(/watch\?v=(.+)(.*)/)) {
+		f.width.value = '425';
+		f.height.value = '350';
+		f.src.value = 'http://www.youtube.com/v/' + v.match(/v=(.*)(.*)/)[0].split('=')[1];
+		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(ed.getLang("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('flv_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;
+
+	if (n == 'src')
+		v = tinyMCEPopup.editor.convertURL(v, 'src', null);
+
+	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 = ed.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 = tinyMCEPopup.editor.plugins.media._parse(pl);
+
+	if (!pl.src) {
+		p.innerHTML = '';
+		return;
+	}
+
+	pl.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(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;
+
+	// Avoid annoying warning about insecure items
+	if (!tinymce.isIE || document.location.protocol != 'https:') {
+		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>';
+
+	// Avoid annoying warning about insecure items
+	if (!tinymce.isIE || document.location.protocol != 'https:')
+		h += '</object>';
+
+	p.innerHTML = "<!-- x --->" + h;
+}
+
+tinyMCEPopup.onInit.add(init);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/media/jscripts/embed.js
@@ -1,1 +1,74 @@
+/**
+ * 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);
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/media/jscripts/media.js
@@ -1,1 +1,573 @@
-
+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.width.height)
+			tinyMCE.selectedInstance.repaint();
+
+		fe.title = serializeParameters();
+		fe.width = f.width.value;
+		fe.height = f.height.value;
+		fe.style.width = f.width.value + (f.width.value.indexOf('%') == -1 ? 'px' : '');
+		fe.style.height = f.height.value + (f.height.value.indexOf('%') == -1 ? 'px' : '');
+		fe.align = f.align.options[f.align.selectedIndex].value;
+	} else {
+		h = '<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 = tinyMCE.getParam("media_types", "flash=swf;shockwave=dcr;qt=mov,qt,mpg,mp3,mp4,mpeg;shockwave=dcr;wmp=avi,wmv,wm,asf,asx,wmx,wvx;rmp=rm,ra,ram").split(';'), i, c, el, x;
+
+	for (i=0; i<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', false);
+			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;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/media/langs/en.js
@@ -1,1 +1,94 @@
+// UK lang variables
 
+tinyMCE.addToLang('media',{
+title : 'Insert / edit embedded media',
+desc : 'Insert / edit embedded media',
+general : 'General',
+advanced : 'Advanced',
+file : 'File',
+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'
+});

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/media/langs/en_dlg.js
@@ -1,1 +1,103 @@
-
+tinyMCE.addI18n('en.media_dlg',{
+title:"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",
+flv_options:"Flash video options",
+flv_scalemode:"Scale mode",
+flv_buffer:"Buffer",
+flv_startimage:"Start image",
+flv_starttime:"Start time",
+flv_defaultvolume:"Default volumne",
+flv_hiddengui:"Hidden GUI",
+flv_autostart:"Auto start",
+flv_loop:"Loop",
+flv_showscalemodes:"Show scale modes",
+flv_smoothvideo:"Smooth video",
+flv_jscallback:"JS Callback"
+});

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/media/media.htm
@@ -1,1 +1,825 @@
-
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#media_dlg.title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="js/media.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/validate.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="../../utils/editable_selects.js"></script>
+	<link href="css/media.css" rel="stylesheet" type="text/css" />
+	<base target="_self" />
+</head>
+<body style="display: none">
+    <form onsubmit="insertMedia();return false;" action="#">
+		<div class="tabs">
+			<ul>
+				<li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');generatePreview();" onmousedown="return false;">{#media_dlg.general}</a></span></li>
+				<li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#media_dlg.advanced}</a></span></li>
+			</ul>
+		</div>
+
+		<div class="panel_wrapper">
+			<div id="general_panel" class="panel current">
+				<fieldset>
+					<legend>{#media_dlg.general}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+							<tr>
+								<td><label for="media_type">{#media_dlg.type}</label></td>
+								<td>
+									<select id="media_type" name="media_type" onchange="changedType(this.value);generatePreview();">
+										<option value="flash">Flash</option>
+										<!-- <option value="flv">Flash video (FLV)</option> -->
+										<option value="qt">Quicktime</option>
+										<option value="shockwave">Shockwave</option>
+										<option value="wmp">Windows Media</option>
+										<option value="rmp">Real Media</option>
+									</select>
+								</td>
+							</tr>
+							<tr>
+							<td><label for="src">{#media_dlg.file}</label></td>
+							  <td>
+									<table border="0" cellspacing="0" cellpadding="0">
+									  <tr>
+										<td><input id="src" name="src" type="text" value="" class="mceFocus" onchange="switchType(this.value);generatePreview();" /></td>
+										<td id="filebrowsercontainer">&nbsp;</td>
+									  </tr>
+									</table>
+								</td>
+							</tr>
+							<tr id="linklistrow">
+								<td><label for="linklist">{#media_dlg.list}</label></td>
+								<td id="linklistcontainer">&nbsp;</td>
+							</tr>
+							<tr>
+								<td><label for="width">{#media_dlg.size}</label></td>
+								<td>
+									<table border="0" cellpadding="0" cellspacing="0">
+										<tr>
+											<td><input type="text" id="width" name="width" value="" class="size" onchange="generatePreview('width');" /> x <input type="text" id="height" name="height" value="" class="size"  onchange="generatePreview('height');" /></td>
+											<td>&nbsp;&nbsp;<input id="constrain" type="checkbox" name="constrain" class="checkbox" /></td>
+											<td><label id="constrainlabel" for="constrain">{#media_dlg.constrain_proportions}</label></td>
+										</tr>
+									</table>
+								</td>
+							</tr>
+					</table>
+				</fieldset>
+
+				<fieldset>
+					<legend>{#media_dlg.preview}</legend>
+					<div id="prev"></div>
+				</fieldset>
+			</div>
+
+			<div id="advanced_panel" class="panel">
+				<fieldset>
+					<legend>{#media_dlg.advanced}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0" width="100%">
+						<tr>
+							<td><label for="id">{#media_dlg.id}</label></td>
+							<td><input type="text" id="id" name="id" onchange="generatePreview();" /></td>
+							<td><label for="name">{#media_dlg.name}</label></td>
+							<td><input type="text" id="name" name="name" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="align">{#media_dlg.align}</label></td>
+							<td>
+								<select id="align" name="align" onchange="generatePreview();">
+									<option value="">{#not_set}</option> 
+									<option value="top">{#media_dlg.align_top}</option>
+									<option value="right">{#media_dlg.align_right}</option>
+									<option value="bottom">{#media_dlg.align_bottom}</option>
+									<option value="left">{#media_dlg.align_left}</option>
+								</select>
+							</td>
+
+							<td><label for="bgcolor">{#media_dlg.bgcolor}</label></td>
+							<td>
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');generatePreview();" /></td>
+										<td id="bgcolor_pickcontainer">&nbsp;</td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td><label for="vspace">{#media_dlg.vspace}</label></td>
+							<td><input type="text" id="vspace" name="vspace" class="number" onchange="generatePreview();" /></td>
+							<td><label for="hspace">{#media_dlg.hspace}</label></td>
+							<td><input type="text" id="hspace" name="hspace" class="number" onchange="generatePreview();" /></td>
+						</tr>
+					</table>
+				</fieldset>
+
+				<fieldset id="flash_options">
+					<legend>{#media_dlg.flash_options}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td><label for="flash_quality">{#media_dlg.quality}</label></td>
+							<td>
+								<select id="flash_quality" name="flash_quality" onchange="generatePreview();">
+									<option value="">{#not_set}</option> 
+									<option value="high">high</option>
+									<option value="low">low</option>
+									<option value="autolow">autolow</option>
+									<option value="autohigh">autohigh</option>
+									<option value="best">best</option>
+								</select>
+							</td>
+
+							<td><label for="flash_scale">{#media_dlg.scale}</label></td>
+							<td>
+								<select id="flash_scale" name="flash_scale" onchange="generatePreview();">
+									<option value="">{#not_set}</option> 
+									<option value="showall">showall</option>
+									<option value="noborder">noborder</option>
+									<option value="exactfit">exactfit</option>
+									<option value="noscale">noscale</option>
+								</select>
+							</td>
+						</tr>
+
+						<tr>
+							<td><label for="flash_wmode">{#media_dlg.wmode}</label></td>
+							<td>
+								<select id="flash_wmode" name="flash_wmode" onchange="generatePreview();">
+									<option value="">{#not_set}</option> 
+									<option value="window">window</option>
+									<option value="opaque">opaque</option>
+									<option value="transparent">transparent</option>
+								</select>
+							</td>
+
+							<td><label for="flash_salign">{#media_dlg.salign}</label></td>
+							<td>
+								<select id="flash_salign" name="flash_salign" onchange="generatePreview();">
+									<option value="">{#not_set}</option> 
+									<option value="l">{#media_dlg.align_left}</option>
+									<option value="t">{#media_dlg.align_top}</option>
+									<option value="r">{#media_dlg.align_right}</option>
+									<option value="b">{#media_dlg.align_bottom}</option>
+									<option value="tl">{#media_dlg.align_top_left}</option>
+									<option value="tr">{#media_dlg.align_top_right}</option>
+									<option value="bl">{#media_dlg.align_bottom_left}</option>
+									<option value="br">{#media_dlg.align_bottom_right}</option>
+								</select>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flash_play" name="flash_play" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="flash_play">{#media_dlg.play}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flash_loop" name="flash_loop" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="flash_loop">{#media_dlg.loop}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flash_menu" name="flash_menu" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="flash_menu">{#media_dlg.menu}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flash_swliveconnect" name="flash_swliveconnect" onchange="generatePreview();" /></td>
+										<td><label for="flash_swliveconnect">{#media_dlg.liveconnect}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+					</table>
+
+					<table>
+						<tr>
+							<td><label for="flash_base">{#media_dlg.base}</label></td>
+							<td><input type="text" id="flash_base" name="flash_base" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="flash_flashvars">{#media_dlg.flashvars}</label></td>
+							<td><input type="text" id="flash_flashvars" name="flash_flashvars" onchange="generatePreview();" /></td>
+						</tr>
+					</table>
+				</fieldset>
+
+				<fieldset id="flv_options">
+					<legend>{#media_dlg.flv_options}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td><label for="flv_scalemode">{#media_dlg.flv_scalemode}</label></td>
+							<td>
+								<select id="flv_scalemode" name="flv_scalemode" onchange="generatePreview();">
+									<option value="">{#not_set}</option> 
+									<option value="none">none</option>
+									<option value="double">double</option>
+									<option value="full">full</option>
+								</select>
+							</td>
+
+							<td><label for="flv_buffer">{#media_dlg.flv_buffer}</label></td>
+							<td><input type="text" id="flv_buffer" name="flv_buffer" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="flv_startimage">{#media_dlg.flv_startimage}</label></td>
+							<td><input type="text" id="flv_startimage" name="flv_startimage" onchange="generatePreview();" /></td>
+
+							<td><label for="flv_starttime">{#media_dlg.flv_starttime}</label></td>
+							<td><input type="text" id="flv_starttime" name="flv_starttime" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="flv_defaultvolume">{#media_dlg.flv_defaultvolume}</label></td>
+							<td><input type="text" id="flv_defaultvolume" name="flv_defaultvolume" onchange="generatePreview();" /></td>
+
+							<td><label for="flv_starttime">{#media_dlg.flv_starttime}</label></td>
+							<td><input type="text" id="flv_starttime" name="flv_starttime" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flv_hiddengui" name="flv_hiddengui" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="flv_hiddengui">{#media_dlg.flv_hiddengui}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flv_autostart" name="flv_autostart" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="flv_autostart">{#media_dlg.flv_autostart}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flv_loop" name="flv_loop" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="flv_loop">{#media_dlg.flv_loop}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flv_showscalemodes" name="flv_showscalemodes" onchange="generatePreview();" /></td>
+										<td><label for="flv_showscalemodes">{#media_dlg.flv_showscalemodes}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flv_smoothvideo" name="flash_flv_flv_smoothvideosmoothvideo" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="flv_smoothvideo">{#media_dlg.flv_smoothvideo}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="flv_jscallback" name="flv_jscallback" onchange="generatePreview();" /></td>
+										<td><label for="flv_jscallback">{#media_dlg.flv_jscallback}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+					</table>
+				</fieldset>
+
+				<fieldset id="qt_options">
+					<legend>{#media_dlg.qt_options}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_loop" name="qt_loop" onchange="generatePreview();" /></td>
+										<td><label for="qt_loop">{#media_dlg.loop}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_autoplay" name="qt_autoplay" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="qt_autoplay">{#media_dlg.play}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_cache" name="qt_cache" onchange="generatePreview();" /></td>
+										<td><label for="qt_cache">{#media_dlg.cache}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_controller" name="qt_controller" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="qt_controller">{#media_dlg.controller}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_correction" name="qt_correction" onchange="generatePreview();" /></td>
+										<td><label for="qt_correction">{#media_dlg.correction}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_enablejavascript" name="qt_enablejavascript" onchange="generatePreview();" /></td>
+										<td><label for="qt_enablejavascript">{#media_dlg.enablejavascript}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_kioskmode" name="qt_kioskmode" onchange="generatePreview();" /></td>
+										<td><label for="qt_kioskmode">{#media_dlg.kioskmode}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_autohref" name="qt_autohref" onchange="generatePreview();" /></td>
+										<td><label for="qt_autohref">{#media_dlg.autohref}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_playeveryframe" name="qt_playeveryframe" onchange="generatePreview();" /></td>
+										<td><label for="qt_playeveryframe">{#media_dlg.playeveryframe}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="qt_targetcache" name="qt_targetcache" onchange="generatePreview();" /></td>
+										<td><label for="qt_targetcache">{#media_dlg.targetcache}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td><label for="qt_scale">{#media_dlg.scale}</label></td>
+							<td><select id="qt_scale" name="qt_scale" class="mceEditableSelect" onchange="generatePreview();">
+									<option value="">{#not_set}</option> 
+									<option value="tofit">tofit</option>
+									<option value="aspect">aspect</option>
+								</select>
+							</td>
+
+							<td colspan="2">&nbsp;</td>
+						</tr>
+
+						<tr>
+							<td><label for="qt_starttime">{#media_dlg.starttime}</label></td>
+							<td><input type="text" id="qt_starttime" name="qt_starttime" onchange="generatePreview();" /></td>
+
+							<td><label for="qt_endtime">{#media_dlg.endtime}</label></td>
+							<td><input type="text" id="qt_endtime" name="qt_endtime" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="qt_target">{#media_dlg.target}</label></td>
+							<td><input type="text" id="qt_target" name="qt_target" onchange="generatePreview();" /></td>
+
+							<td><label for="qt_href">{#media_dlg.href}</label></td>
+							<td><input type="text" id="qt_href" name="qt_href" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="qt_qtsrcchokespeed">{#media_dlg.qtsrcchokespeed}</label></td>
+							<td><input type="text" id="qt_qtsrcchokespeed" name="qt_qtsrcchokespeed" onchange="generatePreview();" /></td>
+
+							<td><label for="qt_volume">{#media_dlg.volume}</label></td>
+							<td><input type="text" id="qt_volume" name="qt_volume" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="qt_qtsrc">{#media_dlg.qtsrc}</label></td>
+							<td colspan="4">
+							<table border="0" cellspacing="0" cellpadding="0">
+								  <tr>
+									<td><input type="text" id="qt_qtsrc" name="qt_qtsrc" onchange="generatePreview();" /></td>
+									<td id="qtsrcfilebrowsercontainer">&nbsp;</td>
+								  </tr>
+							</table>
+							</td>
+						</tr>
+					</table>
+				</fieldset>
+
+				<fieldset id="wmp_options">
+					<legend>{#media_dlg.wmp_options}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="wmp_autostart" name="wmp_autostart" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="wmp_autostart">{#media_dlg.autostart}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="wmp_enabled" name="wmp_enabled" onchange="generatePreview();" /></td>
+										<td><label for="wmp_enabled">{#media_dlg.enabled}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="wmp_enablecontextmenu" name="wmp_enablecontextmenu" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="wmp_enablecontextmenu">{#media_dlg.menu}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="wmp_fullscreen" name="wmp_fullscreen" onchange="generatePreview();" /></td>
+										<td><label for="wmp_fullscreen">{#media_dlg.fullscreen}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="wmp_invokeurls" name="wmp_invokeurls" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="wmp_invokeurls">{#media_dlg.invokeurls}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="wmp_mute" name="wmp_mute" onchange="generatePreview();" /></td>
+										<td><label for="wmp_mute">{#media_dlg.mute}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="wmp_stretchtofit" name="wmp_stretchtofit" onchange="generatePreview();" /></td>
+										<td><label for="wmp_stretchtofit">{#media_dlg.stretchtofit}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="wmp_windowlessvideo" name="wmp_windowlessvideo" onchange="generatePreview();" /></td>
+										<td><label for="wmp_windowlessvideo">{#media_dlg.windowlessvideo}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td><label for="wmp_balance">{#media_dlg.balance}</label></td>
+							<td><input type="text" id="wmp_balance" name="wmp_balance" onchange="generatePreview();" /></td>
+
+							<td><label for="wmp_baseurl">{#media_dlg.baseurl}</label></td>
+							<td><input type="text" id="wmp_baseurl" name="wmp_baseurl" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="wmp_captioningid">{#media_dlg.captioningid}</label></td>
+							<td><input type="text" id="wmp_captioningid" name="wmp_captioningid" onchange="generatePreview();" /></td>
+
+							<td><label for="wmp_currentmarker">{#media_dlg.currentmarker}</label></td>
+							<td><input type="text" id="wmp_currentmarker" name="wmp_currentmarker" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="wmp_currentposition">{#media_dlg.currentposition}</label></td>
+							<td><input type="text" id="wmp_currentposition" name="wmp_currentposition" onchange="generatePreview();" /></td>
+
+							<td><label for="wmp_defaultframe">{#media_dlg.defaultframe}</label></td>
+							<td><input type="text" id="wmp_defaultframe" name="wmp_defaultframe" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="wmp_playcount">{#media_dlg.playcount}</label></td>
+							<td><input type="text" id="wmp_playcount" name="wmp_playcount" onchange="generatePreview();" /></td>
+
+							<td><label for="wmp_rate">{#media_dlg.rate}</label></td>
+							<td><input type="text" id="wmp_rate" name="wmp_rate" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="wmp_uimode">{#media_dlg.uimode}</label></td>
+							<td><input type="text" id="wmp_uimode" name="wmp_uimode" onchange="generatePreview();" /></td>
+
+							<td><label for="wmp_volume">{#media_dlg.volume}</label></td>
+							<td><input type="text" id="wmp_volume" name="wmp_volume" onchange="generatePreview();" /></td>
+						</tr>
+
+					</table>
+				</fieldset>
+
+				<fieldset id="rmp_options">
+					<legend>{#media_dlg.rmp_options}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="rmp_autostart" name="rmp_autostart" onchange="generatePreview();" /></td>
+										<td><label for="rmp_autostart">{#media_dlg.autostart}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="rmp_loop" name="rmp_loop" onchange="generatePreview();" /></td>
+										<td><label for="rmp_loop">{#media_dlg.loop}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="rmp_autogotourl" name="rmp_autogotourl" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="rmp_autogotourl">{#media_dlg.autogotourl}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="rmp_center" name="rmp_center" onchange="generatePreview();" /></td>
+										<td><label for="rmp_center">{#media_dlg.center}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="rmp_imagestatus" name="rmp_imagestatus" checked="checked" onchange="generatePreview();" /></td>
+										<td><label for="rmp_imagestatus">{#media_dlg.imagestatus}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="rmp_maintainaspect" name="rmp_maintainaspect" onchange="generatePreview();" /></td>
+										<td><label for="rmp_maintainaspect">{#media_dlg.maintainaspect}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="rmp_nojava" name="rmp_nojava" onchange="generatePreview();" /></td>
+										<td><label for="rmp_nojava">{#media_dlg.nojava}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="rmp_prefetch" name="rmp_prefetch" onchange="generatePreview();" /></td>
+										<td><label for="rmp_prefetch">{#media_dlg.prefetch}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="rmp_shuffle" name="rmp_shuffle" onchange="generatePreview();" /></td>
+										<td><label for="rmp_shuffle">{#media_dlg.shuffle}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								&nbsp;
+							</td>
+						</tr>
+
+						<tr>
+							<td><label for="rmp_console">{#media_dlg.console}</label></td>
+							<td><input type="text" id="rmp_console" name="rmp_console" onchange="generatePreview();" /></td>
+
+							<td><label for="rmp_controls">{#media_dlg.controls}</label></td>
+							<td><input type="text" id="rmp_controls" name="rmp_controls" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="rmp_numloop">{#media_dlg.numloop}</label></td>
+							<td><input type="text" id="rmp_numloop" name="rmp_numloop" onchange="generatePreview();" /></td>
+
+							<td><label for="rmp_scriptcallbacks">{#media_dlg.scriptcallbacks}</label></td>
+							<td><input type="text" id="rmp_scriptcallbacks" name="rmp_scriptcallbacks" onchange="generatePreview();" /></td>
+						</tr>
+					</table>
+				</fieldset>
+
+				<fieldset id="shockwave_options">
+					<legend>{#media_dlg.shockwave_options}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td><label for="shockwave_swstretchstyle">{#media_dlg.swstretchstyle}</label></td>
+							<td>
+								<select id="shockwave_swstretchstyle" name="shockwave_swstretchstyle" onchange="generatePreview();">
+									<option value="none">{#not_set}</option>
+									<option value="meet">Meet</option>
+									<option value="fill">Fill</option>
+									<option value="stage">Stage</option>
+								</select>
+							</td>
+
+							<td><label for="shockwave_swvolume">{#media_dlg.volume}</label></td>
+							<td><input type="text" id="shockwave_swvolume" name="shockwave_swvolume" onchange="generatePreview();" /></td>
+						</tr>
+
+						<tr>
+							<td><label for="shockwave_swstretchhalign">{#media_dlg.swstretchhalign}</label></td>
+							<td>
+								<select id="shockwave_swstretchhalign" name="shockwave_swstretchhalign" onchange="generatePreview();">
+									<option value="none">{#not_set}</option>
+									<option value="left">{#media_dlg.align_left}</option>
+									<option value="center">{#media_dlg.align_center}</option>
+									<option value="right">{#media_dlg.align_right}</option>
+								</select>
+							</td>
+
+							<td><label for="shockwave_swstretchvalign">{#media_dlg.swstretchvalign}</label></td>
+							<td>
+								<select id="shockwave_swstretchvalign" name="shockwave_swstretchvalign" onchange="generatePreview();">
+									<option value="none">{#not_set}</option>
+									<option value="meet">Meet</option>
+									<option value="fill">Fill</option>
+									<option value="stage">Stage</option>
+								</select>
+							</td>
+						</tr>
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="shockwave_autostart" name="shockwave_autostart" onchange="generatePreview();" checked="checked" /></td>
+										<td><label for="shockwave_autostart">{#media_dlg.autostart}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="shockwave_sound" name="shockwave_sound" onchange="generatePreview();" checked="checked" /></td>
+										<td><label for="shockwave_sound">{#media_dlg.sound}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+
+
+						<tr>
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="shockwave_swliveconnect" name="shockwave_swliveconnect" onchange="generatePreview();" /></td>
+										<td><label for="shockwave_swliveconnect">{#media_dlg.liveconnect}</label></td>
+									</tr>
+								</table>
+							</td>
+
+							<td colspan="2">
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input type="checkbox" class="checkbox" id="shockwave_progress" name="shockwave_progress" onchange="generatePreview();" checked="checked" /></td>
+										<td><label for="shockwave_progress">{#media_dlg.progress}</label></td>
+									</tr>
+								</table>
+							</td>
+						</tr>
+					</table>
+				</fieldset>
+			</div>
+		</div>
+
+		<div class="mceActionPanel">
+			<div style="float: left">
+				<input type="submit" id="insert" name="insert" value="{#insert}" />
+			</div>
+
+			<div style="float: right">
+				<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+			</div>
+		</div>
+	</form>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.Nonbreaking',{init:function(ed,url){var t=this;t.editor=ed;ed.addCommand('mceNonBreaking',function(){ed.execCommand('mceInsertContent',false,(ed.plugins.visualchars&&ed.plugins.visualchars.state)?'<span class="mceItemHidden mceVisualNbsp">&middot;</span>':'&nbsp;');});ed.addButton('nonbreaking',{title:'nonbreaking.nonbreaking_desc',cmd:'mceNonBreaking'});if(ed.getParam('nonbreaking_force_tab')){ed.onKeyDown.add(function(ed,e){if(tinymce.isIE&&e.keyCode==9){ed.execCommand('mceNonBreaking');ed.execCommand('mceNonBreaking');ed.execCommand('mceNonBreaking');tinymce.dom.Event.cancel(e);}});}},getInfo:function(){return{longname:'Nonbreaking space',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/nonbreaking',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.PluginManager.add('nonbreaking',tinymce.plugins.Nonbreaking);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js
@@ -1,1 +1,50 @@
+/**
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.Nonbreaking', {
+		init : function(ed, url) {
+			var t = this;
+
+			t.editor = ed;
+
+			// Register commands
+			ed.addCommand('mceNonBreaking', function() {
+				ed.execCommand('mceInsertContent', false, (ed.plugins.visualchars && ed.plugins.visualchars.state) ? '<span class="mceItemHidden mceVisualNbsp">&middot;</span>' : '&nbsp;');
+			});
+
+			// Register buttons
+			ed.addButton('nonbreaking', {title : 'nonbreaking.nonbreaking_desc', cmd : 'mceNonBreaking'});
+
+			if (ed.getParam('nonbreaking_force_tab')) {
+				ed.onKeyDown.add(function(ed, e) {
+					if (tinymce.isIE && e.keyCode == 9) {
+						ed.execCommand('mceNonBreaking');
+						ed.execCommand('mceNonBreaking');
+						ed.execCommand('mceNonBreaking');
+						tinymce.dom.Event.cancel(e);
+					}
+				});
+			}
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Nonbreaking space',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/nonbreaking',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		}
+
+		// Private methods
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('nonbreaking', tinymce.plugins.Nonbreaking);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/nonbreaking/images/nonbreaking.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/nonbreaking/langs/en.js
@@ -1,1 +1,6 @@
+// UK lang variables
 
+tinyMCE.addToLang('nonbreaking',{
+desc : 'Insert non-breaking space character'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/noneditable/css/noneditable.css
@@ -1,1 +1,10 @@
+/* This is the CSS file for the noneditable elements plugin */
 
+.mceEditable {
+	/*border: 1px dotted #0000cc;*/
+}
+
+.mceNonEditable {
+	/*border: 1px dotted #cc0000;*/
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){var Event=tinymce.dom.Event;tinymce.create('tinymce.plugins.NonEditablePlugin',{init:function(ed,url){var t=this,editClass,nonEditClass;t.editor=ed;editClass=ed.getParam("noneditable_editable_class","mceEditable");nonEditClass=ed.getParam("noneditable_noneditable_class","mceNonEditable");ed.onNodeChange.addToTop(function(ed,cm,n){var sc,ec;sc=ed.dom.getParent(ed.selection.getStart(),function(n){return ed.dom.hasClass(n,nonEditClass);});ec=ed.dom.getParent(ed.selection.getEnd(),function(n){return ed.dom.hasClass(n,nonEditClass);});if(sc||ec){t._setDisabled(1);return false;}else t._setDisabled(0);});},getInfo:function(){return{longname:'Non editable elements',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_block:function(ed,e){var k=e.keyCode;if((k>32&&k<41)||(k>111&&k<124))return;return Event.cancel(e);},_setDisabled:function(s){var t=this,ed=t.editor;tinymce.each(ed.controlManager.controls,function(c){c.setDisabled(s);});if(s!==t.disabled){if(s){ed.onKeyDown.addToTop(t._block);ed.onKeyPress.addToTop(t._block);ed.onKeyUp.addToTop(t._block);ed.onPaste.addToTop(t._block);}else{ed.onKeyDown.remove(t._block);ed.onKeyPress.remove(t._block);ed.onKeyUp.remove(t._block);ed.onPaste.remove(t._block);}t.disabled=s;}}});tinymce.PluginManager.add('noneditable',tinymce.plugins.NonEditablePlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js
@@ -1,1 +1,87 @@
+/**
+ * $Id: editor_plugin_src.js 743 2008-03-23 17:47:33Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	var Event = tinymce.dom.Event;
+
+	tinymce.create('tinymce.plugins.NonEditablePlugin', {
+		init : function(ed, url) {
+			var t = this, editClass, nonEditClass;
+
+			t.editor = ed;
+			editClass = ed.getParam("noneditable_editable_class", "mceEditable");
+			nonEditClass = ed.getParam("noneditable_noneditable_class", "mceNonEditable");
+
+			ed.onNodeChange.addToTop(function(ed, cm, n) {
+				var sc, ec;
+
+				// Block if start or end is inside a non editable element
+				sc = ed.dom.getParent(ed.selection.getStart(), function(n) {
+					return ed.dom.hasClass(n, nonEditClass);
+				});
+
+				ec = ed.dom.getParent(ed.selection.getEnd(), function(n) {
+					return ed.dom.hasClass(n, nonEditClass);
+				});
+
+				// Block or unblock
+				if (sc || ec) {
+					t._setDisabled(1);
+					return false;
+				} else
+					t._setDisabled(0);
+			});
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Non editable elements',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		},
+
+		_block : function(ed, e) {
+			var k = e.keyCode;
+
+			// Don't block arrow keys, pg up/down, and F1-F12
+			if ((k > 32 && k < 41) || (k > 111 && k < 124))
+				return;
+
+			return Event.cancel(e);
+		},
+
+		_setDisabled : function(s) {
+			var t = this, ed = t.editor;
+
+			tinymce.each(ed.controlManager.controls, function(c) {
+				c.setDisabled(s);
+			});
+
+			if (s !== t.disabled) {
+				if (s) {
+					ed.onKeyDown.addToTop(t._block);
+					ed.onKeyPress.addToTop(t._block);
+					ed.onKeyUp.addToTop(t._block);
+					ed.onPaste.addToTop(t._block);
+				} else {
+					ed.onKeyDown.remove(t._block);
+					ed.onKeyPress.remove(t._block);
+					ed.onKeyUp.remove(t._block);
+					ed.onPaste.remove(t._block);
+				}
+
+				t.disabled = s;
+			}
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('noneditable', tinymce.plugins.NonEditablePlugin);
+})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/noneditable/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/pagebreak/css/content.css
@@ -1,1 +1,2 @@
+.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../img/pagebreak.gif) no-repeat center top;}
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.PageBreakPlugin',{init:function(ed,url){var pb='<img src="'+url+'/img/trans.gif" class="mcePageBreak mceItemNoResize" />',cls='mcePageBreak',sep=ed.getParam('pagebreak_separator','<!-- pagebreak -->'),pbRE;pbRE=new RegExp(sep.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,function(a){return'\\'+a;}),'g');ed.addCommand('mcePageBreak',function(){ed.execCommand('mceInsertContent',0,pb);});ed.addButton('pagebreak',{title:'pagebreak.desc',cmd:cls});ed.onInit.add(function(){if(ed.settings.content_css!==false)ed.dom.loadCSS(url+"/css/content.css");if(ed.theme.onResolveName){ed.theme.onResolveName.add(function(th,o){if(o.node.nodeName=='IMG'&&ed.dom.hasClass(o.node,cls))o.name='pagebreak';});}});ed.onClick.add(function(ed,e){e=e.target;if(e.nodeName==='IMG'&&ed.dom.hasClass(e,cls))ed.selection.select(e);});ed.onNodeChange.add(function(ed,cm,n){cm.setActive('pagebreak',n.nodeName==='IMG'&&ed.dom.hasClass(n,cls));});ed.onBeforeSetContent.add(function(ed,o){o.content=o.content.replace(pbRE,pb);});ed.onPostProcess.add(function(ed,o){if(o.get)o.content=o.content.replace(/<img[^>]+>/g,function(im){if(im.indexOf('class="mcePageBreak')!==-1)im=sep;return im;});});},getInfo:function(){return{longname:'PageBreak',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/pagebreak',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.PluginManager.add('pagebreak',tinymce.plugins.PageBreakPlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js
@@ -1,1 +1,74 @@
+/**
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.PageBreakPlugin', {
+		init : function(ed, url) {
+			var pb = '<img src="' + url + '/img/trans.gif" class="mcePageBreak mceItemNoResize" />', cls = 'mcePageBreak', sep = ed.getParam('pagebreak_separator', '<!-- pagebreak -->'), pbRE;
+
+			pbRE = new RegExp(sep.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g, function(a) {return '\\' + a;}), 'g');
+
+			// Register commands
+			ed.addCommand('mcePageBreak', function() {
+				ed.execCommand('mceInsertContent', 0, pb);
+			});
+
+			// Register buttons
+			ed.addButton('pagebreak', {title : 'pagebreak.desc', cmd : cls});
+
+			ed.onInit.add(function() {
+				if (ed.settings.content_css !== false)
+					ed.dom.loadCSS(url + "/css/content.css");
+
+				if (ed.theme.onResolveName) {
+					ed.theme.onResolveName.add(function(th, o) {
+						if (o.node.nodeName == 'IMG' && ed.dom.hasClass(o.node, cls))
+							o.name = 'pagebreak';
+					});
+				}
+			});
+
+			ed.onClick.add(function(ed, e) {
+				e = e.target;
+
+				if (e.nodeName === 'IMG' && ed.dom.hasClass(e, cls))
+					ed.selection.select(e);
+			});
+
+			ed.onNodeChange.add(function(ed, cm, n) {
+				cm.setActive('pagebreak', n.nodeName === 'IMG' && ed.dom.hasClass(n, cls));
+			});
+
+			ed.onBeforeSetContent.add(function(ed, o) {
+				o.content = o.content.replace(pbRE, pb);
+			});
+
+			ed.onPostProcess.add(function(ed, o) {
+				if (o.get)
+					o.content = o.content.replace(/<img[^>]+>/g, function(im) {
+						if (im.indexOf('class="mcePageBreak') !== -1)
+							im = sep;
+
+						return im;
+					});
+			});
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'PageBreak',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/pagebreak',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('pagebreak', tinymce.plugins.PageBreakPlugin);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/pagebreak/img/pagebreak.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/pagebreak/img/trans.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/paste/blank.htm
@@ -1,1 +1,23 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>blank_page</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<link href="css/blank.css" rel="stylesheet" type="text/css" />
+<base target="_self" />
+<script type="text/javascript">
+function init() {
+	if (parent.tinymce.isIE)
+		document.body.contentEditable = true;
+	else
+		document.designMode = 'on';
 
+	parent.initIframe(document);
+	window.focus();
+}
+</script>
+</head>
+<body onload="init();">
+
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/paste/css/blank.css
@@ -1,1 +1,15 @@
+html, body {height:98%}
+body {
+background-color: #FFFFFF;
+font-family: Verdana, Arial, Helvetica, sans-serif;
+font-size: 10px;
+scrollbar-3dlight-color: #F0F0EE;
+scrollbar-arrow-color: #676662;
+scrollbar-base-color: #F0F0EE;
+scrollbar-darkshadow-color: #DDDDDD;
+scrollbar-face-color: #E0E0DD;
+scrollbar-highlight-color: #F0F0EE;
+scrollbar-shadow-color: #F0F0EE;
+scrollbar-track-color: #F5F5F5;
+}
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/paste/css/pasteword.css
@@ -1,1 +1,4 @@
+.sourceIframe {
+	border: 1px solid #808080;
+}
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){var Event=tinymce.dom.Event;tinymce.create('tinymce.plugins.PastePlugin',{init:function(ed,url){var t=this;t.editor=ed;ed.addCommand('mcePasteText',function(ui,v){if(ui){if((ed.getParam('paste_use_dialog',true))||(!tinymce.isIE)){ed.windowManager.open({file:url+'/pastetext.htm',width:450,height:400,inline:1},{plugin_url:url});}else t._insertText(clipboardData.getData("Text"),true);}else t._insertText(v.html,v.linebreaks);});ed.addCommand('mcePasteWord',function(ui,v){if(ui){if((ed.getParam('paste_use_dialog',true))||(!tinymce.isIE)){ed.windowManager.open({file:url+'/pasteword.htm',width:450,height:400,inline:1},{plugin_url:url});}else t._insertText(t._clipboardHTML());}else t._insertWordContent(v);});ed.addCommand('mceSelectAll',function(){ed.execCommand('selectall');});ed.addButton('pastetext',{title:'paste.paste_text_desc',cmd:'mcePasteText',ui:true});ed.addButton('pasteword',{title:'paste.paste_word_desc',cmd:'mcePasteWord',ui:true});ed.addButton('selectall',{title:'paste.selectall_desc',cmd:'mceSelectAll'});if(ed.getParam("paste_auto_cleanup_on_paste",false)){ed.onPaste.add(function(ed,e){return t._handlePasteEvent(e)});}if(!tinymce.isIE&&ed.getParam("paste_auto_cleanup_on_paste",false)){ed.onKeyDown.add(function(ed,e){if(e.ctrlKey&&e.keyCode==86){window.setTimeout(function(){ed.execCommand("mcePasteText",true);},1);Event.cancel(e);}});}},getInfo:function(){return{longname:'Paste text/word',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_handlePasteEvent:function(e){var html=this._clipboardHTML(),ed=this.editor,sel=ed.selection,r;if(ed&&(r=sel.getRng())&&r.text.length>0)ed.execCommand('delete');if(html&&html.length>0)ed.execCommand('mcePasteWord',false,html);return Event.cancel(e);},_insertText:function(content,bLinebreaks){if(content&&content.length>0){if(bLinebreaks){if(this.editor.getParam("paste_create_paragraphs",true)){var rl=this.editor.getParam("paste_replace_list",'\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');for(var i=0;i<rl.length;i+=2)content=content.replace(new RegExp(rl[i],'gi'),rl[i+1]);content=content.replace(/\r\n\r\n/g,'</p><p>');content=content.replace(/\r\r/g,'</p><p>');content=content.replace(/\n\n/g,'</p><p>');if((pos=content.indexOf('</p><p>'))!=-1){this.editor.execCommand("Delete");var node=this.editor.selection.getNode();var breakElms=[];do{if(node.nodeType==1){if(node.nodeName=="TD"||node.nodeName=="BODY")break;breakElms[breakElms.length]=node;}}while(node=node.parentNode);var before="",after="</p>";before+=content.substring(0,pos);for(var i=0;i<breakElms.length;i++){before+="</"+breakElms[i].nodeName+">";after+="<"+breakElms[(breakElms.length-1)-i].nodeName+">";}before+="<p>";content=before+content.substring(pos+7)+after;}}if(this.editor.getParam("paste_create_linebreaks",true)){content=content.replace(/\r\n/g,'<br />');content=content.replace(/\r/g,'<br />');content=content.replace(/\n/g,'<br />');}}this.editor.execCommand("mceInsertRawHTML",false,this.editor.dom.encode(content));}},_insertWordContent:function(content){var t=this,ed=t.editor;if(content&&content.length>0){var bull=String.fromCharCode(8226);var middot=String.fromCharCode(183);if(ed.getParam('paste_insert_word_content_callback'))content=ed.execCallback('paste_insert_word_content_callback','before',content);var rl=ed.getParam("paste_replace_list",'\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');for(var i=0;i<rl.length;i+=2)content=content.replace(new RegExp(rl[i],'gi'),rl[i+1]);if(this.editor.getParam("paste_convert_headers_to_strong",false)){content=content.replace(new RegExp('<p class=MsoHeading.*?>(.*?)<\/p>','gi'),'<p><b>$1</b></p>');}content=content.replace(new RegExp('tab-stops: list [0-9]+.0pt">','gi'),'">'+"--list--");content=content.replace(new RegExp(bull+"(.*?)<BR>","gi"),"<p>"+middot+"$1</p>");content=content.replace(new RegExp('<SPAN style="mso-list: Ignore">','gi'),"<span>"+bull);content=content.replace(/<o:p><\/o:p>/gi,"");content=content.replace(new RegExp('<br style="page-break-before: always;.*>','gi'),'-- page break --');content=content.replace(new RegExp('<(!--)([^>]*)(--)>','g'),"");if(this.editor.getParam("paste_remove_spans",true))content=content.replace(/<\/?span[^>]*>/gi,"");if(this.editor.getParam("paste_remove_styles",true))content=content.replace(new RegExp('<(\\w[^>]*) style="([^"]*)"([^>]*)','gi'),"<$1$3");content=content.replace(/<\/?font[^>]*>/gi,"");switch(this.editor.getParam("paste_strip_class_attributes","all")){case"all":content=content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi,"<$1$3");break;case"mso":content=content.replace(new RegExp('<(\\w[^>]*) class="?mso([^ |>]*)([^>]*)','gi'),"<$1$3");break;}content=content.replace(new RegExp('href="?'+this._reEscape(""+document.location)+'','gi'),'href="'+this.editor.documentBaseURI.getURI());content=content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi,"<$1$3");content=content.replace(/<\\?\?xml[^>]*>/gi,"");content=content.replace(/<\/?\w+:[^>]*>/gi,"");content=content.replace(/-- page break --\s*<p>&nbsp;<\/p>/gi,"");content=content.replace(/-- page break --/gi,"");if(!this.editor.getParam('force_p_newlines')){content=content.replace('','','gi');content=content.replace('</p>','<br /><br />','gi');}if(!tinymce.isIE&&!this.editor.getParam('force_p_newlines')){content=content.replace(/<\/?p[^>]*>/gi,"");}content=content.replace(/<\/?div[^>]*>/gi,"");if(this.editor.getParam("paste_convert_middot_lists",true)){var div=ed.dom.create("div",null,content);var className=this.editor.getParam("paste_unindented_list_class","unIndentedList");while(this._convertMiddots(div,"--list--"));while(this._convertMiddots(div,middot,className));while(this._convertMiddots(div,bull));content=div.innerHTML;}if(this.editor.getParam("paste_convert_headers_to_strong",false)){content=content.replace(/<h[1-6]>&nbsp;<\/h[1-6]>/gi,'<p>&nbsp;&nbsp;</p>');content=content.replace(/<h[1-6]>/gi,'<p><b>');content=content.replace(/<\/h[1-6]>/gi,'</b></p>');content=content.replace(/<b>&nbsp;<\/b>/gi,'<b>&nbsp;&nbsp;</b>');content=content.replace(/^(&nbsp;)*/gi,'');}content=content.replace(/--list--/gi,"");if(ed.getParam('paste_insert_word_content_callback'))content=ed.execCallback('paste_insert_word_content_callback','after',content);this.editor.execCommand("mceInsertContent",false,content);if(this.editor.getParam('paste_force_cleanup_wordpaste',true)){var ed=this.editor;window.setTimeout(function(){ed.execCommand("mceCleanup");},1);}}},_reEscape:function(s){var l="?.\\*[](){}+^$:";var o="";for(var i=0;i<s.length;i++){var c=s.charAt(i);if(l.indexOf(c)!=-1)o+='\\'+c;else o+=c;}return o;},_convertMiddots:function(div,search,class_name){var ed=this.editor,mdot=String.fromCharCode(183),bull=String.fromCharCode(8226);var nodes,prevul,i,p,ul,li,np,cp,li;nodes=div.getElementsByTagName("p");for(i=0;i<nodes.length;i++){p=nodes[i];if(p.innerHTML.indexOf(search)==0){ul=ed.dom.create("ul");if(class_name)ul.className=class_name;li=ed.dom.create("li");li.innerHTML=p.innerHTML.replace(new RegExp(''+mdot+'|'+bull+'|--list--|&nbsp;',"gi"),'');ul.appendChild(li);np=p.nextSibling;while(np){if(np.nodeType==3&&new RegExp('^\\s$','m').test(np.nodeValue)){np=np.nextSibling;continue;}if(search==mdot){if(np.nodeType==1&&new RegExp('^o(\\s+|&nbsp;)').test(np.innerHTML)){if(!prevul){prevul=ul;ul=ed.dom.create("ul");prevul.appendChild(ul);}np.innerHTML=np.innerHTML.replace(/^o/,'');}else{if(prevul){ul=prevul;prevul=null;}if(np.nodeType!=1||np.innerHTML.indexOf(search)!=0)break;}}else{if(np.nodeType!=1||np.innerHTML.indexOf(search)!=0)break;}cp=np.nextSibling;li=ed.dom.create("li");li.innerHTML=np.innerHTML.replace(new RegExp(''+mdot+'|'+bull+'|--list--|&nbsp;',"gi"),'');np.parentNode.removeChild(np);ul.appendChild(li);np=cp;}p.parentNode.replaceChild(ul,p);return true;}}return false;},_clipboardHTML:function(){var div=document.getElementById('_TinyMCE_clipboardHTML');if(!div){var div=document.createElement('DIV');div.id='_TinyMCE_clipboardHTML';with(div.style){visibility='hidden';overflow='hidden';position='absolute';width=1;height=1;}document.body.appendChild(div);}div.innerHTML='';var rng=document.body.createTextRange();rng.moveToElementText(div);rng.execCommand('Paste');var html=div.innerHTML;div.innerHTML='';return html;}});tinymce.PluginManager.add('paste',tinymce.plugins.PastePlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js
@@ -1,1 +1,387 @@
-
+/**
+ * $Id: editor_plugin_src.js 839 2008-05-06 15:42:26Z spocke $
+ *
+ * @author Moxiecode

+ */
+
+(function() {
+	var Event = tinymce.dom.Event;
+
+	tinymce.create('tinymce.plugins.PastePlugin', {
+		init : function(ed, url) {
+			var t = this;
+
+			t.editor = ed; 
+
+			// Register commands
+			ed.addCommand('mcePasteText', function(ui, v) {
+				if (ui) {
+					if ((ed.getParam('paste_use_dialog', true)) || (!tinymce.isIE)) {
+						ed.windowManager.open({
+							file : url + '/pastetext.htm',
+							width : 450,
+							height : 400,
+							inline : 1
+						}, {
+							plugin_url : url
+						});
+					} else
+						t._insertText(clipboardData.getData("Text"), true);
+				} else
+					t._insertText(v.html, v.linebreaks);
+			});
+
+			ed.addCommand('mcePasteWord', function(ui, v) {
+				if (ui) {
+					if ((ed.getParam('paste_use_dialog', true)) || (!tinymce.isIE)) {
+						ed.windowManager.open({
+							file : url + '/pasteword.htm',
+							width : 450,
+							height : 400,
+							inline : 1
+						}, {
+							plugin_url : url
+						});
+					} else
+						t._insertText(t._clipboardHTML());
+				} else
+					t._insertWordContent(v);
+			});
+
+			ed.addCommand('mceSelectAll', function() {
+				ed.execCommand('selectall'); 
+			});
+
+			// Register buttons
+			ed.addButton('pastetext', {title : 'paste.paste_text_desc', cmd : 'mcePasteText', ui : true});
+			ed.addButton('pasteword', {title : 'paste.paste_word_desc', cmd : 'mcePasteWord', ui : true});
+			ed.addButton('selectall', {title : 'paste.selectall_desc', cmd : 'mceSelectAll'});
+
+			if (ed.getParam("paste_auto_cleanup_on_paste", false)) {
+				ed.onPaste.add(function(ed, e) {
+					return t._handlePasteEvent(e)
+				});
+			}
+
+			if (!tinymce.isIE && ed.getParam("paste_auto_cleanup_on_paste", false)) {
+				// Force paste dialog if non IE browser
+				ed.onKeyDown.add(function(ed, e) {
+					if (e.ctrlKey && e.keyCode == 86) {
+						window.setTimeout(function() {
+							ed.execCommand("mcePasteText", true);
+						}, 1);
+
+						Event.cancel(e);
+					}
+				});
+			}
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Paste text/word',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		},
+
+		// Private methods
+
+		_handlePasteEvent : function(e) {
+			var html = this._clipboardHTML(), ed = this.editor, sel = ed.selection, r;
+
+			// Removes italic, strong etc, the if was needed due to bug #1437114
+			if (ed && (r = sel.getRng()) && r.text.length > 0)
+				ed.execCommand('delete');
+
+			if (html && html.length > 0)
+				ed.execCommand('mcePasteWord', false, html);
+
+			return Event.cancel(e);
+		},
+
+		_insertText : function(content, bLinebreaks) { 
+			if (content && content.length > 0) {
+				if (bLinebreaks) { 
+					// Special paragraph treatment 
+					if (this.editor.getParam("paste_create_paragraphs", true)) {
+						var rl = this.editor.getParam("paste_replace_list", '\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');
+						for (var i=0; i<rl.length; i+=2)
+							content = content.replace(new RegExp(rl[i], 'gi'), rl[i+1]);
+
+						content = content.replace(/\r\n\r\n/g, '</p><p>');
+						content = content.replace(/\r\r/g, '</p><p>');
+						content = content.replace(/\n\n/g, '</p><p>');
+
+						// Has paragraphs 
+						if ((pos = content.indexOf('</p><p>')) != -1) { 
+							this.editor.execCommand("Delete"); 
+
+							var node = this.editor.selection.getNode(); 
+
+							// Get list of elements to break 
+							var breakElms = [];
+
+							do { 
+								if (node.nodeType == 1) { 
+									// Don't break tables and break at body 
+									if (node.nodeName == "TD" || node.nodeName == "BODY") 
+										break; 
+			
+									breakElms[breakElms.length] = node; 
+								} 
+							} while(node = node.parentNode); 
+
+							var before = "", after = "</p>"; 
+							before += content.substring(0, pos); 
+
+							for (var i=0; i<breakElms.length; i++) { 
+								before += "</" + breakElms[i].nodeName + ">"; 
+								after += "<" + breakElms[(breakElms.length-1)-i].nodeName + ">"; 
+							} 
+
+							before += "<p>"; 
+							content = before + content.substring(pos+7) + after; 
+						} 
+					} 
+
+					if (this.editor.getParam("paste_create_linebreaks", true)) {
+						content = content.replace(/\r\n/g, '<br />');
+						content = content.replace(/\r/g, '<br />');
+						content = content.replace(/\n/g, '<br />');
+					}
+				} 
+			
+				this.editor.execCommand("mceInsertRawHTML", false, this.editor.dom.encode(content)); 
+			}
+		},
+
+		_insertWordContent : function(content) { 
+			var t = this, ed = t.editor;
+
+			if (content && content.length > 0) {
+				// Cleanup Word content
+				var bull = String.fromCharCode(8226);
+				var middot = String.fromCharCode(183);
+
+				if (ed.getParam('paste_insert_word_content_callback'))
+					content = ed.execCallback('paste_insert_word_content_callback', 'before', content);
+
+				var rl = ed.getParam("paste_replace_list", '\u2122,<sup>TM</sup>,\u2026,...,\u201c|\u201d,",\u2019,\',\u2013|\u2014|\u2015|\u2212,-').split(',');
+				for (var i=0; i<rl.length; i+=2)
+					content = content.replace(new RegExp(rl[i], 'gi'), rl[i+1]);
+
+				if (this.editor.getParam("paste_convert_headers_to_strong", false)) {
+					content = content.replace(new RegExp('<p class=MsoHeading.*?>(.*?)<\/p>', 'gi'), '<p><b>$1</b></p>');
+				}
+
+				content = content.replace(new RegExp('tab-stops: list [0-9]+.0pt">', 'gi'), '">' + "--list--");
+				content = content.replace(new RegExp(bull + "(.*?)<BR>", "gi"), "<p>" + middot + "$1</p>");
+				content = content.replace(new RegExp('<SPAN style="mso-list: Ignore">', 'gi'), "<span>" + bull); // Covert to bull list
+				content = content.replace(/<o:p><\/o:p>/gi, "");
+				content = content.replace(new RegExp('<br style="page-break-before: always;.*>', 'gi'), '-- page break --'); // Replace pagebreaks
+				content = content.replace(new RegExp('<(!--)([^>]*)(--)>', 'g'), "");  // Word comments
+
+				if (this.editor.getParam("paste_remove_spans", true))
+					content = content.replace(/<\/?span[^>]*>/gi, "");
+
+				if (this.editor.getParam("paste_remove_styles", true))
+					content = content.replace(new RegExp('<(\\w[^>]*) style="([^"]*)"([^>]*)', 'gi'), "<$1$3");
+
+				content = content.replace(/<\/?font[^>]*>/gi, "");
+
+				// Strips class attributes.
+				switch (this.editor.getParam("paste_strip_class_attributes", "all")) {
+					case "all":
+						content = content.replace(/<(\w[^>]*) class=([^ |>]*)([^>]*)/gi, "<$1$3");
+						break;
+
+					case "mso":
+						content = content.replace(new RegExp('<(\\w[^>]*) class="?mso([^ |>]*)([^>]*)', 'gi'), "<$1$3");
+						break;
+				}
+
+				content = content.replace(new RegExp('href="?' + this._reEscape("" + document.location) + '', 'gi'), 'href="' + this.editor.documentBaseURI.getURI());
+				content = content.replace(/<(\w[^>]*) lang=([^ |>]*)([^>]*)/gi, "<$1$3");
+				content = content.replace(/<\\?\?xml[^>]*>/gi, "");
+				content = content.replace(/<\/?\w+:[^>]*>/gi, "");
+				content = content.replace(/-- page break --\s*<p>&nbsp;<\/p>/gi, ""); // Remove pagebreaks
+				content = content.replace(/-- page break --/gi, ""); // Remove pagebreaks
+
+		//		content = content.replace(/\/?&nbsp;*/gi, ""); &nbsp;
+		//		content = content.replace(/<p>&nbsp;<\/p>/gi, '');
+
+				if (!this.editor.getParam('force_p_newlines')) {
+					content = content.replace('', '' ,'gi');
+					content = content.replace('</p>', '<br /><br />' ,'gi');
+				}
+
+				if (!tinymce.isIE && !this.editor.getParam('force_p_newlines')) {
+					content = content.replace(/<\/?p[^>]*>/gi, "");
+				}
+
+				content = content.replace(/<\/?div[^>]*>/gi, "");
+
+				// Convert all middlot lists to UL lists
+				if (this.editor.getParam("paste_convert_middot_lists", true)) {
+					var div = ed.dom.create("div", null, content);
+
+					// Convert all middot paragraphs to li elements
+					var className = this.editor.getParam("paste_unindented_list_class", "unIndentedList");
+
+					while (this._convertMiddots(div, "--list--")) ; // bull
+					while (this._convertMiddots(div, middot, className)) ; // Middot
+					while (this._convertMiddots(div, bull)) ; // bull
+
+					content = div.innerHTML;
+				}
+
+				// Replace all headers with strong and fix some other issues
+				if (this.editor.getParam("paste_convert_headers_to_strong", false)) {
+					content = content.replace(/<h[1-6]>&nbsp;<\/h[1-6]>/gi, '<p>&nbsp;&nbsp;</p>');
+					content = content.replace(/<h[1-6]>/gi, '<p><b>');
+					content = content.replace(/<\/h[1-6]>/gi, '</b></p>');
+					content = content.replace(/<b>&nbsp;<\/b>/gi, '<b>&nbsp;&nbsp;</b>');
+					content = content.replace(/^(&nbsp;)*/gi, '');
+				}
+
+				content = content.replace(/--list--/gi, ""); // Remove --list--
+
+				if (ed.getParam('paste_insert_word_content_callback'))
+					content = ed.execCallback('paste_insert_word_content_callback', 'after', content);
+
+				// Insert cleaned content
+				this.editor.execCommand("mceInsertContent", false, content);
+
+				if (this.editor.getParam('paste_force_cleanup_wordpaste', true)) {
+					var ed = this.editor;
+
+					window.setTimeout(function() {
+						ed.execCommand("mceCleanup");
+					}, 1); // Do normal cleanup detached from this thread
+				}
+			}
+		},
+
+		_reEscape : function(s) {
+			var l = "?.\\*[](){}+^$:";
+			var o = "";
+
+			for (var i=0; i<s.length; i++) {
+				var c = s.charAt(i);
+
+				if (l.indexOf(c) != -1)
+					o += '\\' + c;
+				else
+					o += c;
+			}
+
+			return o;
+		},
+
+		_convertMiddots : function(div, search, class_name) {
+			var ed = this.editor, mdot = String.fromCharCode(183), bull = String.fromCharCode(8226);
+			var nodes, prevul, i, p, ul, li, np, cp, li;
+
+			nodes = div.getElementsByTagName("p");
+			for (i=0; i<nodes.length; i++) {
+				p = nodes[i];
+
+				// Is middot
+				if (p.innerHTML.indexOf(search) == 0) {
+					ul = ed.dom.create("ul");
+
+					if (class_name)
+						ul.className = class_name;
+
+					// Add the first one
+					li = ed.dom.create("li");
+					li.innerHTML = p.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--|&nbsp;', "gi"), '');
+					ul.appendChild(li);
+
+					// Add the rest
+					np = p.nextSibling;
+					while (np) {
+						// If the node is whitespace, then
+						// ignore it and continue on.
+						if (np.nodeType == 3 && new RegExp('^\\s$', 'm').test(np.nodeValue)) {
+								np = np.nextSibling;
+								continue;
+						}
+
+						if (search == mdot) {
+								if (np.nodeType == 1 && new RegExp('^o(\\s+|&nbsp;)').test(np.innerHTML)) {
+										// Second level of nesting
+										if (!prevul) {
+												prevul = ul;
+												ul = ed.dom.create("ul");
+												prevul.appendChild(ul);
+										}
+										np.innerHTML = np.innerHTML.replace(/^o/, '');
+								} else {
+										// Pop the stack if we're going back up to the first level
+										if (prevul) {
+												ul = prevul;
+												prevul = null;
+										}
+										// Not element or middot paragraph
+										if (np.nodeType != 1 || np.innerHTML.indexOf(search) != 0)
+												break;
+								}
+						} else {
+								// Not element or middot paragraph
+								if (np.nodeType != 1 || np.innerHTML.indexOf(search) != 0)
+										break;
+							}
+
+						cp = np.nextSibling;
+						li = ed.dom.create("li");
+						li.innerHTML = np.innerHTML.replace(new RegExp('' + mdot + '|' + bull + '|--list--|&nbsp;', "gi"), '');
+						np.parentNode.removeChild(np);
+						ul.appendChild(li);
+						np = cp;
+					}
+
+					p.parentNode.replaceChild(ul, p);
+
+					return true;
+				}
+			}
+
+			return false;
+		},
+
+		_clipboardHTML : function() {
+			var div = document.getElementById('_TinyMCE_clipboardHTML');
+
+			if (!div) {
+				var div = document.createElement('DIV');
+				div.id = '_TinyMCE_clipboardHTML';
+
+				with (div.style) {
+					visibility = 'hidden';
+					overflow = 'hidden';
+					position = 'absolute';
+					width = 1;
+					height = 1;
+				}
+
+				document.body.appendChild(div);
+			}
+
+			div.innerHTML = '';
+			var rng = document.body.createTextRange();
+			rng.moveToElementText(div);
+			rng.execCommand('Paste');
+			var html = div.innerHTML;
+			div.innerHTML = '';
+			return html;
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('paste', tinymce.plugins.PastePlugin);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/paste/images/pastetext.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/paste/images/pasteword.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/paste/images/selectall.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/paste/js/pastetext.js
@@ -1,1 +1,42 @@
+tinyMCEPopup.requireLangPack();
 
+function saveContent() {
+	if (document.forms[0].htmlSource.value == '') {
+		tinyMCEPopup.close();
+		return false;
+	}
+
+	tinyMCEPopup.execCommand('mcePasteText', false, {
+		html : document.forms[0].htmlSource.value,
+		linebreaks : document.forms[0].linebreaks.checked
+	});
+
+	tinyMCEPopup.close();
+}
+
+function onLoadInit() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	// Remove Gecko spellchecking
+	if (tinymce.isGecko)
+		document.body.spellcheck = tinyMCEPopup.getParam("gecko_spellcheck");
+
+	resizeInputs();
+}
+
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;
+
+function resizeInputs() {
+	if (!tinymce.isIE) {
+		wHeight = self.innerHeight-80;
+		wWidth = self.innerWidth-17;
+	} else {
+		wHeight = document.body.clientHeight-80;
+		wWidth = document.body.clientWidth-17;
+	}
+
+	document.forms[0].htmlSource.style.height = Math.abs(wHeight) + 'px';
+	document.forms[0].htmlSource.style.width  = Math.abs(wWidth) + 'px';
+}
+
+tinyMCEPopup.onInit.add(onLoadInit);

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/paste/js/pasteword.js
@@ -1,1 +1,57 @@
+tinyMCEPopup.requireLangPack();
 
+function saveContent() {
+	var html = document.getElementById("frmData").contentWindow.document.body.innerHTML;
+
+	if (html == ''){
+		tinyMCEPopup.close();
+		return false;
+	}
+
+	tinyMCEPopup.execCommand('mcePasteWord', false, html);
+	tinyMCEPopup.close();
+}
+
+function onLoadInit() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	// Fix for endless reloading in FF
+	window.setTimeout(createIFrame, 10);
+}
+
+function createIFrame() {
+	document.getElementById('iframecontainer').innerHTML = '<iframe id="frmData" name="frmData" class="sourceIframe" src="blank.htm" height="280" width="400" frameborder="0" style="background-color:#FFFFFF; width:100%;" dir="ltr" wrap="soft"></iframe>';
+}
+
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;
+
+function initIframe(doc) {
+	var dir = tinyMCEPopup.editor.settings.directionality;
+
+	doc.body.dir = dir;
+
+	// Remove Gecko spellchecking
+	if (tinymce.isGecko)
+		doc.body.spellcheck = tinyMCEPopup.getParam("gecko_spellcheck");
+
+	resizeInputs();
+}
+
+function resizeInputs() {
+	if (!tinymce.isIE) {
+		wHeight = self.innerHeight - 80;
+		wWidth = self.innerWidth - 18;
+	} else {
+		wHeight = document.body.clientHeight - 80;
+		wWidth = document.body.clientWidth - 18;
+	}
+
+	var elm = document.getElementById('frmData');
+	if (elm) {
+		elm.style.height = Math.abs(wHeight) + 'px';
+		elm.style.width  = Math.abs(wWidth) + 'px';
+	}
+}
+
+tinyMCEPopup.onInit.add(onLoadInit);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/paste/jscripts/pastetext.js
@@ -1,1 +1,39 @@
+function saveContent() {
+	if (document.forms[0].htmlSource.value == '') {
+		tinyMCEPopup.close();
+		return false;
+	}
 
+	tinyMCEPopup.execCommand('mcePasteText', false, {
+		html : document.forms[0].htmlSource.value,
+		linebreaks : document.forms[0].linebreaks.checked
+	});
+
+	tinyMCEPopup.close();
+}
+
+function onLoadInit() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	// Remove Gecko spellchecking
+	if (tinyMCE.isGecko)
+		document.body.spellcheck = tinyMCE.getParam("gecko_spellcheck");
+
+	resizeInputs();
+}
+
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;
+
+function resizeInputs() {
+	if (!tinyMCE.isMSIE) {
+		wHeight = self.innerHeight-80;
+		wWidth = self.innerWidth-17;
+	} else {
+		wHeight = document.body.clientHeight-80;
+		wWidth = document.body.clientWidth-17;
+	}
+
+	document.forms[0].htmlSource.style.height = Math.abs(wHeight) + 'px';
+	document.forms[0].htmlSource.style.width  = Math.abs(wWidth) + 'px';
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/paste/jscripts/pasteword.js
@@ -1,1 +1,53 @@
+function saveContent() {
+	var html = document.getElementById("frmData").contentWindow.document.body.innerHTML;
 
+	if (html == ''){
+		tinyMCEPopup.close();
+		return false;
+	}
+
+	tinyMCEPopup.execCommand('mcePasteWord', false, html);
+	tinyMCEPopup.close();
+}
+
+function onLoadInit() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	// Fix for endless reloading in FF
+	window.setTimeout('createIFrame();', 10);
+}
+
+function createIFrame() {
+	document.getElementById('iframecontainer').innerHTML = '<iframe id="frmData" name="frmData" class="sourceIframe" src="blank.htm" height="280" width="400" frameborder="0" style="background-color:#FFFFFF; width:100%;" dir="ltr" wrap="soft"></iframe>';
+}
+
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;
+
+function initIframe(doc) {
+	var dir = tinyMCE.selectedInstance.settings['directionality'];
+
+	doc.body.dir = dir;
+
+	// Remove Gecko spellchecking
+	if (tinyMCE.isGecko)
+		doc.body.spellcheck = tinyMCE.getParam("gecko_spellcheck");
+
+	resizeInputs();
+}
+
+function resizeInputs() {
+	if (!tinyMCE.isMSIE) {
+		wHeight = self.innerHeight - 80;
+		wWidth = self.innerWidth - 18;
+	} else {
+		wHeight = document.body.clientHeight - 80;
+		wWidth = document.body.clientWidth - 18;
+	}
+
+	var elm = document.getElementById('frmData');
+	if (elm) {
+		elm.style.height = Math.abs(wHeight) + 'px';
+		elm.style.width  = Math.abs(wWidth) + 'px';
+	}
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/paste/langs/en.js
@@ -1,1 +1,11 @@
+// UK lang variables
 
+tinyMCE.addToLang('',{
+paste_text_desc : 'Paste as Plain Text',
+paste_text_title : 'Use CTRL+V on your keyboard to paste the text into the window.',
+paste_text_linebreaks : 'Keep linebreaks',
+paste_word_desc : 'Paste from Word',
+paste_word_title : 'Use CTRL+V on your keyboard to paste the text into the window.',
+selectall_desc : 'Select All'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/paste/langs/en_dlg.js
@@ -1,1 +1,5 @@
-
+tinyMCE.addI18n('en.paste_dlg',{
+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",
+text_linebreaks:"Keep linebreaks",
+word_title:"Use CTRL+V on your keyboard to paste the text into the window."
+});

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/paste/pastetext.htm
@@ -1,1 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#paste.paste_text_desc}</title>
+	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="js/pastetext.js"></script>
+	<base target="_self" />
+</head>
+<body onresize="resizeInputs();" style="display:none; overflow:hidden;">
+<form name="source" onsubmit="saveContent();return false;" action="#">
+	<div style="float: left" class="title">{#paste.paste_text_desc}</div>
 
+	<div style="float: right">
+		<input type="checkbox" name="linebreaks" id="linebreaks" class="wordWrapCode" checked="checked" /><label for="linebreaks">{#paste_dlg.text_linebreaks}</label>
+	</div>
+
+	<br style="clear: both" />
+
+	<div>{#paste_dlg.text_title}</div>
+
+	<textarea name="htmlSource" id="htmlSource" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,mono; font-size: 12px;" dir="ltr" wrap="soft" class="mceFocus"></textarea>
+
+	<div class="mceActionPanel">
+		<div style="float: left">
+			<input type="submit" name="insert" value="{#insert}" id="insert" />
+		</div>
+
+		<div style="float: right">
+			<input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" />
+		</div>
+	</div>
+</form>
+</body> 
+</html>

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/paste/pasteword.htm
@@ -1,1 +1,30 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+	<title>{#paste.paste_word_desc}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="js/pasteword.js"></script>
+	<link href="css/pasteword.css" rel="stylesheet" type="text/css" />
+	<base target="_self" />
+</head>
+<body onresize="resizeInputs();" style="display:none; overflow:hidden;">
+	<form name="source" onsubmit="saveContent();" action="#">
+		<div class="title">{#paste.paste_word_desc}</div>
 
+		<div>{#paste_dlg.word_title}</div>
+
+		<div id="iframecontainer"></div>
+
+		<div class="mceActionPanel">
+			<div style="float: left">
+				<input type="button" id="insert" name="insert" value="{#insert}" onclick="saveContent();" />
+			</div>
+
+			<div style="float: right">
+				<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+			</div>
+		</div>
+	</form>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/paste/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/preview/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.Preview',{init:function(ed,url){var t=this;t.editor=ed;ed.addCommand('mcePreview',t._preview,t);ed.addButton('preview',{title:'preview.preview_desc',cmd:'mcePreview'});},getInfo:function(){return{longname:'Preview',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_preview:function(){var ed=this.editor,win,html,c,pos,pos2,css,i,page=ed.getParam("plugin_preview_pageurl",null),w=ed.getParam("plugin_preview_width","550"),h=ed.getParam("plugin_preview_height","600");if(page){ed.windowManager.open({file:ed.getParam("plugin_preview_pageurl",null),width:w,height:h},{resizable:"yes",scrollbars:"yes",inline:1});}else{win=window.open("","mcePreview","menubar=no,toolbar=no,scrollbars=yes,resizable=yes,left=20,top=20,width="+w+",height="+h);html="";c=ed.getContent();pos=c.indexOf('<body');css=ed.getParam("content_css",'').split(',');tinymce.map(css,function(u){return ed.documentBaseURI.toAbsolute(u);});if(pos!=-1){pos=c.indexOf('>',pos);pos2=c.lastIndexOf('</body>');c=c.substring(pos+1,pos2);}html+=ed.getParam('doctype');html+='<html xmlns="http://www.w3.org/1999/xhtml">';html+='<head>';html+='<title>'+ed.getLang('preview.preview_desc')+'</title>';html+='<base href="'+ed.documentBaseURI.getURI()+'" />';html+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';for(i=0;i<css.length;i++)html+='<link href="'+css[i]+'" rel="stylesheet" type="text/css" />';html+='</head>';html+='<body dir="'+ed.getParam("directionality")+'" onload="window.opener.tinymce.EditorManager.get(\''+ed.id+'\').plugins[\'preview\']._onLoad(window,document);">';html+=c;html+='</body>';html+='</html>';win.document.write(html);win.document.close();}},_onLoad:function(w,d){var t=this,nl,i,el=[],sv,ne;t._doc=d;w.writeFlash=t._writeFlash;w.writeShockWave=t._writeShockWave;w.writeQuickTime=t._writeQuickTime;w.writeRealMedia=t._writeRealMedia;w.writeWindowsMedia=t._writeWindowsMedia;w.writeEmbed=t._writeEmbed;nl=d.getElementsByTagName("script");for(i=0;i<nl.length;i++){sv=tinymce.isIE?nl[i].innerHTML:nl[i].firstChild.nodeValue;if(new RegExp('write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\\(.*','g').test(sv))el[el.length]=nl[i];}for(i=0;i<el.length;i++){ne=d.createElement("div");ne.innerHTML=d._embeds[i];el[i].parentNode.insertBefore(ne.firstChild,el[i]);}},_writeFlash:function(p){p.src=this.editor.documentBaseURI.toAbsolute(p.src);TinyMCE_PreviewPlugin._writeEmbed('D27CDB6E-AE6D-11cf-96B8-444553540000','http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0','application/x-shockwave-flash',p);},_writeShockWave:function(p){this.editor.documentBaseURI.toAbsolute(p.src);TinyMCE_PreviewPlugin._writeEmbed('166B1BCA-3F9C-11CF-8075-444553540000','http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0','application/x-director',p);},_writeQuickTime:function(p){this.editor.documentBaseURI.toAbsolute(p.src);TinyMCE_PreviewPlugin._writeEmbed('02BF25D5-8C17-4B23-BC80-D3488ABDDC6B','http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0','video/quicktime',p);},_writeRealMedia:function(p){this.editor.documentBaseURI.toAbsolute(p.src);TinyMCE_PreviewPlugin._writeEmbed('CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA','http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0','audio/x-pn-realaudio-plugin',p);},_writeWindowsMedia:function(p){this.editor.documentBaseURI.toAbsolute(p.src);p.url=p.src;TinyMCE_PreviewPlugin._writeEmbed('6BF52A52-394A-11D3-B153-00C04F79FAA6','http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701','application/x-mplayer2',p);},_writeEmbed:function(cls,cb,mt,p){var h='',n,d=t._doc,ne,c;h+='<object classid="clsid:'+cls+'" codebase="'+cb+'"';h+=typeof(p.id)!="undefined"?'id="'+p.id+'"':'';h+=typeof(p.name)!="undefined"?'name="'+p.name+'"':'';h+=typeof(p.width)!="undefined"?'width="'+p.width+'"':'';h+=typeof(p.height)!="undefined"?'height="'+p.height+'"':'';h+=typeof(p.align)!="undefined"?'align="'+p.align+'"':'';h+='>';for(n in p)h+='<param name="'+n+'" value="'+p[n]+'">';h+='<embed type="'+mt+'"';for(n in p)h+=n+'="'+p[n]+'" ';h+='></embed></object>';d._embeds[d._embeds.length]=h;}});tinymce.PluginManager.add('preview',tinymce.plugins.Preview);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/preview/editor_plugin_src.js
@@ -1,1 +1,187 @@
+/**
+ * $Id: editor_plugin_src.js 537 2008-01-14 16:38:33Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.Preview', {
+		init : function(ed, url) {
+			var t = this;
+
+			t.editor = ed;
+
+			ed.addCommand('mcePreview', t._preview, t);
+			ed.addButton('preview', {title : 'preview.preview_desc', cmd : 'mcePreview'});
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Preview',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		},
+
+		// Private methods
+
+		_preview : function() {
+			var ed = this.editor, win, html, c, pos, pos2, css, i, page = ed.getParam("plugin_preview_pageurl", null), w = ed.getParam("plugin_preview_width", "550"), h = ed.getParam("plugin_preview_height", "600");
+
+			// Use a custom preview page
+			if (page) {
+				ed.windowManager.open({
+					file : ed.getParam("plugin_preview_pageurl", null),
+					width : w,
+					height : h
+				}, {
+					resizable : "yes",
+					scrollbars : "yes",
+					inline : 1
+				});
+			} else {
+				win = window.open("", "mcePreview", "menubar=no,toolbar=no,scrollbars=yes,resizable=yes,left=20,top=20,width=" + w + ",height="  + h);
+				html = "";
+				c = ed.getContent();
+				pos = c.indexOf('<body');
+				css = ed.getParam("content_css", '').split(',');
+
+				tinymce.map(css, function(u) {
+					return ed.documentBaseURI.toAbsolute(u);
+				});
+
+				if (pos != -1) {
+					pos = c.indexOf('>', pos);
+					pos2 = c.lastIndexOf('</body>');
+					c = c.substring(pos + 1, pos2);
+				}
+
+				html += ed.getParam('doctype');
+				html += '<html xmlns="http://www.w3.org/1999/xhtml">';
+				html += '<head>';
+				html += '<title>' + ed.getLang('preview.preview_desc') + '</title>';
+				html += '<base href="' + ed.documentBaseURI.getURI() + '" />';
+				html += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';
+
+				for (i=0; i<css.length; i++)
+					html += '<link href="' + css[i] + '" rel="stylesheet" type="text/css" />';
+
+				html += '</head>';
+				html += '<body dir="' + ed.getParam("directionality") + '" onload="window.opener.tinymce.EditorManager.get(\'' + ed.id + '\').plugins[\'preview\']._onLoad(window,document);">';
+				html += c;
+				html += '</body>';
+				html += '</html>';
+
+				win.document.write(html);
+				win.document.close();
+			}
+		},
+
+		_onLoad : function(w, d) {
+			var t = this, nl, i, el = [], sv, ne;
+
+			t._doc = d;
+			w.writeFlash = t._writeFlash;
+			w.writeShockWave = t._writeShockWave;
+			w.writeQuickTime = t._writeQuickTime;
+			w.writeRealMedia = t._writeRealMedia;
+			w.writeWindowsMedia = t._writeWindowsMedia;
+			w.writeEmbed = t._writeEmbed;
+
+			nl = d.getElementsByTagName("script");
+			for (i=0; i<nl.length; i++) {
+				sv = tinymce.isIE ? nl[i].innerHTML : nl[i].firstChild.nodeValue;
+
+				if (new RegExp('write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\\(.*', 'g').test(sv))
+					el[el.length] = nl[i];
+			}
+
+			for (i=0; i<el.length; i++) {
+				ne = d.createElement("div");
+				ne.innerHTML = d._embeds[i];
+				el[i].parentNode.insertBefore(ne.firstChild, el[i]);
+			}
+		},
+
+		_writeFlash : function(p) {
+			p.src = this.editor.documentBaseURI.toAbsolute(p.src);
+			TinyMCE_PreviewPlugin._writeEmbed(
+				'D27CDB6E-AE6D-11cf-96B8-444553540000',
+				'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',
+				'application/x-shockwave-flash',
+				p
+			);
+		},
+
+		_writeShockWave : function(p) {
+			this.editor.documentBaseURI.toAbsolute(p.src);
+			TinyMCE_PreviewPlugin._writeEmbed(
+				'166B1BCA-3F9C-11CF-8075-444553540000',
+				'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0',
+				'application/x-director',
+				p
+			);
+		},
+
+		_writeQuickTime : function(p) {
+			this.editor.documentBaseURI.toAbsolute(p.src);
+			TinyMCE_PreviewPlugin._writeEmbed(
+				'02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',
+				'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',
+				'video/quicktime',
+				p
+			);
+		},
+
+		_writeRealMedia : function(p) {
+			this.editor.documentBaseURI.toAbsolute(p.src);
+			TinyMCE_PreviewPlugin._writeEmbed(
+				'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA',
+				'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',
+				'audio/x-pn-realaudio-plugin',
+				p
+			);
+		},
+
+		_writeWindowsMedia : function(p) {
+			this.editor.documentBaseURI.toAbsolute(p.src);
+			p.url = p.src;
+			TinyMCE_PreviewPlugin._writeEmbed(
+				'6BF52A52-394A-11D3-B153-00C04F79FAA6',
+				'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701',
+				'application/x-mplayer2',
+				p
+			);
+		},
+
+		_writeEmbed : function(cls, cb, mt, p) {
+			var h = '', n, d = t._doc, ne, c;
+
+			h += '<object classid="clsid:' + cls + '" codebase="' + cb + '"';
+			h += typeof(p.id) != "undefined" ? 'id="' + p.id + '"' : '';
+			h += typeof(p.name) != "undefined" ? 'name="' + p.name + '"' : '';
+			h += typeof(p.width) != "undefined" ? 'width="' + p.width + '"' : '';
+			h += typeof(p.height) != "undefined" ? 'height="' + p.height + '"' : '';
+			h += typeof(p.align) != "undefined" ? 'align="' + p.align + '"' : '';
+			h += '>';
+
+			for (n in p)
+				h += '<param name="' + n + '" value="' + p[n] + '">';
+
+			h += '<embed type="' + mt + '"';
+
+			for (n in p)
+				h += n + '="' + p[n] + '" ';
+
+			h += '></embed></object>';
+
+			d._embeds[d._embeds.length] = h;
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('preview', tinymce.plugins.Preview);
+})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/preview/example.html
@@ -1,1 +1,29 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<script language="javascript" src="../../tiny_mce_popup.js"></script>
+<script type="text/javascript" src="jscripts/embed.js"></script>
+<script type="text/javascript">
+tinyMCEPopup.onInit.add(function(ed) {
+	var dom = tinyMCEPopup.dom;
 
+	// Load editor content_css
+	tinymce.each(ed.settings.content_css.split(','), function(u) {
+		dom.loadCSS(ed.documentBaseURI.toAbsolute(u));
+	});
+
+	// Place contents inside div container
+	dom.setHTML('content', ed.getContent());
+});
+</script>
+<title>Example of a custom preview page</title>
+</head>
+<body>
+
+Editor contents: <br />
+<div id="content">
+<!-- Gets filled with editor contents -->
+</div>
+
+</body>
+</html>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/preview/images/preview.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/preview/jscripts/embed.js
@@ -1,1 +1,74 @@
+/**
+ * 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);
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/preview/langs/en.js
@@ -1,1 +1,6 @@
+// UK lang variables
 
+tinyMCE.addToLang('',{
+preview_desc : 'Preview'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/preview/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/print/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.Print',{init:function(ed,url){ed.addCommand('mcePrint',function(){ed.getWin().print();});ed.addButton('print',{title:'print.print_desc',cmd:'mcePrint'});},getInfo:function(){return{longname:'Print',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/print',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.PluginManager.add('print',tinymce.plugins.Print);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/print/editor_plugin_src.js
@@ -1,1 +1,32 @@
+/**
+ * $Id: editor_plugin_src.js 520 2008-01-07 16:30:32Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.Print', {
+		init : function(ed, url) {
+			ed.addCommand('mcePrint', function() {
+				ed.getWin().print();
+			});
+
+			ed.addButton('print', {title : 'print.print_desc', cmd : 'mcePrint'});
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Print',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/print',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('print', tinymce.plugins.Print);
+})();
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/print/images/print.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/print/langs/en.js
@@ -1,1 +1,6 @@
+// UK lang variables
 
+tinyMCE.addToLang('',{
+print_desc : 'Print'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/print/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/readme.txt
@@ -1,1 +1,2 @@
+This is the location you place TinyMCE plugins.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/safari/blank.htm
@@ -1,1 +1,1 @@
-
+<!-- WebKit -->

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/safari/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){var Event=tinymce.dom.Event,grep=tinymce.grep,each=tinymce.each,inArray=tinymce.inArray,isOldWebKit=tinymce.isOldWebKit;tinymce.create('tinymce.plugins.Safari',{init:function(ed){var t=this,dom;if(!tinymce.isWebKit)return;t.editor=ed;t.webKitFontSizes=['x-small','small','medium','large','x-large','xx-large','-webkit-xxx-large'];t.namedFontSizes=['xx-small','x-small','small','medium','large','x-large','xx-large'];ed.onPaste.add(function(ed,e){function removeStyles(e){e=e.target;if(e.nodeType==1){e.style.cssText='';each(ed.dom.select('*',e),function(e){e.style.cssText='';});}};Event.add(ed.getDoc(),'DOMNodeInserted',removeStyles);window.setTimeout(function(){Event.remove(ed.getDoc(),'DOMNodeInserted',removeStyles);},0);});ed.onKeyUp.add(function(ed,e){var h,b;if(e.keyCode==46||e.keyCode==8){b=ed.getBody();h=b.innerHTML;if(b.childNodes.length==1&&!/<(img|hr)/.test(h)&&tinymce.trim(h.replace(/<[^>]+>/g,'')).length==0)ed.setContent('',{format:'raw'});}});ed.addCommand('FormatBlock',function(u,v){var dom=ed.dom,e=dom.getParent(ed.selection.getNode(),dom.isBlock);if(e)dom.replace(dom.create(v),e,1);else ed.getDoc().execCommand("FormatBlock",false,v);});ed.addCommand('mceInsertContent',function(u,v){ed.getDoc().execCommand("InsertText",false,'mce_marker');ed.getBody().innerHTML=ed.getBody().innerHTML.replace(/mce_marker/g,v+'<span id="_mce_tmp">XX</span>');ed.selection.select(ed.dom.get('_mce_tmp'));ed.getDoc().execCommand("Delete",false,' ');});ed.onKeyPress.add(function(ed,e){if(e.keyCode==13&&(e.shiftKey||ed.settings.force_br_newlines&&ed.selection.getNode().nodeName!='LI')){t._insertBR(ed);Event.cancel(e);}});ed.addQueryValueHandler('FontSize',function(u,v){var e,v;if((e=ed.dom.getParent(ed.selection.getStart(),'span'))&&(v=e.style.fontSize))return tinymce.inArray(t.namedFontSizes,v)+1;if((e=ed.dom.getParent(ed.selection.getEnd(),'span'))&&(v=e.style.fontSize))return tinymce.inArray(t.namedFontSizes,v)+1;return ed.getDoc().queryCommandValue('FontSize');});ed.addQueryValueHandler('FontName',function(u,v){var e,v;if((e=ed.dom.getParent(ed.selection.getStart(),'span'))&&(v=e.style.fontFamily))return v.replace(/, /g,',');if((e=ed.dom.getParent(ed.selection.getEnd(),'span'))&&(v=e.style.fontFamily))return v.replace(/, /g,',');return ed.getDoc().queryCommandValue('FontName');});ed.onClick.add(function(ed,e){e=e.target;if(e.nodeName=='IMG'){t.selElm=e;ed.selection.select(e);}else t.selElm=null;});ed.onInit.add(function(){t._fixWebKitSpans();if(isOldWebKit)t._patchSafari2x(ed);});ed.onSetContent.add(function(){dom=ed.dom;each(['strong','b','em','u','strike','sub','sup','a'],function(v){each(grep(dom.select(v)).reverse(),function(n){var nn=n.nodeName.toLowerCase(),st;if(nn=='a'){if(n.name)dom.replace(dom.create('img',{mce_name:'a',name:n.name,'class':'mceItemAnchor'}),n);return;}switch(nn){case'b':case'strong':if(nn=='b')nn='strong';st='font-weight: bold;';break;case'em':st='font-style: italic;';break;case'u':st='text-decoration: underline;';break;case'sub':st='vertical-align: sub;';break;case'sup':st='vertical-align: super;';break;case'strike':st='text-decoration: line-through;';break;}dom.replace(dom.create('span',{mce_name:nn,style:st,'class':'Apple-style-span'}),n,1);});});});ed.onPreProcess.add(function(ed,o){dom=ed.dom;each(grep(o.node.getElementsByTagName('span')).reverse(),function(n){var v,bg;if(o.get){if(dom.hasClass(n,'Apple-style-span')){bg=n.style.backgroundColor;switch(dom.getAttrib(n,'mce_name')){case'font':if(!ed.settings.convert_fonts_to_spans)dom.setAttrib(n,'style','');break;case'strong':case'em':case'sub':case'sup':dom.setAttrib(n,'style','');break;case'strike':case'u':if(!ed.settings.inline_styles)dom.setAttrib(n,'style','');else dom.setAttrib(n,'mce_name','');break;default:if(!ed.settings.inline_styles)dom.setAttrib(n,'style','');}if(bg)n.style.backgroundColor=bg;}}if(dom.hasClass(n,'mceItemRemoved'))dom.remove(n,1);});});ed.onPostProcess.add(function(ed,o){o.content=o.content.replace(/<br \/><\/(h[1-6]|div|p|address|pre)>/g,'</$1>');o.content=o.content.replace(/ id=\"undefined\"/g,'');});},getInfo:function(){return{longname:'Safari compatibility',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/safari',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_fixWebKitSpans:function(){var t=this,ed=t.editor;if(!isOldWebKit){Event.add(ed.getDoc(),'DOMNodeInserted',function(e){e=e.target;if(e&&e.nodeType==1)t._fixAppleSpan(e);});}else{ed.onExecCommand.add(function(){each(ed.dom.select('span'),function(n){t._fixAppleSpan(n);});ed.nodeChanged();});}},_fixAppleSpan:function(e){var ed=this.editor,dom=ed.dom,fz=this.webKitFontSizes,fzn=this.namedFontSizes,s=ed.settings,st,p;if(dom.getAttrib(e,'mce_fixed'))return;if(e.nodeName=='SPAN'&&e.className=='Apple-style-span'){st=e.style;if(!s.convert_fonts_to_spans){if(st.fontSize){dom.setAttrib(e,'mce_name','font');dom.setAttrib(e,'size',inArray(fz,st.fontSize)+1);}if(st.fontFamily){dom.setAttrib(e,'mce_name','font');dom.setAttrib(e,'face',st.fontFamily);}if(st.color){dom.setAttrib(e,'mce_name','font');dom.setAttrib(e,'color',dom.toHex(st.color));}if(st.backgroundColor){dom.setAttrib(e,'mce_name','font');dom.setStyle(e,'background-color',st.backgroundColor);}}else{if(st.fontSize)dom.setStyle(e,'fontSize',fzn[inArray(fz,st.fontSize)]);}if(st.fontWeight=='bold')dom.setAttrib(e,'mce_name','strong');if(st.fontStyle=='italic')dom.setAttrib(e,'mce_name','em');if(st.textDecoration=='underline')dom.setAttrib(e,'mce_name','u');if(st.textDecoration=='line-through')dom.setAttrib(e,'mce_name','strike');if(st.verticalAlign=='super')dom.setAttrib(e,'mce_name','sup');if(st.verticalAlign=='sub')dom.setAttrib(e,'mce_name','sub');dom.setAttrib(e,'mce_fixed','1');}},_patchSafari2x:function(ed){var t=this,setContent,getNode,dom=ed.dom,lr;if(ed.windowManager.onBeforeOpen){ed.windowManager.onBeforeOpen.add(function(){r=ed.selection.getRng();});}ed.selection.select=function(n){this.getSel().setBaseAndExtent(n,0,n,1);};getNode=ed.selection.getNode;ed.selection.getNode=function(){return t.selElm||getNode.call(this);};ed.selection.getRng=function(){var t=this,s=t.getSel(),d=ed.getDoc(),r,rb,ra,di;if(s.anchorNode){r=d.createRange();try{rb=d.createRange();rb.setStart(s.anchorNode,s.anchorOffset);rb.collapse(1);ra=d.createRange();ra.setStart(s.focusNode,s.focusOffset);ra.collapse(1);di=rb.compareBoundaryPoints(rb.START_TO_END,ra)<0;r.setStart(di?s.anchorNode:s.focusNode,di?s.anchorOffset:s.focusOffset);r.setEnd(di?s.focusNode:s.anchorNode,di?s.focusOffset:s.anchorOffset);lr=r;}catch(ex){}}return r||lr;};setContent=ed.selection.setContent;ed.selection.setContent=function(h,s){var r=this.getRng(),b;try{setContent.call(this,h,s);}catch(ex){b=dom.create('body');b.innerHTML=h;each(b.childNodes,function(n){r.insertNode(n.cloneNode(true));});}};},_insertBR:function(ed){var dom=ed.dom,s=ed.selection,r=s.getRng(),br;r.insertNode(br=dom.create('br'));r.setStartAfter(br);r.setEndAfter(br);s.setRng(r);if(s.getSel().focusNode==br.previousSibling){s.select(dom.insertAfter(dom.doc.createTextNode('\u00a0'),br));s.collapse(1);}ed.getWin().scrollTo(0,dom.getPos(s.getRng().startContainer).y);}});tinymce.PluginManager.add('safari',tinymce.plugins.Safari);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/safari/editor_plugin_src.js
@@ -1,1 +1,461 @@
-
+/**
+ * $Id: editor_plugin_src.js 264 2007-04-26 20:53:09Z spocke $
+ *
+ * @author Moxiecode

+ */
+
+(function() {
+	var Event = tinymce.dom.Event, grep = tinymce.grep, each = tinymce.each, inArray = tinymce.inArray, isOldWebKit = tinymce.isOldWebKit;
+
+	tinymce.create('tinymce.plugins.Safari', {
+		init : function(ed) {
+			var t = this, dom;
+
+			// Ignore on non webkit
+			if (!tinymce.isWebKit)
+				return;
+
+			t.editor = ed;
+			t.webKitFontSizes = ['x-small', 'small', 'medium', 'large', 'x-large', 'xx-large', '-webkit-xxx-large'];
+			t.namedFontSizes = ['xx-small', 'x-small','small','medium','large','x-large', 'xx-large'];
+
+			// Safari will crash if the build in createlink command is used
+/*			ed.addCommand('CreateLink', function(u, v) {
+				ed.execCommand("mceInsertContent", false, '<a href="' + dom.encode(v) + '">' + ed.selection.getContent() + '</a>');
+			});*/
+
+			ed.onPaste.add(function(ed, e) {
+				function removeStyles(e) {
+					e = e.target;
+
+					if (e.nodeType == 1) {
+						e.style.cssText = '';
+
+						each(ed.dom.select('*', e), function(e) {
+							e.style.cssText = '';
+						});
+					}
+				};
+
+				Event.add(ed.getDoc(), 'DOMNodeInserted', removeStyles);
+
+				window.setTimeout(function() {
+					Event.remove(ed.getDoc(), 'DOMNodeInserted', removeStyles);
+				}, 0);
+			});
+
+			ed.onKeyUp.add(function(ed, e) {
+				var h, b;
+
+				// If backspace or delete key
+				if (e.keyCode == 46 || e.keyCode == 8) {
+					b = ed.getBody();
+					h = b.innerHTML;
+
+					// If there is no text content or images or hr elements then remove everything
+					if (b.childNodes.length == 1 && !/<(img|hr)/.test(h) && tinymce.trim(h.replace(/<[^>]+>/g, '')).length == 0)
+						ed.setContent('', {format : 'raw'});
+				}
+			});
+
+			// Workaround for FormatBlock bug, http://bugs.webkit.org/show_bug.cgi?id=16004
+			ed.addCommand('FormatBlock', function(u, v) {
+				var dom = ed.dom, e = dom.getParent(ed.selection.getNode(), dom.isBlock);
+
+				if (e)
+					dom.replace(dom.create(v), e, 1);
+				else
+					ed.getDoc().execCommand("FormatBlock", false, v);
+			});
+
+			// Workaround for InsertHTML bug, http://bugs.webkit.org/show_bug.cgi?id=16382
+			ed.addCommand('mceInsertContent', function(u, v) {
+				ed.getDoc().execCommand("InsertText", false, 'mce_marker');
+				ed.getBody().innerHTML = ed.getBody().innerHTML.replace(/mce_marker/g, v + '<span id="_mce_tmp">XX</span>');
+				ed.selection.select(ed.dom.get('_mce_tmp'));
+				ed.getDoc().execCommand("Delete", false, ' ');
+			});
+
+			// Workaround for missing shift+enter support, http://bugs.webkit.org/show_bug.cgi?id=16973
+			ed.onKeyPress.add(function(ed, e) {
+				if (e.keyCode == 13 && (e.shiftKey || ed.settings.force_br_newlines && ed.selection.getNode().nodeName != 'LI')) {
+					t._insertBR(ed);
+					Event.cancel(e);
+				}
+			});
+
+			// Safari returns incorrect values
+			ed.addQueryValueHandler('FontSize', function(u, v) {
+				var e, v;
+
+				// Check for the real font size at the start of selection
+				if ((e = ed.dom.getParent(ed.selection.getStart(), 'span')) && (v = e.style.fontSize))
+					return tinymce.inArray(t.namedFontSizes, v) + 1;
+
+				// Check for the real font size at the end of selection
+				if ((e = ed.dom.getParent(ed.selection.getEnd(), 'span')) && (v = e.style.fontSize))
+					return tinymce.inArray(t.namedFontSizes, v) + 1;
+
+				// Return default value it's better than nothing right!
+				return ed.getDoc().queryCommandValue('FontSize');
+			});
+
+			// Safari returns incorrect values
+			ed.addQueryValueHandler('FontName', function(u, v) {
+				var e, v;
+
+				// Check for the real font name at the start of selection
+				if ((e = ed.dom.getParent(ed.selection.getStart(), 'span')) && (v = e.style.fontFamily))
+					return v.replace(/, /g, ',');
+
+				// Check for the real font name at the end of selection
+				if ((e = ed.dom.getParent(ed.selection.getEnd(), 'span')) && (v = e.style.fontFamily))
+					return v.replace(/, /g, ',');
+
+				// Return default value it's better than nothing right!
+				return ed.getDoc().queryCommandValue('FontName');
+			});
+
+			// Workaround for bug, http://bugs.webkit.org/show_bug.cgi?id=12250
+			ed.onClick.add(function(ed, e) {
+				e = e.target;
+
+				if (e.nodeName == 'IMG') {
+					t.selElm = e;
+					ed.selection.select(e);
+				} else
+					t.selElm = null;
+			});
+
+/*			ed.onBeforeExecCommand.add(function(ed, c, b) {
+				var r = t.bookmarkRng;
+
+				// Restore selection
+				if (r) {
+					ed.selection.setRng(r);
+					t.bookmarkRng = null;
+					//console.debug('restore', r.startContainer, r.startOffset, r.endContainer, r.endOffset);
+				}
+			});*/
+
+			ed.onInit.add(function() {
+				t._fixWebKitSpans();
+
+/*				ed.windowManager.onOpen.add(function() {
+					var r = ed.selection.getRng();
+
+					// Store selection if valid
+					if (r.startContainer != ed.getDoc()) {
+						t.bookmarkRng = r.cloneRange();
+						//console.debug('store', r.startContainer, r.startOffset, r.endContainer, r.endOffset);
+					}
+				});
+
+				ed.windowManager.onClose.add(function() {
+					t.bookmarkRng = null;
+				});*/
+
+				if (isOldWebKit)
+					t._patchSafari2x(ed);
+			});
+
+			ed.onSetContent.add(function() {
+				dom = ed.dom;
+
+				// Convert strong,b,em,u,strike to spans
+				each(['strong','b','em','u','strike','sub','sup','a'], function(v) {
+					each(grep(dom.select(v)).reverse(), function(n) {
+						var nn = n.nodeName.toLowerCase(), st;
+
+						// Convert anchors into images
+						if (nn == 'a') {
+							if (n.name)
+								dom.replace(dom.create('img', {mce_name : 'a', name : n.name, 'class' : 'mceItemAnchor'}), n);
+
+							return;
+						}
+
+						switch (nn) {
+							case 'b':
+							case 'strong':
+								if (nn == 'b')
+									nn = 'strong';
+
+								st = 'font-weight: bold;';
+								break;
+
+							case 'em':
+								st = 'font-style: italic;';
+								break;
+
+							case 'u':
+								st = 'text-decoration: underline;';
+								break;
+
+							case 'sub':
+								st = 'vertical-align: sub;';
+								break;
+
+							case 'sup':
+								st = 'vertical-align: super;';
+								break;
+
+							case 'strike':
+								st = 'text-decoration: line-through;';
+								break;
+						}
+
+						dom.replace(dom.create('span', {mce_name : nn, style : st, 'class' : 'Apple-style-span'}), n, 1);
+					});
+				});
+			});
+
+			ed.onPreProcess.add(function(ed, o) {
+				dom = ed.dom;
+
+				each(grep(o.node.getElementsByTagName('span')).reverse(), function(n) {
+					var v, bg;
+
+					if (o.get) {
+						if (dom.hasClass(n, 'Apple-style-span')) {
+							bg = n.style.backgroundColor;
+
+							switch (dom.getAttrib(n, 'mce_name')) {
+								case 'font':
+									if (!ed.settings.convert_fonts_to_spans)
+										dom.setAttrib(n, 'style', '');
+									break;
+
+								case 'strong':
+								case 'em':
+								case 'sub':
+								case 'sup':
+									dom.setAttrib(n, 'style', '');
+									break;
+
+								case 'strike':
+								case 'u':
+									if (!ed.settings.inline_styles)
+										dom.setAttrib(n, 'style', '');
+									else
+										dom.setAttrib(n, 'mce_name', '');
+
+									break;
+
+								default:
+									if (!ed.settings.inline_styles)
+										dom.setAttrib(n, 'style', '');
+							}
+
+
+							if (bg)
+								n.style.backgroundColor = bg;
+						}
+					}
+
+					if (dom.hasClass(n, 'mceItemRemoved'))
+						dom.remove(n, 1);
+				});
+			});
+
+			ed.onPostProcess.add(function(ed, o) {
+				// Safari adds BR at end of all block elements
+				o.content = o.content.replace(/<br \/><\/(h[1-6]|div|p|address|pre)>/g, '</$1>');
+
+				// Safari adds id="undefined" to HR elements
+				o.content = o.content.replace(/ id=\"undefined\"/g, '');
+			});
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Safari compatibility',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/safari',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		},
+
+		// Internal methods
+
+		_fixWebKitSpans : function() {
+			var t = this, ed = t.editor;
+
+			if (!isOldWebKit) {
+				// Use mutator events on new WebKit
+				Event.add(ed.getDoc(), 'DOMNodeInserted', function(e) {
+					e = e.target;
+
+					if (e && e.nodeType == 1)
+						t._fixAppleSpan(e);
+				});
+			} else {
+				// Do post command processing in old WebKit since the browser crashes on Mutator events :(
+				ed.onExecCommand.add(function() {
+					each(ed.dom.select('span'), function(n) {
+						t._fixAppleSpan(n);
+					});
+
+					ed.nodeChanged();
+				});
+			}
+		},
+
+		_fixAppleSpan : function(e) {
+			var ed = this.editor, dom = ed.dom, fz = this.webKitFontSizes, fzn = this.namedFontSizes, s = ed.settings, st, p;
+
+			if (dom.getAttrib(e, 'mce_fixed'))
+				return;
+
+			// Handle Apple style spans
+			if (e.nodeName == 'SPAN' && e.className == 'Apple-style-span') {
+				st = e.style;
+
+				if (!s.convert_fonts_to_spans) {
+					if (st.fontSize) {
+						dom.setAttrib(e, 'mce_name', 'font');
+						dom.setAttrib(e, 'size', inArray(fz, st.fontSize) + 1);
+					}
+
+					if (st.fontFamily) {
+						dom.setAttrib(e, 'mce_name', 'font');
+						dom.setAttrib(e, 'face', st.fontFamily);
+					}
+
+					if (st.color) {
+						dom.setAttrib(e, 'mce_name', 'font');
+						dom.setAttrib(e, 'color', dom.toHex(st.color));
+					}
+
+					if (st.backgroundColor) {
+						dom.setAttrib(e, 'mce_name', 'font');
+						dom.setStyle(e, 'background-color', st.backgroundColor);
+					}
+				} else {
+					if (st.fontSize)
+						dom.setStyle(e, 'fontSize', fzn[inArray(fz, st.fontSize)]);
+				}
+
+				if (st.fontWeight == 'bold')
+					dom.setAttrib(e, 'mce_name', 'strong');
+
+				if (st.fontStyle == 'italic')
+					dom.setAttrib(e, 'mce_name', 'em');
+
+				if (st.textDecoration == 'underline')
+					dom.setAttrib(e, 'mce_name', 'u');
+
+				if (st.textDecoration == 'line-through')
+					dom.setAttrib(e, 'mce_name', 'strike');
+
+				if (st.verticalAlign == 'super')
+					dom.setAttrib(e, 'mce_name', 'sup');
+
+				if (st.verticalAlign == 'sub')
+					dom.setAttrib(e, 'mce_name', 'sub');
+
+				dom.setAttrib(e, 'mce_fixed', '1');
+			}
+		},
+
+		_patchSafari2x : function(ed) {
+			var t = this, setContent, getNode, dom = ed.dom, lr;
+
+			// Inline dialogs
+			if (ed.windowManager.onBeforeOpen) {
+				ed.windowManager.onBeforeOpen.add(function() {
+					r = ed.selection.getRng();
+				});
+			}
+
+			// Fake select on 2.x
+			ed.selection.select = function(n) {
+				this.getSel().setBaseAndExtent(n, 0, n, 1);
+			};
+
+			getNode = ed.selection.getNode;
+			ed.selection.getNode = function() {
+				return t.selElm || getNode.call(this);
+			};
+
+			// Fake range on Safari 2.x
+			ed.selection.getRng = function() {
+				var t = this, s = t.getSel(), d = ed.getDoc(), r, rb, ra, di;
+
+				// Fake range on Safari 2.x
+				if (s.anchorNode) {
+					r = d.createRange();
+
+					try {
+						// Setup before range
+						rb = d.createRange();
+						rb.setStart(s.anchorNode, s.anchorOffset);
+						rb.collapse(1);
+
+						// Setup after range
+						ra = d.createRange();
+						ra.setStart(s.focusNode, s.focusOffset);
+						ra.collapse(1);
+
+						// Setup start/end points by comparing locations
+						di = rb.compareBoundaryPoints(rb.START_TO_END, ra) < 0;
+						r.setStart(di ? s.anchorNode : s.focusNode, di ? s.anchorOffset : s.focusOffset);
+						r.setEnd(di ? s.focusNode : s.anchorNode, di ? s.focusOffset : s.anchorOffset);
+
+						lr = r;
+					} catch (ex) {
+						// Sometimes fails, at least we tried to do it by the book. I hope Safari 2.x will go disappear soooon!!!
+					}
+				}
+
+				return r || lr;
+			};
+
+			// Fix setContent so it works
+			setContent = ed.selection.setContent;
+			ed.selection.setContent = function(h, s) {
+				var r = this.getRng(), b;
+
+				try {
+					setContent.call(this, h, s);
+				} catch (ex) {
+					// Workaround for Safari 2.x
+					b = dom.create('body');
+					b.innerHTML = h;
+
+					each(b.childNodes, function(n) {
+						r.insertNode(n.cloneNode(true));
+					});
+				}
+			};
+		},
+
+		_insertBR : function(ed) {
+			var dom = ed.dom, s = ed.selection, r = s.getRng(), br;
+
+			// Insert BR element
+			r.insertNode(br = dom.create('br'));
+
+			// Place caret after BR
+			r.setStartAfter(br);
+			r.setEndAfter(br);
+			s.setRng(r);
+
+			// Could not place caret after BR then insert an nbsp entity and move the caret
+			if (s.getSel().focusNode == br.previousSibling) {
+				s.select(dom.insertAfter(dom.doc.createTextNode('\u00a0'), br));
+				s.collapse(1);
+			}
+
+			// Scroll to new position, scrollIntoView can't be used due to bug: http://bugs.webkit.org/show_bug.cgi?id=16117
+			ed.getWin().scrollTo(0, dom.getPos(s.getRng().startContainer).y);
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('safari', tinymce.plugins.Safari);
+})();
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/save/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.Save',{init:function(ed,url){var t=this;t.editor=ed;ed.addCommand('mceSave',t._save,t);ed.addCommand('mceCancel',t._cancel,t);ed.addButton('save',{title:'save.save_desc',cmd:'mceSave'});ed.addButton('cancel',{title:'save.cancel_desc',cmd:'mceCancel'});ed.onNodeChange.add(t._nodeChange,t);ed.addShortcut('ctrl+s',ed.getLang('save.save_desc'),'mceSave');},getInfo:function(){return{longname:'Save',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_nodeChange:function(ed,cm,n){var ed=this.editor;if(ed.getParam('save_enablewhendirty')){cm.setDisabled('save',!ed.isDirty());cm.setDisabled('cancel',!ed.isDirty());}},_save:function(){var ed=this.editor,formObj,os,i,elementId;formObj=tinymce.DOM.get(ed.id).form||tinymce.DOM.getParent(ed.id,'form');if(ed.getParam("save_enablewhendirty")&&!ed.isDirty())return;tinyMCE.triggerSave();if(os=ed.getParam("save_onsavecallback")){if(ed.execCallback('save_onsavecallback',ed)){ed.startContent=tinymce.trim(ed.getContent({format:'raw'}));ed.nodeChanged();}return;}if(formObj){ed.isNotDirty=true;if(formObj.onsubmit==null||formObj.onsubmit()!=false)formObj.submit();ed.nodeChanged();}else ed.windowManager.alert("Error: No form element found.");},_cancel:function(){var ed=this.editor,os,h=tinymce.trim(ed.startContent);if(os=ed.getParam("save_oncancelcallback")){ed.execCallback('save_oncancelcallback',ed);return;}ed.setContent(h);ed.undoManager.clear();ed.nodeChanged();}});tinymce.PluginManager.add('save',tinymce.plugins.Save);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/save/editor_plugin_src.js
@@ -1,1 +1,98 @@
+/**
+ * $Id: editor_plugin_src.js 851 2008-05-26 15:38:49Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.Save', {
+		init : function(ed, url) {
+			var t = this;
+
+			t.editor = ed;
+
+			// Register commands
+			ed.addCommand('mceSave', t._save, t);
+			ed.addCommand('mceCancel', t._cancel, t);
+
+			// Register buttons
+			ed.addButton('save', {title : 'save.save_desc', cmd : 'mceSave'});
+			ed.addButton('cancel', {title : 'save.cancel_desc', cmd : 'mceCancel'});
+
+			ed.onNodeChange.add(t._nodeChange, t);
+			ed.addShortcut('ctrl+s', ed.getLang('save.save_desc'), 'mceSave');
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Save',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		},
+
+		// Private methods
+
+		_nodeChange : function(ed, cm, n) {
+			var ed = this.editor;
+
+			if (ed.getParam('save_enablewhendirty')) {
+				cm.setDisabled('save', !ed.isDirty());
+				cm.setDisabled('cancel', !ed.isDirty());
+			}
+		},
+
+		// Private methods
+
+		_save : function() {
+			var ed = this.editor, formObj, os, i, elementId;
+
+			formObj = tinymce.DOM.get(ed.id).form || tinymce.DOM.getParent(ed.id, 'form');
+
+			if (ed.getParam("save_enablewhendirty") && !ed.isDirty())
+				return;
+
+			tinyMCE.triggerSave();
+
+			// Use callback instead
+			if (os = ed.getParam("save_onsavecallback")) {
+				if (ed.execCallback('save_onsavecallback', ed)) {
+					ed.startContent = tinymce.trim(ed.getContent({format : 'raw'}));
+					ed.nodeChanged();
+				}
+
+				return;
+			}
+
+			if (formObj) {
+				ed.isNotDirty = true;
+
+				if (formObj.onsubmit == null || formObj.onsubmit() != false)
+					formObj.submit();
+
+				ed.nodeChanged();
+			} else
+				ed.windowManager.alert("Error: No form element found.");
+		},
+
+		_cancel : function() {
+			var ed = this.editor, os, h = tinymce.trim(ed.startContent);
+
+			// Use callback instead
+			if (os = ed.getParam("save_oncancelcallback")) {
+				ed.execCallback('save_oncancelcallback', ed);
+				return;
+			}
+
+			ed.setContent(h);
+			ed.undoManager.clear();
+			ed.nodeChanged();
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('save', tinymce.plugins.Save);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/save/images/save.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/save/langs/en.js
@@ -1,1 +1,6 @@
+// UK lang variables
 
+tinyMCE.addToLang('',{
+save_desc : 'Save'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/save/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/css/searchreplace.css
@@ -1,1 +1,7 @@
+.panel_wrapper {height:85px;}
+.panel_wrapper div.current {height:85px;}
 
+/* IE */
+* html .panel_wrapper {height:100px;}
+* html .panel_wrapper div.current {height:100px;}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.SearchReplacePlugin',{init:function(ed,url){function open(m){ed.windowManager.open({file:url+'/searchreplace.htm',width:420+parseInt(ed.getLang('searchreplace.delta_width',0)),height:160+parseInt(ed.getLang('searchreplace.delta_height',0)),inline:1,auto_focus:0},{mode:m,search_string:ed.selection.getContent({format:'text'}),plugin_url:url});};ed.addCommand('mceSearch',function(){open('search');});ed.addCommand('mceReplace',function(){open('replace');});ed.addButton('search',{title:'searchreplace.search_desc',cmd:'mceSearch'});ed.addButton('replace',{title:'searchreplace.replace_desc',cmd:'mceReplace'});ed.addShortcut('ctrl+f','searchreplace.search_desc','mceSearch');},getInfo:function(){return{longname:'Search/Replace',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.PluginManager.add('searchreplace',tinymce.plugins.SearchReplacePlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js
@@ -1,1 +1,54 @@
+/**
+ * $Id: editor_plugin_src.js 686 2008-03-09 18:13:49Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.SearchReplacePlugin', {
+		init : function(ed, url) {
+			function open(m) {
+				ed.windowManager.open({
+					file : url + '/searchreplace.htm',
+					width : 420 + parseInt(ed.getLang('searchreplace.delta_width', 0)),
+					height : 160 + parseInt(ed.getLang('searchreplace.delta_height', 0)),
+					inline : 1,
+					auto_focus : 0
+				}, {
+					mode : m,
+					search_string : ed.selection.getContent({format : 'text'}),
+					plugin_url : url
+				});
+			};
+
+			// Register commands
+			ed.addCommand('mceSearch', function() {
+				open('search');
+			});
+
+			ed.addCommand('mceReplace', function() {
+				open('replace');
+			});
+
+			// Register buttons
+			ed.addButton('search', {title : 'searchreplace.search_desc', cmd : 'mceSearch'});
+			ed.addButton('replace', {title : 'searchreplace.replace_desc', cmd : 'mceReplace'});
+
+			ed.addShortcut('ctrl+f', 'searchreplace.search_desc', 'mceSearch');
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Search/Replace',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('searchreplace', tinymce.plugins.SearchReplacePlugin);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/searchreplace/images/replace.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/searchreplace/images/replace_all_button_bg.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/searchreplace/images/replace_button_bg.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/searchreplace/images/search.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js
@@ -1,1 +1,118 @@
+tinyMCEPopup.requireLangPack();
 
+var SearchReplaceDialog = {
+	init : function(ed) {
+		var f = document.forms[0], m = tinyMCEPopup.getWindowArg("mode");
+
+		this.switchMode(m);
+
+		f[m + '_panel_searchstring'].value = tinyMCEPopup.getWindowArg("search_string");
+
+		// Focus input field
+		f[m + '_panel_searchstring'].focus();
+	},
+
+	switchMode : function(m) {
+		var f, lm = this.lastMode;
+
+		if (lm != m) {
+			f = document.forms[0];
+
+			if (lm) {
+				f[m + '_panel_searchstring'].value = f[lm + '_panel_searchstring'].value;
+				f[m + '_panel_backwardsu'].checked = f[lm + '_panel_backwardsu'].checked;
+				f[m + '_panel_backwardsd'].checked = f[lm + '_panel_backwardsd'].checked;
+				f[m + '_panel_casesensitivebox'].checked = f[lm + '_panel_casesensitivebox'].checked;
+			}
+
+			mcTabs.displayTab(m + '_tab',  m + '_panel');
+			document.getElementById("replaceBtn").style.display = (m == "replace") ? "inline" : "none";
+			document.getElementById("replaceAllBtn").style.display = (m == "replace") ? "inline" : "none";
+			this.lastMode = m;
+		}
+	},
+
+	searchNext : function(a) {
+		var ed = tinyMCEPopup.editor, se = ed.selection, r = se.getRng(), f, m = this.lastMode, s, b, fl = 0, w = ed.getWin(), wm = ed.windowManager, fo = 0;
+
+		// Get input
+		f = document.forms[0];
+		s = f[m + '_panel_searchstring'].value;
+		b = f[m + '_panel_backwardsu'].checked;
+		ca = f[m + '_panel_casesensitivebox'].checked;
+		rs = f['replace_panel_replacestring'].value;
+
+		function fix() {
+			// Correct Firefox graphics glitches
+			r = se.getRng().cloneRange();
+			ed.getDoc().execCommand('SelectAll', false, null);
+			se.setRng(r);
+		};
+
+		function replace() {
+			if (tinymce.isIE)
+				ed.selection.getRng().duplicate().pasteHTML(rs); // Needs to be duplicated due to selection bug in IE
+			else
+				ed.getDoc().execCommand('InsertHTML', false, rs);
+		};
+
+		// IE flags
+		if (ca)
+			fl = fl | 4;
+
+		switch (a) {
+			case 'all':
+				if (tinymce.isIE) {
+					while (r.findText(s, b ? -1 : 1, fl)) {
+						r.scrollIntoView();
+						r.select();
+						replace();
+						fo = 1;
+					}
+
+					tinyMCEPopup.storeSelection();
+				} else {
+					while (w.find(s, ca, b, false, false, false, false)) {
+						replace();
+						fo = 1;
+					}
+				}
+
+				if (fo)
+					wm.alert(ed.getLang('searchreplace_dlg.allreplaced'));
+				else
+					wm.alert(ed.getLang('searchreplace_dlg.notfound'));
+
+				return;
+
+			case 'current':
+				replace();
+				break;
+		}
+
+		se.collapse(b);
+		r = se.getRng();
+
+		// Whats the point
+		if (!s)
+			return;
+
+		if (tinymce.isIE) {
+			if (r.findText(s, b ? -1 : 1, fl)) {
+				r.scrollIntoView();
+				r.select();
+			} else
+				wm.alert(ed.getLang('searchreplace_dlg.notfound'));
+
+			tinyMCEPopup.storeSelection();
+		} else {
+			if (!w.find(s, ca, b, false, false, false, false))
+				wm.alert(ed.getLang('searchreplace_dlg.notfound'));
+			else
+				fix();
+		}
+	}
+};
+
+tinyMCEPopup.onInit.add(SearchReplaceDialog.init, SearchReplaceDialog);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/jscripts/replace.js
@@ -1,1 +1,41 @@
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
 
+	var formObj = document.forms[0];
+
+	formObj.searchstring.value = tinyMCE.getWindowArg("searchstring");
+	formObj.replacestring.value = tinyMCE.getWindowArg("replacestring");
+	formObj.casesensitivebox.checked = tinyMCE.getWindowArg("casesensitive");
+//	formObj.backwards[0].checked = tinyMCE.getWindowArg("backwards");
+//	formObj.backwards[1].checked = !tinyMCE.getWindowArg("backwards");
+//		formObj.wrapatend.checked = tinyMCE.getWindowArg("wrap");
+//		formObj.wholeword.checked = tinyMCE.getWindowArg("wholeword");
+
+	tinyMCEPopup.execCommand("mceResetSearch", false, {dummy : ""}, false);
+}
+
+function searchNext(replacemode) {
+	var formObj = document.forms[0];
+
+	// Whats the point?
+	if (formObj.searchstring.value == "" || formObj.searchstring.value == formObj.replacestring.value)
+		return;
+
+	// Do search
+	tinyMCEPopup.execCommand('mceSearch', false, { 
+		string : formObj.searchstring.value,
+		replacestring : formObj.replacestring.value,
+		replacemode : replacemode,
+		casesensitive : formObj.casesensitivebox.checked,
+		backwards : false
+//			wrap : formObj.wrapatend.checked,
+//			wholeword : formObj.wholeword.checked
+		}, false);
+
+	window.focus();
+}
+
+function cancelAction() {
+	tinyMCEPopup.close();
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/jscripts/search.js
@@ -1,1 +1,37 @@
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
 
+	var formObj = document.forms[0];
+
+	formObj.searchstring.value = tinyMCE.getWindowArg("searchstring");
+	formObj.casesensitivebox.checked = tinyMCE.getWindowArg("casesensitive");
+	formObj.backwards[0].checked = tinyMCE.getWindowArg("backwards");
+	formObj.backwards[1].checked = !tinyMCE.getWindowArg("backwards");
+//		formObj.wrapatend.checked = tinyMCE.getWindowArg("wrap");
+//		formObj.wholeword.checked = tinyMCE.getWindowArg("wholeword");
+
+	tinyMCEPopup.execCommand("mceResetSearch", false, {dummy : ""}, false);
+}
+
+function searchNext() {
+	var formObj = document.forms[0];
+
+	if (formObj.searchstring.value == "")
+		return;
+
+	// Do search
+	tinyMCEPopup.execCommand('mceSearch', false, { 
+		string : formObj.searchstring.value,
+		casesensitive : formObj.casesensitivebox.checked,
+		backwards : formObj.backwards[0].checked
+//			wrap : formObj.wrapatend.checked,
+//			wholeword : formObj.wholeword.checked
+		}, false);
+
+	window.focus();
+}
+
+function cancelAction() {
+	tinyMCEPopup.close();
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/jscripts/searchreplace.js
@@ -1,1 +1,86 @@
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
 
+	// start with appropiate tab
+	var task = (tinyMCE.getWindowArg("replacestring") != null) ? "replace" : "search";
+	mcTabs.displayTab(task + '_tab', task +'_panel');
+	manageReplaceButtons();
+	
+	var formObj = document.forms[0];
+
+	formObj[task + "_panel_searchstring"].value = tinyMCE.getWindowArg("searchstring");
+	formObj["replace_panel_replacestring"].value = (tinyMCE.getWindowArg("replacestring") != null) ? tinyMCE.getWindowArg("replacestring") : "";
+	formObj[task + "_panel_casesensitivebox"].checked = tinyMCE.getWindowArg("casesensitive");
+	formObj[task + "_panel_backwardsu"].checked = tinyMCE.getWindowArg("backwards");
+	formObj[task + "_panel_backwardsd"].checked = !tinyMCE.getWindowArg("backwards");
+}
+
+function searchNext(replacemode) {
+	// "search" or "replace" mode of operation?
+	var task = (document.getElementById("search_tab").className == "current") ? "search" : "replace";
+
+	var formObj = document.forms[0];
+
+	if (task == "replace") {
+		// Whats the point?
+		if (formObj[task + "_panel_searchstring"].value == "" || formObj[task + "_panel_searchstring"].value == formObj[task + "_panel_replacestring"].value)
+			return false;
+	}
+
+	// Do search
+	tinyMCEPopup.execCommand('mceSearch', false, { 
+		string : formObj[task + "_panel_searchstring"].value,
+		replacestring : formObj["replace_panel_replacestring"].value,
+		replacemode : replacemode,
+		casesensitive : formObj[task + "_panel_casesensitivebox"].checked,
+		backwards : formObj[task + "_panel_backwardsu"].checked,
+		win : window
+		}, false);
+
+	window.focus();
+
+	return false;
+}
+
+function cancelAction() {
+	tinyMCEPopup.close();
+}
+
+function manageReplaceButtons() {
+	// "search" or "replace" mode of operation?
+	var task = (document.getElementById("search_tab").className == "current") ? "search" : "replace";
+	document.getElementById("replace_buttons").style.visibility = (task == "replace") ? "visible" : "hidden";
+}
+
+function copyValues(link) {
+	// check if tab is already active
+	var tab = link;
+	while (tab.tagName && tab.tagName.toLowerCase() != "li") tab = tab.parentNode;
+	if (tab.className) return false; // tab is already active -> no need to copy any values!
+
+	// copy values from one panel to the other (if they exist there)
+	var from_panel_name = tab.id.match(/^search/i) ? "replace_panel" : "search_panel";
+	var to_panel_name = (from_panel_name == "search_panel") ? "replace_panel" : "search_panel";
+
+	// find all elements with IDs to copy their values
+	var elms = document.getElementById(from_panel_name).getElementsByTagName("*");
+	for (var i = 0; i < elms.length; i++) {
+		if (elms[i].id && elms[i].id != "") {
+			var checked = "undefined";
+			if (elms[i].type.toLowerCase() == "checkbox" || elms[i].type.toLowerCase() == "radio")
+				checked = elms[i].checked;
+
+			// copy values if element exists in other panel
+			var to_elm_name = to_panel_name + elms[i].id.substring(from_panel_name.length, elms[i].id.length);
+			var to_elm = document.getElementById(to_elm_name);
+			if (to_elm) {
+				if (checked != "undefined")
+					to_elm.checked = checked;
+				else
+					to_elm.value = elms[i].value;
+			}
+		}
+	}
+
+	return false;
+}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/cs.js
@@ -1,1 +1,28 @@
+/**
+ * Czech lang variables 
+ * encoding: utf-8
+ *  
+ * $Id$ 
+ */  
 
+tinyMCE.addToLang('',{
+searchreplace_search_desc : 'Najdi',
+searchreplace_searchnext_desc : 'Najdi znova',
+searchreplace_replace_desc : 'Najdi/Nahradit',
+searchreplace_notfound : 'Vyhledávaní ukončeno. Řetězec nemusel být nalezen.',
+searchreplace_search_title : 'Najdi',
+searchreplace_replace_title : 'Najdi/Nahradit',
+searchreplace_allreplaced : 'Všechny výskyty řetězce byly změněny.',
+searchreplace_findwhat : 'Najít',
+searchreplace_replacewith : 'Nahradit',
+searchreplace_direction : 'Směr',
+searchreplace_up : 'Nahoru',
+searchreplace_down : 'Dolů',
+searchreplace_case : 'Přesná shoda',
+searchreplace_findnext : 'Najdi&nbsp;další',
+searchreplace_replace : 'Nahradit',
+searchreplace_replaceall : 'Nahradit&nbsp;vše',
+searchreplace_cancel : 'Zrušit'
+});
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/da.js
@@ -1,1 +1,22 @@
+// DK lang variables contributed by Jan Moelgaard
 
+tinyMCE.addToLang('',{
+searchreplace_search_desc : 'S&#248;g',
+searchreplace_searchnext_desc : 'S&#248;g igen',
+searchreplace_replace_desc : 'S&#248;g og erstat',
+searchreplace_notfound : 'S&#248;gningen er f&#230;rdig. S&#248;geudtrykket kunne ikke findes.',
+searchreplace_search_title : 'S&#248;g',
+searchreplace_replace_title : 'S&#248;g og erstat',
+searchreplace_allreplaced : 'Alle forekomster af s&#248;geudtrykket blev erstattet.',
+searchreplace_findwhat : 'Hvad skal vi s&#248;ge efter',
+searchreplace_replacewith : 'Erstat det med',
+searchreplace_direction : 'Retning',
+searchreplace_up : 'Op',
+searchreplace_down : 'Ned',
+searchreplace_case : 'Skelne mellem store og sm&#229; bogstaver',
+searchreplace_findnext : 'S&#248;g efter&nbsp;n&#230;ste',
+searchreplace_replace : 'Erstat',
+searchreplace_replaceall : 'Erstat&nbsp;alle',
+searchreplace_cancel : 'Fortryd'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/de.js
@@ -1,1 +1,23 @@
+// DE lang variables 
 
+tinyMCE.addToLang('',{
+searchreplace_search_desc : 'Suchen',
+searchreplace_searchnext_desc : 'Erneut suchen',
+searchreplace_replace_desc : 'Suchen/Ersetzen',
+searchreplace_notfound : 'Die Suche wurde abgeschlossen. Das Suchwort wurde nicht gefunden.',
+searchreplace_search_title : 'Suchen',
+searchreplace_replace_title : 'Suchen/Ersetzen',
+searchreplace_allreplaced : 'Die Suche wurde abgeschlossen. Alle Vorkommen wurden ersetzt.',
+searchreplace_findwhat : 'Suchen nach',
+searchreplace_replacewith : 'Ersetzen durch',
+searchreplace_direction : 'Suchrichtung',
+searchreplace_up : 'R&uuml;ckw&auml;rts',
+searchreplace_down : 'Vorw&auml;rts',
+searchreplace_case : 'Gro&szlig;-/Kleinschreibung beachten',
+searchreplace_findnext : 'Weitersuchen',
+searchreplace_replace : 'Ersetzen',
+searchreplace_replaceall : 'Alle ersetzen',
+searchreplace_cancel : 'Abbrechen',
+searchreplace_replace_delta_width : 50
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/en.js
@@ -1,1 +1,22 @@
+// UK lang variables
 
+tinyMCE.addToLang('',{
+searchreplace_search_desc : 'Find',
+searchreplace_searchnext_desc : 'Find again',
+searchreplace_replace_desc : 'Find/Replace',
+searchreplace_notfound : 'The search has been completed. The search string could not be found.',
+searchreplace_search_title : 'Find',
+searchreplace_replace_title : 'Find/Replace',
+searchreplace_allreplaced : 'All occurrences of the search string were replaced.',
+searchreplace_findwhat : 'Find what',
+searchreplace_replacewith : 'Replace with',
+searchreplace_direction : 'Direction',
+searchreplace_up : 'Up',
+searchreplace_down : 'Down',
+searchreplace_case : 'Match case',
+searchreplace_findnext : 'Find&nbsp;next',
+searchreplace_replace : 'Replace',
+searchreplace_replaceall : 'Replace&nbsp;all',
+searchreplace_cancel : 'Cancel'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js
@@ -1,1 +1,16 @@
-
+tinyMCE.addI18n('en.searchreplace_dlg',{
+searchnext_desc:"Find again",
+notfound:"The search has been completed. The search string could not be found.",
+search_title:"Find",
+replace_title:"Find/Replace",
+allreplaced:"All occurrences of the search string were replaced.",
+findwhat:"Find what",
+replacewith:"Replace with",
+direction:"Direction",
+up:"Up",
+down:"Down",
+mcase:"Match case",
+findnext:"Find next",
+replace:"Replace",
+replaceall:"Replace all"
+});

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/fa.js
@@ -1,1 +1,27 @@
+// IR lang variables
+// Persian (Farsi) language pack (for IRAN)
+// By: Morteza Zafari
+// Lost@LostLord.com
+// http://www.LostLord.com
 
+tinyMCE.addToLang('',{
+dir : 'rtl',
+searchreplace_search_desc : '?????',
+searchreplace_searchnext_desc : '?????? ????',
+searchreplace_replace_desc : '?????/????????',
+searchreplace_notfound : '????? ????? ????. ??? ????? ???? ???.',
+searchreplace_search_title : '?????',
+searchreplace_replace_title : '?????/????????',
+searchreplace_allreplaced : '??? ????? ??????? ?????.',
+searchreplace_findwhat : '????? ?? ?????',
+searchreplace_replacewith : '???????? ??',
+searchreplace_direction : '??? ?????',
+searchreplace_up : '?? ??? ????',
+searchreplace_down : '?? ??? ?????',
+searchreplace_case : '????? ???? ???? ? ????',
+searchreplace_findnext : '????-????',
+searchreplace_replace : '???????-??',
+searchreplace_replaceall : '????????-???',
+searchreplace_cancel : '??????'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/fr.js
@@ -1,1 +1,22 @@
+// Franch lang variables by Laurent Dran
 
+tinyMCE.addToLang('',{
+searchreplace_search_desc : 'Trouver',
+searchreplace_searchnext_desc : 'Trouver encore',
+searchreplace_replace_desc : 'Trouver/Remplacer',
+searchreplace_notfound : 'Votre recherche a &eacute;t&eacute; compl&eacute;&eacute;. La recherche de la chaine pourra ne pas aboutir.',
+searchreplace_search_title : 'Trouver',
+searchreplace_replace_title : 'Trouver/Remplacer',
+searchreplace_allreplaced : 'Toutes les occurences de la chaine ont &eacute;t&eacute; remplc&eacute;es.',
+searchreplace_findwhat : 'Trouver le mot',
+searchreplace_replacewith : 'Remplacer avec',
+searchreplace_direction : 'Direction',
+searchreplace_up : 'Haut',
+searchreplace_down : 'Base',
+searchreplace_case : 'Respecter la casse',
+searchreplace_findnext : 'Trouver le prochain',
+searchreplace_replace : 'Remplacer',
+searchreplace_replaceall : 'Remplacer tout',
+searchreplace_cancel : 'Annuler'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/fr_ca.js
@@ -1,1 +1,22 @@
+// Canadian French lang variables by Virtuelcom   last modification: 2005-06-15
 
+tinyMCE.addToLang('',{
+searchreplace_search_desc : 'Chercher',
+searchreplace_searchnext_desc : 'Chercher suivant',
+searchreplace_replace_desc : 'Chercher/Remplacer',

+searchreplace_search_title : 'Chercher',
+searchreplace_replace_title : 'Chercher/Remplacer',

+searchreplace_findwhat : 'Chercher quoi',
+searchreplace_replacewith : 'Remplacer par',
+searchreplace_direction : 'Direction',
+searchreplace_up : 'Monter',
+searchreplace_down : 'Descendre',

+searchreplace_findnext : 'Chercher&nbsp,suivant',
+searchreplace_replace : 'Remplacer',
+searchreplace_replaceall : 'Remplacer&nbsp,tous',
+searchreplace_cancel : 'Annuler'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/he.js
@@ -1,1 +1,22 @@
+// HE lang variables by Liron Newman, http://eesh.net
 
+tinyMCE.addToLang('',{

















+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/hu.js
@@ -1,1 +1,22 @@
+// HU lang variables
 
+tinyMCE.addToLang('',{




+searchreplace_search_title : 'Keres',


+searchreplace_findwhat : 'Mit keres',


+searchreplace_up : 'Fel',
+searchreplace_down : 'Le',





+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/nl.js
@@ -1,1 +1,22 @@
+// NL lang variables
 
+tinyMCE.addToLang('',{
+searchreplace_search_desc : 'Zoeken',
+searchreplace_searchnext_desc : 'Opnieuw zoeken',
+searchreplace_replace_desc : 'Zoeken/Vervang',
+searchreplace_notfound : 'De zoekopdracht is klaar. Het zoekargument was niet gevonden.',
+searchreplace_search_title : 'Zoeken',
+searchreplace_replace_title : 'Zoeken/Vervangen',
+searchreplace_allreplaced : 'Alle zoekargumenten werden vervangen.',
+searchreplace_findwhat : 'Zoek argument',
+searchreplace_replacewith : 'Vervang met',
+searchreplace_direction : 'Richting',
+searchreplace_up : 'Op',
+searchreplace_down : 'Neer',
+searchreplace_case : 'Identieke hoofdletters',
+searchreplace_findnext : 'Volgende zoeken',
+searchreplace_replace : 'Vervang',
+searchreplace_replaceall : 'Vervang&nbsp;alles',
+searchreplace_cancel : 'Annuleer'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/no.js
@@ -1,1 +1,22 @@
+// NO lang variables by Knut B. Jacobsen
 
+tinyMCE.addToLang('',{
+searchreplace_search_desc : 'S&oslash;k',
+searchreplace_searchnext_desc : 'S&oslash;k igjen',
+searchreplace_replace_desc : 'S&oslash;k/Erstatt',
+searchreplace_notfound : 'S&oslash;kingen avsluttet. Fant ikke s&oslash;kestrengen.',
+searchreplace_search_title : 'S&oslash;k',
+searchreplace_replace_title : 'S&oslash;k/Erstatt',
+searchreplace_allreplaced : 'Alle treff p&aring; s&oslash;kestrengen erstattes',
+searchreplace_findwhat : 'S&oslash;k p&aring;',
+searchreplace_replacewith : 'Erstatt med',
+searchreplace_direction : 'S&oslash;keretning',
+searchreplace_up : 'Oppover',
+searchreplace_down : 'Nedover',
+searchreplace_case : 'Skill mellom store og sm&aring; tegn',
+searchreplace_findnext : 'Neste s&oslash;k',
+searchreplace_replace : 'Erstatt',
+searchreplace_replaceall : 'Erstatt&nbsp;alle',
+searchreplace_cancel : 'Avbryt'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/pl.js
@@ -1,1 +1,22 @@
+// PL lang variables
 
+tinyMCE.addToLang('',{
+searchreplace_search_desc : 'Znajdz',
+searchreplace_searchnext_desc : 'Znajdz ponownie',
+searchreplace_replace_desc : 'Znajdz/Zastap',
+searchreplace_notfound : 'Ukonczono wyszukiwanie. Poszukiwana fraza nie zostala odnaleziona.',
+searchreplace_search_title : 'Znajdz',
+searchreplace_replace_title : 'Znajdz/Zastap',
+searchreplace_allreplaced : 'Wszystkie wystapienia poszukiwanej frazy zostaly zastapione. ',
+searchreplace_findwhat : 'Znajdz',
+searchreplace_replacewith : 'Zastap',
+searchreplace_direction : 'Kierunek',
+searchreplace_up : 'Do góry',
+searchreplace_down : 'Do dolu',
+searchreplace_case : 'Wielkosc liter',
+searchreplace_findnext : 'Znajdz&nbsp;nastepny',
+searchreplace_replace : 'Zastap',
+searchreplace_replaceall : 'Zastap&nbsp;wszystkie',
+searchreplace_cancel : 'Wyjdz'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/pt_br.js
@@ -1,1 +1,22 @@
+// pt_BR lang variables
 
+tinyMCE.addToLang('',{
+searchreplace_search_desc : 'Procurar',
+searchreplace_searchnext_desc : 'Procurar novamente',
+searchreplace_replace_desc : 'Procurar/Substituir',

+searchreplace_search_title : 'Procurar',
+searchreplace_replace_title : 'Procurar/Substituir',

+searchreplace_findwhat : 'Procurar por',
+searchreplace_replacewith : 'Substituir com',

+searchreplace_up : 'Acima',
+searchreplace_down : 'Abaixo',
+searchreplace_case : 'Procurar exatamente',

+searchreplace_replace : 'Substituir',
+searchreplace_replaceall : 'Substituir&nbsp,tudo',
+searchreplace_cancel : 'Cancelar'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/sv.js
@@ -1,1 +1,22 @@
+// SE lang variables
 
+tinyMCE.addToLang('',{
+searchreplace_search_desc : 'S&ouml;k',
+searchreplace_searchnext_desc : 'S&ouml;k igen',
+searchreplace_replace_desc : 'S&ouml;k/Ers&auml;tt',
+searchreplace_notfound : 'S&ouml;kningen &auml;r slutf&ouml;rd. S&ouml;kstr&auml;ngen kunde inte hittas.',
+searchreplace_search_title : 'S&ouml;k',
+searchreplace_replace_title : 'S&ouml;k/Ers&auml;tt',
+searchreplace_allreplaced : 'Alla tr&auml;ffar p&aring; s&ouml;kstr&auml;ngen ersattes',
+searchreplace_findwhat : 'S&ouml;k p&aring;',
+searchreplace_replacewith : 'Ers&auml;tt med',
+searchreplace_direction : 'S&ouml;kriktning',
+searchreplace_up : 'Upp&aring;t',
+searchreplace_down : 'Ner&aring;t',
+searchreplace_case : 'Matcha gemener/VERSALER',
+searchreplace_findnext : 'S&ouml;k&nbsp;n&auml;sta',
+searchreplace_replace : 'Ers&auml;tt',
+searchreplace_replaceall : 'Ers&auml;tt&nbsp;alla',
+searchreplace_cancel : 'Avbryt'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/zh_cn.js
@@ -1,1 +1,23 @@
+// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com)

 
+tinyMCE.addToLang('',{

















+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/replace.htm
@@ -1,1 +1,50 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{$lang_searchreplace_replace_title}</title>
+	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script language="javascript" type="text/javascript" src="jscripts/replace.js"></script>
+	<base target="_self" />
+</head>
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none; margin: 4px;">
+<form onsubmit="searchNext('none');return false;" action="#">
+  <table border="0" cellspacing="0" cellpadding="2">
+	  <tr>
+		<td><label for="searchstring">{$lang_searchreplace_findwhat}</label></td>
+		<td><input type="text" id="searchstring" name="searchstring" style="width: 200px" /></td>
+	  </tr>
+	  <tr>
+		<td><label for="replacestring">{$lang_searchreplace_replacewith}</label></td>
+		<td><input type="text" id="replacestring" name="replacestring" style="width: 200px" /></td>
+	  </tr>
+        <tr>
+          <td colspan="2"><!--<table border="0" cellspacing="0" cellpadding="0">
+            <tr>
+              <td><label>{$lang_searchreplace_direction}</label></td>
+              <td><input id="backwardsu" name="backwards" class="radio" type="radio" value="true" /></td>
+              <td><label for="backwardsu">{$lang_searchreplace_up}</label></td>
+              <td><input id="backwardsd" name="backwards" class="radio" type="radio" value="false" /></td>
+              <td><label for="backwardsd">{$lang_searchreplace_down}</label></td>
+            </tr>
+          </table>--></td>
+        </tr>
+        <tr>
+<td colspan="2"><table border="0" cellspacing="0" cellpadding="0">
+  <tr>
+    <td><input id="casesensitivebox" name="casesensitivebox" class="checkbox" type="checkbox" value="true" /></td>
+    <td><label for="casesensitivebox">{$lang_searchreplace_case}</label></td>
+  </tr>
+</table></td>
+</tr>
+      </table>
+  <table border="0" width="300" cellspacing="0" cellpadding="4">
+    <tr>
+      <td><input id="insertBtn" name="insertBtn" type="button" value="{$lang_searchreplace_findnext}" onclick="searchNext('none');" /></td>
+      <td><input name="replaceBtn" type="button" id="replaceBtn" value="{$lang_searchreplace_replace}" onclick="searchNext('current');" /></td>
+      <td><input name="replaceBtn" type="button" id="replaceAllBtn" value="{$lang_searchreplace_replaceall}" onclick="searchNext('all');" /></td>
+     <td align="right"><input name="cancelBtn" type="button" id="cancelBtn" value="{$lang_searchreplace_cancel}" onclick="cancelAction();" /></td>
+    </tr>
+  </table>
+</form>
+</body>
+</html>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/search.htm
@@ -1,1 +1,43 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{$lang_searchreplace_search_title}</title>
+	<script language="javascript" type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script language="javascript" type="text/javascript" src="jscripts/search.js"></script>
+	<base target="_self" />
+</head>
+<body onload="tinyMCEPopup.executeOnLoad('init();');" style="display: none; margin: 4px;">
+<form onsubmit="searchNext();return false;" action="#">
+  <table border="0" cellspacing="0" cellpadding="2">
+        <tr>
+          <td><label for="searchstring">{$lang_searchreplace_findwhat}</label>&nbsp;<input type="text" id="searchstring" name="searchstring" style="width: 200px" /></td>
+        </tr>
+        <tr>
+          <td><table border="0" cellspacing="0" cellpadding="0">
+            <tr>
+              <td><label>{$lang_searchreplace_direction}</label></td>
+              <td><input id="backwardsu" name="backwards" class="radio" type="radio" value="true" /></td>
+              <td><label for="backwardsu">{$lang_searchreplace_up}</label></td>
+              <td><input id="backwardsd" name="backwards" class="radio" type="radio" value="false" /></td>
+              <td><label for="backwardsd">{$lang_searchreplace_down}</label></td>
+            </tr>
+          </table></td>
+        </tr>
+        <tr>
+<td><table border="0" cellspacing="0" cellpadding="0">
+  <tr>
+    <td><input id="casesensitivebox" name="casesensitivebox" class="checkbox" type="checkbox" value="true" /></td>
+    <td><label for="casesensitivebox">{$lang_searchreplace_case}</label></td>
+  </tr>
+</table></td>
+</tr>
+      </table>
+  <table border="0" width="300" cellspacing="0" cellpadding="4">
+    <tr>
+      <td><input id="insert" name="insert" type="submit" value="{$lang_searchreplace_findnext}" /></td>
+      <td align="right"><input id="cancel" name="cancel" type="button" value="{$lang_searchreplace_cancel}" onclick="cancelAction();" /></td>
+    </tr>
+  </table>
+</form>
+</body>
+</html>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm
@@ -1,1 +1,106 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#searchreplace_dlg.replace_title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="js/searchreplace.js"></script>
+	<link rel="stylesheet" type="text/css" href="css/searchreplace.css" />
+	<base target="_self" />
+</head>
+<body style="display:none;">
+<form onsubmit="SearchReplaceDialog.searchNext('none');return false;" action="#">
+	<div class="tabs">
+		<ul>
+			<li id="search_tab"><span><a href="javascript:SearchReplaceDialog.switchMode('search');" onmousedown="return false;">{#searchreplace.search_desc}</a></span></li>
+			<li id="replace_tab"><span><a href="javascript:SearchReplaceDialog.switchMode('replace');" onmousedown="return false;">{#searchreplace_dlg.replace}</a></span></li>
+		</ul>
+	</div>
 
+	<div class="panel_wrapper">
+		<div id="search_panel" class="panel">
+			<table border="0" cellspacing="0" cellpadding="2">
+				<tr>
+					<td><label for="search_panel_searchstring">{#searchreplace_dlg.findwhat}</label></td>
+					<td><input type="text" id="search_panel_searchstring" name="search_panel_searchstring" style="width: 200px" /></td>
+				</tr>
+				<tr>
+					<td colspan="2">
+						<table border="0" cellspacing="0" cellpadding="0" class="direction">
+							<tr>
+								<td><label>{#searchreplace_dlg.direction}</label></td>
+								<td><input id="search_panel_backwardsu" name="search_panel_backwards" class="radio" type="radio" /></td>
+								<td><label for="search_panel_backwardsu">{#searchreplace_dlg.up}</label></td>
+								<td><input id="search_panel_backwardsd" name="search_panel_backwards" class="radio" type="radio" checked="checked" /></td>
+								<td><label for="search_panel_backwardsd">{#searchreplace_dlg.down}</label></td>
+							</tr>
+						</table>
+					</td>
+				</tr>
+				<tr>
+					<td colspan="2">
+						<table border="0" cellspacing="0" cellpadding="0">
+							<tr>
+								<td><input id="search_panel_casesensitivebox" name="search_panel_casesensitivebox" class="checkbox" type="checkbox" /></td>
+								<td><label for="search_panel_casesensitivebox">{#searchreplace_dlg.mcase}</label></td>
+							</tr>
+						</table>
+					</td>
+				</tr>
+			</table>
+		</div>
+
+		<div id="replace_panel" class="panel">
+			<table border="0" cellspacing="0" cellpadding="2">
+				<tr>
+					<td><label for="replace_panel_searchstring">{#searchreplace_dlg.findwhat}</label></td>
+					<td><input type="text" id="replace_panel_searchstring" name="replace_panel_searchstring" style="width: 200px" /></td>
+				</tr>
+				<tr>
+					<td><label for="replace_panel_replacestring">{#searchreplace_dlg.replacewith}</label></td>
+					<td><input type="text" id="replace_panel_replacestring" name="replace_panel_replacestring" style="width: 200px" /></td>
+				</tr>
+				<tr>
+					<td colspan="2">
+						<table border="0" cellspacing="0" cellpadding="0" class="direction">
+							<tr>
+								<td><label>{#searchreplace_dlg.direction}</label></td>
+								<td><input id="replace_panel_backwardsu" name="replace_panel_backwards" class="radio" type="radio" /></td>
+								<td><label for="replace_panel_backwardsu">{#searchreplace_dlg.up}</label></td>
+								<td><input id="replace_panel_backwardsd" name="replace_panel_backwards" class="radio" type="radio" checked="checked" /></td>
+								<td><label for="replace_panel_backwardsd">{#searchreplace_dlg.down}</label></td>
+							</tr>
+						</table>
+					</td>
+				</tr>
+				<tr>
+					<td colspan="2">
+						<table border="0" cellspacing="0" cellpadding="0">
+							<tr>
+								<td><input id="replace_panel_casesensitivebox" name="replace_panel_casesensitivebox" class="checkbox" type="checkbox" /></td>
+								<td><label for="replace_panel_casesensitivebox">{#searchreplace_dlg.mcase}</label></td>
+							</tr>
+						</table>
+					</td>
+				</tr>
+			</table>
+		</div>
+
+	</div>
+
+	<div class="mceActionPanel">
+		<div style="float: left">
+			<input type="submit" id="insert" name="insert" value="{#searchreplace_dlg.findnext}" />
+			<input type="button" class="button" id="replaceBtn" name="replaceBtn" value="{#searchreplace_dlg.replace}" onclick="SearchReplaceDialog.searchNext('current');" />
+			<input type="button" class="button" id="replaceAllBtn" name="replaceAllBtn" value="{#searchreplace_dlg.replaceall}" onclick="SearchReplaceDialog.searchNext('all');" />
+		</div>
+
+		<div style="float: right">	
+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+		</div>
+	</div>
+</form>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/spellchecker/css/content.css
@@ -1,1 +1,2 @@
+.mceItemHiddenSpellWord {background:url(../img/wline.gif) repeat-x bottom left; cursor:default;}
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/spellchecker/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){var JSONRequest=tinymce.util.JSONRequest,each=tinymce.each,DOM=tinymce.DOM;tinymce.create('tinymce.plugins.SpellcheckerPlugin',{getInfo:function(){return{longname:'Spellchecker',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker',version:tinymce.majorVersion+"."+tinymce.minorVersion};},init:function(ed,url){var t=this,cm;t.url=url;t.editor=ed;ed.addCommand('mceSpellCheck',function(){if(!t.active){ed.setProgressState(1);t._sendRPC('checkWords',[t.selectedLang,t._getWords()],function(r){if(r.length>0){t.active=1;t._markWords(r);ed.setProgressState(0);ed.nodeChanged();}else{ed.setProgressState(0);ed.windowManager.alert('spellchecker.no_mpell');}});}else t._done();});ed.onInit.add(function(){if(ed.settings.content_css!==false)ed.dom.loadCSS(url+'/css/content.css');});ed.onClick.add(t._showMenu,t);ed.onContextMenu.add(t._showMenu,t);ed.onBeforeGetContent.add(function(){if(t.active)t._removeWords();});ed.onNodeChange.add(function(ed,cm){cm.setActive('spellchecker',t.active);});ed.onSetContent.add(function(){t._done();});ed.onBeforeGetContent.add(function(){t._done();});ed.onBeforeExecCommand.add(function(ed,cmd){if(cmd=='mceFullScreen')t._done();});t.languages={};each(ed.getParam('spellchecker_languages','+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv','hash'),function(v,k){if(k.indexOf('+')===0){k=k.substring(1);t.selectedLang=v;}t.languages[k]=v;});},createControl:function(n,cm){var t=this,c,ed=t.editor;if(n=='spellchecker'){c=cm.createSplitButton(n,{title:'spellchecker.desc',cmd:'mceSpellCheck',scope:t});c.onRenderMenu.add(function(c,m){m.add({title:'spellchecker.langs','class':'mceMenuItemTitle'}).setDisabled(1);each(t.languages,function(v,k){var o={icon:1},mi;o.onclick=function(){mi.setSelected(1);t.selectedItem.setSelected(0);t.selectedItem=mi;t.selectedLang=v;};o.title=k;mi=m.add(o);mi.setSelected(v==t.selectedLang);if(v==t.selectedLang)t.selectedItem=mi;})});return c;}},_walk:function(n,f){var d=this.editor.getDoc(),w;if(d.createTreeWalker){w=d.createTreeWalker(n,NodeFilter.SHOW_TEXT,null,false);while((n=w.nextNode())!=null)f.call(this,n);}else tinymce.walk(n,f,'childNodes');},_getSeparators:function(){var re='',i,str=this.editor.getParam('spellchecker_word_separator_chars','\\s!"#$%&()*+,-./:;<=>?@[\]^_{|}����������������\u201d\u201c');for(i=0;i<str.length;i++)re+='\\'+str.charAt(i);return re;},_getWords:function(){var ed=this.editor,wl=[],tx='',lo={};this._walk(ed.getBody(),function(n){if(n.nodeType==3)tx+=n.nodeValue+' ';});tx=tx.replace(new RegExp('([0-9]|['+this._getSeparators()+'])','g'),' ');tx=tinymce.trim(tx.replace(/(\s+)/g,' '));each(tx.split(' '),function(v){if(!lo[v]){wl.push(v);lo[v]=1;}});return wl;},_removeWords:function(w){var ed=this.editor,dom=ed.dom,se=ed.selection,b=se.getBookmark();each(dom.select('span').reverse(),function(n){if(n&&(dom.hasClass(n,'mceItemHiddenSpellWord')||dom.hasClass(n,'mceItemHidden'))){if(!w||dom.decode(n.innerHTML)==w)dom.remove(n,1);}});se.moveToBookmark(b);},_markWords:function(wl){var r1,r2,r3,r4,r5,w='',ed=this.editor,re=this._getSeparators(),dom=ed.dom,nl=[];var se=ed.selection,b=se.getBookmark();each(wl,function(v){w+=(w?'|':'')+v;});r1=new RegExp('(['+re+'])('+w+')(['+re+'])','g');r2=new RegExp('^('+w+')','g');r3=new RegExp('('+w+')(['+re+']?)$','g');r4=new RegExp('^('+w+')(['+re+']?)$','g');r5=new RegExp('('+w+')(['+re+'])','g');this._walk(this.editor.getBody(),function(n){if(n.nodeType==3){nl.push(n);}});each(nl,function(n){var v;if(n.nodeType==3){v=n.nodeValue;if(r1.test(v)||r2.test(v)||r3.test(v)||r4.test(v)){v=dom.encode(v);v=v.replace(r5,'<span class="mceItemHiddenSpellWord">$1</span>$2');v=v.replace(r3,'<span class="mceItemHiddenSpellWord">$1</span>$2');dom.replace(dom.create('span',{'class':'mceItemHidden'},v),n);}}});se.moveToBookmark(b);},_showMenu:function(ed,e){var t=this,ed=t.editor,m=t._menu,p1,dom=ed.dom,vp=dom.getViewPort(ed.getWin());if(!m){p1=DOM.getPos(ed.getContentAreaContainer());m=ed.controlManager.createDropMenu('spellcheckermenu',{offset_x:p1.x,offset_y:p1.y,'class':'mceNoIcons'});t._menu=m;}if(dom.hasClass(e.target,'mceItemHiddenSpellWord')){m.removeAll();m.add({title:'spellchecker.wait','class':'mceMenuItemTitle'}).setDisabled(1);t._sendRPC('getSuggestions',[t.selectedLang,dom.decode(e.target.innerHTML)],function(r){m.removeAll();if(r.length>0){m.add({title:'spellchecker.sug','class':'mceMenuItemTitle'}).setDisabled(1);each(r,function(v){m.add({title:v,onclick:function(){dom.replace(ed.getDoc().createTextNode(v),e.target);t._checkDone();}});});m.addSeparator();}else m.add({title:'spellchecker.no_sug','class':'mceMenuItemTitle'}).setDisabled(1);m.add({title:'spellchecker.ignore_word',onclick:function(){dom.remove(e.target,1);t._checkDone();}});m.add({title:'spellchecker.ignore_words',onclick:function(){t._removeWords(dom.decode(e.target.innerHTML));t._checkDone();}});m.update();});ed.selection.select(e.target);p1=dom.getPos(e.target);m.showMenu(p1.x,p1.y+e.target.offsetHeight-vp.y);return tinymce.dom.Event.cancel(e);}else m.hideMenu();},_checkDone:function(){var t=this,ed=t.editor,dom=ed.dom,o;each(dom.select('span'),function(n){if(n&&dom.hasClass(n,'mceItemHiddenSpellWord')){o=true;return false;}});if(!o)t._done();},_done:function(){var t=this,la=t.active;if(t.active){t.active=0;t._removeWords();if(t._menu)t._menu.hideMenu();if(la)t.editor.nodeChanged();}},_sendRPC:function(m,p,cb){var t=this,url=t.editor.getParam("spellchecker_rpc_url","{backend}");if(url=='{backend}'){t.editor.setProgressState(0);alert('Please specify: spellchecker_rpc_url');return;}JSONRequest.sendRPC({url:url,method:m,params:p,success:cb,error:function(e,x){t.editor.setProgressState(0);t.editor.windowManager.alert(e.errstr||('Error response: '+x.responseText));}});}});tinymce.PluginManager.add('spellchecker',tinymce.plugins.SpellcheckerPlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js
@@ -1,1 +1,338 @@
-
+/**
+ * $Id: editor_plugin_src.js 425 2007-11-21 15:17:39Z spocke $
+ *
+ * @author Moxiecode

+ */
+
+(function() {
+	var JSONRequest = tinymce.util.JSONRequest, each = tinymce.each, DOM = tinymce.DOM;
+
+	tinymce.create('tinymce.plugins.SpellcheckerPlugin', {
+		getInfo : function() {
+			return {
+				longname : 'Spellchecker',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		},
+
+		init : function(ed, url) {
+			var t = this, cm;
+
+			t.url = url;
+			t.editor = ed;
+
+			// Register commands
+			ed.addCommand('mceSpellCheck', function() {
+				if (!t.active) {
+					ed.setProgressState(1);
+					t._sendRPC('checkWords', [t.selectedLang, t._getWords()], function(r) {
+						if (r.length > 0) {
+							t.active = 1;
+							t._markWords(r);
+							ed.setProgressState(0);
+							ed.nodeChanged();
+						} else {
+							ed.setProgressState(0);
+							ed.windowManager.alert('spellchecker.no_mpell');
+						}
+					});
+				} else
+					t._done();
+			});
+
+			ed.onInit.add(function() {
+				if (ed.settings.content_css !== false)
+					ed.dom.loadCSS(url + '/css/content.css');
+			});
+
+			ed.onClick.add(t._showMenu, t);
+			ed.onContextMenu.add(t._showMenu, t);
+			ed.onBeforeGetContent.add(function() {
+				if (t.active)
+					t._removeWords();
+			});
+
+			ed.onNodeChange.add(function(ed, cm) {
+				cm.setActive('spellchecker', t.active);
+			});
+
+			ed.onSetContent.add(function() {
+				t._done();
+			});
+
+			ed.onBeforeGetContent.add(function() {
+				t._done();
+			});
+
+			ed.onBeforeExecCommand.add(function(ed, cmd) {
+				if (cmd == 'mceFullScreen')
+					t._done();
+			});
+
+			// Find selected language
+			t.languages = {};
+			each(ed.getParam('spellchecker_languages', '+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv', 'hash'), function(v, k) {
+				if (k.indexOf('+') === 0) {
+					k = k.substring(1);
+					t.selectedLang = v;
+				}
+
+				t.languages[k] = v;
+			});
+		},
+
+		createControl : function(n, cm) {
+			var t = this, c, ed = t.editor;
+
+			if (n == 'spellchecker') {
+				c = cm.createSplitButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t});
+
+				c.onRenderMenu.add(function(c, m) {
+					m.add({title : 'spellchecker.langs', 'class' : 'mceMenuItemTitle'}).setDisabled(1);
+					each(t.languages, function(v, k) {
+						var o = {icon : 1}, mi;
+
+						o.onclick = function() {
+							mi.setSelected(1);
+							t.selectedItem.setSelected(0);
+							t.selectedItem = mi;
+							t.selectedLang = v;
+						};
+
+						o.title = k;
+						mi = m.add(o);
+						mi.setSelected(v == t.selectedLang);
+
+						if (v == t.selectedLang)
+							t.selectedItem = mi;
+					})
+				});
+
+				return c;
+			}
+		},
+
+		// Internal functions
+
+		_walk : function(n, f) {
+			var d = this.editor.getDoc(), w;
+
+			if (d.createTreeWalker) {
+				w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false);
+
+				while ((n = w.nextNode()) != null)
+					f.call(this, n);
+			} else
+				tinymce.walk(n, f, 'childNodes');
+		},
+
+		_getSeparators : function() {

+
+			// Build word separator regexp
+			for (i=0; i<str.length; i++)
+				re += '\\' + str.charAt(i);
+
+			return re;
+		},
+
+		_getWords : function() {
+			var ed = this.editor, wl = [], tx = '', lo = {};
+
+			// Get area text
+			this._walk(ed.getBody(), function(n) {
+				if (n.nodeType == 3)
+					tx += n.nodeValue + ' ';
+			});
+
+			// Split words by separator
+			tx = tx.replace(new RegExp('([0-9]|[' + this._getSeparators() + '])', 'g'), ' ');
+			tx = tinymce.trim(tx.replace(/(\s+)/g, ' '));
+
+			// Build word array and remove duplicates
+			each(tx.split(' '), function(v) {
+				if (!lo[v]) {
+					wl.push(v);
+					lo[v] = 1;
+				}
+			});
+
+			return wl;
+		},
+
+		_removeWords : function(w) {
+			var ed = this.editor, dom = ed.dom, se = ed.selection, b = se.getBookmark();
+
+			each(dom.select('span').reverse(), function(n) {
+				if (n && (dom.hasClass(n, 'mceItemHiddenSpellWord') || dom.hasClass(n, 'mceItemHidden'))) {
+					if (!w || dom.decode(n.innerHTML) == w)
+						dom.remove(n, 1);
+				}
+			});
+
+			se.moveToBookmark(b);
+		},
+
+		_markWords : function(wl) {
+			var r1, r2, r3, r4, r5, w = '', ed = this.editor, re = this._getSeparators(), dom = ed.dom, nl = [];
+			var se = ed.selection, b = se.getBookmark();
+
+			each(wl, function(v) {
+				w += (w ? '|' : '') + v;
+			});
+
+			r1 = new RegExp('([' + re + '])(' + w + ')([' + re + '])', 'g');
+			r2 = new RegExp('^(' + w + ')', 'g');
+			r3 = new RegExp('(' + w + ')([' + re + ']?)$', 'g');
+			r4 = new RegExp('^(' + w + ')([' + re + ']?)$', 'g');
+			r5 = new RegExp('(' + w + ')([' + re + '])', 'g');
+
+			// Collect all text nodes
+			this._walk(this.editor.getBody(), function(n) {
+				if (n.nodeType == 3) {
+					nl.push(n);
+				}
+			});
+
+			// Wrap incorrect words in spans
+			each(nl, function(n) {
+				var v;
+
+				if (n.nodeType == 3) {
+					v = n.nodeValue;
+
+					if (r1.test(v) || r2.test(v) || r3.test(v) || r4.test(v)) {
+						v = dom.encode(v);
+						v = v.replace(r5, '<span class="mceItemHiddenSpellWord">$1</span>$2');
+						v = v.replace(r3, '<span class="mceItemHiddenSpellWord">$1</span>$2');
+
+						dom.replace(dom.create('span', {'class' : 'mceItemHidden'}, v), n);
+					}
+				}
+			});
+
+			se.moveToBookmark(b);
+		},
+
+		_showMenu : function(ed, e) {
+			var t = this, ed = t.editor, m = t._menu, p1, dom = ed.dom, vp = dom.getViewPort(ed.getWin());
+
+			if (!m) {
+				p1 = DOM.getPos(ed.getContentAreaContainer());
+				//p2 = DOM.getPos(ed.getContainer());
+
+				m = ed.controlManager.createDropMenu('spellcheckermenu', {
+					offset_x : p1.x,
+					offset_y : p1.y,
+					'class' : 'mceNoIcons'
+				});
+
+				t._menu = m;
+			}
+
+			if (dom.hasClass(e.target, 'mceItemHiddenSpellWord')) {
+				m.removeAll();
+				m.add({title : 'spellchecker.wait', 'class' : 'mceMenuItemTitle'}).setDisabled(1);
+
+				t._sendRPC('getSuggestions', [t.selectedLang, dom.decode(e.target.innerHTML)], function(r) {
+					m.removeAll();
+
+					if (r.length > 0) {
+						m.add({title : 'spellchecker.sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1);
+						each(r, function(v) {
+							m.add({title : v, onclick : function() {
+								dom.replace(ed.getDoc().createTextNode(v), e.target);
+								t._checkDone();
+							}});
+						});
+
+						m.addSeparator();
+					} else
+						m.add({title : 'spellchecker.no_sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1);
+
+					m.add({
+						title : 'spellchecker.ignore_word',
+						onclick : function() {
+							dom.remove(e.target, 1);
+							t._checkDone();
+						}
+					});
+
+					m.add({
+						title : 'spellchecker.ignore_words',
+						onclick : function() {
+							t._removeWords(dom.decode(e.target.innerHTML));
+							t._checkDone();
+						}
+					});
+
+					m.update();
+				});
+
+				ed.selection.select(e.target);
+				p1 = dom.getPos(e.target);
+				m.showMenu(p1.x, p1.y + e.target.offsetHeight - vp.y);
+
+				return tinymce.dom.Event.cancel(e);
+			} else
+				m.hideMenu();
+		},
+
+		_checkDone : function() {
+			var t = this, ed = t.editor, dom = ed.dom, o;
+
+			each(dom.select('span'), function(n) {
+				if (n && dom.hasClass(n, 'mceItemHiddenSpellWord')) {
+					o = true;
+					return false;
+				}
+			});
+
+			if (!o)
+				t._done();
+		},
+
+		_done : function() {
+			var t = this, la = t.active;
+
+			if (t.active) {
+				t.active = 0;
+				t._removeWords();
+
+				if (t._menu)
+					t._menu.hideMenu();
+
+				if (la)
+					t.editor.nodeChanged();
+			}
+		},
+
+		_sendRPC : function(m, p, cb) {
+			var t = this, url = t.editor.getParam("spellchecker_rpc_url", "{backend}");
+
+			if (url == '{backend}') {
+				t.editor.setProgressState(0);
+				alert('Please specify: spellchecker_rpc_url');
+				return;
+			}
+
+			JSONRequest.sendRPC({
+				url : url,
+				method : m,
+				params : p,
+				success : cb,
+				error : function(e, x) {
+					t.editor.setProgressState(0);
+					t.editor.windowManager.alert(e.errstr || ('Error response: ' + x.responseText));
+				}
+			});
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('spellchecker', tinymce.plugins.SpellcheckerPlugin);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/spellchecker/img/wline.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/style/css/props.css
@@ -1,1 +1,14 @@
+#text_font {width:250px;}
+#text_size {width:70px;}
+.mceAddSelectValue {background:#DDD;}
+select, #block_text_indent, #box_width, #box_height, #box_padding_top, #box_padding_right, #box_padding_bottom, #box_padding_left {width:70px;}
+#box_margin_top, #box_margin_right, #box_margin_bottom, #box_margin_left, #positioning_width, #positioning_height, #positioning_zindex {width:70px;}
+#positioning_placement_top, #positioning_placement_right, #positioning_placement_bottom, #positioning_placement_left {width:70px;}
+#positioning_clip_top, #positioning_clip_right, #positioning_clip_bottom, #positioning_clip_left {width:70px;}
+.panel_wrapper div.current {padding-top:10px;height:230px;}
+.delim {border-left:1px solid gray;}
+.tdelim {border-bottom:1px solid gray;}
+#block_display {width:145px;}
+#list_type {width:115px;}
+.disabled {background:#EEE;}
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/style/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.StylePlugin',{init:function(ed,url){ed.addCommand('mceStyleProps',function(){ed.windowManager.open({file:url+'/props.htm',width:480+parseInt(ed.getLang('style.delta_width',0)),height:320+parseInt(ed.getLang('style.delta_height',0)),inline:1},{plugin_url:url,style_text:ed.selection.getNode().style.cssText});});ed.addCommand('mceSetElementStyle',function(ui,v){if(e=ed.selection.getNode()){ed.dom.setAttrib(e,'style',v);ed.execCommand('mceRepaint');}});ed.onNodeChange.add(function(ed,cm,n){cm.setDisabled('styleprops',n.nodeName==='BODY');});ed.addButton('styleprops',{title:'style.desc',cmd:'mceStyleProps'});},getInfo:function(){return{longname:'Style',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/style',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.PluginManager.add('style',tinymce.plugins.StylePlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/style/editor_plugin_src.js
@@ -1,1 +1,52 @@
+/**
+ * $Id: editor_plugin_src.js 787 2008-04-10 11:40:57Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.StylePlugin', {
+		init : function(ed, url) {
+			// Register commands
+			ed.addCommand('mceStyleProps', function() {
+				ed.windowManager.open({
+					file : url + '/props.htm',
+					width : 480 + parseInt(ed.getLang('style.delta_width', 0)),
+					height : 320 + parseInt(ed.getLang('style.delta_height', 0)),
+					inline : 1
+				}, {
+					plugin_url : url,
+					style_text : ed.selection.getNode().style.cssText
+				});
+			});
+
+			ed.addCommand('mceSetElementStyle', function(ui, v) {
+				if (e = ed.selection.getNode()) {
+					ed.dom.setAttrib(e, 'style', v);
+					ed.execCommand('mceRepaint');
+				}
+			});
+
+			ed.onNodeChange.add(function(ed, cm, n) {
+				cm.setDisabled('styleprops', n.nodeName === 'BODY');
+			});
+
+			// Register buttons
+			ed.addButton('styleprops', {title : 'style.desc', cmd : 'mceStyleProps'});
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Style',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/style',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('style', tinymce.plugins.StylePlugin);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/style/images/apply_button_bg.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/style/images/style_info.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/style/images/styleprops.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/style/js/props.js
@@ -1,1 +1,642 @@
-
+tinyMCEPopup.requireLangPack();
+
+var defaultFonts = "" + 
+	"Arial, Helvetica, sans-serif=Arial, Helvetica, sans-serif;" + 
+	"Times New Roman, Times, serif=Times New Roman, Times, serif;" + 
+	"Courier New, Courier, mono=Courier New, Courier, mono;" + 
+	"Times New Roman, Times, serif=Times New Roman, Times, serif;" + 
+	"Georgia, Times New Roman, Times, serif=Georgia, Times New Roman, Times, serif;" + 
+	"Verdana, Arial, Helvetica, sans-serif=Verdana, Arial, Helvetica, sans-serif;" + 
+	"Geneva, Arial, Helvetica, sans-serif=Geneva, Arial, Helvetica, sans-serif";
+
+var defaultSizes = "9;10;12;14;16;18;24;xx-small;x-small;small;medium;large;x-large;xx-large;smaller;larger";
+var defaultMeasurement = "+pixels=px;points=pt;em;in;cm;mm;picas;ems;exs;%";
+var defaultSpacingMeasurement = "pixels=px;points=pt;in;cm;mm;picas;+ems;exs;%";
+var defaultIndentMeasurement = "pixels=px;+points=pt;in;cm;mm;picas;ems;exs;%";
+var defaultWeight = "normal;bold;bolder;lighter;100;200;300;400;500;600;700;800;900";
+var defaultTextStyle = "normal;italic;oblique";
+var defaultVariant = "normal;small-caps";
+var defaultLineHeight = "normal";
+var defaultAttachment = "fixed;scroll";
+var defaultRepeat = "no-repeat;repeat;repeat-x;repeat-y";
+var defaultPosH = "left;center;right";
+var defaultPosV = "top;center;bottom";
+var defaultVAlign = "baseline;sub;super;top;text-top;middle;bottom;text-bottom";
+var defaultDisplay = "inline;block;list-item;run-in;compact;marker;table;inline-table;table-row-group;table-header-group;table-footer-group;table-row;table-column-group;table-column;table-cell;table-caption;none";
+var defaultBorderStyle = "none;solid;dashed;dotted;double;groove;ridge;inset;outset";
+var defaultBorderWidth = "thin;medium;thick";
+var defaultListType = "disc;circle;square;decimal;lower-roman;upper-roman;lower-alpha;upper-alpha;none";
+
+function init() {
+	var ce = document.getElementById('container'), h;
+
+	ce.style.cssText = tinyMCEPopup.getWindowArg('style_text');
+
+	h = getBrowserHTML('background_image_browser','background_image','image','advimage');
+	document.getElementById("background_image_browser").innerHTML = h;
+
+	document.getElementById('text_color_pickcontainer').innerHTML = getColorPickerHTML('text_color_pick','text_color');
+	document.getElementById('background_color_pickcontainer').innerHTML = getColorPickerHTML('background_color_pick','background_color');
+	document.getElementById('border_color_top_pickcontainer').innerHTML = getColorPickerHTML('border_color_top_pick','border_color_top');
+	document.getElementById('border_color_right_pickcontainer').innerHTML = getColorPickerHTML('border_color_right_pick','border_color_right');
+	document.getElementById('border_color_bottom_pickcontainer').innerHTML = getColorPickerHTML('border_color_bottom_pick','border_color_bottom');
+	document.getElementById('border_color_left_pickcontainer').innerHTML = getColorPickerHTML('border_color_left_pick','border_color_left');
+
+	fillSelect(0, 'text_font', 'style_font', defaultFonts, ';', true);
+	fillSelect(0, 'text_size', 'style_font_size', defaultSizes, ';', true);
+	fillSelect(0, 'text_size_measurement', 'style_font_size_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'text_case', 'style_text_case', "capitalize;uppercase;lowercase", ';', true);
+	fillSelect(0, 'text_weight', 'style_font_weight', defaultWeight, ';', true);
+	fillSelect(0, 'text_style', 'style_font_style', defaultTextStyle, ';', true);
+	fillSelect(0, 'text_variant', 'style_font_variant', defaultVariant, ';', true);
+	fillSelect(0, 'text_lineheight', 'style_font_line_height', defaultLineHeight, ';', true);
+	fillSelect(0, 'text_lineheight_measurement', 'style_font_line_height_measurement', defaultMeasurement, ';', true);
+
+	fillSelect(0, 'background_attachment', 'style_background_attachment', defaultAttachment, ';', true);
+	fillSelect(0, 'background_repeat', 'style_background_repeat', defaultRepeat, ';', true);
+
+	fillSelect(0, 'background_hpos_measurement', 'style_background_hpos_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'background_vpos_measurement', 'style_background_vpos_measurement', defaultMeasurement, ';', true);
+
+	fillSelect(0, 'background_hpos', 'style_background_hpos', defaultPosH, ';', true);
+	fillSelect(0, 'background_vpos', 'style_background_vpos', defaultPosV, ';', true);
+
+	fillSelect(0, 'block_wordspacing', 'style_wordspacing', 'normal', ';', true);
+	fillSelect(0, 'block_wordspacing_measurement', 'style_wordspacing_measurement', defaultSpacingMeasurement, ';', true);
+	fillSelect(0, 'block_letterspacing', 'style_letterspacing', 'normal', ';', true);
+	fillSelect(0, 'block_letterspacing_measurement', 'style_letterspacing_measurement', defaultSpacingMeasurement, ';', true);
+	fillSelect(0, 'block_vertical_alignment', 'style_vertical_alignment', defaultVAlign, ';', true);
+	fillSelect(0, 'block_text_align', 'style_text_align', "left;right;center;justify", ';', true);
+	fillSelect(0, 'block_whitespace', 'style_whitespace', "normal;pre;nowrap", ';', true);
+	fillSelect(0, 'block_display', 'style_display', defaultDisplay, ';', true);
+	fillSelect(0, 'block_text_indent_measurement', 'style_text_indent_measurement', defaultIndentMeasurement, ';', true);
+
+	fillSelect(0, 'box_width_measurement', 'style_box_width_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'box_height_measurement', 'style_box_height_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'box_float', 'style_float', 'left;right;none', ';', true);
+	fillSelect(0, 'box_clear', 'style_clear', 'left;right;both;none', ';', true);
+	fillSelect(0, 'box_padding_left_measurement', 'style_padding_left_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'box_padding_top_measurement', 'style_padding_top_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'box_padding_bottom_measurement', 'style_padding_bottom_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'box_padding_right_measurement', 'style_padding_right_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'box_margin_left_measurement', 'style_margin_left_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'box_margin_top_measurement', 'style_margin_top_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'box_margin_bottom_measurement', 'style_margin_bottom_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'box_margin_right_measurement', 'style_margin_right_measurement', defaultMeasurement, ';', true);
+
+	fillSelect(0, 'border_style_top', 'style_border_style_top', defaultBorderStyle, ';', true);
+	fillSelect(0, 'border_style_right', 'style_border_style_right', defaultBorderStyle, ';', true);
+	fillSelect(0, 'border_style_bottom', 'style_border_style_bottom', defaultBorderStyle, ';', true);
+	fillSelect(0, 'border_style_left', 'style_border_style_left', defaultBorderStyle, ';', true);
+
+	fillSelect(0, 'border_width_top', 'style_border_width_top', defaultBorderWidth, ';', true);
+	fillSelect(0, 'border_width_right', 'style_border_width_right', defaultBorderWidth, ';', true);
+	fillSelect(0, 'border_width_bottom', 'style_border_width_bottom', defaultBorderWidth, ';', true);
+	fillSelect(0, 'border_width_left', 'style_border_width_left', defaultBorderWidth, ';', true);
+
+	fillSelect(0, 'border_width_top_measurement', 'style_border_width_top_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'border_width_right_measurement', 'style_border_width_right_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'border_width_bottom_measurement', 'style_border_width_bottom_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'border_width_left_measurement', 'style_border_width_left_measurement', defaultMeasurement, ';', true);
+
+	fillSelect(0, 'list_type', 'style_list_type', defaultListType, ';', true);
+	fillSelect(0, 'list_position', 'style_list_position', "inside;outside", ';', true);
+
+	fillSelect(0, 'positioning_type', 'style_positioning_type', "absolute;relative;static", ';', true);
+	fillSelect(0, 'positioning_visibility', 'style_positioning_visibility', "inherit;visible;hidden", ';', true);
+
+	fillSelect(0, 'positioning_width_measurement', 'style_positioning_width_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'positioning_height_measurement', 'style_positioning_height_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'positioning_overflow', 'style_positioning_overflow', "visible;hidden;scroll;auto", ';', true);
+
+	fillSelect(0, 'positioning_placement_top_measurement', 'style_positioning_placement_top_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'positioning_placement_right_measurement', 'style_positioning_placement_right_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'positioning_placement_bottom_measurement', 'style_positioning_placement_bottom_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'positioning_placement_left_measurement', 'style_positioning_placement_left_measurement', defaultMeasurement, ';', true);
+
+	fillSelect(0, 'positioning_clip_top_measurement', 'style_positioning_clip_top_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'positioning_clip_right_measurement', 'style_positioning_clip_right_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'positioning_clip_bottom_measurement', 'style_positioning_clip_bottom_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'positioning_clip_left_measurement', 'style_positioning_clip_left_measurement', defaultMeasurement, ';', true);
+
+	TinyMCE_EditableSelects.init();
+	setupFormData();
+	showDisabledControls();
+}
+
+function setupFormData() {
+	var ce = document.getElementById('container'), f = document.forms[0], s, b, i;
+
+	// Setup text fields
+
+	selectByValue(f, 'text_font', ce.style.fontFamily, true, true);
+	selectByValue(f, 'text_size', getNum(ce.style.fontSize), true, true);
+	selectByValue(f, 'text_size_measurement', getMeasurement(ce.style.fontSize));
+	selectByValue(f, 'text_weight', ce.style.fontWeight, true, true);
+	selectByValue(f, 'text_style', ce.style.fontStyle, true, true);
+	selectByValue(f, 'text_lineheight', getNum(ce.style.lineHeight), true, true);
+	selectByValue(f, 'text_lineheight_measurement', getMeasurement(ce.style.lineHeight));
+	selectByValue(f, 'text_case', ce.style.textTransform, true, true);
+	selectByValue(f, 'text_variant', ce.style.fontVariant, true, true);
+	f.text_color.value = tinyMCEPopup.editor.dom.toHex(ce.style.color);
+	updateColor('text_color_pick', 'text_color');
+	f.text_underline.checked = inStr(ce.style.textDecoration, 'underline');
+	f.text_overline.checked = inStr(ce.style.textDecoration, 'overline');
+	f.text_linethrough.checked = inStr(ce.style.textDecoration, 'line-through');
+	f.text_blink.checked = inStr(ce.style.textDecoration, 'blink');
+
+	// Setup background fields
+
+	f.background_color.value = tinyMCEPopup.editor.dom.toHex(ce.style.backgroundColor);
+	updateColor('background_color_pick', 'background_color');
+	f.background_image.value = ce.style.backgroundImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+	selectByValue(f, 'background_repeat', ce.style.backgroundRepeat, true, true);
+	selectByValue(f, 'background_attachment', ce.style.backgroundAttachment, true, true);
+	selectByValue(f, 'background_hpos', getNum(getVal(ce.style.backgroundPosition, 0)), true, true);
+	selectByValue(f, 'background_hpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 0)));
+	selectByValue(f, 'background_vpos', getNum(getVal(ce.style.backgroundPosition, 1)), true, true);
+	selectByValue(f, 'background_vpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 1)));
+
+	// Setup block fields
+
+	selectByValue(f, 'block_wordspacing', getNum(ce.style.wordSpacing), true, true);
+	selectByValue(f, 'block_wordspacing_measurement', getMeasurement(ce.style.wordSpacing));
+	selectByValue(f, 'block_letterspacing', getNum(ce.style.letterSpacing), true, true);
+	selectByValue(f, 'block_letterspacing_measurement', getMeasurement(ce.style.letterSpacing));
+	selectByValue(f, 'block_vertical_alignment', ce.style.verticalAlign, true, true);
+	selectByValue(f, 'block_text_align', ce.style.textAlign, true, true);
+	f.block_text_indent.value = getNum(ce.style.textIndent);
+	selectByValue(f, 'block_text_indent_measurement', getMeasurement(ce.style.textIndent));
+	selectByValue(f, 'block_whitespace', ce.style.whiteSpace, true, true);
+	selectByValue(f, 'block_display', ce.style.display, true, true);
+
+	// Setup box fields
+
+	f.box_width.value = getNum(ce.style.width);
+	selectByValue(f, 'box_width_measurement', getMeasurement(ce.style.width));
+
+	f.box_height.value = getNum(ce.style.height);
+	selectByValue(f, 'box_height_measurement', getMeasurement(ce.style.height));
+
+	if (tinymce.isGecko)
+		selectByValue(f, 'box_float', ce.style.cssFloat, true, true);
+	else
+		selectByValue(f, 'box_float', ce.style.styleFloat, true, true);
+
+	selectByValue(f, 'box_clear', ce.style.clear, true, true);
+
+	setupBox(f, ce, 'box_padding', 'padding', '');
+	setupBox(f, ce, 'box_margin', 'margin', '');
+
+	// Setup border fields
+
+	setupBox(f, ce, 'border_style', 'border', 'Style');
+	setupBox(f, ce, 'border_width', 'border', 'Width');
+	setupBox(f, ce, 'border_color', 'border', 'Color');
+
+	updateColor('border_color_top_pick', 'border_color_top');
+	updateColor('border_color_right_pick', 'border_color_right');
+	updateColor('border_color_bottom_pick', 'border_color_bottom');
+	updateColor('border_color_left_pick', 'border_color_left');
+
+	f.elements.border_color_top.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_top.value);
+	f.elements.border_color_right.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_right.value);
+	f.elements.border_color_bottom.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_bottom.value);
+	f.elements.border_color_left.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_left.value);
+
+	// Setup list fields
+
+	selectByValue(f, 'list_type', ce.style.listStyleType, true, true);
+	selectByValue(f, 'list_position', ce.style.listStylePosition, true, true);
+	f.list_bullet_image.value = ce.style.listStyleImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+
+	// Setup box fields
+
+	selectByValue(f, 'positioning_type', ce.style.position, true, true);
+	selectByValue(f, 'positioning_visibility', ce.style.visibility, true, true);
+	selectByValue(f, 'positioning_overflow', ce.style.overflow, true, true);
+	f.positioning_zindex.value = ce.style.zIndex ? ce.style.zIndex : "";
+
+	f.positioning_width.value = getNum(ce.style.width);
+	selectByValue(f, 'positioning_width_measurement', getMeasurement(ce.style.width));
+
+	f.positioning_height.value = getNum(ce.style.height);
+	selectByValue(f, 'positioning_height_measurement', getMeasurement(ce.style.height));
+
+	setupBox(f, ce, 'positioning_placement', '', '', ['top', 'right', 'bottom', 'left']);
+
+	s = ce.style.clip.replace(new RegExp("rect\\('?([^']*)'?\\)", 'gi'), "$1");
+	s = s.replace(/,/g, ' ');
+
+	if (!hasEqualValues([getVal(s, 0), getVal(s, 1), getVal(s, 2), getVal(s, 3)])) {
+		f.positioning_clip_top.value = getNum(getVal(s, 0));
+		selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0)));
+		f.positioning_clip_right.value = getNum(getVal(s, 1));
+		selectByValue(f, 'positioning_clip_right_measurement', getMeasurement(getVal(s, 1)));
+		f.positioning_clip_bottom.value = getNum(getVal(s, 2));
+		selectByValue(f, 'positioning_clip_bottom_measurement', getMeasurement(getVal(s, 2)));
+		f.positioning_clip_left.value = getNum(getVal(s, 3));
+		selectByValue(f, 'positioning_clip_left_measurement', getMeasurement(getVal(s, 3)));
+	} else {
+		f.positioning_clip_top.value = getNum(getVal(s, 0));
+		selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0)));
+		f.positioning_clip_right.value = f.positioning_clip_bottom.value = f.positioning_clip_left.value;
+	}
+
+//	setupBox(f, ce, '', 'border', 'Color');
+}
+
+function getMeasurement(s) {
+	return s.replace(/^([0-9]+)(.*)$/, "$2");
+}
+
+function getNum(s) {
+	if (new RegExp('^[0-9]+[a-z%]+$', 'gi').test(s))
+		return s.replace(/[^0-9]/g, '');
+
+	return s;
+}
+
+function inStr(s, n) {
+	return new RegExp(n, 'gi').test(s);
+}
+
+function getVal(s, i) {
+	var a = s.split(' ');
+
+	if (a.length > 1)
+		return a[i];
+
+	return "";
+}
+
+function setValue(f, n, v) {
+	if (f.elements[n].type == "text")
+		f.elements[n].value = v;
+	else
+		selectByValue(f, n, v, true, true);
+}
+
+function setupBox(f, ce, fp, pr, sf, b) {
+	if (typeof(b) == "undefined")
+		b = ['Top', 'Right', 'Bottom', 'Left'];
+
+	if (isSame(ce, pr, sf, b)) {
+		f.elements[fp + "_same"].checked = true;
+
+		setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf]));
+		f.elements[fp + "_top"].disabled = false;
+
+		f.elements[fp + "_right"].value = "";
+		f.elements[fp + "_right"].disabled = true;
+		f.elements[fp + "_bottom"].value = "";
+		f.elements[fp + "_bottom"].disabled = true;
+		f.elements[fp + "_left"].value = "";
+		f.elements[fp + "_left"].disabled = true;
+
+		if (f.elements[fp + "_top_measurement"]) {
+			selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf]));
+			f.elements[fp + "_left_measurement"].disabled = true;
+			f.elements[fp + "_bottom_measurement"].disabled = true;
+			f.elements[fp + "_right_measurement"].disabled = true;
+		}
+	} else {
+		f.elements[fp + "_same"].checked = false;
+
+		setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf]));
+		f.elements[fp + "_top"].disabled = false;
+
+		setValue(f, fp + "_right", getNum(ce.style[pr + b[1] + sf]));
+		f.elements[fp + "_right"].disabled = false;
+
+		setValue(f, fp + "_bottom", getNum(ce.style[pr + b[2] + sf]));
+		f.elements[fp + "_bottom"].disabled = false;
+
+		setValue(f, fp + "_left", getNum(ce.style[pr + b[3] + sf]));
+		f.elements[fp + "_left"].disabled = false;
+
+		if (f.elements[fp + "_top_measurement"]) {
+			selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf]));
+			selectByValue(f, fp + '_right_measurement', getMeasurement(ce.style[pr + b[1] + sf]));
+			selectByValue(f, fp + '_bottom_measurement', getMeasurement(ce.style[pr + b[2] + sf]));
+			selectByValue(f, fp + '_left_measurement', getMeasurement(ce.style[pr + b[3] + sf]));
+			f.elements[fp + "_left_measurement"].disabled = false;
+			f.elements[fp + "_bottom_measurement"].disabled = false;
+			f.elements[fp + "_right_measurement"].disabled = false;
+		}
+	}
+}
+
+function isSame(e, pr, sf, b) {
+	var a = [], i, x;
+
+	if (typeof(b) == "undefined")
+		b = ['Top', 'Right', 'Bottom', 'Left'];
+
+	if (typeof(sf) == "undefined" || sf == null)
+		sf = "";
+
+	a[0] = e.style[pr + b[0] + sf];
+	a[1] = e.style[pr + b[1] + sf];
+	a[2] = e.style[pr + b[2] + sf];
+	a[3] = e.style[pr + b[3] + sf];
+
+	for (i=0; i<a.length; i++) {
+		if (a[i] == null)
+			return false;
+
+		for (x=0; x<a.length; x++) {
+			if (a[x] != a[i])
+				return false;
+		}
+	}
+
+	return true;
+};
+
+function hasEqualValues(a) {
+	var i, x;
+
+	for (i=0; i<a.length; i++) {
+		if (a[i] == null)
+			return false;
+
+		for (x=0; x<a.length; x++) {
+			if (a[x] != a[i])
+				return false;
+		}
+	}
+
+	return true;
+}
+
+function applyAction() {
+	var ce = document.getElementById('container'), ed = tinyMCEPopup.editor;
+
+	generateCSS();
+
+	tinyMCEPopup.restoreSelection();
+	ed.dom.setAttrib(ed.selection.getNode(), 'style', tinyMCEPopup.editor.dom.serializeStyle(tinyMCEPopup.editor.dom.parseStyle(ce.style.cssText)));
+}
+
+function updateAction() {
+	applyAction();
+	tinyMCEPopup.close();
+}
+
+function generateCSS() {
+	var ce = document.getElementById('container'), f = document.forms[0], num = new RegExp('[0-9]+', 'g'), s, t;
+
+	ce.style.cssText = "";
+
+	// Build text styles
+	ce.style.fontFamily = f.text_font.value;
+	ce.style.fontSize = f.text_size.value + (isNum(f.text_size.value) ? (f.text_size_measurement.value || 'px') : "");
+	ce.style.fontStyle = f.text_style.value;
+	ce.style.lineHeight = f.text_lineheight.value + (isNum(f.text_lineheight.value) ? f.text_lineheight_measurement.value : "");
+	ce.style.textTransform = f.text_case.value;
+	ce.style.fontWeight = f.text_weight.value;
+	ce.style.fontVariant = f.text_variant.value;
+	ce.style.color = f.text_color.value;
+
+	s = "";
+	s += f.text_underline.checked ? " underline" : "";
+	s += f.text_overline.checked ? " overline" : "";
+	s += f.text_linethrough.checked ? " line-through" : "";
+	s += f.text_blink.checked ? " blink" : "";
+	s = s.length > 0 ? s.substring(1) : s;
+
+	if (f.text_none.checked)
+		s = "none";
+
+	ce.style.textDecoration = s;
+
+	// Build background styles
+
+	ce.style.backgroundColor = f.background_color.value;
+	ce.style.backgroundImage = f.background_image.value != "" ? "url(" + f.background_image.value + ")" : "";
+	ce.style.backgroundRepeat = f.background_repeat.value;
+	ce.style.backgroundAttachment = f.background_attachment.value;
+
+	if (f.background_hpos.value != "") {
+		s = "";
+		s += f.background_hpos.value + (isNum(f.background_hpos.value) ? f.background_hpos_measurement.value : "") + " ";
+		s += f.background_vpos.value + (isNum(f.background_vpos.value) ? f.background_vpos_measurement.value : "");
+		ce.style.backgroundPosition = s;
+	}
+
+	// Build block styles
+
+	ce.style.wordSpacing = f.block_wordspacing.value + (isNum(f.block_wordspacing.value) ? f.block_wordspacing_measurement.value : "");
+	ce.style.letterSpacing = f.block_letterspacing.value + (isNum(f.block_letterspacing.value) ? f.block_letterspacing_measurement.value : "");
+	ce.style.verticalAlign = f.block_vertical_alignment.value;
+	ce.style.textAlign = f.block_text_align.value;
+	ce.style.textIndent = f.block_text_indent.value + (isNum(f.block_text_indent.value) ? f.block_text_indent_measurement.value : "");
+	ce.style.whiteSpace = f.block_whitespace.value;
+	ce.style.display = f.block_display.value;
+
+	// Build box styles
+
+	ce.style.width = f.box_width.value + (isNum(f.box_width.value) ? f.box_width_measurement.value : "");
+	ce.style.height = f.box_height.value + (isNum(f.box_height.value) ? f.box_height_measurement.value : "");
+	ce.style.styleFloat = f.box_float.value;
+
+	if (tinymce.isGecko)
+		ce.style.cssFloat = f.box_float.value;
+
+	ce.style.clear = f.box_clear.value;
+
+	if (!f.box_padding_same.checked) {
+		ce.style.paddingTop = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : "");
+		ce.style.paddingRight = f.box_padding_right.value + (isNum(f.box_padding_right.value) ? f.box_padding_right_measurement.value : "");
+		ce.style.paddingBottom = f.box_padding_bottom.value + (isNum(f.box_padding_bottom.value) ? f.box_padding_bottom_measurement.value : "");
+		ce.style.paddingLeft = f.box_padding_left.value + (isNum(f.box_padding_left.value) ? f.box_padding_left_measurement.value : "");
+	} else
+		ce.style.padding = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : "");		
+
+	if (!f.box_margin_same.checked) {
+		ce.style.marginTop = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : "");
+		ce.style.marginRight = f.box_margin_right.value + (isNum(f.box_margin_right.value) ? f.box_margin_right_measurement.value : "");
+		ce.style.marginBottom = f.box_margin_bottom.value + (isNum(f.box_margin_bottom.value) ? f.box_margin_bottom_measurement.value : "");
+		ce.style.marginLeft = f.box_margin_left.value + (isNum(f.box_margin_left.value) ? f.box_margin_left_measurement.value : "");
+	} else
+		ce.style.margin = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : "");		
+
+	// Build border styles
+
+	if (!f.border_style_same.checked) {
+		ce.style.borderTopStyle = f.border_style_top.value;
+		ce.style.borderRightStyle = f.border_style_right.value;
+		ce.style.borderBottomStyle = f.border_style_bottom.value;
+		ce.style.borderLeftStyle = f.border_style_left.value;
+	} else
+		ce.style.borderStyle = f.border_style_top.value;
+
+	if (!f.border_width_same.checked) {
+		ce.style.borderTopWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : "");
+		ce.style.borderRightWidth = f.border_width_right.value + (isNum(f.border_width_right.value) ? f.border_width_right_measurement.value : "");
+		ce.style.borderBottomWidth = f.border_width_bottom.value + (isNum(f.border_width_bottom.value) ? f.border_width_bottom_measurement.value : "");
+		ce.style.borderLeftWidth = f.border_width_left.value + (isNum(f.border_width_left.value) ? f.border_width_left_measurement.value : "");
+	} else
+		ce.style.borderWidth = f.border_width_top.value;
+
+	if (!f.border_color_same.checked) {
+		ce.style.borderTopColor = f.border_color_top.value;
+		ce.style.borderRightColor = f.border_color_right.value;
+		ce.style.borderBottomColor = f.border_color_bottom.value;
+		ce.style.borderLeftColor = f.border_color_left.value;
+	} else
+		ce.style.borderColor = f.border_color_top.value;
+
+	// Build list styles
+
+	ce.style.listStyleType = f.list_type.value;
+	ce.style.listStylePosition = f.list_position.value;
+	ce.style.listStyleImage = f.list_bullet_image.value != "" ? "url(" + f.list_bullet_image.value + ")" : "";
+
+	// Build positioning styles
+
+	ce.style.position = f.positioning_type.value;
+	ce.style.visibility = f.positioning_visibility.value;
+
+	if (ce.style.width == "")
+		ce.style.width = f.positioning_width.value + (isNum(f.positioning_width.value) ? f.positioning_width_measurement.value : "");
+
+	if (ce.style.height == "")
+		ce.style.height = f.positioning_height.value + (isNum(f.positioning_height.value) ? f.positioning_height_measurement.value : "");
+
+	ce.style.zIndex = f.positioning_zindex.value;
+	ce.style.overflow = f.positioning_overflow.value;
+
+	if (!f.positioning_placement_same.checked) {
+		ce.style.top = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : "");
+		ce.style.right = f.positioning_placement_right.value + (isNum(f.positioning_placement_right.value) ? f.positioning_placement_right_measurement.value : "");
+		ce.style.bottom = f.positioning_placement_bottom.value + (isNum(f.positioning_placement_bottom.value) ? f.positioning_placement_bottom_measurement.value : "");
+		ce.style.left = f.positioning_placement_left.value + (isNum(f.positioning_placement_left.value) ? f.positioning_placement_left_measurement.value : "");
+	} else {
+		s = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : "");
+		ce.style.top = s;
+		ce.style.right = s;
+		ce.style.bottom = s;
+		ce.style.left = s;
+	}
+
+	if (!f.positioning_clip_same.checked) {
+		s = "rect(";
+		s += (isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto") + " ";
+		s += (isNum(f.positioning_clip_right.value) ? f.positioning_clip_right.value + f.positioning_clip_right_measurement.value : "auto") + " ";
+		s += (isNum(f.positioning_clip_bottom.value) ? f.positioning_clip_bottom.value + f.positioning_clip_bottom_measurement.value : "auto") + " ";
+		s += (isNum(f.positioning_clip_left.value) ? f.positioning_clip_left.value + f.positioning_clip_left_measurement.value : "auto");
+		s += ")";
+
+		if (s != "rect(auto auto auto auto)")
+			ce.style.clip = s;
+	} else {
+		s = "rect(";
+		t = isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto";
+		s += t + " ";
+		s += t + " ";
+		s += t + " ";
+		s += t + ")";
+
+		if (s != "rect(auto auto auto auto)")
+			ce.style.clip = s;
+	}
+
+	ce.style.cssText = ce.style.cssText;
+}
+
+function isNum(s) {
+	return new RegExp('[0-9]+', 'g').test(s);
+}
+
+function showDisabledControls() {
+	var f = document.forms, i, a;
+
+	for (i=0; i<f.length; i++) {
+		for (a=0; a<f[i].elements.length; a++) {
+			if (f[i].elements[a].disabled)
+				tinyMCEPopup.editor.dom.addClass(f[i].elements[a], "disabled");
+			else
+				tinyMCEPopup.editor.dom.removeClass(f[i].elements[a], "disabled");
+		}
+	}
+}
+
+function fillSelect(f, s, param, dval, sep, em) {
+	var i, ar, p, se;
+
+	f = document.forms[f];
+	sep = typeof(sep) == "undefined" ? ";" : sep;
+
+	if (em)
+		addSelectValue(f, s, "", "");
+
+	ar = tinyMCEPopup.getParam(param, dval).split(sep);
+	for (i=0; i<ar.length; i++) {
+		se = false;
+
+		if (ar[i].charAt(0) == '+') {
+			ar[i] = ar[i].substring(1);
+			se = true;
+		}
+
+		p = ar[i].split('=');
+
+		if (p.length > 1) {
+			addSelectValue(f, s, p[0], p[1]);
+
+			if (se)
+				selectByValue(f, s, p[1]);
+		} else {
+			addSelectValue(f, s, p[0], p[0]);
+
+			if (se)
+				selectByValue(f, s, p[0]);
+		}
+	}
+}
+
+function toggleSame(ce, pre) {
+	var el = document.forms[0].elements, i;
+
+	if (ce.checked) {
+		el[pre + "_top"].disabled = false;
+		el[pre + "_right"].disabled = true;
+		el[pre + "_bottom"].disabled = true;
+		el[pre + "_left"].disabled = true;
+
+		if (el[pre + "_top_measurement"]) {
+			el[pre + "_top_measurement"].disabled = false;
+			el[pre + "_right_measurement"].disabled = true;
+			el[pre + "_bottom_measurement"].disabled = true;
+			el[pre + "_left_measurement"].disabled = true;
+		}
+	} else {
+		el[pre + "_top"].disabled = false;
+		el[pre + "_right"].disabled = false;
+		el[pre + "_bottom"].disabled = false;
+		el[pre + "_left"].disabled = false;
+
+		if (el[pre + "_top_measurement"]) {
+			el[pre + "_top_measurement"].disabled = false;
+			el[pre + "_right_measurement"].disabled = false;
+			el[pre + "_bottom_measurement"].disabled = false;
+			el[pre + "_left_measurement"].disabled = false;
+		}
+	}
+
+	showDisabledControls();
+}
+
+function synch(fr, to) {
+	var f = document.forms[0];
+
+	f.elements[to].value = f.elements[fr].value;
+
+	if (f.elements[fr + "_measurement"])
+		selectByValue(f, to + "_measurement", f.elements[fr + "_measurement"].value);
+}
+
+tinyMCEPopup.onInit.add(init);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/style/jscripts/props.js
@@ -1,1 +1,634 @@
-
+var defaultFonts = "" + 
+	"Arial, Helvetica, sans-serif=Arial, Helvetica, sans-serif;" + 
+	"Times New Roman, Times, serif=Times New Roman, Times, serif;" + 
+	"Courier New, Courier, mono=Courier New, Courier, mono;" + 
+	"Times New Roman, Times, serif=Times New Roman, Times, serif;" + 
+	"Georgia, Times New Roman, Times, serif=Georgia, Times New Roman, Times, serif;" + 
+	"Verdana, Arial, Helvetica, sans-serif=Verdana, Arial, Helvetica, sans-serif;" + 
+	"Geneva, Arial, Helvetica, sans-serif=Geneva, Arial, Helvetica, sans-serif";
+
+var defaultSizes = "9;10;12;14;16;18;24;xx-small;x-small;small;medium;large;x-large;xx-large;smaller;larger";
+var defaultMeasurement = "+pixels=px;points=pt;in;cm;mm;picas;ems;exs;%";
+var defaultSpacingMeasurement = "pixels=px;points=pt;in;cm;mm;picas;+ems;exs;%";
+var defaultIndentMeasurement = "pixels=px;+points=pt;in;cm;mm;picas;ems;exs;%";
+var defaultWeight = "normal;bold;bolder;lighter;100;200;300;400;500;600;700;800;900";
+var defaultTextStyle = "normal;italic;oblique";
+var defaultVariant = "normal;small-caps";
+var defaultLineHeight = "normal";
+var defaultAttachment = "fixed;scroll";
+var defaultRepeat = "no-repeat;repeat;repeat-x;repeat-y";
+var defaultPosH = "left;center;right";
+var defaultPosV = "top;center;bottom";
+var defaultVAlign = "baseline;sub;super;top;text-top;middle;bottom;text-bottom";
+var defaultDisplay = "inline;block;list-item;run-in;compact;marker;table;inline-table;table-row-group;table-header-group;table-footer-group;table-row;table-column-group;table-column;table-cell;table-caption;none";
+var defaultBorderStyle = "none;solid;dashed;dotted;double;groove;ridge;inset;outset";
+var defaultBorderWidth = "thin;medium;thick";
+var defaultListType = "disc;circle;square;decimal;lower-roman;upper-roman;lower-alpha;upper-alpha;none";
+
+function init() {
+	var ce = document.getElementById('container'), h;
+
+	ce.style.cssText = tinyMCEPopup.getWindowArg('style_text');
+
+	h = getBrowserHTML('background_image_browser','background_image','image','advimage');
+	document.getElementById("background_image_browser").innerHTML = h;
+
+	tinyMCEPopup.resizeToInnerSize();
+
+	document.getElementById('text_color_pickcontainer').innerHTML = getColorPickerHTML('text_color_pick','text_color');
+	document.getElementById('background_color_pickcontainer').innerHTML = getColorPickerHTML('background_color_pick','background_color');
+	document.getElementById('border_color_top_pickcontainer').innerHTML = getColorPickerHTML('border_color_top_pick','border_color_top');
+	document.getElementById('border_color_right_pickcontainer').innerHTML = getColorPickerHTML('border_color_right_pick','border_color_right');
+	document.getElementById('border_color_bottom_pickcontainer').innerHTML = getColorPickerHTML('border_color_bottom_pick','border_color_bottom');
+	document.getElementById('border_color_left_pickcontainer').innerHTML = getColorPickerHTML('border_color_left_pick','border_color_left');
+
+	fillSelect(0, 'text_font', 'style_font', defaultFonts, ';', true);
+	fillSelect(0, 'text_size', 'style_font_size', defaultSizes, ';', true);
+	fillSelect(0, 'text_size_measurement', 'style_font_size_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'text_case', 'style_text_case', "capitalize;uppercase;lowercase", ';', true);
+	fillSelect(0, 'text_weight', 'style_font_weight', defaultWeight, ';', true);
+	fillSelect(0, 'text_style', 'style_font_style', defaultTextStyle, ';', true);
+	fillSelect(0, 'text_variant', 'style_font_variant', defaultVariant, ';', true);
+	fillSelect(0, 'text_lineheight', 'style_font_line_height', defaultLineHeight, ';', true);
+	fillSelect(0, 'text_lineheight_measurement', 'style_font_line_height_measurement', defaultMeasurement, ';', true);
+
+	fillSelect(0, 'background_attachment', 'style_background_attachment', defaultAttachment, ';', true);
+	fillSelect(0, 'background_repeat', 'style_background_repeat', defaultRepeat, ';', true);
+
+	fillSelect(0, 'background_hpos_measurement', 'style_background_hpos_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'background_vpos_measurement', 'style_background_vpos_measurement', defaultMeasurement, ';', true);
+
+	fillSelect(0, 'background_hpos', 'style_background_hpos', defaultPosH, ';', true);
+	fillSelect(0, 'background_vpos', 'style_background_vpos', defaultPosV, ';', true);
+
+	fillSelect(0, 'block_wordspacing', 'style_wordspacing', 'normal', ';', true);
+	fillSelect(0, 'block_wordspacing_measurement', 'style_wordspacing_measurement', defaultSpacingMeasurement, ';', true);
+	fillSelect(0, 'block_letterspacing', 'style_letterspacing', 'normal', ';', true);
+	fillSelect(0, 'block_letterspacing_measurement', 'style_letterspacing_measurement', defaultSpacingMeasurement, ';', true);
+	fillSelect(0, 'block_vertical_alignment', 'style_vertical_alignment', defaultVAlign, ';', true);
+	fillSelect(0, 'block_text_align', 'style_text_align', "left;right;center;justify", ';', true);
+	fillSelect(0, 'block_whitespace', 'style_whitespace', "normal;pre;nowrap", ';', true);
+	fillSelect(0, 'block_display', 'style_display', defaultDisplay, ';', true);
+	fillSelect(0, 'block_text_indent_measurement', 'style_text_indent_measurement', defaultIndentMeasurement, ';', true);
+
+	fillSelect(0, 'box_width_measurement', 'style_box_width_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'box_height_measurement', 'style_box_height_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'box_float', 'style_float', 'left;right;none', ';', true);
+	fillSelect(0, 'box_clear', 'style_clear', 'left;right;both;none', ';', true);
+	fillSelect(0, 'box_padding_left_measurement', 'style_padding_left_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'box_padding_top_measurement', 'style_padding_top_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'box_padding_bottom_measurement', 'style_padding_bottom_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'box_padding_right_measurement', 'style_padding_right_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'box_margin_left_measurement', 'style_margin_left_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'box_margin_top_measurement', 'style_margin_top_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'box_margin_bottom_measurement', 'style_margin_bottom_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'box_margin_right_measurement', 'style_margin_right_measurement', defaultMeasurement, ';', true);
+
+	fillSelect(0, 'border_style_top', 'style_border_style_top', defaultBorderStyle, ';', true);
+	fillSelect(0, 'border_style_right', 'style_border_style_right', defaultBorderStyle, ';', true);
+	fillSelect(0, 'border_style_bottom', 'style_border_style_bottom', defaultBorderStyle, ';', true);
+	fillSelect(0, 'border_style_left', 'style_border_style_left', defaultBorderStyle, ';', true);
+
+	fillSelect(0, 'border_width_top', 'style_border_width_top', defaultBorderWidth, ';', true);
+	fillSelect(0, 'border_width_right', 'style_border_width_right', defaultBorderWidth, ';', true);
+	fillSelect(0, 'border_width_bottom', 'style_border_width_bottom', defaultBorderWidth, ';', true);
+	fillSelect(0, 'border_width_left', 'style_border_width_left', defaultBorderWidth, ';', true);
+
+	fillSelect(0, 'border_width_top_measurement', 'style_border_width_top_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'border_width_right_measurement', 'style_border_width_right_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'border_width_bottom_measurement', 'style_border_width_bottom_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'border_width_left_measurement', 'style_border_width_left_measurement', defaultMeasurement, ';', true);
+
+	fillSelect(0, 'list_type', 'style_list_type', defaultListType, ';', true);
+	fillSelect(0, 'list_position', 'style_list_position', "inside;outside", ';', true);
+
+	fillSelect(0, 'positioning_type', 'style_positioning_type', "absolute;relative;static", ';', true);
+	fillSelect(0, 'positioning_visibility', 'style_positioning_visibility', "inherit;visible;hidden", ';', true);
+
+	fillSelect(0, 'positioning_width_measurement', 'style_positioning_width_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'positioning_height_measurement', 'style_positioning_height_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'positioning_overflow', 'style_positioning_overflow', "visible;hidden;scroll;auto", ';', true);
+
+	fillSelect(0, 'positioning_placement_top_measurement', 'style_positioning_placement_top_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'positioning_placement_right_measurement', 'style_positioning_placement_right_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'positioning_placement_bottom_measurement', 'style_positioning_placement_bottom_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'positioning_placement_left_measurement', 'style_positioning_placement_left_measurement', defaultMeasurement, ';', true);
+
+	fillSelect(0, 'positioning_clip_top_measurement', 'style_positioning_clip_top_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'positioning_clip_right_measurement', 'style_positioning_clip_right_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'positioning_clip_bottom_measurement', 'style_positioning_clip_bottom_measurement', defaultMeasurement, ';', true);
+	fillSelect(0, 'positioning_clip_left_measurement', 'style_positioning_clip_left_measurement', defaultMeasurement, ';', true);
+
+	TinyMCE_EditableSelects.init();
+	setupFormData();
+	showDisabledControls();
+}
+
+function setupFormData() {
+	var ce = document.getElementById('container'), f = document.forms[0], s, b, i;
+
+	// Setup text fields
+
+	selectByValue(f, 'text_font', ce.style.fontFamily, true, true);
+	selectByValue(f, 'text_size', getNum(ce.style.fontSize), true, true);
+	selectByValue(f, 'text_size_measurement', getMeasurement(ce.style.fontSize));
+	selectByValue(f, 'text_weight', ce.style.fontWeight, true, true);
+	selectByValue(f, 'text_style', ce.style.fontStyle, true, true);
+	selectByValue(f, 'text_lineheight', getNum(ce.style.lineHeight), true, true);
+	selectByValue(f, 'text_lineheight_measurement', getMeasurement(ce.style.lineHeight));
+	selectByValue(f, 'text_case', ce.style.textTransform, true, true);
+	selectByValue(f, 'text_variant', ce.style.fontVariant, true, true);
+	f.text_color.value = ce.style.color;
+	updateColor('text_color_pick', 'text_color');
+	f.text_underline.checked = inStr(ce.style.textDecoration, 'underline');
+	f.text_overline.checked = inStr(ce.style.textDecoration, 'overline');
+	f.text_linethrough.checked = inStr(ce.style.textDecoration, 'line-through');
+	f.text_blink.checked = inStr(ce.style.textDecoration, 'blink');
+
+	// Setup background fields
+
+	f.background_color.value = ce.style.backgroundColor;
+	updateColor('background_color_pick', 'background_color');
+	f.background_image.value = ce.style.backgroundImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+	selectByValue(f, 'background_repeat', ce.style.backgroundRepeat, true, true);
+	selectByValue(f, 'background_attachment', ce.style.backgroundAttachment, true, true);
+	selectByValue(f, 'background_hpos', getNum(getVal(ce.style.backgroundPosition, 0)), true, true);
+	selectByValue(f, 'background_hpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 0)));
+	selectByValue(f, 'background_vpos', getNum(getVal(ce.style.backgroundPosition, 1)), true, true);
+	selectByValue(f, 'background_vpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 1)));
+
+	// Setup block fields
+
+	selectByValue(f, 'block_wordspacing', getNum(ce.style.wordSpacing), true, true);
+	selectByValue(f, 'block_wordspacing_measurement', getMeasurement(ce.style.wordSpacing));
+	selectByValue(f, 'block_letterspacing', getNum(ce.style.letterSpacing), true, true);
+	selectByValue(f, 'block_letterspacing_measurement', getMeasurement(ce.style.letterSpacing));
+	selectByValue(f, 'block_vertical_alignment', ce.style.verticalAlign, true, true);
+	selectByValue(f, 'block_text_align', ce.style.textAlign, true, true);
+	f.block_text_indent.value = getNum(ce.style.textIndent);
+	selectByValue(f, 'block_text_indent_measurement', getMeasurement(ce.style.textIndent));
+	selectByValue(f, 'block_whitespace', ce.style.whiteSpace, true, true);
+	selectByValue(f, 'block_display', ce.style.display, true, true);
+
+	// Setup box fields
+
+	f.box_width.value = getNum(ce.style.width);
+	selectByValue(f, 'box_width_measurement', getMeasurement(ce.style.width));
+
+	f.box_height.value = getNum(ce.style.height);
+	selectByValue(f, 'box_height_measurement', getMeasurement(ce.style.height));
+
+	if (tinyMCE.isGecko)
+		selectByValue(f, 'box_float', ce.style.cssFloat, true, true);
+	else
+		selectByValue(f, 'box_float', ce.style.styleFloat, true, true);
+
+	selectByValue(f, 'box_clear', ce.style.clear, true, true);
+
+	setupBox(f, ce, 'box_padding', 'padding', '');
+	setupBox(f, ce, 'box_margin', 'margin', '');
+
+	// Setup border fields
+
+	setupBox(f, ce, 'border_style', 'border', 'Style');
+	setupBox(f, ce, 'border_width', 'border', 'Width');
+	setupBox(f, ce, 'border_color', 'border', 'Color');
+
+	updateColor('border_color_top_pick', 'border_color_top');
+	updateColor('border_color_right_pick', 'border_color_right');
+	updateColor('border_color_bottom_pick', 'border_color_bottom');
+	updateColor('border_color_left_pick', 'border_color_left');
+
+	// Setup list fields
+
+	selectByValue(f, 'list_type', ce.style.listStyleType, true, true);
+	selectByValue(f, 'list_position', ce.style.listStylePosition, true, true);
+	f.list_bullet_image.value = ce.style.listStyleImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+
+	// Setup box fields
+
+	selectByValue(f, 'positioning_type', ce.style.position, true, true);
+	selectByValue(f, 'positioning_visibility', ce.style.visibility, true, true);
+	selectByValue(f, 'positioning_overflow', ce.style.overflow, true, true);
+	f.positioning_zindex.value = ce.style.zIndex ? ce.style.zIndex : "";
+
+	f.positioning_width.value = getNum(ce.style.width);
+	selectByValue(f, 'positioning_width_measurement', getMeasurement(ce.style.width));
+
+	f.positioning_height.value = getNum(ce.style.height);
+	selectByValue(f, 'positioning_height_measurement', getMeasurement(ce.style.height));
+
+	setupBox(f, ce, 'positioning_placement', '', '', new Array('top', 'right', 'bottom', 'left'));
+
+	s = ce.style.clip.replace(new RegExp("rect\\('?([^']*)'?\\)", 'gi'), "$1");
+	s = s.replace(/,/g, ' ');
+
+	if (!hasEqualValues(new Array(getVal(s, 0), getVal(s, 1), getVal(s, 2), getVal(s, 3)))) {
+		f.positioning_clip_top.value = getNum(getVal(s, 0));
+		selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0)));
+		f.positioning_clip_right.value = getNum(getVal(s, 1));
+		selectByValue(f, 'positioning_clip_right_measurement', getMeasurement(getVal(s, 1)));
+		f.positioning_clip_bottom.value = getNum(getVal(s, 2));
+		selectByValue(f, 'positioning_clip_bottom_measurement', getMeasurement(getVal(s, 2)));
+		f.positioning_clip_left.value = getNum(getVal(s, 3));
+		selectByValue(f, 'positioning_clip_left_measurement', getMeasurement(getVal(s, 3)));
+	} else {
+		f.positioning_clip_top.value = getNum(getVal(s, 0));
+		selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0)));
+		f.positioning_clip_right.value = f.positioning_clip_bottom.value = f.positioning_clip_left.value;
+	}
+
+//	setupBox(f, ce, '', 'border', 'Color');
+}
+
+function getMeasurement(s) {
+	return s.replace(/^([0-9]+)(.*)$/, "$2");
+}
+
+function getNum(s) {
+	if (new RegExp('^[0-9]+[a-z%]+$', 'gi').test(s))
+		return s.replace(/[^0-9]/g, '');
+
+	return s;
+}
+
+function inStr(s, n) {
+	return new RegExp(n, 'gi').test(s);
+}
+
+function getVal(s, i) {
+	var a = tinyMCE.explode(' ', s);
+
+	if (a.length > 1)
+		return a[i];
+
+	return "";
+}
+
+function setValue(f, n, v) {
+	if (f.elements[n].type == "text")
+		f.elements[n].value = v;
+	else
+		selectByValue(f, n, v, true, true);
+}
+
+function setupBox(f, ce, fp, pr, sf, b) {
+	if (typeof(b) == "undefined")
+		b = new Array('Top', 'Right', 'Bottom', 'Left');
+
+	if (isSame(ce, pr, sf, b)) {
+		f.elements[fp + "_same"].checked = true;
+
+		setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf]));
+		f.elements[fp + "_top"].disabled = false;
+
+		f.elements[fp + "_right"].value = "";
+		f.elements[fp + "_right"].disabled = true;
+		f.elements[fp + "_bottom"].value = "";
+		f.elements[fp + "_bottom"].disabled = true;
+		f.elements[fp + "_left"].value = "";
+		f.elements[fp + "_left"].disabled = true;
+
+		if (f.elements[fp + "_top_measurement"]) {
+			selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf]));
+			f.elements[fp + "_left_measurement"].disabled = true;
+			f.elements[fp + "_bottom_measurement"].disabled = true;
+			f.elements[fp + "_right_measurement"].disabled = true;
+		}
+	} else {
+		f.elements[fp + "_same"].checked = false;
+
+		setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf]));
+		f.elements[fp + "_top"].disabled = false;
+
+		setValue(f, fp + "_right", getNum(ce.style[pr + b[1] + sf]));
+		f.elements[fp + "_right"].disabled = false;
+
+		setValue(f, fp + "_bottom", getNum(ce.style[pr + b[2] + sf]));
+		f.elements[fp + "_bottom"].disabled = false;
+
+		setValue(f, fp + "_left", getNum(ce.style[pr + b[3] + sf]));
+		f.elements[fp + "_left"].disabled = false;
+
+		if (f.elements[fp + "_top_measurement"]) {
+			selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf]));
+			selectByValue(f, fp + '_right_measurement', getMeasurement(ce.style[pr + b[1] + sf]));
+			selectByValue(f, fp + '_bottom_measurement', getMeasurement(ce.style[pr + b[2] + sf]));
+			selectByValue(f, fp + '_left_measurement', getMeasurement(ce.style[pr + b[3] + sf]));
+			f.elements[fp + "_left_measurement"].disabled = false;
+			f.elements[fp + "_bottom_measurement"].disabled = false;
+			f.elements[fp + "_right_measurement"].disabled = false;
+		}
+	}
+}
+
+function isSame(e, pr, sf, b) {
+	var a = new Array(), i, x;
+
+	if (typeof(b) == "undefined")
+		b = new Array('Top', 'Right', 'Bottom', 'Left');
+
+	if (typeof(sf) == "undefined" || sf == null)
+		sf = "";
+
+	a[0] = e.style[pr + b[0] + sf];
+	a[1] = e.style[pr + b[1] + sf];
+	a[2] = e.style[pr + b[2] + sf];
+	a[3] = e.style[pr + b[3] + sf];
+
+	for (i=0; i<a.length; i++) {
+		if (a[i] == null)
+			return false;
+
+		for (x=0; x<a.length; x++) {
+			if (a[x] != a[i])
+				return false;
+		}
+	}
+
+	return true;
+};
+
+function hasEqualValues(a) {
+	var i, x;
+
+	for (i=0; i<a.length; i++) {
+		if (a[i] == null)
+			return false;
+
+		for (x=0; x<a.length; x++) {
+			if (a[x] != a[i])
+				return false;
+		}
+	}
+
+	return true;
+}
+
+function applyAction() {
+	var ce = document.getElementById('container');
+
+	generateCSS();
+
+	tinyMCEPopup.execCommand('mceSetElementStyle', false, tinyMCE.serializeStyle(tinyMCE.parseStyle(ce.style.cssText)));
+}
+
+function updateAction() {
+	applyAction();
+	tinyMCEPopup.close();
+}
+
+function generateCSS() {
+	var ce = document.getElementById('container'), f = document.forms[0], num = new RegExp('[0-9]+', 'g'), s, t;
+
+	ce.style.cssText = "";
+
+	// Build text styles
+	ce.style.fontFamily = f.text_font.value;
+	ce.style.fontSize = f.text_size.value + (isNum(f.text_size.value) ? f.text_size_measurement.value : "");
+	ce.style.fontStyle = f.text_style.value;
+	ce.style.lineHeight = f.text_lineheight.value + (isNum(f.text_lineheight.value) ? f.text_lineheight_measurement.value : "");
+	ce.style.textTransform = f.text_case.value;
+	ce.style.fontWeight = f.text_weight.value;
+	ce.style.fontVariant = f.text_variant.value;
+	ce.style.color = f.text_color.value;
+
+	s = "";
+	s += f.text_underline.checked ? " underline" : "";
+	s += f.text_overline.checked ? " overline" : "";
+	s += f.text_linethrough.checked ? " line-through" : "";
+	s += f.text_blink.checked ? " blink" : "";
+	s = s.length > 0 ? s.substring(1) : s;
+
+	if (f.text_none.checked)
+		s = "none";
+
+	ce.style.textDecoration = s;
+
+	// Build background styles
+
+	ce.style.backgroundColor = f.background_color.value;
+	ce.style.backgroundImage = f.background_image.value != "" ? "url(" + f.background_image.value + ")" : "";
+	ce.style.backgroundRepeat = f.background_repeat.value;
+	ce.style.backgroundAttachment = f.background_attachment.value;
+
+	if (f.background_hpos.value != "") {
+		s = "";
+		s += f.background_hpos.value + (isNum(f.background_hpos.value) ? f.background_hpos_measurement.value : "") + " ";
+		s += f.background_vpos.value + (isNum(f.background_vpos.value) ? f.background_vpos_measurement.value : "");
+		ce.style.backgroundPosition = s;
+	}
+
+	// Build block styles
+
+	ce.style.wordSpacing = f.block_wordspacing.value + (isNum(f.block_wordspacing.value) ? f.block_wordspacing_measurement.value : "");
+	ce.style.letterSpacing = f.block_letterspacing.value + (isNum(f.block_letterspacing.value) ? f.block_letterspacing_measurement.value : "");
+	ce.style.verticalAlign = f.block_vertical_alignment.value;
+	ce.style.textAlign = f.block_text_align.value;
+	ce.style.textIndent = f.block_text_indent.value + (isNum(f.block_text_indent.value) ? f.block_text_indent_measurement.value : "");
+	ce.style.whiteSpace = f.block_whitespace.value;
+	ce.style.display = f.block_display.value;
+
+	// Build box styles
+
+	ce.style.width = f.box_width.value + (isNum(f.box_width.value) ? f.box_width_measurement.value : "");
+	ce.style.height = f.box_height.value + (isNum(f.box_height.value) ? f.box_height_measurement.value : "");
+	ce.style.styleFloat = f.box_float.value;
+
+	if (tinyMCE.isGecko)
+		ce.style.cssFloat = f.box_float.value;
+
+	ce.style.clear = f.box_clear.value;
+
+	if (!f.box_padding_same.checked) {
+		ce.style.paddingTop = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : "");
+		ce.style.paddingRight = f.box_padding_right.value + (isNum(f.box_padding_right.value) ? f.box_padding_right_measurement.value : "");
+		ce.style.paddingBottom = f.box_padding_bottom.value + (isNum(f.box_padding_bottom.value) ? f.box_padding_bottom_measurement.value : "");
+		ce.style.paddingLeft = f.box_padding_left.value + (isNum(f.box_padding_left.value) ? f.box_padding_left_measurement.value : "");
+	} else
+		ce.style.padding = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : "");		
+
+	if (!f.box_margin_same.checked) {
+		ce.style.marginTop = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : "");
+		ce.style.marginRight = f.box_margin_right.value + (isNum(f.box_margin_right.value) ? f.box_margin_right_measurement.value : "");
+		ce.style.marginBottom = f.box_margin_bottom.value + (isNum(f.box_margin_bottom.value) ? f.box_margin_bottom_measurement.value : "");
+		ce.style.marginLeft = f.box_margin_left.value + (isNum(f.box_margin_left.value) ? f.box_margin_left_measurement.value : "");
+	} else
+		ce.style.margin = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : "");		
+
+	// Build border styles
+
+	if (!f.border_style_same.checked) {
+		ce.style.borderTopStyle = f.border_style_top.value;
+		ce.style.borderRightStyle = f.border_style_right.value;
+		ce.style.borderBottomStyle = f.border_style_bottom.value;
+		ce.style.borderLeftStyle = f.border_style_left.value;
+	} else
+		ce.style.borderStyle = f.border_style_top.value;
+
+	if (!f.border_width_same.checked) {
+		ce.style.borderTopWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : "");
+		ce.style.borderRightWidth = f.border_width_right.value + (isNum(f.border_width_right.value) ? f.border_width_right_measurement.value : "");
+		ce.style.borderBottomWidth = f.border_width_bottom.value + (isNum(f.border_width_bottom.value) ? f.border_width_bottom_measurement.value : "");
+		ce.style.borderLeftWidth = f.border_width_left.value + (isNum(f.border_width_left.value) ? f.border_width_left_measurement.value : "");
+	} else
+		ce.style.borderWidth = f.border_width_top.value;
+
+	if (!f.border_color_same.checked) {
+		ce.style.borderTopColor = f.border_color_top.value;
+		ce.style.borderRightColor = f.border_color_right.value;
+		ce.style.borderBottomColor = f.border_color_bottom.value;
+		ce.style.borderLeftColor = f.border_color_left.value;
+	} else
+		ce.style.borderColor = f.border_color_top.value;
+
+	// Build list styles
+
+	ce.style.listStyleType = f.list_type.value;
+	ce.style.listStylePosition = f.list_position.value;
+	ce.style.listStyleImage = f.list_bullet_image.value != "" ? "url(" + f.list_bullet_image.value + ")" : "";
+
+	// Build positioning styles
+
+	ce.style.position = f.positioning_type.value;
+	ce.style.visibility = f.positioning_visibility.value;
+
+	if (ce.style.width == "")
+		ce.style.width = f.positioning_width.value + (isNum(f.positioning_width.value) ? f.positioning_width_measurement.value : "");
+
+	if (ce.style.height == "")
+		ce.style.height = f.positioning_height.value + (isNum(f.positioning_height.value) ? f.positioning_height_measurement.value : "");
+
+	ce.style.zIndex = f.positioning_zindex.value;
+	ce.style.overflow = f.positioning_overflow.value;
+
+	if (!f.positioning_placement_same.checked) {
+		ce.style.top = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : "");
+		ce.style.right = f.positioning_placement_right.value + (isNum(f.positioning_placement_right.value) ? f.positioning_placement_right_measurement.value : "");
+		ce.style.bottom = f.positioning_placement_bottom.value + (isNum(f.positioning_placement_bottom.value) ? f.positioning_placement_bottom_measurement.value : "");
+		ce.style.left = f.positioning_placement_left.value + (isNum(f.positioning_placement_left.value) ? f.positioning_placement_left_measurement.value : "");
+	} else {
+		s = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : "");
+		ce.style.top = s;
+		ce.style.right = s;
+		ce.style.bottom = s;
+		ce.style.left = s;
+	}
+
+	if (!f.positioning_clip_same.checked) {
+		s = "rect(";
+		s += (isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto") + " ";
+		s += (isNum(f.positioning_clip_right.value) ? f.positioning_clip_right.value + f.positioning_clip_right_measurement.value : "auto") + " ";
+		s += (isNum(f.positioning_clip_bottom.value) ? f.positioning_clip_bottom.value + f.positioning_clip_bottom_measurement.value : "auto") + " ";
+		s += (isNum(f.positioning_clip_left.value) ? f.positioning_clip_left.value + f.positioning_clip_left_measurement.value : "auto");
+		s += ")";
+
+		if (s != "rect(auto auto auto auto)")
+			ce.style.clip = s;
+	} else {
+		s = "rect(";
+		t = isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto";
+		s += t + " ";
+		s += t + " ";
+		s += t + " ";
+		s += t + ")";
+
+		if (s != "rect(auto auto auto auto)")
+			ce.style.clip = s;
+	}
+
+	ce.style.cssText = tinyMCE.serializeStyle(tinyMCE.parseStyle(ce.style.cssText));
+}
+
+function isNum(s) {
+	return new RegExp('[0-9]+', 'g').test(s);
+}
+
+function showDisabledControls() {
+	var f = document.forms, i, a;
+
+	for (i=0; i<f.length; i++) {
+		for (a=0; a<f[i].elements.length; a++) {
+			if (f[i].elements[a].disabled)
+				tinyMCE.addCSSClass(f[i].elements[a], "disabled");
+			else
+				tinyMCE.removeCSSClass(f[i].elements[a], "disabled");
+		}
+	}
+}
+
+function fillSelect(f, s, param, dval, sep, em) {
+	var i, ar, p, se;
+
+	f = document.forms[f];
+	sep = typeof(sep) == "undefined" ? ";" : sep;
+
+	if (em)
+		addSelectValue(f, s, "", "");
+
+	ar = tinyMCE.getParam(param, dval).split(sep);
+	for (i=0; i<ar.length; i++) {
+		se = false;
+
+		if (ar[i].charAt(0) == '+') {
+			ar[i] = ar[i].substring(1);
+			se = true;
+		}
+
+		p = ar[i].split('=');
+
+		if (p.length > 1) {
+			addSelectValue(f, s, p[0], p[1]);
+
+			if (se)
+				selectByValue(f, s, p[1]);
+		} else {
+			addSelectValue(f, s, p[0], p[0]);
+
+			if (se)
+				selectByValue(f, s, p[0]);
+		}
+	}
+}
+
+function toggleSame(ce, pre) {
+	var el = document.forms[0].elements, i;
+
+	if (ce.checked) {
+		el[pre + "_top"].disabled = false;
+		el[pre + "_right"].disabled = true;
+		el[pre + "_bottom"].disabled = true;
+		el[pre + "_left"].disabled = true;
+
+		if (el[pre + "_top_measurement"]) {
+			el[pre + "_top_measurement"].disabled = false;
+			el[pre + "_right_measurement"].disabled = true;
+			el[pre + "_bottom_measurement"].disabled = true;
+			el[pre + "_left_measurement"].disabled = true;
+		}
+	} else {
+		el[pre + "_top"].disabled = false;
+		el[pre + "_right"].disabled = false;
+		el[pre + "_bottom"].disabled = false;
+		el[pre + "_left"].disabled = false;
+
+		if (el[pre + "_top_measurement"]) {
+			el[pre + "_top_measurement"].disabled = false;
+			el[pre + "_right_measurement"].disabled = false;
+			el[pre + "_bottom_measurement"].disabled = false;
+			el[pre + "_left_measurement"].disabled = false;
+		}
+	}
+
+	showDisabledControls();
+}
+
+function synch(fr, to) {
+	var f = document.forms[0];
+
+	f.elements[to].value = f.elements[fr].value;
+
+	if (f.elements[fr + "_measurement"])
+		selectByValue(f, to + "_measurement", f.elements[fr + "_measurement"].value);
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/style/langs/en.js
@@ -1,1 +1,67 @@
+// UK lang variables
 
+tinyMCE.addToLang('style',{
+title : 'Edit CSS Style',
+styleinfo_desc : 'Edit CSS Style',
+apply : 'Apply',
+text_tab : 'Text',
+background_tab : 'Background',
+block_tab : 'Block',
+box_tab : 'Box',
+border_tab : 'Border',
+list_tab : 'List',
+positioning_tab : 'Positioning',
+text_props : 'Text',
+text_font : 'Font',
+text_size : 'Size',
+text_weight : 'Weight',
+text_style : 'Style',
+text_variant : 'Variant',
+text_lineheight : 'Line height',
+text_case : 'Case',
+text_color : 'Color',
+text_decoration : 'Decoration',
+text_overline : 'overline',
+text_underline : 'underline',
+text_striketrough : 'strikethrough',
+text_blink : 'blink',
+text_none : 'none',
+background_color : 'Background color',
+background_image : 'Background image',
+background_repeat : 'Repeat',
+background_attachment : 'Attachment',
+background_hpos : 'Horizontal position',
+background_vpos : 'Vertical position',
+block_wordspacing : 'Word spacing',
+block_letterspacing : 'Letter spacing',
+block_vertical_alignment : 'Vertical alignment',
+block_text_align : 'Text align',
+block_text_indent : 'Text indent',
+block_whitespace : 'Whitespace',
+block_display : 'Display',
+box_width : 'Width',
+box_height : 'Height',
+box_float : 'Float',
+box_clear : 'Clear',
+padding : 'Padding',
+same : 'Same for all',
+top : 'Top',
+right : 'Right',
+bottom : 'Bottom',
+left : 'Left',
+margin : 'Margin',
+style : 'Style',
+width : 'Width',
+height : 'Height',
+color : 'Color',
+list_type : 'Type',
+bullet_image : 'Bullet image',
+position : 'Position',
+positioning_type : 'Type',
+visibility : 'Visibility',
+zindex : 'Z-index',
+overflow : 'Overflow',
+placement : 'Placement',
+clip : 'Clip'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/style/langs/en_dlg.js
@@ -1,1 +1,63 @@
-
+tinyMCE.addI18n('en.style_dlg',{
+title:"Edit CSS Style",
+apply:"Apply",
+text_tab:"Text",
+background_tab:"Background",
+block_tab:"Block",
+box_tab:"Box",
+border_tab:"Border",
+list_tab:"List",
+positioning_tab:"Positioning",
+text_props:"Text",
+text_font:"Font",
+text_size:"Size",
+text_weight:"Weight",
+text_style:"Style",
+text_variant:"Variant",
+text_lineheight:"Line height",
+text_case:"Case",
+text_color:"Color",
+text_decoration:"Decoration",
+text_overline:"overline",
+text_underline:"underline",
+text_striketrough:"strikethrough",
+text_blink:"blink",
+text_none:"none",
+background_color:"Background color",
+background_image:"Background image",
+background_repeat:"Repeat",
+background_attachment:"Attachment",
+background_hpos:"Horizontal position",
+background_vpos:"Vertical position",
+block_wordspacing:"Word spacing",
+block_letterspacing:"Letter spacing",
+block_vertical_alignment:"Vertical alignment",
+block_text_align:"Text align",
+block_text_indent:"Text indent",
+block_whitespace:"Whitespace",
+block_display:"Display",
+box_width:"Width",
+box_height:"Height",
+box_float:"Float",
+box_clear:"Clear",
+padding:"Padding",
+same:"Same for all",
+top:"Top",
+right:"Right",
+bottom:"Bottom",
+left:"Left",
+margin:"Margin",
+style:"Style",
+width:"Width",
+height:"Height",
+color:"Color",
+list_type:"Type",
+bullet_image:"Bullet image",
+position:"Position",
+positioning_type:"Type",
+visibility:"Visibility",
+zindex:"Z-index",
+overflow:"Overflow",
+placement:"Placement",
+clip:"Clip"
+});

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/style/props.htm
@@ -1,1 +1,732 @@
-
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#style_dlg.title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/editable_selects.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="js/props.js"></script>
+	<link href="css/props.css" rel="stylesheet" type="text/css" />
+	<base target="_self" />
+</head>
+
+<body id="styleprops" style="display: none">
+<form onsubmit="updateAction();return false;" action="#">
+<div class="tabs">
+	<ul>
+		<li id="text_tab" class="current"><span><a href="javascript:mcTabs.displayTab('text_tab','text_panel');" onMouseDown="return false;">{#style_dlg.text_tab}</a></span></li>
+		<li id="background_tab"><span><a href="javascript:mcTabs.displayTab('background_tab','background_panel');" onMouseDown="return false;">{#style_dlg.background_tab}</a></span></li>
+		<li id="block_tab"><span><a href="javascript:mcTabs.displayTab('block_tab','block_panel');" onMouseDown="return false;">{#style_dlg.block_tab}</a></span></li>
+		<li id="box_tab"><span><a href="javascript:mcTabs.displayTab('box_tab','box_panel');" onMouseDown="return false;">{#style_dlg.box_tab}</a></span></li>
+		<li id="border_tab"><span><a href="javascript:mcTabs.displayTab('border_tab','border_panel');" onMouseDown="return false;">{#style_dlg.border_tab}</a></span></li>
+		<li id="list_tab"><span><a href="javascript:mcTabs.displayTab('list_tab','list_panel');" onMouseDown="return false;">{#style_dlg.list_tab}</a></span></li>
+		<li id="positioning_tab"><span><a href="javascript:mcTabs.displayTab('positioning_tab','positioning_panel');" onMouseDown="return false;">{#style_dlg.positioning_tab}</a></span></li>
+	</ul>
+</div>
+
+<div class="panel_wrapper">
+<div id="text_panel" class="panel current">
+	<table border="0" width="100%">
+		<tr>
+			<td><label for="text_font">{#style_dlg.text_font}</label></td>
+			<td colspan="3">
+				<select id="text_font" name="text_font" class="mceEditableSelect mceFocus"></select>
+			</td>
+		</tr>
+		<tr>
+			<td><label for="text_size">{#style_dlg.text_size}</label></td>
+			<td>
+				<table border="0" cellspacing="0" cellpadding="0">
+					<tr>
+						<td><select id="text_size" name="text_size" class="mceEditableSelect"></select></td>
+						<td>&nbsp;</td>
+      <td><select id="text_size_measurement" name="text_size_measurement"></select></td>
+					</tr>
+				</table>
+			</td>
+			<td><label for="text_weight">{#style_dlg.text_weight}</label></td>
+			<td>
+				<select id="text_weight" name="text_weight"></select>
+			</td>
+		</tr>
+		<tr>
+			<td><label for="text_style">{#style_dlg.text_style}</label></td>
+			<td>
+				<select id="text_style" name="text_style" class="mceEditableSelect"></select>
+			</td>
+			<td><label for="text_variant">{#style_dlg.text_variant}</label></td>
+			<td>
+				<select id="text_variant" name="text_variant"></select>
+			</td>
+		</tr>
+		<tr>
+			<td><label for="text_lineheight">{#style_dlg.text_lineheight}</label></td>
+			<td>
+				<table border="0" cellspacing="0" cellpadding="0">
+					<tr>
+						<td>
+							<select id="text_lineheight" name="text_lineheight" class="mceEditableSelect"></select>
+						</td>
+						<td>&nbsp;</td>
+						<td><select id="text_lineheight_measurement" name="text_lineheight_measurement"></select></td>
+					</tr>
+				</table>
+			</td>
+			<td><label for="text_case">{#style_dlg.text_case}</label></td>
+			<td>
+				<select id="text_case" name="text_case"></select>
+			</td>
+		</tr>
+		<tr>
+			<td><label for="text_color">{#style_dlg.text_color}</label></td>
+			<td colspan="2">
+				<table border="0" cellpadding="0" cellspacing="0">
+					<tr>
+						<td><input id="text_color" name="text_color" type="text" value="" size="9" onChange="updateColor('text_color_pick','text_color');" /></td>
+						<td id="text_color_pickcontainer">&nbsp;</td>
+					</tr>
+				</table>
+			</td>
+		</tr>
+		<tr>
+			<td valign="top" style="vertical-align: top; padding-top: 3px;">{#style_dlg.text_decoration}</td>
+			<td colspan="2">
+				<table border="0" cellspacing="0" cellpadding="0">
+					<tr>
+						<td><input id="text_underline" name="text_underline" class="checkbox" type="checkbox" /></td>
+						<td><label for="text_underline">{#style_dlg.text_underline}</label></td>
+					</tr>
+					<tr>
+						<td><input id="text_overline" name="text_overline" class="checkbox" type="checkbox" /></td>
+						<td><label for="text_overline">{#style_dlg.text_overline}</label></td>
+					</tr>
+					<tr>
+						<td><input id="text_linethrough" name="text_linethrough" class="checkbox" type="checkbox" /></td>
+						<td><label for="text_linethrough">{#style_dlg.text_striketrough}</label></td>
+					</tr>
+					<tr>
+						<td><input id="text_blink" name="text_blink" class="checkbox" type="checkbox" /></td>
+						<td><label for="text_blink">{#style_dlg.text_blink}</label></td>
+					</tr>
+					<tr>
+						<td><input id="text_none" name="text_none" class="checkbox" type="checkbox" /></td>
+						<td><label for="text_none">{#style_dlg.text_none}</label></td>
+					</tr>
+				</table>
+			</td>
+		</tr>
+	</table>
+</div>
+
+<div id="background_panel" class="panel">
+	<table border="0">
+		<tr>
+			<td><label for="background_color">{#style_dlg.background_color}</label></td>
+			<td>
+				<table border="0" cellpadding="0" cellspacing="0">
+					<tr>
+						<td><input id="background_color" name="background_color" type="text" value="" size="9" onChange="updateColor('background_color_pick','background_color');" /></td>
+						<td id="background_color_pickcontainer">&nbsp;</td>
+					</tr>
+				</table>
+			</td>
+		</tr>
+
+		<tr>
+			<td><label for="background_image">{#style_dlg.background_image}</label></td>
+			<td><table border="0" cellspacing="0" cellpadding="0">
+				<tr> 
+				  <td><input id="background_image" name="background_image" type="text" /></td> 
+				  <td id="background_image_browser">&nbsp;</td>
+				</tr>
+				</table>
+			</td>
+		</tr>
+
+		<tr>
+			<td><label for="background_repeat">{#style_dlg.background_repeat}</label></td>
+			<td><select id="background_repeat" name="background_repeat" class="mceEditableSelect"></select></td>
+		</tr>
+
+		<tr>
+			<td><label for="background_attachment">{#style_dlg.background_attachment}</label></td>
+			<td><select id="background_attachment" name="background_attachment" class="mceEditableSelect"></select></td>
+		</tr>
+
+		<tr>
+			<td><label for="background_hpos">{#style_dlg.background_hpos}</label></td>
+			<td>
+				<table border="0" cellspacing="0" cellpadding="0">
+					<tr>
+						<td><select id="background_hpos" name="background_hpos" class="mceEditableSelect"></select></td>
+						<td>&nbsp;</td>
+						<td><select id="background_hpos_measurement" name="background_hpos_measurement"></select></td>
+					</tr>
+				</table>
+			</td>
+		</tr>
+
+		<tr>
+			<td><label for="background_vpos">{#style_dlg.background_vpos}</label></td>
+			<td>
+				<table border="0" cellspacing="0" cellpadding="0">
+					<tr>
+						<td><select id="background_vpos" name="background_vpos" class="mceEditableSelect"></select></td>
+						<td>&nbsp;</td>
+						<td><select id="background_vpos_measurement" name="background_vpos_measurement"></select></td>
+					</tr>
+				</table>
+			</td>
+		</tr>
+	</table>
+</div>
+
+<div id="block_panel" class="panel">
+	<table border="0">
+		<tr>
+			<td><label for="block_wordspacing">{#style_dlg.block_wordspacing}</label></td>
+			<td>
+				<table border="0" cellspacing="0" cellpadding="0">
+					<tr>
+						<td><select id="block_wordspacing" name="block_wordspacing" class="mceEditableSelect"></select></td>
+						<td>&nbsp;</td>
+						<td><select id="block_wordspacing_measurement" name="block_wordspacing_measurement"></select></td>
+					</tr>
+				</table>
+			</td>
+		</tr>
+
+		<tr>
+			<td><label for="block_letterspacing">{#style_dlg.block_letterspacing}</label></td>
+			<td>
+				<table border="0" cellspacing="0" cellpadding="0">
+					<tr>
+						<td><select id="block_letterspacing" name="block_letterspacing" class="mceEditableSelect"></select></td>
+						<td>&nbsp;</td>
+						<td><select id="block_letterspacing_measurement" name="block_letterspacing_measurement"></select></td>
+					</tr>
+				</table>
+			</td>
+		</tr>
+
+		<tr>
+			<td><label for="block_vertical_alignment">{#style_dlg.block_vertical_alignment}</label></td>
+			<td><select id="block_vertical_alignment" name="block_vertical_alignment" class="mceEditableSelect"></select></td>
+		</tr>
+
+		<tr>
+			<td><label for="block_text_align">{#style_dlg.block_text_align}</label></td>
+			<td><select id="block_text_align" name="block_text_align" class="mceEditableSelect"></select></td>
+		</tr>
+
+		<tr>
+			<td><label for="block_text_indent">{#style_dlg.block_text_indent}</label></td>
+			<td>
+				<table border="0" cellspacing="0" cellpadding="0">
+					<tr>
+						<td><input type="text" id="block_text_indent" name="block_text_indent" /></td>
+						<td>&nbsp;</td>
+						<td><select id="block_text_indent_measurement" name="block_text_indent_measurement"></select></td>
+					</tr>
+				</table>
+			</td>
+		</tr>
+
+		<tr>
+			<td><label for="block_whitespace">{#style_dlg.block_whitespace}</label></td>
+			<td><select id="block_whitespace" name="block_whitespace" class="mceEditableSelect"></select></td>
+		</tr>
+
+		<tr>
+			<td><label for="block_display">{#style_dlg.block_display}</label></td>
+			<td><select id="block_display" name="block_display" class="mceEditableSelect"></select></td>
+		</tr>
+	</table>
+</div>
+
+<div id="box_panel" class="panel">
+<table border="0">
+	<tr>
+		<td><label for="box_width">{#style_dlg.box_width}</label></td>
+		<td>
+			<table border="0" cellspacing="0" cellpadding="0">
+				<tr>
+					<td><input type="text" id="box_width" name="box_width" class="mceEditableSelect" onChange="synch('box_width','positioning_width');" /></td>
+					<td>&nbsp;</td>
+					<td><select id="box_width_measurement" name="box_width_measurement"></select></td>
+				</tr>
+			</table>
+		</td>
+		<td>&nbsp;&nbsp;&nbsp;<label for="box_float">{#style_dlg.box_float}</label></td>
+		<td><select id="box_float" name="box_float" class="mceEditableSelect"></select></td>
+	</tr>
+
+	<tr>
+		<td><label for="box_height">{#style_dlg.box_height}</label></td>
+		<td>
+			<table border="0" cellspacing="0" cellpadding="0">
+				<tr>
+					<td><input type="text" id="box_height" name="box_height" class="mceEditableSelect" onChange="synch('box_height','positioning_height');" /></td>
+					<td>&nbsp;</td>
+					<td><select id="box_height_measurement" name="box_height_measurement"></select></td>
+				</tr>
+			</table>
+		</td>
+		<td>&nbsp;&nbsp;&nbsp;<label for="box_clear">{#style_dlg.box_clear}</label></td>
+		<td><select id="box_clear" name="box_clear" class="mceEditableSelect"></select></td>
+	</tr>
+</table>
+<div style="float: left; width: 49%">
+	<fieldset>
+		<legend>{#style_dlg.padding}</legend>
+
+		<table border="0">
+			<tr>
+				<td>&nbsp;</td>
+				<td><input type="checkbox" id="box_padding_same" name="box_padding_same" class="checkbox" checked="checked" onClick="toggleSame(this,'box_padding');" /> <label for="box_padding_same">{#style_dlg.same}</label></td>
+			</tr>
+			<tr>
+				<td><label for="box_padding_top">{#style_dlg.top}</label></td>
+				<td>
+					<table border="0" cellspacing="0" cellpadding="0">
+						<tr>
+							<td><input type="text" id="box_padding_top" name="box_padding_top" class="mceEditableSelect" /></td>
+							<td>&nbsp;</td>
+							<td><select id="box_padding_top_measurement" name="box_padding_top_measurement"></select></td>
+						</tr>
+					</table>
+				</td>
+			</tr>
+			<tr>
+				<td><label for="box_padding_right">{#style_dlg.right}</label></td>
+				<td>
+					<table border="0" cellspacing="0" cellpadding="0">
+						<tr>
+							<td><input type="text" id="box_padding_right" name="box_padding_right" class="mceEditableSelect" disabled="disabled" /></td>
+							<td>&nbsp;</td>
+							<td><select id="box_padding_right_measurement" name="box_padding_right_measurement" disabled="disabled"></select></td>
+						</tr>
+					</table>
+				</td>
+			</tr>
+			<tr>
+				<td><label for="box_padding_bottom">{#style_dlg.bottom}</label></td>
+				<td>
+					<table border="0" cellspacing="0" cellpadding="0">
+						<tr>
+							<td><input type="text" id="box_padding_bottom" name="box_padding_bottom" class="mceEditableSelect" disabled="disabled" /></td>
+							<td>&nbsp;</td>
+							<td><select id="box_padding_bottom_measurement" name="box_padding_bottom_measurement" disabled="disabled"></select></td>
+						</tr>
+					</table>
+				</td>
+			</tr>
+			<tr>
+				<td><label for="box_padding_left">{#style_dlg.left}</label></td>
+				<td>
+					<table border="0" cellspacing="0" cellpadding="0">
+						<tr>
+							<td><input type="text" id="box_padding_left" name="box_padding_left" class="mceEditableSelect" disabled="disabled" /></td>
+							<td>&nbsp;</td>
+							<td><select id="box_padding_left_measurement" name="box_padding_left_measurement" disabled="disabled"></select></td>
+						</tr>
+					</table>
+				</td>
+			</tr>
+		</table>
+	</fieldset>
+</div>
+
+<div style="float: right; width: 49%">
+	<fieldset>
+		<legend>{#style_dlg.margin}</legend>
+
+		<table border="0">
+			<tr>
+				<td>&nbsp;</td>
+				<td><input type="checkbox" id="box_margin_same" name="box_margin_same" class="checkbox" checked="checked" onClick="toggleSame(this,'box_margin');" /> <label for="box_margin_same">{#style_dlg.same}</label></td>
+			</tr>
+			<tr>
+				<td><label for="box_margin_top">{#style_dlg.top}</label></td>
+				<td>
+					<table border="0" cellspacing="0" cellpadding="0">
+						<tr>
+							<td><input type="text" id="box_margin_top" name="box_margin_top" class="mceEditableSelect" /></td>
+							<td>&nbsp;</td>
+							<td><select id="box_margin_top_measurement" name="box_margin_top_measurement"></select></td>
+						</tr>
+					</table>
+				</td>
+			</tr>
+			<tr>
+				<td><label for="box_margin_right">{#style_dlg.right}</label></td>
+				<td>
+					<table border="0" cellspacing="0" cellpadding="0">
+						<tr>
+							<td><input type="text" id="box_margin_right" name="box_margin_right" class="mceEditableSelect" disabled="disabled" /></td>
+							<td>&nbsp;</td>
+							<td><select id="box_margin_right_measurement" name="box_margin_right_measurement" disabled="disabled"></select></td>
+						</tr>
+					</table>
+				</td>
+			</tr>
+			<tr>
+				<td><label for="box_margin_bottom">{#style_dlg.bottom}</label></td>
+				<td>
+					<table border="0" cellspacing="0" cellpadding="0">
+						<tr>
+							<td><input type="text" id="box_margin_bottom" name="box_margin_bottom" class="mceEditableSelect" disabled="disabled" /></td>
+							<td>&nbsp;</td>
+							<td><select id="box_margin_bottom_measurement" name="box_margin_bottom_measurement" disabled="disabled"></select></td>
+						</tr>
+					</table>
+				</td>
+			</tr>
+			<tr>
+				<td><label for="box_margin_left">{#style_dlg.left}</label></td>
+				<td>
+					<table border="0" cellspacing="0" cellpadding="0">
+						<tr>
+							<td><input type="text" id="box_margin_left" name="box_margin_left" class="mceEditableSelect" disabled="disabled" /></td>
+							<td>&nbsp;</td>
+							<td><select id="box_margin_left_measurement" name="box_margin_left_measurement" disabled="disabled"></select></td>
+						</tr>
+					</table>
+				</td>
+			</tr>
+		</table>
+	</fieldset>
+</div>
+<br style="clear: both" />
+</div>
+
+<div id="border_panel" class="panel">
+<table border="0" cellspacing="0" cellpadding="0" width="100%">
+<tr>
+	<td class="tdelim">&nbsp;</td>
+	<td class="tdelim delim">&nbsp;</td>
+	<td class="tdelim">{#style_dlg.style}</td>
+	<td class="tdelim delim">&nbsp;</td>
+	<td class="tdelim">{#style_dlg.width}</td>
+	<td class="tdelim delim">&nbsp;</td>
+	<td class="tdelim">{#style_dlg.color}</td>
+</tr>
+
+<tr>
+	<td>&nbsp;</td>
+	<td class="delim">&nbsp;</td>
+	<td><input type="checkbox" id="border_style_same" name="border_style_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_style');" /> <label for="border_style_same">{#style_dlg.same}</label></td>
+	<td class="delim">&nbsp;</td>
+	<td><input type="checkbox" id="border_width_same" name="border_width_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_width');" /> <label for="border_width_same">{#style_dlg.same}</label></td>
+	<td class="delim">&nbsp;</td>
+	<td><input type="checkbox" id="border_color_same" name="border_color_same" class="checkbox" checked="checked" onClick="toggleSame(this,'border_color');" /> <label for="border_color_same">{#style_dlg.same}</label></td>
+</tr>
+
+<tr>
+	<td>{#style_dlg.top}</td>
+	<td class="delim">&nbsp;</td>
+	<td><select id="border_style_top" name="border_style_top" class="mceEditableSelect"></select></td>
+	<td class="delim">&nbsp;</td>
+	<td>
+		<table border="0" cellspacing="0" cellpadding="0">
+			<tr>
+				<td><select id="border_width_top" name="border_width_top" class="mceEditableSelect"></select></td>
+				<td>&nbsp;</td>
+				<td><select id="border_width_top_measurement" name="border_width_top_measurement"></select></td>
+			</tr>
+		</table>
+	</td>
+	<td class="delim">&nbsp;</td>
+	<td>
+		<table border="0" cellpadding="0" cellspacing="0">
+			<tr>
+				<td><input id="border_color_top" name="border_color_top" type="text" value="" size="9" onChange="updateColor('border_color_top_pick','border_color_top');" /></td>
+				<td id="border_color_top_pickcontainer">&nbsp;</td>
+			</tr>
+		</table>
+	</td>
+</tr>
+
+<tr>
+	<td>{#style_dlg.right}</td>
+	<td class="delim">&nbsp;</td>
+	<td><select id="border_style_right" name="border_style_right" class="mceEditableSelect" disabled="disabled"></select></td>
+	<td class="delim">&nbsp;</td>
+	<td>
+		<table border="0" cellspacing="0" cellpadding="0">
+			<tr>
+				<td><select id="border_width_right" name="border_width_right" class="mceEditableSelect" disabled="disabled"></select></td>
+				<td>&nbsp;</td>
+				<td><select id="border_width_right_measurement" name="border_width_right_measurement" disabled="disabled"></select></td>
+			</tr>
+		</table>
+	</td>
+	<td class="delim">&nbsp;</td>
+	<td>
+		<table border="0" cellpadding="0" cellspacing="0">
+			<tr>
+				<td><input id="border_color_right" name="border_color_right" type="text" value="" size="9" onChange="updateColor('border_color_right_pick','border_color_right');" disabled="disabled" /></td>
+				<td id="border_color_right_pickcontainer">&nbsp;</td>
+			</tr>
+		</table>
+	</td>
+</tr>
+
+<tr>
+	<td>{#style_dlg.bottom}</td>
+	<td class="delim">&nbsp;</td>
+	<td><select id="border_style_bottom" name="border_style_bottom" class="mceEditableSelect" disabled="disabled"></select></td>
+	<td class="delim">&nbsp;</td>
+	<td>
+		<table border="0" cellspacing="0" cellpadding="0">
+			<tr>
+				<td><select id="border_width_bottom" name="border_width_bottom" class="mceEditableSelect" disabled="disabled"></select></td>
+				<td>&nbsp;</td>
+				<td><select id="border_width_bottom_measurement" name="border_width_bottom_measurement" disabled="disabled"></select></td>
+			</tr>
+		</table>
+	</td>
+	<td class="delim">&nbsp;</td>
+	<td>
+		<table border="0" cellpadding="0" cellspacing="0">
+			<tr>
+				<td><input id="border_color_bottom" name="border_color_bottom" type="text" value="" size="9" onChange="updateColor('border_color_bottom_pick','border_color_bottom');" disabled="disabled" /></td>
+				<td id="border_color_bottom_pickcontainer">&nbsp;</td>
+			</tr>
+		</table>
+	</td>
+</tr>
+
+<tr>
+	<td>{#style_dlg.left}</td>
+	<td class="delim">&nbsp;</td>
+	<td><select id="border_style_left" name="border_style_left" class="mceEditableSelect" disabled="disabled"></select></td>
+	<td class="delim">&nbsp;</td>
+	<td>
+		<table border="0" cellspacing="0" cellpadding="0">
+			<tr>
+				<td><select id="border_width_left" name="border_width_left" class="mceEditableSelect" disabled="disabled"></select></td>
+				<td>&nbsp;</td>
+				<td><select id="border_width_left_measurement" name="border_width_left_measurement" disabled="disabled"></select></td>
+			</tr>
+		</table>
+	</td>
+	<td class="delim">&nbsp;</td>
+	<td>
+		<table border="0" cellpadding="0" cellspacing="0">
+			<tr>
+				<td><input id="border_color_left" name="border_color_left" type="text" value="" size="9" onChange="updateColor('border_color_left_pick','border_color_left');" disabled="disabled" /></td>
+				<td id="border_color_left_pickcontainer">&nbsp;</td>
+			</tr>
+		</table>
+	</td>
+</tr>
+</table>
+</div>
+
+<div id="list_panel" class="panel">
+	<table border="0">
+		<tr>
+			<td><label for="list_type">{#style_dlg.list_type}</label></td>
+			<td><select id="list_type" name="list_type" class="mceEditableSelect"></select></td>
+		</tr>
+
+		<tr>
+			<td><label for="list_bullet_image">{#style_dlg.bullet_image}</label></td>
+			<td><input id="list_bullet_image" name="list_bullet_image" type="text" /></td>
+		</tr>
+
+		<tr>
+			<td><label for="list_position">{#style_dlg.position}</label></td>
+			<td><select id="list_position" name="list_position" class="mceEditableSelect"></select></td>
+		</tr>
+	</table>
+</div>
+
+<div id="positioning_panel" class="panel">
+<table border="0">
+	<tr>
+		<td><label for="positioning_type">{#style_dlg.positioning_type}</label></td>
+		<td><select id="positioning_type" name="positioning_type" class="mceEditableSelect"></select></td>
+		<td>&nbsp;&nbsp;&nbsp;<label for="positioning_visibility">{#style_dlg.visibility}</label></td>
+		<td><select id="positioning_visibility" name="positioning_visibility" class="mceEditableSelect"></select></td>
+	</tr>
+
+	<tr>
+		<td><label for="positioning_width">{#style_dlg.width}</label></td>
+		<td>
+			<table border="0" cellspacing="0" cellpadding="0">
+				<tr>
+					<td><input type="text" id="positioning_width" name="positioning_width" onChange="synch('positioning_width','box_width');" /></td>
+					<td>&nbsp;</td>
+					<td><select id="positioning_width_measurement" name="positioning_width_measurement"></select></td>
+				</tr>
+			</table>
+		</td>
+		<td>&nbsp;&nbsp;&nbsp;<label for="positioning_zindex">{#style_dlg.zindex}</label></td>
+		<td><input type="text" id="positioning_zindex" name="positioning_zindex" /></td>
+	</tr>
+
+	<tr>
+		<td><label for="positioning_height">{#style_dlg.height}</label></td>
+		<td>
+			<table border="0" cellspacing="0" cellpadding="0">
+				<tr>
+					<td><input type="text" id="positioning_height" name="positioning_height" onChange="synch('positioning_height','box_height');" /></td>
+					<td>&nbsp;</td>
+					<td><select id="positioning_height_measurement" name="positioning_height_measurement"></select></td>
+				</tr>
+			</table>
+		</td>
+		<td>&nbsp;&nbsp;&nbsp;<label for="positioning_overflow">{#style_dlg.overflow}</label></td>
+		<td><select id="positioning_overflow" name="positioning_overflow" class="mceEditableSelect"></select></td>
+	</tr>
+</table>
+
+<div style="float: left; width: 49%">
+	<fieldset>
+		<legend>{#style_dlg.placement}</legend>
+
+		<table border="0">
+			<tr>
+				<td>&nbsp;</td>
+				<td><input type="checkbox" id="positioning_placement_same" name="positioning_placement_same" class="checkbox" checked="checked" onClick="toggleSame(this,'positioning_placement');" /> <label for="positioning_placement_same">{#style_dlg.same}</label></td>
+			</tr>
+			<tr>
+				<td>{#style_dlg.top}</td>
+				<td>
+					<table border="0" cellspacing="0" cellpadding="0">
+						<tr>
+							<td><input type="text" id="positioning_placement_top" name="positioning_placement_top" /></td>
+							<td>&nbsp;</td>
+							<td><select id="positioning_placement_top_measurement" name="positioning_placement_top_measurement"></select></td>
+						</tr>
+					</table>
+				</td>
+			</tr>
+			<tr>
+				<td>{#style_dlg.right}</td>
+				<td>
+					<table border="0" cellspacing="0" cellpadding="0">
+						<tr>
+							<td><input type="text" id="positioning_placement_right" name="positioning_placement_right" disabled="disabled" /></td>
+							<td>&nbsp;</td>
+							<td><select id="positioning_placement_right_measurement" name="positioning_placement_right_measurement" disabled="disabled"></select></td>
+						</tr>
+					</table>
+				</td>
+			</tr>
+			<tr>
+				<td>{#style_dlg.bottom}</td>
+				<td>
+					<table border="0" cellspacing="0" cellpadding="0">
+						<tr>
+							<td><input type="text" id="positioning_placement_bottom" name="positioning_placement_bottom" disabled="disabled" /></td>
+							<td>&nbsp;</td>
+							<td><select id="positioning_placement_bottom_measurement" name="positioning_placement_bottom_measurement" disabled="disabled"></select></td>
+						</tr>
+					</table>
+				</td>
+			</tr>
+			<tr>
+				<td>{#style_dlg.left}</td>
+				<td>
+					<table border="0" cellspacing="0" cellpadding="0">
+						<tr>
+							<td><input type="text" id="positioning_placement_left" name="positioning_placement_left" disabled="disabled" /></td>
+							<td>&nbsp;</td>
+							<td><select id="positioning_placement_left_measurement" name="positioning_placement_left_measurement" disabled="disabled"></select></td>
+						</tr>
+					</table>
+				</td>
+			</tr>
+		</table>
+	</fieldset>
+</div>
+
+<div style="float: right; width: 49%">
+	<fieldset>
+		<legend>{#style_dlg.clip}</legend>
+
+		<table border="0">
+			<tr>
+				<td>&nbsp;</td>
+				<td><input type="checkbox" id="positioning_clip_same" name="positioning_clip_same" class="checkbox" checked="checked" onClick="toggleSame(this,'positioning_clip');" /> <label for="positioning_clip_same">{#style_dlg.same}</label></td>
+			</tr>
+			<tr>
+				<td>{#style_dlg.top}</td>
+				<td>
+					<table border="0" cellspacing="0" cellpadding="0">
+						<tr>
+							<td><input type="text" id="positioning_clip_top" name="positioning_clip_top" /></td>
+							<td>&nbsp;</td>
+							<td><select id="positioning_clip_top_measurement" name="positioning_clip_top_measurement"></select></td>
+						</tr>
+					</table>
+				</td>
+			</tr>
+			<tr>
+				<td>{#style_dlg.right}</td>
+				<td>
+					<table border="0" cellspacing="0" cellpadding="0">
+						<tr>
+							<td><input type="text" id="positioning_clip_right" name="positioning_clip_right" disabled="disabled" /></td>
+							<td>&nbsp;</td>
+							<td><select id="positioning_clip_right_measurement" name="positioning_clip_right_measurement" disabled="disabled"></select></td>
+						</tr>
+					</table>
+				</td>
+			</tr>
+			<tr>
+				<td>{#style_dlg.bottom}</td>
+				<td>
+					<table border="0" cellspacing="0" cellpadding="0">
+						<tr>
+							<td><input type="text" id="positioning_clip_bottom" name="positioning_clip_bottom" disabled="disabled" /></td>
+							<td>&nbsp;</td>
+							<td><select id="positioning_clip_bottom_measurement" name="positioning_clip_bottom_measurement" disabled="disabled"></select></td>
+						</tr>
+					</table>
+				</td>
+			</tr>
+			<tr>
+				<td>{#style_dlg.left}</td>
+				<td>
+					<table border="0" cellspacing="0" cellpadding="0">
+						<tr>
+							<td><input type="text" id="positioning_clip_left" name="positioning_clip_left" disabled="disabled" /></td>
+							<td>&nbsp;</td>
+							<td><select id="positioning_clip_left_measurement" name="positioning_clip_left_measurement" disabled="disabled"></select></td>
+						</tr>
+					</table>
+				</td>
+			</tr>
+		</table>
+	</fieldset>
+</div>
+<br style="clear: both" />
+</div>
+</div>
+
+<div class="mceActionPanel">
+	<div style="float: left">
+		<div style="float: left"><input type="submit" id="insert" name="insert" value="{#update}" /></div>
+
+		<div style="float: left">&nbsp;<input type="button" class="button" id="apply" name="apply" value="{#style_dlg.apply}" onClick="applyAction();" /></div>
+		<br style="clear: both" />
+	</div>
+
+	<div style="float: right">
+		<input type="button" id="cancel" name="cancel" value="{#cancel}" onClick="tinyMCEPopup.close();" />
+	</div>
+</div>
+</form>
+
+<div style="display: none">
+	<div id="container"></div>
+</div>
+
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/style/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/cell.htm
@@ -1,1 +1,185 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#table_dlg.cell_title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="../../utils/editable_selects.js"></script>
+	<script type="text/javascript" src="js/cell.js"></script>
+	<link href="css/cell.css" rel="stylesheet" type="text/css" />
+	<base target="_self" />
+</head>
+<body id="tablecell" style="display: none">
+	<form onsubmit="updateAction();return false;" action="#">
+		<div class="tabs">
+			<ul>
+				<li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#table_dlg.general_tab}</a></span></li>
+				<li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#table_dlg.advanced_tab}</a></span></li>
+			</ul>
+		</div>
 
+		<div class="panel_wrapper">
+			<div id="general_panel" class="panel current">
+				<fieldset>
+					<legend>{#table_dlg.general_props}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td><label for="align">{#table_dlg.align}</label></td>
+							<td>
+								<select id="align" name="align" class="mceFocus">
+									<option value="">{#not_set}</option>
+									<option value="center">{#table_dlg.align_middle}</option>
+									<option value="left">{#table_dlg.align_left}</option>
+									<option value="right">{#table_dlg.align_right}</option>
+								</select>
+							</td>
+		
+							<td><label for="celltype">{#table_dlg.cell_type}</label></td>
+							<td>
+								<select id="celltype" name="celltype">
+									<option value="td">{#table_dlg.td}</option>
+									<option value="th">{#table_dlg.th}</option>
+								</select>
+							</td>
+						</tr>
+
+						<tr>
+							<td><label for="valign">{#table_dlg.valign}</label></td>
+							<td>
+								<select id="valign" name="valign">
+									<option value="">{#not_set}</option>
+									<option value="top">{#table_dlg.align_top}</option>
+									<option value="middle">{#table_dlg.align_middle}</option>
+									<option value="bottom">{#table_dlg.align_bottom}</option>
+								</select>
+							</td>
+
+							<td><label for="scope">{#table_dlg.scope}</label></td>
+							<td>
+								<select id="scope" name="scope">
+									<option value="">{#not_set}</option>
+									<option value="col">{#table.col}</option>
+									<option value="row">{#table.row}</option>
+									<option value="rowgroup">{#table_dlg.rowgroup}</option>
+									<option value="colgroup">{#table_dlg.colgroup}</option>
+								</select>
+							</td>
+
+						</tr>
+
+						<tr>
+							<td><label for="width">{#table_dlg.width}</label></td>
+							<td><input id="width" name="width" type="text" value="" size="4" maxlength="4" onchange="changedSize();" /></td>
+
+							<td><label for="height">{#table_dlg.height}</label></td>
+							<td><input id="height" name="height" type="text" value="" size="4" maxlength="4" onchange="changedSize();" /></td>
+						</tr>
+
+						<tr id="styleSelectRow">
+							<td><label for="class">{#class_name}</label></td>
+							<td colspan="3">
+								<select id="class" name="class" class="mceEditableSelect">
+									<option value="" selected="selected">{#not_set}</option>
+								</select>
+							</td>
+						</tr>
+					</table>
+				</fieldset>
+			</div>
+
+			<div id="advanced_panel" class="panel">
+				<fieldset>
+					<legend>{#table_dlg.advanced_props}</legend>
+
+					<table border="0" cellpadding="0" cellspacing="4">
+						<tr>
+							<td class="column1"><label for="id">{#table_dlg.id}</label></td> 
+							<td><input id="id" name="id" type="text" value="" style="width: 200px" /></td> 
+						</tr>
+
+						<tr>
+							<td><label for="style">{#table_dlg.style}</label></td>
+							<td><input type="text" id="style" name="style" value="" style="width: 200px;" onchange="changedStyle();" /></td>
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="dir">{#table_dlg.langdir}</label></td> 
+							<td>
+								<select id="dir" name="dir" style="width: 200px"> 
+										<option value="">{#not_set}</option> 
+										<option value="ltr">{#table_dlg.ltr}</option> 
+										<option value="rtl">{#table_dlg.rtl}</option> 
+								</select>
+							</td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="lang">{#table_dlg.langcode}</label></td> 
+							<td>
+								<input id="lang" name="lang" type="text" value="" style="width: 200px" />
+							</td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="backgroundimage">{#table_dlg.bgimage}</label></td> 
+							<td>
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="backgroundimage" name="backgroundimage" type="text" value="" style="width: 200px" onchange="changedBackgroundImage();" /></td>
+										<td id="backgroundimagebrowsercontainer">&nbsp;</td>
+									</tr>
+								</table>
+							</td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="bordercolor">{#table_dlg.bordercolor}</label></td> 
+							<td>
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="bordercolor" name="bordercolor" type="text" value="" size="9" onchange="updateColor('bordercolor_pick','bordercolor');changedColor();" /></td>
+										<td id="bordercolor_pickcontainer">&nbsp;</td>
+									</tr>
+								</table>
+							</td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="bgcolor">{#table_dlg.bgcolor}</label></td> 
+							<td>
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>
+										<td id="bgcolor_pickcontainer">&nbsp;</td>
+									</tr>
+								</table>
+							</td> 
+						</tr>
+					</table>
+				</fieldset>
+			</div>
+		</div>
+
+		<div class="mceActionPanel">
+			<div>
+				<select id="action" name="action">
+					<option value="cell">{#table_dlg.cell_cell}</option>
+					<option value="row">{#table_dlg.cell_row}</option>
+					<option value="all">{#table_dlg.cell_all}</option>
+				</select>
+			</div>
+
+			<div style="float: left">
+				<div><input type="submit" id="insert" name="insert" value="{#update}" /></div>
+			</div>
+
+			<div style="float: right">
+				<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+			</div>
+		</div>
+	</form>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/css/cell.css
@@ -1,1 +1,17 @@
+/* CSS file for cell dialog in the table plugin */
 
+.panel_wrapper div.current {
+	height: 200px;
+}
+
+.advfield {
+	width: 200px;
+}
+
+#action {
+	margin-bottom: 3px;
+}
+
+#class {
+	width: 150px;
+}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/css/row.css
@@ -1,1 +1,26 @@
+/* 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;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/css/table.css
@@ -1,1 +1,14 @@
+/* CSS file for table dialog in the table plugin */
 
+.panel_wrapper div.current {
+	height: 245px;
+}
+
+.advfield {
+	width: 200px;
+}
+
+#class {
+	width: 150px;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){var each=tinymce.each;tinymce.create('tinymce.plugins.TablePlugin',{init:function(ed,url){var t=this;t.editor=ed;t.url=url;each([['table','table.desc','mceInsertTable',true],['delete_table','table.del','mceTableDelete'],['delete_col','table.delete_col_desc','mceTableDeleteCol'],['delete_row','table.delete_row_desc','mceTableDeleteRow'],['col_after','table.col_after_desc','mceTableInsertColAfter'],['col_before','table.col_before_desc','mceTableInsertColBefore'],['row_after','table.row_after_desc','mceTableInsertRowAfter'],['row_before','table.row_before_desc','mceTableInsertRowBefore'],['row_props','table.row_desc','mceTableRowProps',true],['cell_props','table.cell_desc','mceTableCellProps',true],['split_cells','table.split_cells_desc','mceTableSplitCells',true],['merge_cells','table.merge_cells_desc','mceTableMergeCells',true]],function(c){ed.addButton(c[0],{title:c[1],cmd:c[2],ui:c[3]});});ed.onInit.add(function(){if(ed&&ed.plugins.contextmenu){ed.plugins.contextmenu.onContextMenu.add(function(th,m,e){var sm,se=ed.selection,el=se.getNode()||ed.getBody();if(ed.dom.getParent(e,'td')||ed.dom.getParent(e,'th')){m.removeAll();if(el.nodeName=='A'&&!ed.dom.getAttrib(el,'name')){m.add({title:'advanced.link_desc',icon:'link',cmd:ed.plugins.advlink?'mceAdvLink':'mceLink',ui:true});m.add({title:'advanced.unlink_desc',icon:'unlink',cmd:'UnLink'});m.addSeparator();}if(el.nodeName=='IMG'&&el.className.indexOf('mceItem')==-1){m.add({title:'advanced.image_desc',icon:'image',cmd:ed.plugins.advimage?'mceAdvImage':'mceImage',ui:true});m.addSeparator();}m.add({title:'table.desc',icon:'table',cmd:'mceInsertTable',ui:true,value:{action:'insert'}});m.add({title:'table.props_desc',icon:'table_props',cmd:'mceInsertTable',ui:true});m.add({title:'table.del',icon:'delete_table',cmd:'mceTableDelete',ui:true});m.addSeparator();sm=m.addMenu({title:'table.cell'});sm.add({title:'table.cell_desc',icon:'cell_props',cmd:'mceTableCellProps',ui:true});sm.add({title:'table.split_cells_desc',icon:'split_cells',cmd:'mceTableSplitCells',ui:true});sm.add({title:'table.merge_cells_desc',icon:'merge_cells',cmd:'mceTableMergeCells',ui:true});sm=m.addMenu({title:'table.row'});sm.add({title:'table.row_desc',icon:'row_props',cmd:'mceTableRowProps',ui:true});sm.add({title:'table.row_before_desc',icon:'row_before',cmd:'mceTableInsertRowBefore'});sm.add({title:'table.row_after_desc',icon:'row_after',cmd:'mceTableInsertRowAfter'});sm.add({title:'table.delete_row_desc',icon:'delete_row',cmd:'mceTableDeleteRow'});sm.addSeparator();sm.add({title:'table.cut_row_desc',icon:'cut',cmd:'mceTableCutRow'});sm.add({title:'table.copy_row_desc',icon:'copy',cmd:'mceTableCopyRow'});sm.add({title:'table.paste_row_before_desc',icon:'paste',cmd:'mceTablePasteRowBefore'});sm.add({title:'table.paste_row_after_desc',icon:'paste',cmd:'mceTablePasteRowAfter'});sm=m.addMenu({title:'table.col'});sm.add({title:'table.col_before_desc',icon:'col_before',cmd:'mceTableInsertColBefore'});sm.add({title:'table.col_after_desc',icon:'col_after',cmd:'mceTableInsertColAfter'});sm.add({title:'table.delete_col_desc',icon:'delete_col',cmd:'mceTableDeleteCol'});}else m.add({title:'table.desc',icon:'table',cmd:'mceInsertTable',ui:true});});}});ed.onKeyDown.add(function(ed,e){if(e.keyCode==9&&ed.dom.getParent(ed.selection.getNode(),'TABLE')){if(!tinymce.isGecko&&!tinymce.isOpera){tinyMCE.execInstanceCommand(ed.editorId,"mceTableMoveToNextRow",true);return tinymce.dom.Event.cancel(e);}ed.undoManager.add();}});if(!tinymce.isIE){if(ed.getParam('table_selection',true)){ed.onClick.add(function(ed,e){e=e.target;if(e.nodeName==='TABLE')ed.selection.select(e);});}}ed.onNodeChange.add(function(ed,cm,n){var p=ed.dom.getParent(n,'td,th,caption');cm.setActive('table',n.nodeName==='TABLE'||!!p);if(p&&p.nodeName==='CAPTION')p=null;cm.setDisabled('delete_table',!p);cm.setDisabled('delete_col',!p);cm.setDisabled('delete_table',!p);cm.setDisabled('delete_row',!p);cm.setDisabled('col_after',!p);cm.setDisabled('col_before',!p);cm.setDisabled('row_after',!p);cm.setDisabled('row_before',!p);cm.setDisabled('row_props',!p);cm.setDisabled('cell_props',!p);cm.setDisabled('split_cells',!p||(parseInt(ed.dom.getAttrib(p,'colspan','1'))<2&&parseInt(ed.dom.getAttrib(p,'rowspan','1'))<2));cm.setDisabled('merge_cells',!p);});if(!tinymce.isIE){ed.onBeforeSetContent.add(function(ed,o){if(o.initial)o.content=o.content.replace(/<(td|th)([^>]+|)>\s*<\/(td|th)>/g,tinymce.isOpera?'<$1$2>&nbsp;</$1>':'<$1$2><br mce_bogus="1" /></$1>');});}},execCommand:function(cmd,ui,val){var ed=this.editor,b;switch(cmd){case"mceTableMoveToNextRow":case"mceInsertTable":case"mceTableRowProps":case"mceTableCellProps":case"mceTableSplitCells":case"mceTableMergeCells":case"mceTableInsertRowBefore":case"mceTableInsertRowAfter":case"mceTableDeleteRow":case"mceTableInsertColBefore":case"mceTableInsertColAfter":case"mceTableDeleteCol":case"mceTableCutRow":case"mceTableCopyRow":case"mceTablePasteRowBefore":case"mceTablePasteRowAfter":case"mceTableDelete":ed.execCommand('mceBeginUndoLevel');this._doExecCommand(cmd,ui,val);ed.execCommand('mceEndUndoLevel');return true;}return false;},getInfo:function(){return{longname:'Tables',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/table',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_doExecCommand:function(command,user_interface,value){var inst=this.editor,ed=inst,url=this.url;var focusElm=inst.selection.getNode();var trElm=inst.dom.getParent(focusElm,"tr");var tdElm=inst.dom.getParent(focusElm,"td,th");var tableElm=inst.dom.getParent(focusElm,"table");var doc=inst.contentWindow.document;var tableBorder=tableElm?tableElm.getAttribute("border"):"";if(trElm&&tdElm==null)tdElm=trElm.cells[0];function inArray(ar,v){for(var i=0;i<ar.length;i++){if(ar[i].length>0&&inArray(ar[i],v))return true;if(ar[i]==v)return true;}return false;}function select(dx,dy){var td;grid=getTableGrid(tableElm);dx=dx||0;dy=dy||0;dx=Math.max(cpos.cellindex+dx,0);dy=Math.max(cpos.rowindex+dy,0);inst.execCommand('mceRepaint');td=getCell(grid,dy,dx);if(td){inst.selection.select(td.firstChild||td);inst.selection.collapse(1);}};function makeTD(){var newTD=doc.createElement("td");if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';}function getColRowSpan(td){var colspan=inst.dom.getAttrib(td,"colspan");var rowspan=inst.dom.getAttrib(td,"rowspan");colspan=colspan==""?1:parseInt(colspan);rowspan=rowspan==""?1:parseInt(rowspan);return{colspan:colspan,rowspan:rowspan};}function getCellPos(grid,td){var x,y;for(y=0;y<grid.length;y++){for(x=0;x<grid[y].length;x++){if(grid[y][x]==td)return{cellindex:x,rowindex:y};}}return null;}function getCell(grid,row,col){if(grid[row]&&grid[row][col])return grid[row][col];return null;}function getNextCell(table,cell){var cells=[],x=0,i,j,cell,nextCell;for(i=0;i<table.rows.length;i++)for(j=0;j<table.rows[i].cells.length;j++,x++)cells[x]=table.rows[i].cells[j];for(i=0;i<cells.length;i++)if(cells[i]==cell)if(nextCell=cells[i+1])return nextCell;}function getTableGrid(table){var grid=[],rows=table.rows,x,y,td,sd,xstart,x2,y2;for(y=0;y<rows.length;y++){for(x=0;x<rows[y].cells.length;x++){td=rows[y].cells[x];sd=getColRowSpan(td);for(xstart=x;grid[y]&&grid[y][xstart];xstart++);for(y2=y;y2<y+sd['rowspan'];y2++){if(!grid[y2])grid[y2]=[];for(x2=xstart;x2<xstart+sd['colspan'];x2++)grid[y2][x2]=td;}}}return grid;}function trimRow(table,tr,td,new_tr){var grid=getTableGrid(table),cpos=getCellPos(grid,td);var cells,lastElm;if(new_tr.cells.length!=tr.childNodes.length){cells=tr.childNodes;lastElm=null;for(var x=0;td=getCell(grid,cpos.rowindex,x);x++){var remove=true;var sd=getColRowSpan(td);if(inArray(cells,td)){new_tr.childNodes[x]._delete=true;}else if((lastElm==null||td!=lastElm)&&sd.colspan>1){for(var i=x;i<x+td.colSpan;i++)new_tr.childNodes[i]._delete=true;}if((lastElm==null||td!=lastElm)&&sd.rowspan>1)td.rowSpan=sd.rowspan+1;lastElm=td;}deleteMarked(tableElm);}}function prevElm(node,name){while((node=node.previousSibling)!=null){if(node.nodeName==name)return node;}return null;}function nextElm(node,names){var namesAr=names.split(',');while((node=node.nextSibling)!=null){for(var i=0;i<namesAr.length;i++){if(node.nodeName.toLowerCase()==namesAr[i].toLowerCase())return node;}}return null;}function deleteMarked(tbl){if(tbl.rows==0)return;var tr=tbl.rows[0];do{var next=nextElm(tr,"TR");if(tr._delete){tr.parentNode.removeChild(tr);continue;}var td=tr.cells[0];if(td.cells>1){do{var nexttd=nextElm(td,"TD,TH");if(td._delete)td.parentNode.removeChild(td);}while((td=nexttd)!=null);}}while((tr=next)!=null);}function addRows(td_elm,tr_elm,rowspan){td_elm.rowSpan=1;var trNext=nextElm(tr_elm,"TR");for(var i=1;i<rowspan&&trNext;i++){var newTD=doc.createElement("td");if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';if(tinymce.isIE)trNext.insertBefore(newTD,trNext.cells(td_elm.cellIndex));else trNext.insertBefore(newTD,trNext.cells[td_elm.cellIndex]);trNext=nextElm(trNext,"TR");}}function copyRow(doc,table,tr){var grid=getTableGrid(table);var newTR=tr.cloneNode(false);var cpos=getCellPos(grid,tr.cells[0]);var lastCell=null;var tableBorder=inst.dom.getAttrib(table,"border");var tdElm=null;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){var newTD=null;if(lastCell!=tdElm){for(var i=0;i<tr.cells.length;i++){if(tdElm==tr.cells[i]){newTD=tdElm.cloneNode(true);break;}}}if(newTD==null){newTD=doc.createElement("td");if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';}newTD.colSpan=1;newTD.rowSpan=1;newTR.appendChild(newTD);lastCell=tdElm;}return newTR;}switch(command){case"mceTableMoveToNextRow":var nextCell=getNextCell(tableElm,tdElm);if(!nextCell){inst.execCommand("mceTableInsertRowAfter",tdElm);nextCell=getNextCell(tableElm,tdElm);}inst.selection.select(nextCell);inst.selection.collapse(true);return true;case"mceTableRowProps":if(trElm==null)return true;if(user_interface){inst.windowManager.open({url:url+'/row.htm',width:400+parseInt(inst.getLang('table.rowprops_delta_width',0)),height:295+parseInt(inst.getLang('table.rowprops_delta_height',0)),inline:1},{plugin_url:url});}return true;case"mceTableCellProps":if(tdElm==null)return true;if(user_interface){inst.windowManager.open({url:url+'/cell.htm',width:400+parseInt(inst.getLang('table.cellprops_delta_width',0)),height:295+parseInt(inst.getLang('table.cellprops_delta_height',0)),inline:1},{plugin_url:url});}return true;case"mceInsertTable":if(user_interface){inst.windowManager.open({url:url+'/table.htm',width:400+parseInt(inst.getLang('table.table_delta_width',0)),height:320+parseInt(inst.getLang('table.table_delta_height',0)),inline:1},{plugin_url:url,action:value?value.action:0});}return true;case"mceTableDelete":var table=inst.dom.getParent(inst.selection.getNode(),"table");if(table){table.parentNode.removeChild(table);inst.execCommand('mceRepaint');}return true;case"mceTableSplitCells":case"mceTableMergeCells":case"mceTableInsertRowBefore":case"mceTableInsertRowAfter":case"mceTableDeleteRow":case"mceTableInsertColBefore":case"mceTableInsertColAfter":case"mceTableDeleteCol":case"mceTableCutRow":case"mceTableCopyRow":case"mceTablePasteRowBefore":case"mceTablePasteRowAfter":if(!tableElm)return true;if(trElm&&tableElm!=trElm.parentNode)tableElm=trElm.parentNode;if(tableElm&&trElm){switch(command){case"mceTableCutRow":if(!trElm||!tdElm)return true;inst.tableRowClipboard=copyRow(doc,tableElm,trElm);inst.execCommand("mceTableDeleteRow");break;case"mceTableCopyRow":if(!trElm||!tdElm)return true;inst.tableRowClipboard=copyRow(doc,tableElm,trElm);break;case"mceTablePasteRowBefore":if(!trElm||!tdElm)return true;var newTR=inst.tableRowClipboard.cloneNode(true);var prevTR=prevElm(trElm,"TR");if(prevTR!=null)trimRow(tableElm,prevTR,prevTR.cells[0],newTR);trElm.parentNode.insertBefore(newTR,trElm);break;case"mceTablePasteRowAfter":if(!trElm||!tdElm)return true;var nextTR=nextElm(trElm,"TR");var newTR=inst.tableRowClipboard.cloneNode(true);trimRow(tableElm,trElm,tdElm,newTR);if(nextTR==null)trElm.parentNode.appendChild(newTR);else nextTR.parentNode.insertBefore(newTR,nextTR);break;case"mceTableInsertRowBefore":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var newTR=doc.createElement("tr");var lastTDElm=null;cpos.rowindex--;if(cpos.rowindex<0)cpos.rowindex=0;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['rowspan']==1){var newTD=doc.createElement("td");if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';newTD.colSpan=tdElm.colSpan;newTR.appendChild(newTD);}else tdElm.rowSpan=sd['rowspan']+1;lastTDElm=tdElm;}}trElm.parentNode.insertBefore(newTR,trElm);select(0,1);break;case"mceTableInsertRowAfter":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var newTR=doc.createElement("tr");var lastTDElm=null;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['rowspan']==1){var newTD=doc.createElement("td");if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';newTD.colSpan=tdElm.colSpan;newTR.appendChild(newTD);}else tdElm.rowSpan=sd['rowspan']+1;lastTDElm=tdElm;}}if(newTR.hasChildNodes()){var nextTR=nextElm(trElm,"TR");if(nextTR)nextTR.parentNode.insertBefore(newTR,nextTR);else tableElm.appendChild(newTR);}select(0,1);break;case"mceTableDeleteRow":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);if(grid.length==1&&tableElm.nodeName=='TBODY'){inst.dom.remove(inst.dom.getParent(tableElm,"table"));return true;}var cells=trElm.cells;var nextTR=nextElm(trElm,"TR");for(var x=0;x<cells.length;x++){if(cells[x].rowSpan>1){var newTD=cells[x].cloneNode(true);var sd=getColRowSpan(cells[x]);newTD.rowSpan=sd.rowspan-1;var nextTD=nextTR.cells[x];if(nextTD==null)nextTR.appendChild(newTD);else nextTR.insertBefore(newTD,nextTD);}}var lastTDElm=null;for(var x=0;tdElm=getCell(grid,cpos.rowindex,x);x++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd.rowspan>1){tdElm.rowSpan=sd.rowspan-1;}else{trElm=tdElm.parentNode;if(trElm.parentNode)trElm._delete=true;}lastTDElm=tdElm;}}deleteMarked(tableElm);select(0,-1);break;case"mceTableInsertColBefore":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']==1){var newTD=doc.createElement(tdElm.nodeName);if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';newTD.rowSpan=tdElm.rowSpan;tdElm.parentNode.insertBefore(newTD,tdElm);}else tdElm.colSpan++;lastTDElm=tdElm;}}select();break;case"mceTableInsertColAfter":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']==1){var newTD=doc.createElement(tdElm.nodeName);if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';newTD.rowSpan=tdElm.rowSpan;var nextTD=nextElm(tdElm,"TD,TH");if(nextTD==null)tdElm.parentNode.appendChild(newTD);else nextTD.parentNode.insertBefore(newTD,nextTD);}else tdElm.colSpan++;lastTDElm=tdElm;}}select(1);break;case"mceTableDeleteCol":if(!trElm||!tdElm)return true;var grid=getTableGrid(tableElm);var cpos=getCellPos(grid,tdElm);var lastTDElm=null;if((grid.length>1&&grid[0].length<=1)&&tableElm.nodeName=='TBODY'){inst.dom.remove(inst.dom.getParent(tableElm,"table"));return true;}for(var y=0;tdElm=getCell(grid,y,cpos.cellindex);y++){if(tdElm!=lastTDElm){var sd=getColRowSpan(tdElm);if(sd['colspan']>1)tdElm.colSpan=sd['colspan']-1;else{if(tdElm.parentNode)tdElm.parentNode.removeChild(tdElm);}lastTDElm=tdElm;}}select(-1);break;case"mceTableSplitCells":if(!trElm||!tdElm)return true;var spandata=getColRowSpan(tdElm);var colspan=spandata["colspan"];var rowspan=spandata["rowspan"];if(colspan>1||rowspan>1){tdElm.colSpan=1;for(var i=1;i<colspan;i++){var newTD=doc.createElement("td");if(!tinymce.isIE)newTD.innerHTML='<br mce_bogus="1"/>';trElm.insertBefore(newTD,nextElm(tdElm,"TD,TH"));if(rowspan>1)addRows(newTD,trElm,rowspan);}addRows(tdElm,trElm,rowspan);}tableElm=inst.dom.getParent(inst.selection.getNode(),"table");break;case"mceTableMergeCells":var rows=[];var sel=inst.selection.getSel();var grid=getTableGrid(tableElm);if(tinymce.isIE||sel.rangeCount==1){if(user_interface){var sp=getColRowSpan(tdElm);inst.windowManager.open({url:url+'/merge_cells.htm',width:240+parseInt(inst.getLang('table.merge_cells_delta_width',0)),height:110+parseInt(inst.getLang('table.merge_cells_delta_height',0)),inline:1},{action:"update",numcols:sp.colspan,numrows:sp.rowspan,plugin_url:url});return true;}else{var numRows=parseInt(value['numrows']);var numCols=parseInt(value['numcols']);var cpos=getCellPos(grid,tdElm);if((""+numRows)=="NaN")numRows=1;if((""+numCols)=="NaN")numCols=1;var tRows=tableElm.rows;for(var y=cpos.rowindex;y<grid.length;y++){var rowCells=[];for(var x=cpos.cellindex;x<grid[y].length;x++){var td=getCell(grid,y,x);if(td&&!inArray(rows,td)&&!inArray(rowCells,td)){var cp=getCellPos(grid,td);if(cp.cellindex<cpos.cellindex+numCols&&cp.rowindex<cpos.rowindex+numRows)rowCells[rowCells.length]=td;}}if(rowCells.length>0)rows[rows.length]=rowCells;var td=getCell(grid,cpos.rowindex,cpos.cellindex);each(ed.dom.select('br',td),function(e,i){if(i>0&&ed.dom.getAttrib('mce_bogus'))ed.dom.remove(e);});}}}else{var cells=[];var sel=inst.selection.getSel();var lastTR=null;var curRow=null;var x1=-1,y1=-1,x2,y2;if(sel.rangeCount<2)return true;for(var i=0;i<sel.rangeCount;i++){var rng=sel.getRangeAt(i);var tdElm=rng.startContainer.childNodes[rng.startOffset];if(!tdElm)break;if(tdElm.nodeName=="TD"||tdElm.nodeName=="TH")cells[cells.length]=tdElm;}var tRows=tableElm.rows;for(var y=0;y<tRows.length;y++){var rowCells=[];for(var x=0;x<tRows[y].cells.length;x++){var td=tRows[y].cells[x];for(var i=0;i<cells.length;i++){if(td==cells[i]){rowCells[rowCells.length]=td;}}}if(rowCells.length>0)rows[rows.length]=rowCells;}var curRow=[];var lastTR=null;for(var y=0;y<grid.length;y++){for(var x=0;x<grid[y].length;x++){grid[y][x]._selected=false;for(var i=0;i<cells.length;i++){if(grid[y][x]==cells[i]){if(x1==-1){x1=x;y1=y;}x2=x;y2=y;grid[y][x]._selected=true;}}}}for(var y=y1;y<=y2;y++){for(var x=x1;x<=x2;x++){if(!grid[y][x]._selected){alert("Invalid selection for merge.");return true;}}}}var rowSpan=1,colSpan=1;var lastRowSpan=-1;for(var y=0;y<rows.length;y++){var rowColSpan=0;for(var x=0;x<rows[y].length;x++){var sd=getColRowSpan(rows[y][x]);rowColSpan+=sd['colspan'];if(lastRowSpan!=-1&&sd['rowspan']!=lastRowSpan){alert("Invalid selection for merge.");return true;}lastRowSpan=sd['rowspan'];}if(rowColSpan>colSpan)colSpan=rowColSpan;lastRowSpan=-1;}var lastColSpan=-1;for(var x=0;x<rows[0].length;x++){var colRowSpan=0;for(var y=0;y<rows.length;y++){var sd=getColRowSpan(rows[y][x]);colRowSpan+=sd['rowspan'];if(lastColSpan!=-1&&sd['colspan']!=lastColSpan){alert("Invalid selection for merge.");return true;}lastColSpan=sd['colspan'];}if(colRowSpan>rowSpan)rowSpan=colRowSpan;lastColSpan=-1;}tdElm=rows[0][0];tdElm.rowSpan=rowSpan;tdElm.colSpan=colSpan;for(var y=0;y<rows.length;y++){for(var x=0;x<rows[y].length;x++){var html=rows[y][x].innerHTML;var chk=html.replace(/[ \t\r\n]/g,"");if(chk!="<br/>"&&chk!="<br>"&&chk!='<br mce_bogus="1"/>'&&(x+y>0))tdElm.innerHTML+=html;if(rows[y][x]!=tdElm&&!rows[y][x]._deleted){var cpos=getCellPos(grid,rows[y][x]);var tr=rows[y][x].parentNode;tr.removeChild(rows[y][x]);rows[y][x]._deleted=true;if(!tr.hasChildNodes()){tr.parentNode.removeChild(tr);var lastCell=null;for(var x=0;cellElm=getCell(grid,cpos.rowindex,x);x++){if(cellElm!=lastCell&&cellElm.rowSpan>1)cellElm.rowSpan--;lastCell=cellElm;}if(tdElm.rowSpan>1)tdElm.rowSpan--;}}}}each(ed.dom.select('br',tdElm),function(e,i){if(i>0&&ed.dom.getAttrib(e,'mce_bogus'))ed.dom.remove(e);});break;}tableElm=inst.dom.getParent(inst.selection.getNode(),"table");inst.addVisual(tableElm);inst.nodeChanged();}return true;}return false;}});tinymce.PluginManager.add('table',tinymce.plugins.TablePlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin_src.js
@@ -1,1 +1,1115 @@
-
+/**
+ * $Id: editor_plugin_src.js 853 2008-05-27 08:05:35Z spocke $
+ *
+ * @author Moxiecode

+ */
+
+(function() {
+	var each = tinymce.each;
+
+	tinymce.create('tinymce.plugins.TablePlugin', {
+		init : function(ed, url) {
+			var t = this;
+
+			t.editor = ed;
+			t.url = url;
+
+			// Register buttons
+			each([
+				['table', 'table.desc', 'mceInsertTable', true],
+				['delete_table', 'table.del', 'mceTableDelete'],
+				['delete_col', 'table.delete_col_desc', 'mceTableDeleteCol'],
+				['delete_row', 'table.delete_row_desc', 'mceTableDeleteRow'],
+				['col_after', 'table.col_after_desc', 'mceTableInsertColAfter'],
+				['col_before', 'table.col_before_desc', 'mceTableInsertColBefore'],
+				['row_after', 'table.row_after_desc', 'mceTableInsertRowAfter'],
+				['row_before', 'table.row_before_desc', 'mceTableInsertRowBefore'],
+				['row_props', 'table.row_desc', 'mceTableRowProps', true],
+				['cell_props', 'table.cell_desc', 'mceTableCellProps', true],
+				['split_cells', 'table.split_cells_desc', 'mceTableSplitCells', true],
+				['merge_cells', 'table.merge_cells_desc', 'mceTableMergeCells', true]
+			], function(c) {
+				ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]});
+			});
+
+			ed.onInit.add(function() {
+				if (ed && ed.plugins.contextmenu) {
+					ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) {
+						var sm, se = ed.selection, el = se.getNode() || ed.getBody();
+
+						if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th')) {
+							m.removeAll();
+
+							if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) {
+								m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true});
+								m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'});
+								m.addSeparator();
+							}
+
+							if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) {
+								m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true});
+								m.addSeparator();
+							}
+
+							m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', ui : true, value : {action : 'insert'}});
+							m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable', ui : true});
+							m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete', ui : true});
+							m.addSeparator();
+
+							// Cell menu
+							sm = m.addMenu({title : 'table.cell'});
+							sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps', ui : true});
+							sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells', ui : true});
+							sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells', ui : true});
+
+							// Row menu
+							sm = m.addMenu({title : 'table.row'});
+							sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps', ui : true});
+							sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'});
+							sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'});
+							sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'});
+							sm.addSeparator();
+							sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'});
+							sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'});
+							sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'});
+							sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'});
+
+							// Column menu
+							sm = m.addMenu({title : 'table.col'});
+							sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'});
+							sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'});
+							sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'});
+						} else
+							m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', ui : true});
+					});
+				}
+			});
+
+			// Add undo level when new rows are created using the tab key
+			ed.onKeyDown.add(function(ed, e) {
+				if (e.keyCode == 9 && ed.dom.getParent(ed.selection.getNode(), 'TABLE')) {
+					if (!tinymce.isGecko && !tinymce.isOpera) {
+						tinyMCE.execInstanceCommand(ed.editorId, "mceTableMoveToNextRow", true);
+						return tinymce.dom.Event.cancel(e);
+					}
+
+					ed.undoManager.add();
+				}
+			});
+
+			// Select whole table is a table border is clicked
+			if (!tinymce.isIE) {
+				if (ed.getParam('table_selection', true)) {
+					ed.onClick.add(function(ed, e) {
+						e = e.target;
+
+						if (e.nodeName === 'TABLE')
+							ed.selection.select(e);
+					});
+				}
+			}
+
+			ed.onNodeChange.add(function(ed, cm, n) {
+				var p = ed.dom.getParent(n, 'td,th,caption');
+
+				cm.setActive('table', n.nodeName === 'TABLE' || !!p);
+				if (p && p.nodeName === 'CAPTION')
+					p = null;
+
+				cm.setDisabled('delete_table', !p);
+				cm.setDisabled('delete_col', !p);
+				cm.setDisabled('delete_table', !p);
+				cm.setDisabled('delete_row', !p);
+				cm.setDisabled('col_after', !p);
+				cm.setDisabled('col_before', !p);
+				cm.setDisabled('row_after', !p);
+				cm.setDisabled('row_before', !p);
+				cm.setDisabled('row_props', !p);
+				cm.setDisabled('cell_props', !p);
+				cm.setDisabled('split_cells', !p || (parseInt(ed.dom.getAttrib(p, 'colspan', '1')) < 2 && parseInt(ed.dom.getAttrib(p, 'rowspan', '1')) < 2));
+				cm.setDisabled('merge_cells', !p);
+			});
+
+			// Padd empty table cells
+			if (!tinymce.isIE) {
+				ed.onBeforeSetContent.add(function(ed, o) {
+					if (o.initial)
+						o.content = o.content.replace(/<(td|th)([^>]+|)>\s*<\/(td|th)>/g, tinymce.isOpera ? '<$1$2>&nbsp;</$1>' : '<$1$2><br mce_bogus="1" /></$1>');
+				});
+			}
+		},
+
+		execCommand : function(cmd, ui, val) {
+			var ed = this.editor, b;
+
+			// Is table command
+			switch (cmd) {
+				case "mceTableMoveToNextRow":
+				case "mceInsertTable":
+				case "mceTableRowProps":
+				case "mceTableCellProps":
+				case "mceTableSplitCells":
+				case "mceTableMergeCells":
+				case "mceTableInsertRowBefore":
+				case "mceTableInsertRowAfter":
+				case "mceTableDeleteRow":
+				case "mceTableInsertColBefore":
+				case "mceTableInsertColAfter":
+				case "mceTableDeleteCol":
+				case "mceTableCutRow":
+				case "mceTableCopyRow":
+				case "mceTablePasteRowBefore":
+				case "mceTablePasteRowAfter":
+				case "mceTableDelete":
+					ed.execCommand('mceBeginUndoLevel');
+					this._doExecCommand(cmd, ui, val);
+					ed.execCommand('mceEndUndoLevel');
+
+					return true;
+			}
+
+			// Pass to next handler in chain
+			return false;
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Tables',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/table',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		},
+
+		// Private plugin internal methods
+
+		/**
+		 * Executes the table commands.
+		 */
+		_doExecCommand : function(command, user_interface, value) {
+			var inst = this.editor, ed = inst, url = this.url;
+			var focusElm = inst.selection.getNode();
+			var trElm = inst.dom.getParent(focusElm, "tr");
+			var tdElm = inst.dom.getParent(focusElm, "td,th");
+			var tableElm = inst.dom.getParent(focusElm, "table");
+			var doc = inst.contentWindow.document;
+			var tableBorder = tableElm ? tableElm.getAttribute("border") : "";
+
+			// Get first TD if no TD found
+			if (trElm && tdElm == null)
+				tdElm = trElm.cells[0];
+
+			function inArray(ar, v) {
+				for (var i=0; i<ar.length; i++) {
+					// Is array
+					if (ar[i].length > 0 && inArray(ar[i], v))
+						return true;
+
+					// Found value
+					if (ar[i] == v)
+						return true;
+				}
+
+				return false;
+			}
+
+			function select(dx, dy) {
+				var td;
+
+				grid = getTableGrid(tableElm);
+				dx = dx || 0;
+				dy = dy || 0;
+				dx = Math.max(cpos.cellindex + dx, 0);
+				dy = Math.max(cpos.rowindex + dy, 0);
+
+				// Recalculate grid and select
+				inst.execCommand('mceRepaint');
+				td = getCell(grid, dy, dx);
+
+				if (td) {
+					inst.selection.select(td.firstChild || td);
+					inst.selection.collapse(1);
+				}
+			};
+
+			function makeTD() {
+				var newTD = doc.createElement("td");
+
+				if (!tinymce.isIE)
+					newTD.innerHTML = '<br mce_bogus="1"/>';
+			}
+
+			function getColRowSpan(td) {
+				var colspan = inst.dom.getAttrib(td, "colspan");
+				var rowspan = inst.dom.getAttrib(td, "rowspan");
+
+				colspan = colspan == "" ? 1 : parseInt(colspan);
+				rowspan = rowspan == "" ? 1 : parseInt(rowspan);
+
+				return {colspan : colspan, rowspan : rowspan};
+			}
+
+			function getCellPos(grid, td) {
+				var x, y;
+
+				for (y=0; y<grid.length; y++) {
+					for (x=0; x<grid[y].length; x++) {
+						if (grid[y][x] == td)
+							return {cellindex : x, rowindex : y};
+					}
+				}
+
+				return null;
+			}
+
+			function getCell(grid, row, col) {
+				if (grid[row] && grid[row][col])
+					return grid[row][col];
+
+				return null;
+			}
+
+			function getNextCell(table, cell) {
+				var cells = [], x = 0, i, j, cell, nextCell;
+
+				for (i = 0; i < table.rows.length; i++)
+					for (j = 0; j < table.rows[i].cells.length; j++, x++)
+						cells[x] = table.rows[i].cells[j];
+
+				for (i = 0; i < cells.length; i++)
+					if (cells[i] == cell)
+						if (nextCell = cells[i+1])
+							return nextCell;
+			}
+
+			function getTableGrid(table) {
+				var grid = [], rows = table.rows, x, y, td, sd, xstart, x2, y2;
+
+				for (y=0; y<rows.length; y++) {
+					for (x=0; x<rows[y].cells.length; x++) {
+						td = rows[y].cells[x];
+						sd = getColRowSpan(td);
+
+						// All ready filled
+						for (xstart = x; grid[y] && grid[y][xstart]; xstart++) ;
+
+						// Fill box
+						for (y2=y; y2<y+sd['rowspan']; y2++) {
+							if (!grid[y2])
+								grid[y2] = [];
+
+							for (x2=xstart; x2<xstart+sd['colspan']; x2++)
+								grid[y2][x2] = td;
+						}
+					}
+				}
+
+				return grid;
+			}
+
+			function trimRow(table, tr, td, new_tr) {
+				var grid = getTableGrid(table), cpos = getCellPos(grid, td);
+				var cells, lastElm;
+
+				// Time to crop away some
+				if (new_tr.cells.length != tr.childNodes.length) {
+					cells = tr.childNodes;
+					lastElm = null;
+
+					for (var x=0; td = getCell(grid, cpos.rowindex, x); x++) {
+						var remove = true;
+						var sd = getColRowSpan(td);
+
+						// Remove due to rowspan
+						if (inArray(cells, td)) {
+							new_tr.childNodes[x]._delete = true;
+						} else if ((lastElm == null || td != lastElm) && sd.colspan > 1) { // Remove due to colspan
+							for (var i=x; i<x+td.colSpan; i++)
+								new_tr.childNodes[i]._delete = true;
+						}
+
+						if ((lastElm == null || td != lastElm) && sd.rowspan > 1)
+							td.rowSpan = sd.rowspan + 1;
+
+						lastElm = td;
+					}
+
+					deleteMarked(tableElm);
+				}
+			}
+
+			function prevElm(node, name) {
+				while ((node = node.previousSibling) != null) {
+					if (node.nodeName == name)
+						return node;
+				}
+
+				return null;
+			}
+
+			function nextElm(node, names) {
+				var namesAr = names.split(',');
+
+				while ((node = node.nextSibling) != null) {
+					for (var i=0; i<namesAr.length; i++) {
+						if (node.nodeName.toLowerCase() == namesAr[i].toLowerCase() )
+							return node;
+					}
+				}
+
+				return null;
+			}
+
+			function deleteMarked(tbl) {
+				if (tbl.rows == 0)
+					return;
+
+				var tr = tbl.rows[0];
+				do {
+					var next = nextElm(tr, "TR");
+
+					// Delete row
+					if (tr._delete) {
+						tr.parentNode.removeChild(tr);
+						continue;
+					}
+
+					// Delete cells
+					var td = tr.cells[0];
+					if (td.cells > 1) {
+						do {
+							var nexttd = nextElm(td, "TD,TH");
+
+							if (td._delete)
+								td.parentNode.removeChild(td);
+						} while ((td = nexttd) != null);
+					}
+				} while ((tr = next) != null);
+			}
+
+			function addRows(td_elm, tr_elm, rowspan) {
+				// Add rows
+				td_elm.rowSpan = 1;
+				var trNext = nextElm(tr_elm, "TR");
+				for (var i=1; i<rowspan && trNext; i++) {
+					var newTD = doc.createElement("td");
+
+					if (!tinymce.isIE)
+						newTD.innerHTML = '<br mce_bogus="1"/>';
+
+					if (tinymce.isIE)
+						trNext.insertBefore(newTD, trNext.cells(td_elm.cellIndex));
+					else
+						trNext.insertBefore(newTD, trNext.cells[td_elm.cellIndex]);
+
+					trNext = nextElm(trNext, "TR");
+				}
+			}
+
+			function copyRow(doc, table, tr) {
+				var grid = getTableGrid(table);
+				var newTR = tr.cloneNode(false);
+				var cpos = getCellPos(grid, tr.cells[0]);
+				var lastCell = null;
+				var tableBorder = inst.dom.getAttrib(table, "border");
+				var tdElm = null;
+
+				for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {
+					var newTD = null;
+
+					if (lastCell != tdElm) {
+						for (var i=0; i<tr.cells.length; i++) {
+							if (tdElm == tr.cells[i]) {
+								newTD = tdElm.cloneNode(true);
+								break;
+							}
+						}
+					}
+
+					if (newTD == null) {
+						newTD = doc.createElement("td");
+
+						if (!tinymce.isIE)
+							newTD.innerHTML = '<br mce_bogus="1"/>';
+					}
+
+					// Reset col/row span
+					newTD.colSpan = 1;
+					newTD.rowSpan = 1;
+
+					newTR.appendChild(newTD);
+
+					lastCell = tdElm;
+				}
+
+				return newTR;
+			}
+
+			// ---- Commands -----
+
+			// Handle commands
+			switch (command) {
+				case "mceTableMoveToNextRow":
+					var nextCell = getNextCell(tableElm, tdElm);
+
+					if (!nextCell) {
+						inst.execCommand("mceTableInsertRowAfter", tdElm);
+						nextCell = getNextCell(tableElm, tdElm);
+					}
+
+					inst.selection.select(nextCell);
+					inst.selection.collapse(true);
+
+					return true;
+
+				case "mceTableRowProps":
+					if (trElm == null)
+						return true;
+
+					if (user_interface) {
+						inst.windowManager.open({
+							url : url + '/row.htm',
+							width : 400 + parseInt(inst.getLang('table.rowprops_delta_width', 0)),
+							height : 295 + parseInt(inst.getLang('table.rowprops_delta_height', 0)),
+							inline : 1
+						}, {
+							plugin_url : url
+						});
+					}
+
+					return true;
+
+				case "mceTableCellProps":
+					if (tdElm == null)
+						return true;
+
+					if (user_interface) {
+						inst.windowManager.open({
+							url : url + '/cell.htm',
+							width : 400 + parseInt(inst.getLang('table.cellprops_delta_width', 0)),
+							height : 295 + parseInt(inst.getLang('table.cellprops_delta_height', 0)),
+							inline : 1
+						}, {
+							plugin_url : url
+						});
+					}
+
+					return true;
+
+				case "mceInsertTable":
+					if (user_interface) {
+						inst.windowManager.open({
+							url : url + '/table.htm',
+							width : 400 + parseInt(inst.getLang('table.table_delta_width', 0)),
+							height : 320 + parseInt(inst.getLang('table.table_delta_height', 0)),
+							inline : 1
+						}, {
+							plugin_url : url,
+							action : value ? value.action : 0
+						});
+					}
+
+					return true;
+
+				case "mceTableDelete":
+					var table = inst.dom.getParent(inst.selection.getNode(), "table");
+					if (table) {
+						table.parentNode.removeChild(table);
+						inst.execCommand('mceRepaint');
+					}
+					return true;
+
+				case "mceTableSplitCells":
+				case "mceTableMergeCells":
+				case "mceTableInsertRowBefore":
+				case "mceTableInsertRowAfter":
+				case "mceTableDeleteRow":
+				case "mceTableInsertColBefore":
+				case "mceTableInsertColAfter":
+				case "mceTableDeleteCol":
+				case "mceTableCutRow":
+				case "mceTableCopyRow":
+				case "mceTablePasteRowBefore":
+				case "mceTablePasteRowAfter":
+					// No table just return (invalid command)
+					if (!tableElm)
+						return true;
+
+					// Table has a tbody use that reference
+					// Changed logic by ApTest 2005.07.12 (www.aptest.com)
+					// Now lookk at the focused element and take its parentNode.  That will be a tbody or a table.
+					if (trElm && tableElm != trElm.parentNode)
+						tableElm = trElm.parentNode;
+
+					if (tableElm && trElm) {
+						switch (command) {
+							case "mceTableCutRow":
+								if (!trElm || !tdElm)
+									return true;
+
+								inst.tableRowClipboard = copyRow(doc, tableElm, trElm);
+								inst.execCommand("mceTableDeleteRow");
+								break;
+
+							case "mceTableCopyRow":
+								if (!trElm || !tdElm)
+									return true;
+
+								inst.tableRowClipboard = copyRow(doc, tableElm, trElm);
+								break;
+
+							case "mceTablePasteRowBefore":
+								if (!trElm || !tdElm)
+									return true;
+
+								var newTR = inst.tableRowClipboard.cloneNode(true);
+
+								var prevTR = prevElm(trElm, "TR");
+								if (prevTR != null)
+									trimRow(tableElm, prevTR, prevTR.cells[0], newTR);
+
+								trElm.parentNode.insertBefore(newTR, trElm);
+								break;
+
+							case "mceTablePasteRowAfter":
+								if (!trElm || !tdElm)
+									return true;
+								
+								var nextTR = nextElm(trElm, "TR");
+								var newTR = inst.tableRowClipboard.cloneNode(true);
+
+								trimRow(tableElm, trElm, tdElm, newTR);
+
+								if (nextTR == null)
+									trElm.parentNode.appendChild(newTR);
+								else
+									nextTR.parentNode.insertBefore(newTR, nextTR);
+
+								break;
+
+							case "mceTableInsertRowBefore":
+								if (!trElm || !tdElm)
+									return true;
+
+								var grid = getTableGrid(tableElm);
+								var cpos = getCellPos(grid, tdElm);
+								var newTR = doc.createElement("tr");
+								var lastTDElm = null;
+
+								cpos.rowindex--;
+								if (cpos.rowindex < 0)
+									cpos.rowindex = 0;
+
+								// Create cells
+								for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {
+									if (tdElm != lastTDElm) {
+										var sd = getColRowSpan(tdElm);
+
+										if (sd['rowspan'] == 1) {
+											var newTD = doc.createElement("td");
+
+											if (!tinymce.isIE)
+												newTD.innerHTML = '<br mce_bogus="1"/>';
+
+											newTD.colSpan = tdElm.colSpan;
+
+											newTR.appendChild(newTD);
+										} else
+											tdElm.rowSpan = sd['rowspan'] + 1;
+
+										lastTDElm = tdElm;
+									}
+								}
+
+								trElm.parentNode.insertBefore(newTR, trElm);
+								select(0, 1);
+							break;
+
+							case "mceTableInsertRowAfter":
+								if (!trElm || !tdElm)
+									return true;
+
+								var grid = getTableGrid(tableElm);
+								var cpos = getCellPos(grid, tdElm);
+								var newTR = doc.createElement("tr");
+								var lastTDElm = null;
+
+								// Create cells
+								for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {
+									if (tdElm != lastTDElm) {
+										var sd = getColRowSpan(tdElm);
+
+										if (sd['rowspan'] == 1) {
+											var newTD = doc.createElement("td");
+
+											if (!tinymce.isIE)
+												newTD.innerHTML = '<br mce_bogus="1"/>';
+
+											newTD.colSpan = tdElm.colSpan;
+
+											newTR.appendChild(newTD);
+										} else
+											tdElm.rowSpan = sd['rowspan'] + 1;
+
+										lastTDElm = tdElm;
+									}
+								}
+
+								if (newTR.hasChildNodes()) {
+									var nextTR = nextElm(trElm, "TR");
+									if (nextTR)
+										nextTR.parentNode.insertBefore(newTR, nextTR);
+									else
+										tableElm.appendChild(newTR);
+								}
+
+								select(0, 1);
+							break;
+
+							case "mceTableDeleteRow":
+								if (!trElm || !tdElm)
+									return true;
+
+								var grid = getTableGrid(tableElm);
+								var cpos = getCellPos(grid, tdElm);
+
+								// Only one row, remove whole table
+								if (grid.length == 1 && tableElm.nodeName == 'TBODY') {
+									inst.dom.remove(inst.dom.getParent(tableElm, "table"));
+									return true;
+								}
+
+								// Move down row spanned cells
+								var cells = trElm.cells;
+								var nextTR = nextElm(trElm, "TR");
+								for (var x=0; x<cells.length; x++) {
+									if (cells[x].rowSpan > 1) {
+										var newTD = cells[x].cloneNode(true);
+										var sd = getColRowSpan(cells[x]);
+
+										newTD.rowSpan = sd.rowspan - 1;
+
+										var nextTD = nextTR.cells[x];
+
+										if (nextTD == null)
+											nextTR.appendChild(newTD);
+										else
+											nextTR.insertBefore(newTD, nextTD);
+									}
+								}
+
+								// Delete cells
+								var lastTDElm = null;
+								for (var x=0; tdElm = getCell(grid, cpos.rowindex, x); x++) {
+									if (tdElm != lastTDElm) {
+										var sd = getColRowSpan(tdElm);
+
+										if (sd.rowspan > 1) {
+											tdElm.rowSpan = sd.rowspan - 1;
+										} else {
+											trElm = tdElm.parentNode;
+
+											if (trElm.parentNode)
+												trElm._delete = true;
+										}
+
+										lastTDElm = tdElm;
+									}
+								}
+
+								deleteMarked(tableElm);
+
+								select(0, -1);
+							break;
+
+							case "mceTableInsertColBefore":
+								if (!trElm || !tdElm)
+									return true;
+
+								var grid = getTableGrid(tableElm);
+								var cpos = getCellPos(grid, tdElm);
+								var lastTDElm = null;
+
+								for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {
+									if (tdElm != lastTDElm) {
+										var sd = getColRowSpan(tdElm);
+
+										if (sd['colspan'] == 1) {
+											var newTD = doc.createElement(tdElm.nodeName);
+
+											if (!tinymce.isIE)
+												newTD.innerHTML = '<br mce_bogus="1"/>';
+
+											newTD.rowSpan = tdElm.rowSpan;
+
+											tdElm.parentNode.insertBefore(newTD, tdElm);
+										} else
+											tdElm.colSpan++;
+
+										lastTDElm = tdElm;
+									}
+								}
+
+								select();
+							break;
+
+							case "mceTableInsertColAfter":
+								if (!trElm || !tdElm)
+									return true;
+
+								var grid = getTableGrid(tableElm);
+								var cpos = getCellPos(grid, tdElm);
+								var lastTDElm = null;
+
+								for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {
+									if (tdElm != lastTDElm) {
+										var sd = getColRowSpan(tdElm);
+
+										if (sd['colspan'] == 1) {
+											var newTD = doc.createElement(tdElm.nodeName);
+
+											if (!tinymce.isIE)
+												newTD.innerHTML = '<br mce_bogus="1"/>';
+
+											newTD.rowSpan = tdElm.rowSpan;
+
+											var nextTD = nextElm(tdElm, "TD,TH");
+											if (nextTD == null)
+												tdElm.parentNode.appendChild(newTD);
+											else
+												nextTD.parentNode.insertBefore(newTD, nextTD);
+										} else
+											tdElm.colSpan++;
+
+										lastTDElm = tdElm;
+									}
+								}
+
+								select(1);
+							break;
+
+							case "mceTableDeleteCol":
+								if (!trElm || !tdElm)
+									return true;
+
+								var grid = getTableGrid(tableElm);
+								var cpos = getCellPos(grid, tdElm);
+								var lastTDElm = null;
+
+								// Only one col, remove whole table
+								if ((grid.length > 1 && grid[0].length <= 1) && tableElm.nodeName == 'TBODY') {
+									inst.dom.remove(inst.dom.getParent(tableElm, "table"));
+									return true;
+								}
+
+								// Delete cells
+								for (var y=0; tdElm = getCell(grid, y, cpos.cellindex); y++) {
+									if (tdElm != lastTDElm) {
+										var sd = getColRowSpan(tdElm);
+
+										if (sd['colspan'] > 1)
+											tdElm.colSpan = sd['colspan'] - 1;
+										else {
+											if (tdElm.parentNode)
+												tdElm.parentNode.removeChild(tdElm);
+										}
+
+										lastTDElm = tdElm;
+									}
+								}
+
+								select(-1);
+							break;
+
+						case "mceTableSplitCells":
+							if (!trElm || !tdElm)
+								return true;
+
+							var spandata = getColRowSpan(tdElm);
+
+							var colspan = spandata["colspan"];
+							var rowspan = spandata["rowspan"];
+
+							// Needs splitting
+							if (colspan > 1 || rowspan > 1) {
+								// Generate cols
+								tdElm.colSpan = 1;
+								for (var i=1; i<colspan; i++) {
+									var newTD = doc.createElement("td");
+
+									if (!tinymce.isIE)
+										newTD.innerHTML = '<br mce_bogus="1"/>';
+
+									trElm.insertBefore(newTD, nextElm(tdElm, "TD,TH"));
+
+									if (rowspan > 1)
+										addRows(newTD, trElm, rowspan);
+								}
+
+								addRows(tdElm, trElm, rowspan);
+							}
+
+							// Apply visual aids
+							tableElm = inst.dom.getParent(inst.selection.getNode(), "table");
+							break;
+
+						case "mceTableMergeCells":
+							var rows = [];
+							var sel = inst.selection.getSel();
+							var grid = getTableGrid(tableElm);
+
+							if (tinymce.isIE || sel.rangeCount == 1) {
+								if (user_interface) {
+									// Setup template
+									var sp = getColRowSpan(tdElm);
+
+									inst.windowManager.open({
+										url : url + '/merge_cells.htm',
+										width : 240 + parseInt(inst.getLang('table.merge_cells_delta_width', 0)),
+										height : 110 + parseInt(inst.getLang('table.merge_cells_delta_height', 0)),
+										inline : 1
+									}, {
+										action : "update",
+										numcols : sp.colspan,
+										numrows : sp.rowspan,
+										plugin_url : url
+									});
+
+									return true;
+								} else {
+									var numRows = parseInt(value['numrows']);
+									var numCols = parseInt(value['numcols']);
+									var cpos = getCellPos(grid, tdElm);
+
+									if (("" + numRows) == "NaN")
+										numRows = 1;
+
+									if (("" + numCols) == "NaN")
+										numCols = 1;
+
+									// Get rows and cells
+									var tRows = tableElm.rows;
+									for (var y=cpos.rowindex; y<grid.length; y++) {
+										var rowCells = [];
+
+										for (var x=cpos.cellindex; x<grid[y].length; x++) {
+											var td = getCell(grid, y, x);
+
+											if (td && !inArray(rows, td) && !inArray(rowCells, td)) {
+												var cp = getCellPos(grid, td);
+
+												// Within range
+												if (cp.cellindex < cpos.cellindex+numCols && cp.rowindex < cpos.rowindex+numRows)
+													rowCells[rowCells.length] = td;
+											}
+										}
+
+										if (rowCells.length > 0)
+											rows[rows.length] = rowCells;
+
+										var td = getCell(grid, cpos.rowindex, cpos.cellindex);
+										each(ed.dom.select('br', td), function(e, i) {
+											if (i > 0 && ed.dom.getAttrib('mce_bogus'))
+												ed.dom.remove(e);
+										});
+									}
+
+									//return true;
+								}
+							} else {
+								var cells = [];
+								var sel = inst.selection.getSel();
+								var lastTR = null;
+								var curRow = null;
+								var x1 = -1, y1 = -1, x2, y2;
+
+								// Only one cell selected, whats the point?
+								if (sel.rangeCount < 2)
+									return true;
+
+								// Get all selected cells
+								for (var i=0; i<sel.rangeCount; i++) {
+									var rng = sel.getRangeAt(i);
+									var tdElm = rng.startContainer.childNodes[rng.startOffset];
+
+									if (!tdElm)
+										break;
+
+									if (tdElm.nodeName == "TD" || tdElm.nodeName == "TH")
+										cells[cells.length] = tdElm;
+								}
+
+								// Get rows and cells
+								var tRows = tableElm.rows;
+								for (var y=0; y<tRows.length; y++) {
+									var rowCells = [];
+
+									for (var x=0; x<tRows[y].cells.length; x++) {
+										var td = tRows[y].cells[x];
+
+										for (var i=0; i<cells.length; i++) {
+											if (td == cells[i]) {
+												rowCells[rowCells.length] = td;
+											}
+										}
+									}
+
+									if (rowCells.length > 0)
+										rows[rows.length] = rowCells;
+								}
+
+								// Find selected cells in grid and box
+								var curRow = [];
+								var lastTR = null;
+								for (var y=0; y<grid.length; y++) {
+									for (var x=0; x<grid[y].length; x++) {
+										grid[y][x]._selected = false;
+
+										for (var i=0; i<cells.length; i++) {
+											if (grid[y][x] == cells[i]) {
+												// Get start pos
+												if (x1 == -1) {
+													x1 = x;
+													y1 = y;
+												}
+
+												// Get end pos
+												x2 = x;
+												y2 = y;
+
+												grid[y][x]._selected = true;
+											}
+										}
+									}
+								}
+
+								// Is there gaps, if so deny
+								for (var y=y1; y<=y2; y++) {
+									for (var x=x1; x<=x2; x++) {
+										if (!grid[y][x]._selected) {
+											alert("Invalid selection for merge.");
+											return true;
+										}
+									}
+								}
+							}
+
+							// Validate selection and get total rowspan and colspan
+							var rowSpan = 1, colSpan = 1;
+
+							// Validate horizontal and get total colspan
+							var lastRowSpan = -1;
+							for (var y=0; y<rows.length; y++) {
+								var rowColSpan = 0;
+
+								for (var x=0; x<rows[y].length; x++) {
+									var sd = getColRowSpan(rows[y][x]);
+
+									rowColSpan += sd['colspan'];
+
+									if (lastRowSpan != -1 && sd['rowspan'] != lastRowSpan) {
+										alert("Invalid selection for merge.");
+										return true;
+									}
+
+									lastRowSpan = sd['rowspan'];
+								}
+
+								if (rowColSpan > colSpan)
+									colSpan = rowColSpan;
+
+								lastRowSpan = -1;
+							}
+
+							// Validate vertical and get total rowspan
+							var lastColSpan = -1;
+							for (var x=0; x<rows[0].length; x++) {
+								var colRowSpan = 0;
+
+								for (var y=0; y<rows.length; y++) {
+									var sd = getColRowSpan(rows[y][x]);
+
+									colRowSpan += sd['rowspan'];
+
+									if (lastColSpan != -1 && sd['colspan'] != lastColSpan) {
+										alert("Invalid selection for merge.");
+										return true;
+									}
+
+									lastColSpan = sd['colspan'];
+								}
+
+								if (colRowSpan > rowSpan)
+									rowSpan = colRowSpan;
+
+								lastColSpan = -1;
+							}
+
+							// Setup td
+							tdElm = rows[0][0];
+							tdElm.rowSpan = rowSpan;
+							tdElm.colSpan = colSpan;
+
+							// Merge cells
+							for (var y=0; y<rows.length; y++) {
+								for (var x=0; x<rows[y].length; x++) {
+									var html = rows[y][x].innerHTML;
+									var chk = html.replace(/[ \t\r\n]/g, "");
+
+									if (chk != "<br/>" && chk != "<br>" && chk != '<br mce_bogus="1"/>' && (x+y > 0))
+										tdElm.innerHTML += html;
+
+									// Not current cell
+									if (rows[y][x] != tdElm && !rows[y][x]._deleted) {
+										var cpos = getCellPos(grid, rows[y][x]);
+										var tr = rows[y][x].parentNode;
+
+										tr.removeChild(rows[y][x]);
+										rows[y][x]._deleted = true;
+
+										// Empty TR, remove it
+										if (!tr.hasChildNodes()) {
+											tr.parentNode.removeChild(tr);
+
+											var lastCell = null;
+											for (var x=0; cellElm = getCell(grid, cpos.rowindex, x); x++) {
+												if (cellElm != lastCell && cellElm.rowSpan > 1)
+													cellElm.rowSpan--;
+
+												lastCell = cellElm;
+											}
+
+											if (tdElm.rowSpan > 1)
+												tdElm.rowSpan--;
+										}
+									}
+								}
+							}
+
+							// Remove all but one bogus br
+							each(ed.dom.select('br', tdElm), function(e, i) {
+								if (i > 0 && ed.dom.getAttrib(e, 'mce_bogus'))
+									ed.dom.remove(e);
+							});
+
+							break;
+						}
+
+						tableElm = inst.dom.getParent(inst.selection.getNode(), "table");
+						inst.addVisual(tableElm);
+						inst.nodeChanged();
+					}
+
+				return true;
+			}
+
+			// Pass to next handler in chain
+			return false;
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/table/images/buttons.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/table/images/table.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/table/images/table_cell_props.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/table/images/table_delete.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/table/images/table_delete_col.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/table/images/table_delete_row.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/table/images/table_insert_col_after.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/table/images/table_insert_col_before.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/table/images/table_insert_row_after.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/table/images/table_insert_row_before.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/table/images/table_merge_cells.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/table/images/table_row_props.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/table/images/table_split_cells.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/js/cell.js
@@ -1,1 +1,260 @@
-
+tinyMCEPopup.requireLangPack();
+
+var ed;
+
+function init() {
+	ed = tinyMCEPopup.editor;
+	tinyMCEPopup.resizeToInnerSize();
+
+	document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');
+	document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor');
+	document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor')
+
+	var inst = ed;
+	var tdElm = ed.dom.getParent(ed.selection.getNode(), "td,th");
+	var formObj = document.forms[0];
+	var st = ed.dom.parseStyle(ed.dom.getAttrib(tdElm, "style"));
+
+	// Get table cell data
+	var celltype = tdElm.nodeName.toLowerCase();
+	var align = ed.dom.getAttrib(tdElm, 'align');
+	var valign = ed.dom.getAttrib(tdElm, 'valign');
+	var width = trimSize(getStyle(tdElm, 'width', 'width'));
+	var height = trimSize(getStyle(tdElm, 'height', 'height'));
+	var bordercolor = convertRGBToHex(getStyle(tdElm, 'bordercolor', 'borderLeftColor'));
+	var bgcolor = convertRGBToHex(getStyle(tdElm, 'bgcolor', 'backgroundColor'));
+	var className = ed.dom.getAttrib(tdElm, 'class');
+	var backgroundimage = getStyle(tdElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");;
+	var id = ed.dom.getAttrib(tdElm, 'id');
+	var lang = ed.dom.getAttrib(tdElm, 'lang');
+	var dir = ed.dom.getAttrib(tdElm, 'dir');
+	var scope = ed.dom.getAttrib(tdElm, 'scope');
+
+	// Setup form
+	addClassesToList('class', 'table_cell_styles');
+	TinyMCE_EditableSelects.init();
+
+	formObj.bordercolor.value = bordercolor;
+	formObj.bgcolor.value = bgcolor;
+	formObj.backgroundimage.value = backgroundimage;
+	formObj.width.value = width;
+	formObj.height.value = height;
+	formObj.id.value = id;
+	formObj.lang.value = lang;
+	formObj.style.value = ed.dom.serializeStyle(st);
+	selectByValue(formObj, 'align', align);
+	selectByValue(formObj, 'valign', valign);
+	selectByValue(formObj, 'class', className, true, true);
+	selectByValue(formObj, 'celltype', celltype);
+	selectByValue(formObj, 'dir', dir);
+	selectByValue(formObj, 'scope', scope);
+
+	// Resize some elements
+	if (isVisible('backgroundimagebrowser'))
+		document.getElementById('backgroundimage').style.width = '180px';
+
+	updateColor('bordercolor_pick', 'bordercolor');
+	updateColor('bgcolor_pick', 'bgcolor');
+}
+
+function updateAction() {
+	var el, inst = ed, tdElm, trElm, tableElm, formObj = document.forms[0];
+
+	tinyMCEPopup.restoreSelection();
+	el = ed.selection.getNode();
+	tdElm = ed.dom.getParent(el, "td,th");
+	trElm = ed.dom.getParent(el, "tr");
+	tableElm = ed.dom.getParent(el, "table");
+
+	ed.execCommand('mceBeginUndoLevel');
+
+	switch (getSelectValue(formObj, 'action')) {
+		case "cell":
+			var celltype = getSelectValue(formObj, 'celltype');
+			var scope = getSelectValue(formObj, 'scope');
+
+			if (ed.getParam("accessibility_warnings")) {
+				if (celltype == "th" && scope == "")
+					var answer = confirm(ed.getLang('table_dlg.missing_scope', '', true));
+				else
+					var answer = true;
+
+				if (!answer)
+					return;
+			}
+
+			updateCell(tdElm);
+			break;
+
+		case "row":
+			var cell = trElm.firstChild;
+
+			if (cell.nodeName != "TD" && cell.nodeName != "TH")
+				cell = nextCell(cell);
+
+			do {
+				cell = updateCell(cell, true);
+			} while ((cell = nextCell(cell)) != null);
+
+			break;
+
+		case "all":
+			var rows = tableElm.getElementsByTagName("tr");
+
+			for (var i=0; i<rows.length; i++) {
+				var cell = rows[i].firstChild;
+
+				if (cell.nodeName != "TD" && cell.nodeName != "TH")
+					cell = nextCell(cell);
+
+				do {
+					cell = updateCell(cell, true);
+				} while ((cell = nextCell(cell)) != null);
+			}
+
+			break;
+	}
+
+	ed.addVisual();
+	ed.nodeChanged();
+	inst.execCommand('mceEndUndoLevel');
+	tinyMCEPopup.close();
+}
+
+function nextCell(elm) {
+	while ((elm = elm.nextSibling) != null) {
+		if (elm.nodeName == "TD" || elm.nodeName == "TH")
+			return elm;
+	}
+
+	return null;
+}
+
+function updateCell(td, skip_id) {
+	var inst = ed;
+	var formObj = document.forms[0];
+	var curCellType = td.nodeName.toLowerCase();
+	var celltype = getSelectValue(formObj, 'celltype');
+	var doc = inst.getDoc();
+	var dom = ed.dom;
+
+	if (!skip_id)
+		td.setAttribute('id', formObj.id.value);
+
+	td.setAttribute('align', formObj.align.value);
+	td.setAttribute('vAlign', formObj.valign.value);
+	td.setAttribute('lang', formObj.lang.value);
+	td.setAttribute('dir', getSelectValue(formObj, 'dir'));
+	td.setAttribute('style', ed.dom.serializeStyle(ed.dom.parseStyle(formObj.style.value)));
+	td.setAttribute('scope', formObj.scope.value);
+	ed.dom.setAttrib(td, 'class', getSelectValue(formObj, 'class'));
+
+	// Clear deprecated attributes
+	ed.dom.setAttrib(td, 'width', '');
+	ed.dom.setAttrib(td, 'height', '');
+	ed.dom.setAttrib(td, 'bgColor', '');
+	ed.dom.setAttrib(td, 'borderColor', '');
+	ed.dom.setAttrib(td, 'background', '');
+
+	// Set styles
+	td.style.width = getCSSSize(formObj.width.value);
+	td.style.height = getCSSSize(formObj.height.value);
+	if (formObj.bordercolor.value != "") {
+		td.style.borderColor = formObj.bordercolor.value;
+		td.style.borderStyle = td.style.borderStyle == "" ? "solid" : td.style.borderStyle;
+		td.style.borderWidth = td.style.borderWidth == "" ? "1px" : td.style.borderWidth;
+	} else
+		td.style.borderColor = '';
+
+	td.style.backgroundColor = formObj.bgcolor.value;
+
+	if (formObj.backgroundimage.value != "")
+		td.style.backgroundImage = "url('" + formObj.backgroundimage.value + "')";
+	else
+		td.style.backgroundImage = '';
+
+	if (curCellType != celltype) {
+		// changing to a different node type
+		var newCell = doc.createElement(celltype);
+
+		for (var c=0; c<td.childNodes.length; c++)
+			newCell.appendChild(td.childNodes[c].cloneNode(1));
+
+		for (var a=0; a<td.attributes.length; a++)
+			ed.dom.setAttrib(newCell, td.attributes[a].name, ed.dom.getAttrib(td, td.attributes[a].name));
+
+		td.parentNode.replaceChild(newCell, td);
+		td = newCell;
+	}
+
+	dom.setAttrib(td, 'style', dom.serializeStyle(dom.parseStyle(td.style.cssText)));
+
+	return td;
+}
+
+function changedBackgroundImage() {
+	var formObj = document.forms[0];
+	var st = ed.dom.parseStyle(formObj.style.value);
+
+	st['background-image'] = "url('" + formObj.backgroundimage.value + "')";
+
+	formObj.style.value = ed.dom.serializeStyle(st);
+}
+
+function changedSize() {
+	var formObj = document.forms[0];
+	var st = ed.dom.parseStyle(formObj.style.value);
+
+	var width = formObj.width.value;
+	if (width != "")
+		st['width'] = getCSSSize(width);
+	else
+		st['width'] = "";
+
+	var height = formObj.height.value;
+	if (height != "")
+		st['height'] = getCSSSize(height);
+	else
+		st['height'] = "";
+
+	formObj.style.value = ed.dom.serializeStyle(st);
+}
+
+function changedColor() {
+	var formObj = document.forms[0];
+	var st = ed.dom.parseStyle(formObj.style.value);
+
+	st['background-color'] = formObj.bgcolor.value;
+	st['border-color'] = formObj.bordercolor.value;
+
+	formObj.style.value = ed.dom.serializeStyle(st);
+}
+
+function changedStyle() {
+	var formObj = document.forms[0];
+	var st = ed.dom.parseStyle(formObj.style.value);
+
+	if (st['background-image'])
+		formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+	else
+		formObj.backgroundimage.value = '';
+
+	if (st['width'])
+		formObj.width.value = trimSize(st['width']);
+
+	if (st['height'])
+		formObj.height.value = trimSize(st['height']);
+
+	if (st['background-color']) {
+		formObj.bgcolor.value = st['background-color'];
+		updateColor('bgcolor_pick','bgcolor');
+	}
+
+	if (st['border-color']) {
+		formObj.bordercolor.value = st['border-color'];
+		updateColor('bordercolor_pick','bordercolor');
+	}
+}
+
+tinyMCEPopup.onInit.add(init);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/js/merge_cells.js
@@ -1,1 +1,30 @@
+tinyMCEPopup.requireLangPack();
 
+function init() {
+	var f = document.forms[0], v;
+
+	tinyMCEPopup.resizeToInnerSize();
+
+	f.numcols.value = tinyMCEPopup.getWindowArg('numcols', 1);
+	f.numrows.value = tinyMCEPopup.getWindowArg('numrows', 1);
+}
+
+function mergeCells() {
+	var args = [], f = document.forms[0];
+
+	tinyMCEPopup.restoreSelection();
+
+	if (!AutoValidator.validate(f)) {
+		alert(tinyMCEPopup.getLang('invalid_data'));
+		return false;
+	}
+
+	args["numcols"] = f.numcols.value;
+	args["numrows"] = f.numrows.value;
+
+	tinyMCEPopup.execCommand("mceTableMergeCells", false, args);
+	tinyMCEPopup.close();
+}
+
+tinyMCEPopup.onInit.add(init);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/js/row.js
@@ -1,1 +1,213 @@
-
+tinyMCEPopup.requireLangPack();
+
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');
+	document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
+
+	var inst = tinyMCEPopup.editor;
+	var dom = inst.dom;
+	var trElm = dom.getParent(inst.selection.getNode(), "tr");
+	var formObj = document.forms[0];
+	var st = dom.parseStyle(dom.getAttrib(trElm, "style"));
+
+	// Get table row data
+	var rowtype = trElm.parentNode.nodeName.toLowerCase();
+	var align = dom.getAttrib(trElm, 'align');
+	var valign = dom.getAttrib(trElm, 'valign');
+	var height = trimSize(getStyle(trElm, 'height', 'height'));
+	var className = dom.getAttrib(trElm, 'class');
+	var bgcolor = convertRGBToHex(getStyle(trElm, 'bgcolor', 'backgroundColor'));
+	var backgroundimage = getStyle(trElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");;
+	var id = dom.getAttrib(trElm, 'id');
+	var lang = dom.getAttrib(trElm, 'lang');
+	var dir = dom.getAttrib(trElm, 'dir');
+
+	// Setup form
+	addClassesToList('class', 'table_row_styles');
+	TinyMCE_EditableSelects.init();
+
+	formObj.bgcolor.value = bgcolor;
+	formObj.backgroundimage.value = backgroundimage;
+	formObj.height.value = height;
+	formObj.id.value = id;
+	formObj.lang.value = lang;
+	formObj.style.value = dom.serializeStyle(st);
+	selectByValue(formObj, 'align', align);
+	selectByValue(formObj, 'valign', valign);
+	selectByValue(formObj, 'class', className, true, true);
+	selectByValue(formObj, 'rowtype', rowtype);
+	selectByValue(formObj, 'dir', dir);
+
+	// Resize some elements
+	if (isVisible('backgroundimagebrowser'))
+		document.getElementById('backgroundimage').style.width = '180px';
+
+	updateColor('bgcolor_pick', 'bgcolor');
+}
+
+function updateAction() {
+	var inst = tinyMCEPopup.editor, dom = inst.dom, trElm, tableElm, formObj = document.forms[0];
+	var action = getSelectValue(formObj, 'action');
+
+	tinyMCEPopup.restoreSelection();
+	trElm = dom.getParent(inst.selection.getNode(), "tr");
+	tableElm = dom.getParent(inst.selection.getNode(), "table");
+
+	inst.execCommand('mceBeginUndoLevel');
+
+	switch (action) {
+		case "row":
+			updateRow(trElm);
+			break;
+
+		case "all":
+			var rows = tableElm.getElementsByTagName("tr");
+
+			for (var i=0; i<rows.length; i++)
+				updateRow(rows[i], true);
+
+			break;
+
+		case "odd":
+		case "even":
+			var rows = tableElm.getElementsByTagName("tr");
+
+			for (var i=0; i<rows.length; i++) {
+				if ((i % 2 == 0 && action == "odd") || (i % 2 != 0 && action == "even"))
+					updateRow(rows[i], true, true);
+			}
+
+			break;
+	}
+
+	inst.addVisual();
+	inst.nodeChanged();
+	inst.execCommand('mceEndUndoLevel');
+	tinyMCEPopup.close();
+}
+
+function updateRow(tr_elm, skip_id, skip_parent) {
+	var inst = tinyMCEPopup.editor;
+	var formObj = document.forms[0];
+	var dom = inst.dom;
+	var curRowType = tr_elm.parentNode.nodeName.toLowerCase();
+	var rowtype = getSelectValue(formObj, 'rowtype');
+	var doc = inst.getDoc();
+
+	// Update row element
+	if (!skip_id)
+		tr_elm.setAttribute('id', formObj.id.value);
+
+	tr_elm.setAttribute('align', getSelectValue(formObj, 'align'));
+	tr_elm.setAttribute('vAlign', getSelectValue(formObj, 'valign'));
+	tr_elm.setAttribute('lang', formObj.lang.value);
+	tr_elm.setAttribute('dir', getSelectValue(formObj, 'dir'));
+	tr_elm.setAttribute('style', dom.serializeStyle(dom.parseStyle(formObj.style.value)));
+	dom.setAttrib(tr_elm, 'class', getSelectValue(formObj, 'class'));
+
+	// Clear deprecated attributes
+	tr_elm.setAttribute('background', '');
+	tr_elm.setAttribute('bgColor', '');
+	tr_elm.setAttribute('height', '');
+
+	// Set styles
+	tr_elm.style.height = getCSSSize(formObj.height.value);
+	tr_elm.style.backgroundColor = formObj.bgcolor.value;
+
+	if (formObj.backgroundimage.value != "")
+		tr_elm.style.backgroundImage = "url('" + formObj.backgroundimage.value + "')";
+	else
+		tr_elm.style.backgroundImage = '';
+
+	// Setup new rowtype
+	if (curRowType != rowtype && !skip_parent) {
+		// first, clone the node we are working on
+		var newRow = tr_elm.cloneNode(1);
+
+		// next, find the parent of its new destination (creating it if necessary)
+		var theTable = dom.getParent(tr_elm, "table");
+		var dest = rowtype;
+		var newParent = null;
+		for (var i = 0; i < theTable.childNodes.length; i++) {
+			if (theTable.childNodes[i].nodeName.toLowerCase() == dest)
+				newParent = theTable.childNodes[i];
+		}
+
+		if (newParent == null) {
+			newParent = doc.createElement(dest);
+
+			if (dest == "thead") {
+				if (theTable.firstChild.nodeName == 'CAPTION')
+					inst.dom.insertAfter(newParent, theTable.firstChild);
+				else
+					theTable.insertBefore(newParent, theTable.firstChild);
+			} else
+				theTable.appendChild(newParent);
+		}
+
+		// append the row to the new parent
+		newParent.appendChild(newRow);
+
+		// remove the original
+		tr_elm.parentNode.removeChild(tr_elm);
+
+		// set tr_elm to the new node
+		tr_elm = newRow;
+	}
+
+	dom.setAttrib(tr_elm, 'style', dom.serializeStyle(dom.parseStyle(tr_elm.style.cssText)));
+}
+
+function changedBackgroundImage() {
+	var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom;
+	var st = dom.parseStyle(formObj.style.value);
+
+	st['background-image'] = "url('" + formObj.backgroundimage.value + "')";
+
+	formObj.style.value = dom.serializeStyle(st);
+}
+
+function changedStyle() {
+	var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom;
+	var st = dom.parseStyle(formObj.style.value);
+
+	if (st['background-image'])
+		formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+	else
+		formObj.backgroundimage.value = '';
+
+	if (st['height'])
+		formObj.height.value = trimSize(st['height']);
+
+	if (st['background-color']) {
+		formObj.bgcolor.value = st['background-color'];
+		updateColor('bgcolor_pick','bgcolor');
+	}
+}
+
+function changedSize() {
+	var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom;
+	var st = dom.parseStyle(formObj.style.value);
+
+	var height = formObj.height.value;
+	if (height != "")
+		st['height'] = getCSSSize(height);
+	else
+		st['height'] = "";
+
+	formObj.style.value = dom.serializeStyle(st);
+}
+
+function changedColor() {
+	var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom;
+	var st = dom.parseStyle(formObj.style.value);
+
+	st['background-color'] = formObj.bgcolor.value;
+
+	formObj.style.value = dom.serializeStyle(st);
+}
+
+tinyMCEPopup.onInit.add(init);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/js/table.js
@@ -1,1 +1,411 @@
-
+tinyMCEPopup.requireLangPack();
+
+var action, orgTableWidth, orgTableHeight, dom = tinyMCEPopup.editor.dom;
+
+function insertTable() {
+	var formObj = document.forms[0];
+	var inst = tinyMCEPopup.editor, dom = inst.dom;
+	var cols = 2, rows = 2, border = 0, cellpadding = -1, cellspacing = -1, align, width, height, className, caption, frame, rules;
+	var html = '', capEl, elm;
+	var cellLimit, rowLimit, colLimit;
+
+	tinyMCEPopup.restoreSelection();
+
+	if (!AutoValidator.validate(formObj)) {
+		alert(inst.getLang('invalid_data'));
+		return false;
+	}
+
+	elm = dom.getParent(inst.selection.getNode(), 'table');
+
+	// Get form data
+	cols = formObj.elements['cols'].value;
+	rows = formObj.elements['rows'].value;
+	border = formObj.elements['border'].value != "" ? formObj.elements['border'].value  : 0;
+	cellpadding = formObj.elements['cellpadding'].value != "" ? formObj.elements['cellpadding'].value : "";
+	cellspacing = formObj.elements['cellspacing'].value != "" ? formObj.elements['cellspacing'].value : "";
+	align = formObj.elements['align'].options[formObj.elements['align'].selectedIndex].value;
+	frame = formObj.elements['frame'].options[formObj.elements['frame'].selectedIndex].value;
+	rules = formObj.elements['rules'].options[formObj.elements['rules'].selectedIndex].value;
+	width = formObj.elements['width'].value;
+	height = formObj.elements['height'].value;
+	bordercolor = formObj.elements['bordercolor'].value;
+	bgcolor = formObj.elements['bgcolor'].value;
+	className = formObj.elements['class'].options[formObj.elements['class'].selectedIndex].value;
+	id = formObj.elements['id'].value;
+	summary = formObj.elements['summary'].value;
+	style = formObj.elements['style'].value;
+	dir = formObj.elements['dir'].value;
+	lang = formObj.elements['lang'].value;
+	background = formObj.elements['backgroundimage'].value;
+	caption = formObj.elements['caption'].checked;
+
+	cellLimit = tinyMCEPopup.getParam('table_cell_limit', false);
+	rowLimit = tinyMCEPopup.getParam('table_row_limit', false);
+	colLimit = tinyMCEPopup.getParam('table_col_limit', false);
+
+	// Validate table size
+	if (colLimit && cols > colLimit) {
+		inst.windowManager.alert(inst.getLang('table_dlg.col_limit').replace(/\{\$cols\}/g, colLimit));
+		return false;
+	} else if (rowLimit && rows > rowLimit) {
+		inst.windowManager.alert(inst.getLang('table_dlg.row_limit').replace(/\{\$rows\}/g, rowLimit));
+		return false;
+	} else if (cellLimit && cols * rows > cellLimit) {
+		inst.windowManager.alert(inst.getLang('table_dlg.cell_limit').replace(/\{\$cells\}/g, cellLimit));
+		return false;
+	}
+
+	// Update table
+	if (action == "update") {
+		inst.execCommand('mceBeginUndoLevel');
+
+		dom.setAttrib(elm, 'cellPadding', cellpadding, true);
+		dom.setAttrib(elm, 'cellSpacing', cellspacing, true);
+		dom.setAttrib(elm, 'border', border);
+		dom.setAttrib(elm, 'align', align);
+		dom.setAttrib(elm, 'frame', frame);
+		dom.setAttrib(elm, 'rules', rules);
+		dom.setAttrib(elm, 'class', className);
+		dom.setAttrib(elm, 'style', style);
+		dom.setAttrib(elm, 'id', id);
+		dom.setAttrib(elm, 'summary', summary);
+		dom.setAttrib(elm, 'dir', dir);
+		dom.setAttrib(elm, 'lang', lang);
+
+		capEl = inst.dom.select('caption', elm)[0];
+
+		if (capEl && !caption)
+			capEl.parentNode.removeChild(capEl);
+
+		if (!capEl && caption) {
+			capEl = elm.ownerDocument.createElement('caption');
+
+			if (!tinymce.isIE)
+				capEl.innerHTML = '<br mce_bogus="1"/>';
+
+			elm.insertBefore(capEl, elm.firstChild);
+		}
+
+		if (width && /(pt|em|cm)$/.test(width)) {
+			dom.setStyle(elm, 'width', width);
+			dom.setAttrib(elm, 'width', '');
+		} else {
+			dom.setAttrib(elm, 'width', width, true);
+			dom.setStyle(elm, 'width', '');
+		}
+
+		// Remove these since they are not valid XHTML
+		dom.setAttrib(elm, 'borderColor', '');
+		dom.setAttrib(elm, 'bgColor', '');
+		dom.setAttrib(elm, 'background', '');
+
+		if (height) {
+			dom.setStyle(elm, 'height', height);
+			dom.setAttrib(elm, 'height', '');
+		}
+
+		if (background != '')
+			elm.style.backgroundImage = "url('" + background + "')";
+		else
+			elm.style.backgroundImage = '';
+
+/*		if (tinyMCEPopup.getParam("inline_styles")) {
+			if (width != '')
+				elm.style.width = getCSSSize(width);
+		}*/
+
+		if (bordercolor != "") {
+			elm.style.borderColor = bordercolor;
+			elm.style.borderStyle = elm.style.borderStyle == "" ? "solid" : elm.style.borderStyle;
+			elm.style.borderWidth = border == "" ? "1px" : border;
+		} else
+			elm.style.borderColor = '';
+
+		elm.style.backgroundColor = bgcolor;
+		elm.style.height = getCSSSize(height);
+
+		inst.addVisual();
+
+		// Fix for stange MSIE align bug
+		//elm.outerHTML = elm.outerHTML;
+
+		inst.nodeChanged();
+		inst.execCommand('mceEndUndoLevel');
+
+		// Repaint if dimensions changed
+		if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight)
+			inst.execCommand('mceRepaint');
+
+		tinyMCEPopup.close();
+		return true;
+	}
+
+	// Create new table
+	html += '<table';
+
+	html += makeAttrib('id', id);
+	html += makeAttrib('border', border);
+	html += makeAttrib('cellpadding', cellpadding);
+	html += makeAttrib('cellspacing', cellspacing);
+
+	if (width && /(pt|em|cm)$/.test(width)) {
+		if (style)
+			style += '; ';
+
+		style += 'width: ' + width;
+	} else
+		html += makeAttrib('width', width);
+
+/*	if (height) {
+		if (style)
+			style += '; ';
+
+		style += 'height: ' + height;
+	}*/
+
+	//html += makeAttrib('height', height);
+	//html += makeAttrib('bordercolor', bordercolor);
+	//html += makeAttrib('bgcolor', bgcolor);
+	html += makeAttrib('align', align);
+	html += makeAttrib('frame', frame);
+	html += makeAttrib('rules', rules);
+	html += makeAttrib('class', className);
+	html += makeAttrib('style', style);
+	html += makeAttrib('summary', summary);
+	html += makeAttrib('dir', dir);
+	html += makeAttrib('lang', lang);
+	html += '>';
+
+	if (caption) {
+		if (!tinymce.isIE)
+			html += '<caption><br mce_bogus="1"/></caption>';
+		else
+			html += '<caption></caption>';
+	}
+
+	for (var y=0; y<rows; y++) {
+		html += "<tr>";
+
+		for (var x=0; x<cols; x++) {
+			if (!tinymce.isIE)
+				html += '<td><br mce_bogus="1"/></td>';
+			else
+				html += '<td></td>';
+		}
+
+		html += "</tr>";
+	}
+
+	html += "</table>";
+
+	inst.execCommand('mceBeginUndoLevel');
+	inst.execCommand('mceInsertContent', false, html);
+	inst.addVisual();
+	inst.execCommand('mceEndUndoLevel');
+
+	tinyMCEPopup.close();
+}
+
+function makeAttrib(attrib, value) {
+	var formObj = document.forms[0];
+	var valueElm = formObj.elements[attrib];
+
+	if (typeof(value) == "undefined" || value == null) {
+		value = "";
+
+		if (valueElm)
+			value = valueElm.value;
+	}
+
+	if (value == "")
+		return "";
+
+	// XML encode it
+	value = value.replace(/&/g, '&amp;');
+	value = value.replace(/\"/g, '&quot;');
+	value = value.replace(/</g, '&lt;');
+	value = value.replace(/>/g, '&gt;');
+
+	return ' ' + attrib + '="' + value + '"';
+}
+
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');
+	document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');
+	document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor');
+	document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
+
+	var cols = 2, rows = 2, border = tinyMCEPopup.getParam('table_default_border', '0'), cellpadding = tinyMCEPopup.getParam('table_default_cellpadding', ''), cellspacing = tinyMCEPopup.getParam('table_default_cellspacing', '');
+	var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = "";
+	var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = "", rules, frame;
+	var inst = tinyMCEPopup.editor, dom = inst.dom;
+	var formObj = document.forms[0];
+	var elm = dom.getParent(inst.selection.getNode(), "table");
+
+	action = tinyMCEPopup.getWindowArg('action');
+
+	if (!action)
+		action = elm ? "update" : "insert";
+
+	if (elm && action != "insert") {
+		var rowsAr = elm.rows;
+		var cols = 0;
+		for (var i=0; i<rowsAr.length; i++)
+			if (rowsAr[i].cells.length > cols)
+				cols = rowsAr[i].cells.length;
+
+		cols = cols;
+		rows = rowsAr.length;
+
+		st = dom.parseStyle(dom.getAttrib(elm, "style"));
+		border = trimSize(getStyle(elm, 'border', 'borderWidth'));
+		cellpadding = dom.getAttrib(elm, 'cellpadding', "");
+		cellspacing = dom.getAttrib(elm, 'cellspacing', "");
+		width = trimSize(getStyle(elm, 'width', 'width'));
+		height = trimSize(getStyle(elm, 'height', 'height'));
+		bordercolor = convertRGBToHex(getStyle(elm, 'bordercolor', 'borderLeftColor'));
+		bgcolor = convertRGBToHex(getStyle(elm, 'bgcolor', 'backgroundColor'));
+		align = dom.getAttrib(elm, 'align', align);
+		frame = dom.getAttrib(elm, 'frame');
+		rules = dom.getAttrib(elm, 'rules');
+		className = tinymce.trim(dom.getAttrib(elm, 'class').replace(/mceItem.+/g, ''));
+		id = dom.getAttrib(elm, 'id');
+		summary = dom.getAttrib(elm, 'summary');
+		style = dom.serializeStyle(st);
+		dir = dom.getAttrib(elm, 'dir');
+		lang = dom.getAttrib(elm, 'lang');
+		background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+		formObj.caption.checked = elm.getElementsByTagName('caption').length > 0;
+
+		orgTableWidth = width;
+		orgTableHeight = height;
+
+		action = "update";
+		formObj.insert.value = inst.getLang('update');
+	}
+
+	addClassesToList('class', "table_styles");
+	TinyMCE_EditableSelects.init();
+
+	// Update form
+	selectByValue(formObj, 'align', align);
+	selectByValue(formObj, 'frame', frame);
+	selectByValue(formObj, 'rules', rules);
+	selectByValue(formObj, 'class', className, true, true);
+	formObj.cols.value = cols;
+	formObj.rows.value = rows;
+	formObj.border.value = border;
+	formObj.cellpadding.value = cellpadding;
+	formObj.cellspacing.value = cellspacing;
+	formObj.width.value = width;
+	formObj.height.value = height;
+	formObj.bordercolor.value = bordercolor;
+	formObj.bgcolor.value = bgcolor;
+	formObj.id.value = id;
+	formObj.summary.value = summary;
+	formObj.style.value = style;
+	formObj.dir.value = dir;
+	formObj.lang.value = lang;
+	formObj.backgroundimage.value = background;
+
+	updateColor('bordercolor_pick', 'bordercolor');
+	updateColor('bgcolor_pick', 'bgcolor');
+
+	// Resize some elements
+	if (isVisible('backgroundimagebrowser'))
+		document.getElementById('backgroundimage').style.width = '180px';
+
+	// Disable some fields in update mode
+	if (action == "update") {
+		formObj.cols.disabled = true;
+		formObj.rows.disabled = true;
+	}
+}
+
+function changedSize() {
+	var formObj = document.forms[0];
+	var st = dom.parseStyle(formObj.style.value);
+
+/*	var width = formObj.width.value;
+	if (width != "")
+		st['width'] = tinyMCEPopup.getParam("inline_styles") ? getCSSSize(width) : "";
+	else
+		st['width'] = "";*/
+
+	var height = formObj.height.value;
+	if (height != "")
+		st['height'] = getCSSSize(height);
+	else
+		st['height'] = "";
+
+	formObj.style.value = dom.serializeStyle(st);
+}
+
+function changedBackgroundImage() {
+	var formObj = document.forms[0];
+	var st = dom.parseStyle(formObj.style.value);
+
+	st['background-image'] = "url('" + formObj.backgroundimage.value + "')";
+
+	formObj.style.value = dom.serializeStyle(st);
+}
+
+function changedBorder() {
+	var formObj = document.forms[0];
+	var st = dom.parseStyle(formObj.style.value);
+
+	// Update border width if the element has a color
+	if (formObj.border.value != "" && formObj.bordercolor.value != "")
+		st['border-width'] = formObj.border.value + "px";
+
+	formObj.style.value = dom.serializeStyle(st);
+}
+
+function changedColor() {
+	var formObj = document.forms[0];
+	var st = dom.parseStyle(formObj.style.value);
+
+	st['background-color'] = formObj.bgcolor.value;
+
+	if (formObj.bordercolor.value != "") {
+		st['border-color'] = formObj.bordercolor.value;
+
+		// Add border-width if it's missing
+		if (!st['border-width'])
+			st['border-width'] = formObj.border.value == "" ? "1px" : formObj.border.value + "px";
+	}
+
+	formObj.style.value = dom.serializeStyle(st);
+}
+
+function changedStyle() {
+	var formObj = document.forms[0];
+	var st = dom.parseStyle(formObj.style.value);
+
+	if (st['background-image'])
+		formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+	else
+		formObj.backgroundimage.value = '';
+
+	if (st['width'])
+		formObj.width.value = trimSize(st['width']);
+
+	if (st['height'])
+		formObj.height.value = trimSize(st['height']);
+
+	if (st['background-color']) {
+		formObj.bgcolor.value = st['background-color'];
+		updateColor('bgcolor_pick','bgcolor');
+	}
+
+	if (st['border-color']) {
+		formObj.bordercolor.value = st['border-color'];
+		updateColor('bordercolor_pick','bordercolor');
+	}
+}
+
+tinyMCEPopup.onInit.add(init);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/jscripts/cell.js
@@ -1,1 +1,250 @@
-
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');
+	document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor');
+	document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor')
+
+	var inst = tinyMCE.selectedInstance;
+	var tdElm = tinyMCE.getParentElement(inst.getFocusElement(), "td,th");
+	var formObj = document.forms[0];
+	var st = tinyMCE.parseStyle(tinyMCE.getAttrib(tdElm, "style"));
+
+	// Get table cell data
+	var celltype = tdElm.nodeName.toLowerCase();
+	var align = tinyMCE.getAttrib(tdElm, 'align');
+	var valign = tinyMCE.getAttrib(tdElm, 'valign');
+	var width = trimSize(getStyle(tdElm, 'width', 'width'));
+	var height = trimSize(getStyle(tdElm, 'height', 'height'));
+	var bordercolor = convertRGBToHex(getStyle(tdElm, 'bordercolor', 'borderLeftColor'));
+	var bgcolor = convertRGBToHex(getStyle(tdElm, 'bgcolor', 'backgroundColor'));
+	var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tdElm, 'class'), false);
+	var backgroundimage = getStyle(tdElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");;
+	var id = tinyMCE.getAttrib(tdElm, 'id');
+	var lang = tinyMCE.getAttrib(tdElm, 'lang');
+	var dir = tinyMCE.getAttrib(tdElm, 'dir');
+	var scope = tinyMCE.getAttrib(tdElm, 'scope');
+
+	// Setup form
+	addClassesToList('class', 'table_cell_styles');
+	formObj.bordercolor.value = bordercolor;
+	formObj.bgcolor.value = bgcolor;
+	formObj.backgroundimage.value = backgroundimage;
+	formObj.width.value = width;
+	formObj.height.value = height;
+	formObj.id.value = id;
+	formObj.lang.value = lang;
+	formObj.style.value = tinyMCE.serializeStyle(st);
+	selectByValue(formObj, 'align', align);
+	selectByValue(formObj, 'valign', valign);
+	selectByValue(formObj, 'class', className);
+	selectByValue(formObj, 'celltype', celltype);
+	selectByValue(formObj, 'dir', dir);
+	selectByValue(formObj, 'scope', scope);
+
+	// Resize some elements
+	if (isVisible('backgroundimagebrowser'))
+		document.getElementById('backgroundimage').style.width = '180px';
+
+	updateColor('bordercolor_pick', 'bordercolor');
+	updateColor('bgcolor_pick', 'bgcolor');
+}
+
+function updateAction() {
+	tinyMCEPopup.restoreSelection();
+
+	var inst = tinyMCE.selectedInstance;
+	var tdElm = tinyMCE.getParentElement(inst.getFocusElement(), "td,th");
+	var trElm = tinyMCE.getParentElement(inst.getFocusElement(), "tr");
+	var tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");
+	var formObj = document.forms[0];
+
+	inst.execCommand('mceBeginUndoLevel');
+
+	switch (getSelectValue(formObj, 'action')) {
+		case "cell":
+			var celltype = getSelectValue(formObj, 'celltype');
+			var scope = getSelectValue(formObj, 'scope');
+
+			if (tinyMCE.getParam("accessibility_warnings")) {
+				if (celltype == "th" && scope == "")
+					var answer = confirm(tinyMCE.getLang('lang_table_missing_scope', '', true));
+				else
+					var answer = true;
+
+				if (!answer)
+					return;
+			}
+
+			updateCell(tdElm);
+			break;
+
+		case "row":
+			var cell = trElm.firstChild;
+
+			if (cell.nodeName != "TD" && cell.nodeName != "TH")
+				cell = nextCell(cell);
+
+			do {
+				cell = updateCell(cell, true);
+			} while ((cell = nextCell(cell)) != null);
+
+			break;
+
+		case "all":
+			var rows = tableElm.getElementsByTagName("tr");
+
+			for (var i=0; i<rows.length; i++) {
+				var cell = rows[i].firstChild;
+
+				if (cell.nodeName != "TD" && cell.nodeName != "TH")
+					cell = nextCell(cell);
+
+				do {
+					cell = updateCell(cell, true);
+				} while ((cell = nextCell(cell)) != null);
+			}
+
+			break;
+	}
+
+	tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);
+	tinyMCE.triggerNodeChange();
+	inst.execCommand('mceEndUndoLevel');
+	tinyMCEPopup.close();
+}
+
+function nextCell(elm) {
+	while ((elm = elm.nextSibling) != null) {
+		if (elm.nodeName == "TD" || elm.nodeName == "TH")
+			return elm;
+	}
+
+	return null;
+}
+
+function updateCell(td, skip_id) {
+	var inst = tinyMCE.selectedInstance;
+	var formObj = document.forms[0];
+	var curCellType = td.nodeName.toLowerCase();
+	var celltype = getSelectValue(formObj, 'celltype');
+	var doc = inst.getDoc();
+
+	if (!skip_id)
+		td.setAttribute('id', formObj.id.value);
+
+	td.setAttribute('align', formObj.align.value);
+	td.setAttribute('vAlign', formObj.valign.value);
+	td.setAttribute('lang', formObj.lang.value);
+	td.setAttribute('dir', getSelectValue(formObj, 'dir'));
+	td.setAttribute('style', tinyMCE.serializeStyle(tinyMCE.parseStyle(formObj.style.value)));
+	td.setAttribute('scope', formObj.scope.value);
+	tinyMCE.setAttrib(td, 'class', getSelectValue(formObj, 'class'));
+
+	// Clear deprecated attributes
+	tinyMCE.setAttrib(td, 'width', '');
+	tinyMCE.setAttrib(td, 'height', '');
+	tinyMCE.setAttrib(td, 'bgColor', '');
+	tinyMCE.setAttrib(td, 'borderColor', '');
+	tinyMCE.setAttrib(td, 'background', '');
+
+	// Set styles
+	td.style.width = getCSSSize(formObj.width.value);
+	td.style.height = getCSSSize(formObj.height.value);
+	if (formObj.bordercolor.value != "") {
+		td.style.borderColor = formObj.bordercolor.value;
+		td.style.borderStyle = td.style.borderStyle == "" ? "solid" : td.style.borderStyle;
+		td.style.borderWidth = td.style.borderWidth == "" ? "1px" : td.style.borderWidth;
+	} else
+		td.style.borderColor = '';
+
+	td.style.backgroundColor = formObj.bgcolor.value;
+
+	if (formObj.backgroundimage.value != "")
+		td.style.backgroundImage = "url('" + formObj.backgroundimage.value + "')";
+	else
+		td.style.backgroundImage = '';
+
+	if (curCellType != celltype) {
+		// changing to a different node type
+		var newCell = doc.createElement(celltype);
+
+		for (var c=0; c<td.childNodes.length; c++)
+			newCell.appendChild(td.childNodes[c].cloneNode(1));
+
+		for (var a=0; a<td.attributes.length; a++) {
+			var attr = td.attributes[a];
+			newCell.setAttribute(attr.name, attr.value);
+		}
+
+		td.parentNode.replaceChild(newCell, td);
+		td = newCell;
+	}
+
+	return td;
+}
+
+function changedBackgroundImage() {
+	var formObj = document.forms[0];
+	var st = tinyMCE.parseStyle(formObj.style.value);
+
+	st['background-image'] = "url('" + formObj.backgroundimage.value + "')";
+
+	formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function changedSize() {
+	var formObj = document.forms[0];
+	var st = tinyMCE.parseStyle(formObj.style.value);
+
+	var width = formObj.width.value;
+	if (width != "")
+		st['width'] = getCSSSize(width);
+	else
+		st['width'] = "";
+
+	var height = formObj.height.value;
+	if (height != "")
+		st['height'] = getCSSSize(height);
+	else
+		st['height'] = "";
+
+	formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function changedColor() {
+	var formObj = document.forms[0];
+	var st = tinyMCE.parseStyle(formObj.style.value);
+
+	st['background-color'] = formObj.bgcolor.value;
+	st['border-color'] = formObj.bordercolor.value;
+
+	formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function changedStyle() {
+	var formObj = document.forms[0];
+	var st = tinyMCE.parseStyle(formObj.style.value);
+
+	if (st['background-image'])
+		formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+	else
+		formObj.backgroundimage.value = '';
+
+	if (st['width'])
+		formObj.width.value = trimSize(st['width']);
+
+	if (st['height'])
+		formObj.height.value = trimSize(st['height']);
+
+	if (st['background-color']) {
+		formObj.bgcolor.value = st['background-color'];
+		updateColor('bgcolor_pick','bgcolor');
+	}
+
+	if (st['border-color']) {
+		formObj.bordercolor.value = st['border-color'];
+		updateColor('bordercolor_pick','bordercolor');
+	}
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/jscripts/merge_cells.js
@@ -1,1 +1,25 @@
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
 
+	var formObj = document.forms[0];
+
+	formObj.numcols.value = tinyMCE.getWindowArg('numcols', 1);
+	formObj.numrows.value = tinyMCE.getWindowArg('numrows', 1);
+}
+
+function mergeCells() {
+	var args = new Array();
+	var formObj = document.forms[0];
+
+	if (!AutoValidator.validate(formObj)) {
+		alert(tinyMCE.getLang('lang_invalid_data'));
+		return false;
+	}
+
+	args["numcols"] = formObj.numcols.value;
+	args["numrows"] = formObj.numrows.value;
+
+	tinyMCEPopup.execCommand("mceTableMergeCells", false, args);
+	tinyMCEPopup.close();
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/jscripts/row.js
@@ -1,1 +1,201 @@
-
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');
+	document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
+
+	var inst = tinyMCE.selectedInstance;
+	var trElm = tinyMCE.getParentElement(inst.getFocusElement(), "tr");
+	var formObj = document.forms[0];
+	var st = tinyMCE.parseStyle(tinyMCE.getAttrib(trElm, "style"));
+
+	// Get table row data
+	var rowtype = trElm.parentNode.nodeName.toLowerCase();
+	var align = tinyMCE.getAttrib(trElm, 'align');
+	var valign = tinyMCE.getAttrib(trElm, 'valign');
+	var height = trimSize(getStyle(trElm, 'height', 'height'));
+	var className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(trElm, 'class'), false);
+	var bgcolor = convertRGBToHex(getStyle(trElm, 'bgcolor', 'backgroundColor'));
+	var backgroundimage = getStyle(trElm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");;
+	var id = tinyMCE.getAttrib(trElm, 'id');
+	var lang = tinyMCE.getAttrib(trElm, 'lang');
+	var dir = tinyMCE.getAttrib(trElm, 'dir');
+
+	// Setup form
+	addClassesToList('class', 'table_row_styles');
+	formObj.bgcolor.value = bgcolor;
+	formObj.backgroundimage.value = backgroundimage;
+	formObj.height.value = height;
+	formObj.id.value = id;
+	formObj.lang.value = lang;
+	formObj.style.value = tinyMCE.serializeStyle(st);
+	selectByValue(formObj, 'align', align);
+	selectByValue(formObj, 'valign', valign);
+	selectByValue(formObj, 'class', className);
+	selectByValue(formObj, 'rowtype', rowtype);
+	selectByValue(formObj, 'dir', dir);
+
+	// Resize some elements
+	if (isVisible('backgroundimagebrowser'))
+		document.getElementById('backgroundimage').style.width = '180px';
+
+	updateColor('bgcolor_pick', 'bgcolor');
+}
+
+function updateAction() {
+	tinyMCEPopup.restoreSelection();
+
+	var inst = tinyMCE.selectedInstance;
+	var trElm = tinyMCE.getParentElement(inst.getFocusElement(), "tr");
+	var tableElm = tinyMCE.getParentElement(inst.getFocusElement(), "table");
+	var formObj = document.forms[0];
+	var action = getSelectValue(formObj, 'action');
+
+	inst.execCommand('mceBeginUndoLevel');
+
+	switch (action) {
+		case "row":
+			updateRow(trElm);
+			break;
+
+		case "all":
+			var rows = tableElm.getElementsByTagName("tr");
+
+			for (var i=0; i<rows.length; i++)
+				updateRow(rows[i], true);
+
+			break;
+
+		case "odd":
+		case "even":
+			var rows = tableElm.getElementsByTagName("tr");
+
+			for (var i=0; i<rows.length; i++) {
+				if ((i % 2 == 0 && action == "odd") || (i % 2 != 0 && action == "even"))
+					updateRow(rows[i], true, true);
+			}
+
+			break;
+	}
+
+	tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);
+	tinyMCE.triggerNodeChange();
+	inst.execCommand('mceEndUndoLevel');
+	tinyMCEPopup.close();
+}
+
+function updateRow(tr_elm, skip_id, skip_parent) {
+	var inst = tinyMCE.selectedInstance;
+	var formObj = document.forms[0];
+	var curRowType = tr_elm.parentNode.nodeName.toLowerCase();
+	var rowtype = getSelectValue(formObj, 'rowtype');
+	var doc = inst.getDoc();
+
+	// Update row element
+	if (!skip_id)
+		tr_elm.setAttribute('id', formObj.id.value);
+
+	tr_elm.setAttribute('align', getSelectValue(formObj, 'align'));
+	tr_elm.setAttribute('vAlign', getSelectValue(formObj, 'valign'));
+	tr_elm.setAttribute('lang', formObj.lang.value);
+	tr_elm.setAttribute('dir', getSelectValue(formObj, 'dir'));
+	tr_elm.setAttribute('style', tinyMCE.serializeStyle(tinyMCE.parseStyle(formObj.style.value)));
+	tinyMCE.setAttrib(tr_elm, 'class', getSelectValue(formObj, 'class'));
+
+	// Clear deprecated attributes
+	tr_elm.setAttribute('background', '');
+	tr_elm.setAttribute('bgColor', '');
+	tr_elm.setAttribute('height', '');
+
+	// Set styles
+	tr_elm.style.height = getCSSSize(formObj.height.value);
+	tr_elm.style.backgroundColor = formObj.bgcolor.value;
+
+	if (formObj.backgroundimage.value != "")
+		tr_elm.style.backgroundImage = "url('" + formObj.backgroundimage.value + "')";
+	else
+		tr_elm.style.backgroundImage = '';
+
+	// Setup new rowtype
+	if (curRowType != rowtype && !skip_parent) {
+		// first, clone the node we are working on
+		var newRow = tr_elm.cloneNode(1);
+
+		// next, find the parent of its new destination (creating it if necessary)
+		var theTable = tinyMCE.getParentElement(tr_elm, "table");
+		var dest = rowtype;
+		var newParent = null;
+		for (var i = 0; i < theTable.childNodes.length; i++) {
+			if (theTable.childNodes[i].nodeName.toLowerCase() == dest)
+				newParent = theTable.childNodes[i];
+		}
+
+		if (newParent == null) {
+			newParent = doc.createElement(dest);
+
+			if (dest == "thead")
+				theTable.insertBefore(newParent, theTable.firstChild);
+			else
+				theTable.appendChild(newParent);
+		}
+
+		// append the row to the new parent
+		newParent.appendChild(newRow);
+
+		// remove the original
+		tr_elm.parentNode.removeChild(tr_elm);
+
+		// set tr_elm to the new node
+		tr_elm = newRow;
+	}
+}
+
+function changedBackgroundImage() {
+	var formObj = document.forms[0];
+	var st = tinyMCE.parseStyle(formObj.style.value);
+
+	st['background-image'] = "url('" + formObj.backgroundimage.value + "')";
+
+	formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function changedStyle() {
+	var formObj = document.forms[0];
+	var st = tinyMCE.parseStyle(formObj.style.value);
+
+	if (st['background-image'])
+		formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+	else
+		formObj.backgroundimage.value = '';
+
+	if (st['height'])
+		formObj.height.value = trimSize(st['height']);
+
+	if (st['background-color']) {
+		formObj.bgcolor.value = st['background-color'];
+		updateColor('bgcolor_pick','bgcolor');
+	}
+}
+
+function changedSize() {
+	var formObj = document.forms[0];
+	var st = tinyMCE.parseStyle(formObj.style.value);
+
+	var height = formObj.height.value;
+	if (height != "")
+		st['height'] = getCSSSize(height);
+	else
+		st['height'] = "";
+
+	formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function changedColor() {
+	var formObj = document.forms[0];
+	var st = tinyMCE.parseStyle(formObj.style.value);
+
+	st['background-color'] = formObj.bgcolor.value;
+
+	formObj.style.value = tinyMCE.serializeStyle(st);
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/jscripts/table.js
@@ -1,1 +1,365 @@
-
+var action, orgTableWidth, orgTableHeight;
+
+function insertTable() {
+	var formObj = document.forms[0];
+	var inst = tinyMCE.selectedInstance;
+	var cols = 2, rows = 2, border = 0, cellpadding = -1, cellspacing = -1, align, width, height, className, caption;
+	var html = '', capEl;
+	var elm = tinyMCE.tableElm;
+	var cellLimit, rowLimit, colLimit;
+
+	if (!AutoValidator.validate(formObj)) {
+		alert(tinyMCE.getLang('lang_invalid_data'));
+		return false;
+	}
+
+	tinyMCEPopup.restoreSelection();
+
+	// Get form data
+	cols = formObj.elements['cols'].value;
+	rows = formObj.elements['rows'].value;
+	border = formObj.elements['border'].value != "" ? formObj.elements['border'].value  : 0;
+	cellpadding = formObj.elements['cellpadding'].value != "" ? formObj.elements['cellpadding'].value : "";
+	cellspacing = formObj.elements['cellspacing'].value != "" ? formObj.elements['cellspacing'].value : "";
+	align = formObj.elements['align'].options[formObj.elements['align'].selectedIndex].value;
+	width = formObj.elements['width'].value;
+	height = formObj.elements['height'].value;
+	bordercolor = formObj.elements['bordercolor'].value;
+	bgcolor = formObj.elements['bgcolor'].value;
+	className = formObj.elements['class'].options[formObj.elements['class'].selectedIndex].value;
+	id = formObj.elements['id'].value;
+	summary = formObj.elements['summary'].value;
+	style = formObj.elements['style'].value;
+	dir = formObj.elements['dir'].value;
+	lang = formObj.elements['lang'].value;
+	background = formObj.elements['backgroundimage'].value;
+	caption = formObj.elements['caption'].checked;
+
+	cellLimit = tinyMCE.getParam('table_cell_limit', false);
+	rowLimit = tinyMCE.getParam('table_row_limit', false);
+	colLimit = tinyMCE.getParam('table_col_limit', false);
+
+	// Validate table size
+	if (colLimit && cols > colLimit) {
+		alert(tinyMCE.getLang('lang_table_col_limit', '', true, {cols : colLimit}));
+		return false;
+	} else if (rowLimit && rows > rowLimit) {
+		alert(tinyMCE.getLang('lang_table_row_limit', '', true, {rows : rowLimit}));
+		return false;
+	} else if (cellLimit && cols * rows > cellLimit) {
+		alert(tinyMCE.getLang('lang_table_cell_limit', '', true, {cells : cellLimit}));
+		return false;
+	}
+
+	// Update table
+	if (action == "update") {
+		inst.execCommand('mceBeginUndoLevel');
+
+		tinyMCE.setAttrib(elm, 'cellPadding', cellpadding, true);
+		tinyMCE.setAttrib(elm, 'cellSpacing', cellspacing, true);
+		tinyMCE.setAttrib(elm, 'border', border, true);
+		tinyMCE.setAttrib(elm, 'align', align);
+		tinyMCE.setAttrib(elm, 'class', className);
+		tinyMCE.setAttrib(elm, 'style', style);
+		tinyMCE.setAttrib(elm, 'id', id);
+		tinyMCE.setAttrib(elm, 'summary', summary);
+		tinyMCE.setAttrib(elm, 'dir', dir);
+		tinyMCE.setAttrib(elm, 'lang', lang);
+
+		capEl = elm.getElementsByTagName('caption')[0];
+
+		if (capEl && !caption)
+			capEl.parentNode.removeChild(capEl);
+
+		if (!capEl && caption) {
+			capEl = elm.ownerDocument.createElement('caption');
+			capEl.innerHTML = '&nbsp;';
+			elm.insertBefore(capEl, elm.firstChild);
+		}
+
+		// Not inline styles
+		if (!tinyMCE.getParam("inline_styles"))
+			tinyMCE.setAttrib(elm, 'width', width, true);
+
+		// Remove these since they are not valid XHTML
+		tinyMCE.setAttrib(elm, 'borderColor', '');
+		tinyMCE.setAttrib(elm, 'bgColor', '');
+		tinyMCE.setAttrib(elm, 'background', '');
+		tinyMCE.setAttrib(elm, 'height', '');
+
+		if (background != '')
+			elm.style.backgroundImage = "url('" + background + "')";
+		else
+			elm.style.backgroundImage = '';
+
+		if (tinyMCE.getParam("inline_styles"))
+			elm.style.borderWidth = border + "px";
+
+		if (tinyMCE.getParam("inline_styles")) {
+			if (width != '')
+				elm.style.width = getCSSSize(width);
+		}
+
+		if (bordercolor != "") {
+			elm.style.borderColor = bordercolor;
+			elm.style.borderStyle = elm.style.borderStyle == "" ? "solid" : elm.style.borderStyle;
+			elm.style.borderWidth = border == "" ? "1px" : border;
+		} else
+			elm.style.borderColor = '';
+
+		elm.style.backgroundColor = bgcolor;
+		elm.style.height = getCSSSize(height);
+
+		tinyMCE.handleVisualAid(tinyMCE.tableElm, false, inst.visualAid, inst);
+
+		// Fix for stange MSIE align bug
+		tinyMCE.tableElm.outerHTML = tinyMCE.tableElm.outerHTML;
+
+		tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);
+		tinyMCE.triggerNodeChange();
+		inst.execCommand('mceEndUndoLevel');
+
+		// Repaint if dimensions changed
+		if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight)
+			inst.repaint();
+
+		tinyMCEPopup.close();
+		return true;
+	}
+
+	// Create new table
+	html += '<table';
+
+	html += makeAttrib('id', id);
+	html += makeAttrib('border', border);
+	html += makeAttrib('cellpadding', cellpadding);
+	html += makeAttrib('cellspacing', cellspacing);
+	html += makeAttrib('width', width);
+	//html += makeAttrib('height', height);
+	//html += makeAttrib('bordercolor', bordercolor);
+	//html += makeAttrib('bgcolor', bgcolor);
+	html += makeAttrib('align', align);
+	html += makeAttrib('class', tinyMCE.getVisualAidClass(className, border == 0));
+	html += makeAttrib('style', style);
+	html += makeAttrib('summary', summary);
+	html += makeAttrib('dir', dir);
+	html += makeAttrib('lang', lang);
+	html += '>';
+
+	if (caption)
+		html += '<caption>&nbsp;</caption>';
+
+	for (var y=0; y<rows; y++) {
+		html += "<tr>";
+
+		for (var x=0; x<cols; x++)
+			html += '<td>&nbsp;</td>';
+
+		html += "</tr>";
+	}
+
+	html += "</table>";
+
+	inst.execCommand('mceBeginUndoLevel');
+	inst.execCommand('mceInsertContent', false, html);
+	tinyMCE.handleVisualAid(inst.getBody(), true, tinyMCE.settings['visual']);
+	inst.execCommand('mceEndUndoLevel');
+
+	tinyMCEPopup.close();
+}
+
+function makeAttrib(attrib, value) {
+	var formObj = document.forms[0];
+	var valueElm = formObj.elements[attrib];
+
+	if (typeof(value) == "undefined" || value == null) {
+		value = "";
+
+		if (valueElm)
+			value = valueElm.value;
+	}
+
+	if (value == "")
+		return "";
+
+	// XML encode it
+	value = value.replace(/&/g, '&amp;');
+	value = value.replace(/\"/g, '&quot;');
+	value = value.replace(/</g, '&lt;');
+	value = value.replace(/>/g, '&gt;');
+
+	return ' ' + attrib + '="' + value + '"';
+}
+
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');
+	document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');
+	document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor');
+	document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
+
+	var cols = 2, rows = 2, border = tinyMCE.getParam('table_default_border', '0'), cellpadding = tinyMCE.getParam('table_default_cellpadding', ''), cellspacing = tinyMCE.getParam('table_default_cellspacing', '');
+	var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = "";
+	var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = "";
+	var inst = tinyMCE.selectedInstance;
+	var formObj = document.forms[0];
+	var elm = tinyMCE.getParentElement(inst.getFocusElement(), "table");
+
+	tinyMCE.tableElm = elm;
+	action = tinyMCE.getWindowArg('action');
+	if (action == null)
+		action = tinyMCE.tableElm ? "update" : "insert";
+
+	if (tinyMCE.tableElm && action != "insert") {
+		var rowsAr = tinyMCE.tableElm.rows;
+		var cols = 0;
+		for (var i=0; i<rowsAr.length; i++)
+			if (rowsAr[i].cells.length > cols)
+				cols = rowsAr[i].cells.length;
+
+		cols = cols;
+		rows = rowsAr.length;
+
+		st = tinyMCE.parseStyle(tinyMCE.getAttrib(tinyMCE.tableElm, "style"));
+		border = trimSize(getStyle(elm, 'border', 'borderWidth'));
+		cellpadding = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellpadding', "");
+		cellspacing = tinyMCE.getAttrib(tinyMCE.tableElm, 'cellspacing', "");
+		width = trimSize(getStyle(elm, 'width', 'width'));
+		height = trimSize(getStyle(elm, 'height', 'height'));
+		bordercolor = convertRGBToHex(getStyle(elm, 'bordercolor', 'borderLeftColor'));
+		bgcolor = convertRGBToHex(getStyle(elm, 'bgcolor', 'backgroundColor'));
+		align = tinyMCE.getAttrib(tinyMCE.tableElm, 'align', align);
+		className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(tinyMCE.tableElm, 'class'), false);
+		id = tinyMCE.getAttrib(tinyMCE.tableElm, 'id');
+		summary = tinyMCE.getAttrib(tinyMCE.tableElm, 'summary');
+		style = tinyMCE.serializeStyle(st);
+		dir = tinyMCE.getAttrib(tinyMCE.tableElm, 'dir');
+		lang = tinyMCE.getAttrib(tinyMCE.tableElm, 'lang');
+		background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+		formObj.caption.checked = tinyMCE.tableElm.getElementsByTagName('caption').length > 0;
+
+		orgTableWidth = width;
+		orgTableHeight = height;
+
+		action = "update";
+	}
+
+	addClassesToList('class', "table_styles");
+
+	// Update form
+	selectByValue(formObj, 'align', align);
+	selectByValue(formObj, 'class', className);
+	formObj.cols.value = cols;
+	formObj.rows.value = rows;
+	formObj.border.value = border;
+	formObj.cellpadding.value = cellpadding;
+	formObj.cellspacing.value = cellspacing;
+	formObj.width.value = width;
+	formObj.height.value = height;
+	formObj.bordercolor.value = bordercolor;
+	formObj.bgcolor.value = bgcolor;
+	formObj.id.value = id;
+	formObj.summary.value = summary;
+	formObj.style.value = style;
+	formObj.dir.value = dir;
+	formObj.lang.value = lang;
+	formObj.backgroundimage.value = background;
+	formObj.insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true); 
+
+	updateColor('bordercolor_pick', 'bordercolor');
+	updateColor('bgcolor_pick', 'bgcolor');
+
+	// Resize some elements
+	if (isVisible('backgroundimagebrowser'))
+		document.getElementById('backgroundimage').style.width = '180px';
+
+	// Disable some fields in update mode
+	if (action == "update") {
+		formObj.cols.disabled = true;
+		formObj.rows.disabled = true;
+	}
+}
+
+function changedSize() {
+	var formObj = document.forms[0];
+	var st = tinyMCE.parseStyle(formObj.style.value);
+
+	var width = formObj.width.value;
+	if (width != "")
+		st['width'] = tinyMCE.getParam("inline_styles") ? getCSSSize(width) : "";
+	else
+		st['width'] = "";
+
+	var height = formObj.height.value;
+	if (height != "")
+		st['height'] = getCSSSize(height);
+	else
+		st['height'] = "";
+
+	formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function changedBackgroundImage() {
+	var formObj = document.forms[0];
+	var st = tinyMCE.parseStyle(formObj.style.value);
+
+	st['background-image'] = "url('" + formObj.backgroundimage.value + "')";
+
+	formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function changedBorder() {
+	var formObj = document.forms[0];
+	var st = tinyMCE.parseStyle(formObj.style.value);
+
+	// Update border width if the element has a color
+	if (formObj.border.value != "" && formObj.bordercolor.value != "")
+		st['border-width'] = formObj.border.value + "px";
+
+	formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function changedColor() {
+	var formObj = document.forms[0];
+	var st = tinyMCE.parseStyle(formObj.style.value);
+
+	st['background-color'] = formObj.bgcolor.value;
+
+	if (formObj.bordercolor.value != "") {
+		st['border-color'] = formObj.bordercolor.value;
+
+		// Add border-width if it's missing
+		if (!st['border-width'])
+			st['border-width'] = formObj.border.value == "" ? "1px" : formObj.border.value + "px";
+	}
+
+	formObj.style.value = tinyMCE.serializeStyle(st);
+}
+
+function changedStyle() {
+	var formObj = document.forms[0];
+	var st = tinyMCE.parseStyle(formObj.style.value);
+
+	if (st['background-image'])
+		formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+	else
+		formObj.backgroundimage.value = '';
+
+	if (st['width'])
+		formObj.width.value = trimSize(st['width']);
+
+	if (st['height'])
+		formObj.height.value = trimSize(st['height']);
+
+	if (st['background-color']) {
+		formObj.bgcolor.value = st['background-color'];
+		updateColor('bgcolor_pick','bgcolor');
+	}
+
+	if (st['border-color']) {
+		formObj.bordercolor.value = st['border-color'];
+		updateColor('bordercolor_pick','bordercolor');
+	}
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/langs/en.js
@@ -1,1 +1,80 @@
+// UK lang variables
 
+tinyMCE.addToLang('table',{
+general_tab : 'General',
+advanced_tab : 'Advanced',
+general_props : 'General properties',
+advanced_props : 'Advanced properties',
+desc : 'Inserts a new table',
+row_before_desc : 'Insert row before',
+row_after_desc : 'Insert row after',
+delete_row_desc : 'Delete row',
+col_before_desc : 'Insert column before',
+col_after_desc : 'Insert column after',
+delete_col_desc : 'Remove column',
+rowtype : 'Row in table part',
+title : 'Insert/Modify table',
+width : 'Width',
+height : 'Height',
+cols : 'Columns',
+rows : 'Rows',
+cellspacing : 'Cellspacing',
+cellpadding : 'Cellpadding',
+border : 'Border',
+align : 'Alignment',
+align_default : 'Default',
+align_left : 'Left',
+align_right : 'Right',
+align_middle : 'Center',
+row_title : 'Table row properties',
+cell_title : 'Table cell properties',
+cell_type : 'Cell type',
+row_desc : 'Table row properties',
+cell_desc : 'Table cell properties',
+valign : 'Vertical alignment',
+align_top : 'Top',
+align_bottom : 'Bottom',
+props_desc : 'Table properties',
+bordercolor : 'Border color',
+bgcolor : 'Background color',
+merge_cells_title : 'Merge table cells',
+split_cells_desc : 'Split table cells',
+merge_cells_desc : 'Merge table cells',
+cut_row_desc : 'Cut table row',
+copy_row_desc : 'Copy table row',
+paste_row_before_desc : 'Paste table row before',
+paste_row_after_desc : 'Paste table row after',
+id : 'Id',
+style: 'Style',
+langdir : 'Language direction',
+langcode : 'Language code',
+mime : 'Target MIME type',
+ltr : 'Left to right',
+rtl : 'Right to left',
+bgimage : 'Background image',
+summary : 'Summary',
+td : "Data",
+th : "Header",
+cell_cell : 'Update current cell',
+cell_row : 'Update all cells in row',
+cell_all : 'Update all cells in table',
+row_row : 'Update current row',
+row_odd : 'Update odd rows in table',
+row_even : 'Update even rows in table',
+row_all : 'Update all rows in table',
+thead : 'Table Head',
+tbody : 'Table Body',
+tfoot : 'Table Foot',
+del : 'Delete table',
+scope : 'Scope',
+row : 'Row',
+col : 'Col',
+rowgroup : 'Row Group',
+colgroup : 'Col Group',
+col_limit : 'You\'ve exceeded the maximum number of columns of {$cols}.',
+row_limit : 'You\'ve exceeded the maximum number of rows of {$rows}.',
+cell_limit : 'You\'ve exceeded the maximum number of cells of {$cells}.',
+missing_scope: 'Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.',
+caption : 'Table caption'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/langs/en_dlg.js
@@ -1,1 +1,74 @@
-
+tinyMCE.addI18n('en.table_dlg',{
+general_tab:"General",
+advanced_tab:"Advanced",
+general_props:"General properties",
+advanced_props:"Advanced properties",
+rowtype:"Row in table part",
+title:"Insert/Modify table",
+width:"Width",
+height:"Height",
+cols:"Cols",
+rows:"Rows",
+cellspacing:"Cellspacing",
+cellpadding:"Cellpadding",
+border:"Border",
+align:"Alignment",
+align_default:"Default",
+align_left:"Left",
+align_right:"Right",
+align_middle:"Center",
+row_title:"Table row properties",
+cell_title:"Table cell properties",
+cell_type:"Cell type",
+valign:"Vertical alignment",
+align_top:"Top",
+align_bottom:"Bottom",
+bordercolor:"Border color",
+bgcolor:"Background color",
+merge_cells_title:"Merge table cells",
+id:"Id",
+style:"Style",
+langdir:"Language direction",
+langcode:"Language code",
+mime:"Target MIME type",
+ltr:"Left to right",
+rtl:"Right to left",
+bgimage:"Background image",
+summary:"Summary",
+td:"Data",
+th:"Header",
+cell_cell:"Update current cell",
+cell_row:"Update all cells in row",
+cell_all:"Update all cells in table",
+row_row:"Update current row",
+row_odd:"Update odd rows in table",
+row_even:"Update even rows in table",
+row_all:"Update all rows in table",
+thead:"Table Head",
+tbody:"Table Body",
+tfoot:"Table Foot",
+scope:"Scope",
+rowgroup:"Row Group",
+colgroup:"Col Group",
+col_limit:"You've exceeded the maximum number of columns of {$cols}.",
+row_limit:"You've exceeded the maximum number of rows of {$rows}.",
+cell_limit:"You've exceeded the maximum number of cells of {$cells}.",
+missing_scope:"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.",
+caption:"Table caption",
+frame:"Frame",
+frame_none:"none",
+frame_groups:"groups",
+frame_rows:"rows",
+frame_cols:"cols",
+frame_all:"all",
+rules:"Rules",
+rules_void:"void",
+rules_above:"above",
+rules_below:"below",
+rules_hsides:"hsides",
+rules_lhs:"lhs",
+rules_rhs:"rhs",
+rules_vsides:"vsides",
+rules_box:"box",
+rules_border:"border"
+});

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/merge_cells.htm
@@ -1,1 +1,39 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#table_dlg.merge_cells_title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/validate.js"></script>
+	<script type="text/javascript" src="js/merge_cells.js"></script>
+	<base target="_self" />
+</head>
+<body style="margin: 8px" style="display: none">
+<form onsubmit="mergeCells();return false;" action="#">
+	<fieldset>
+		<legend>{#table_dlg.merge_cells_title}</legend>
+		  <table border="0" cellpadding="0" cellspacing="3" width="100%">
+			  <tr>
+				<td>{#table_dlg.cols}:</td>
+				<td align="right"><input type="text" name="numcols" value="" class="number min1 mceFocus" style="width: 30px" /></td>
+			  </tr>
+			  <tr>
+				<td>{#table_dlg.rows}:</td>
+				<td align="right"><input type="text" name="numrows" value="" class="number min1" style="width: 30px" /></td>
+			  </tr>
+		  </table>
+	</fieldset>
 
+	<div class="mceActionPanel">
+		<div style="float: left">
+			<input type="submit" id="insert" name="insert" value="{#update}" />
+		</div>
+
+		<div style="float: right">
+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+		</div>
+	</div>
+</form>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/row.htm
@@ -1,1 +1,162 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#table_dlg.row_title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="../../utils/editable_selects.js"></script>
+	<script type="text/javascript" src="js/row.js"></script>
+	<link href="css/row.css" rel="stylesheet" type="text/css" />
+	<base target="_self" />
+</head>
+<body id="tablerow" style="display: none">
+	<form onsubmit="updateAction();return false;">
+		<div class="tabs">
+			<ul>
+				<li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#table_dlg.general_tab}</a></span></li>
+				<li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#table_dlg.advanced_tab}</a></span></li>
+			</ul>
+		</div>
 
+		<div class="panel_wrapper">
+			<div id="general_panel" class="panel current">
+				<fieldset>
+					<legend>{#table_dlg.general_props}</legend>
+
+					<table border="0" cellpadding="4" cellspacing="0">
+						<tr>
+							<td><label for="rowtype">{#table_dlg.rowtype}</label></td>
+							<td class="col2">
+								<select id="rowtype" name="rowtype" class="mceFocus">
+									<option value="thead">{#table_dlg.thead}</option>
+									<option value="tbody">{#table_dlg.tbody}</option>
+									<option value="tfoot">{#table_dlg.tfoot}</option>
+								</select>
+							</td>
+						</tr>
+
+						<tr>
+							<td><label for="align">{#table_dlg.align}</label></td>
+							<td class="col2">
+								<select id="align" name="align">
+									<option value="">{#not_set}</option>
+									<option value="center">{#table_dlg.align_middle}</option>
+									<option value="left">{#table_dlg.align_left}</option>
+									<option value="right">{#table_dlg.align_right}</option>
+								</select>
+							</td>
+						</tr>
+
+						<tr>
+							<td><label for="valign">{#table_dlg.valign}</label></td>
+							<td class="col2">
+								<select id="valign" name="valign">
+									<option value="">{#not_set}</option>
+									<option value="top">{#table_dlg.align_top}</option>
+									<option value="middle">{#table_dlg.align_middle}</option>
+									<option value="bottom">{#table_dlg.align_bottom}</option>
+								</select>
+							</td>
+						</tr>
+
+						<tr id="styleSelectRow">
+							<td><label for="class">{#class_name}</label></td>
+							<td class="col2">
+								<select id="class" name="class" class="mceEditableSelect">
+									<option value="" selected="selected">{#not_set}</option>
+								</select>
+							</td>
+						</tr>
+
+						<tr>
+							<td><label for="height">{#table_dlg.height}</label></td>
+							<td class="col2"><input name="height" type="text" id="height" value="" size="4" maxlength="4" onchange="changedSize();" /></td>
+						</tr>
+					</table>
+				</fieldset>
+			</div>
+
+			<div id="advanced_panel" class="panel">
+				<fieldset>
+					<legend>{#table_dlg.advanced_props}</legend>
+
+					<table border="0" cellpadding="0" cellspacing="4">
+						<tr>
+							<td class="column1"><label for="id">{#table_dlg.id}</label></td> 
+							<td><input id="id" name="id" type="text" value="" style="width: 200px" /></td> 
+						</tr>
+
+						<tr>
+							<td><label for="style">{#table_dlg.style}</label></td>
+							<td><input type="text" id="style" name="style" value="" style="width: 200px;" onchange="changedStyle();" /></td>
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="dir">{#table_dlg.langdir}</label></td> 
+							<td>
+								<select id="dir" name="dir" style="width: 200px"> 
+										<option value="">{#not_set}</option> 
+										<option value="ltr">{#table_dlg.ltr}</option> 
+										<option value="rtl">{#table_dlg.rtl}</option> 
+								</select>
+							</td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="lang">{#table_dlg.langcode}</label></td> 
+							<td>
+								<input id="lang" name="lang" type="text" value="" style="width: 200px" />
+							</td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="backgroundimage">{#table_dlg.bgimage}</label></td> 
+							<td>
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="backgroundimage" name="backgroundimage" type="text" value="" style="width: 200px" onchange="changedBackgroundImage();" /></td>
+										<td id="backgroundimagebrowsercontainer">&nbsp;</td>
+									</tr>
+								</table>
+							</td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="bgcolor">{#table_dlg.bgcolor}</label></td> 
+							<td>
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>
+										<td id="bgcolor_pickcontainer">&nbsp;</td>
+									</tr>
+								</table>
+							</td> 
+						</tr>
+					</table>
+				</fieldset>
+			</div>
+		</div>
+
+		<div class="mceActionPanel">
+			<div>
+				<select id="action" name="action">
+					<option value="row">{#table_dlg.row_row}</option>
+					<option value="odd">{#table_dlg.row_odd}</option>
+					<option value="even">{#table_dlg.row_even}</option>
+					<option value="all">{#table_dlg.row_all}</option>
+				</select>
+			</div>
+
+			<div style="float: left">
+				<div><input type="submit" id="insert" name="insert" value="{#update}" /></div>
+			</div>
+
+			<div style="float: right">
+				<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+			</div>
+		</div>
+	</form>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/table/table.htm
@@ -1,1 +1,194 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#table_dlg.title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="../../utils/validate.js"></script>
+	<script type="text/javascript" src="../../utils/editable_selects.js"></script>
+	<script type="text/javascript" src="js/table.js"></script>
+	<link href="css/table.css" rel="stylesheet" type="text/css" />
+	<base target="_self" />
+</head>
+<body id="table" style="display: none">
+	<form onsubmit="insertTable();return false;" action="#">
+		<div class="tabs">
+			<ul>
+				<li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#table_dlg.general_tab}</a></span></li>
+				<li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#table_dlg.advanced_tab}</a></span></li>
+			</ul>
+		</div>
 
+		<div class="panel_wrapper">
+			<div id="general_panel" class="panel current">
+				<fieldset>
+					<legend>{#table_dlg.general_props}</legend>
+					  <table border="0" cellpadding="4" cellspacing="0" width="100%">
+							  <tr>
+								<td><label id="colslabel" for="cols">{#table_dlg.cols}</label></td>
+								<td><input id="cols" name="cols" type="text" value="" size="3" maxlength="3" class="required number min1 mceFocus" /></td>
+								<td><label id="rowslabel" for="rows">{#table_dlg.rows}</label></td>
+								<td><input id="rows" name="rows" type="text" value="" size="3" maxlength="3" class="required number min1" /></td>
+							  </tr>
+							  <tr>
+								<td><label id="cellpaddinglabel" for="cellpadding">{#table_dlg.cellpadding}</label></td>
+								<td><input id="cellpadding" name="cellpadding" type="text" value="" size="3" maxlength="3" class="number" /></td>
+								<td><label id="cellspacinglabel" for="cellspacing">{#table_dlg.cellspacing}</label></td>
+								<td><input id="cellspacing" name="cellspacing" type="text" value="" size="3" maxlength="3" class="number" /></td>
+							  </tr>
+							  <tr>
+								<td><label id="alignlabel" for="align">{#table_dlg.align}</label></td>
+								<td><select id="align" name="align">
+									<option value="">{#not_set}</option>
+									<option value="center">{#table_dlg.align_middle}</option>
+									<option value="left">{#table_dlg.align_left}</option>
+									<option value="right">{#table_dlg.align_right}</option>
+								  </select></td>
+								<td><label id="borderlabel" for="border">{#table_dlg.border}</label></td>
+								<td><input id="border" name="border" type="text" value="" size="3" maxlength="3" onchange="changedBorder();" class="number" /></td>
+							  </tr>
+							  <tr id="width_row">
+								<td><label id="widthlabel" for="width">{#table_dlg.width}</label></td>
+								<td><input name="width" type="text" id="width" value="" size="4" maxlength="4" onchange="changedSize();" class="size" /></td>
+								<td><label id="heightlabel" for="height">{#table_dlg.height}</label></td>
+								<td><input name="height" type="text" id="height" value="" size="4" maxlength="4" onchange="changedSize();" class="size" /></td>
+							  </tr>
+							  <tr id="styleSelectRow">
+								<td><label id="classlabel" for="class">{#class_name}</label></td>
+								<td colspan="3">
+								 <select id="class" name="class" class="mceEditableSelect">
+									<option value="" selected>{#not_set}</option>
+								 </select></td>
+							  </tr>
+							  <tr>
+								<td class="column1"><label for="caption">{#table_dlg.caption}</label></td> 
+								<td><input id="caption" name="caption" type="checkbox" class="checkbox" value="true" /></td> 
+							  </tr>
+							</table>
+				</fieldset>
+			</div>
+
+			<div id="advanced_panel" class="panel">
+				<fieldset>
+					<legend>{#table_dlg.advanced_props}</legend>
+
+					<table border="0" cellpadding="0" cellspacing="4">
+						<tr>
+							<td class="column1"><label for="id">{#table_dlg.id}</label></td> 
+							<td><input id="id" name="id" type="text" value="" class="advfield" /></td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="summary">{#table_dlg.summary}</label></td> 
+							<td><input id="summary" name="summary" type="text" value="" class="advfield" /></td> 
+						</tr>
+
+						<tr>
+							<td><label for="style">{#table_dlg.style}</label></td>
+							<td><input type="text" id="style" name="style" value="" class="advfield" onchange="changedStyle();" /></td>
+						</tr>
+
+						<tr>
+							<td class="column1"><label id="langlabel" for="lang">{#table_dlg.langcode}</label></td> 
+							<td>
+								<input id="lang" name="lang" type="text" value="" class="advfield" />
+							</td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="backgroundimage">{#table_dlg.bgimage}</label></td> 
+							<td>
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="backgroundimage" name="backgroundimage" type="text" value="" class="advfield" onchange="changedBackgroundImage();" /></td>
+										<td id="backgroundimagebrowsercontainer">&nbsp;</td>
+									</tr>
+								</table>
+							</td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="frame">{#table_dlg.frame}</label></td> 
+							<td>
+								<select id="frame" name="frame" class="advfield"> 
+										<option value="">{#not_set}</option>
+										<option value="void">{#table_dlg.rules_void}</option>
+										<option value="above">{#table_dlg.rules_above}</option> 
+										<option value="below">{#table_dlg.rules_below}</option> 
+										<option value="hsides">{#table_dlg.rules_hsides}</option> 
+										<option value="lhs">{#table_dlg.rules_lhs}</option> 
+										<option value="rhs">{#table_dlg.rules_rhs}</option> 
+										<option value="vsides">{#table_dlg.rules_vsides}</option> 
+										<option value="box">{#table_dlg.rules_box}</option> 
+										<option value="border">{#table_dlg.rules_border}</option> 
+								</select>
+							</td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="rules">{#table_dlg.rules}</label></td> 
+							<td>
+								<select id="rules" name="rules" class="advfield"> 
+										<option value="">{#not_set}</option> 
+										<option value="none">{#table_dlg.frame_none}</option>
+										<option value="groups">{#table_dlg.frame_groups}</option>
+										<option value="rows">{#table_dlg.frame_rows}</option>
+										<option value="cols">{#table_dlg.frame_cols}</option>
+										<option value="all">{#table_dlg.frame_all}</option>
+									</select>
+							</td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="dir">{#table_dlg.langdir}</label></td> 
+							<td>
+								<select id="dir" name="dir" class="advfield"> 
+										<option value="">{#not_set}</option> 
+										<option value="ltr">{#table_dlg.ltr}</option> 
+										<option value="rtl">{#table_dlg.rtl}</option> 
+								</select>
+							</td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="bordercolor">{#table_dlg.bordercolor}</label></td> 
+							<td>
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="bordercolor" name="bordercolor" type="text" value="" size="9" onchange="updateColor('bordercolor_pick','bordercolor');changedColor();" /></td>
+										<td id="bordercolor_pickcontainer">&nbsp;</td>
+									</tr>
+								</table>
+							</td> 
+						</tr>
+
+						<tr>
+							<td class="column1"><label for="bgcolor">{#table_dlg.bgcolor}</label></td> 
+							<td>
+								<table border="0" cellpadding="0" cellspacing="0">
+									<tr>
+										<td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedColor();" /></td>
+										<td id="bgcolor_pickcontainer">&nbsp;</td>
+									</tr>
+								</table>
+							</td> 
+						</tr>
+					</table>
+				</fieldset>
+			</div>
+		</div>
+
+		<div class="mceActionPanel">
+			<div style="float: left">
+				<input type="submit" id="insert" name="insert" value="{#insert}" />
+			</div>
+
+			<div style="float: right">
+				<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+			</div>
+		</div>
+	</form>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/template/blank.htm
@@ -1,1 +1,13 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>blank_page</title>
+	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+	<script type="text/javascript">
+		parent.TemplateDialog.loadCSSFiles(document);
+	</script>
+</head>
+<body id="mceTemplatePreview" class="mceContentBody">
 
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/template/css/template.css
@@ -1,1 +1,24 @@
+#frmbody {
+	padding: 10px;
+	background-color: #FFF;
+	border: 1px solid #CCC;
+}
 
+.frmRow {
+	margin-bottom: 10px;
+}
+
+#templatesrc {
+	border: none;
+	width: 320px;
+	height: 240px;
+}
+
+.title {
+	padding-bottom: 5px;
+}
+
+.mceActionPanel {
+	padding-top: 5px;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/template/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){var each=tinymce.each;tinymce.create('tinymce.plugins.TemplatePlugin',{init:function(ed,url){var t=this;t.editor=ed;ed.addCommand('mceTemplate',function(ui){ed.windowManager.open({file:url+'/template.htm',width:ed.getParam('template_popup_width',750),height:ed.getParam('template_popup_height',600),inline:1},{plugin_url:url});});ed.addCommand('mceInsertTemplate',t._insertTemplate,t);ed.addButton('template',{title:'template.desc',cmd:'mceTemplate'});ed.onPreProcess.add(function(ed,o){var dom=ed.dom;each(dom.select('div',o.node),function(e){if(dom.hasClass(e,'mceTmpl')){each(dom.select('*',e),function(e){if(dom.hasClass(e,ed.getParam('template_mdate_classes','mdate').replace(/\s+/g,'|')))e.innerHTML=t._getDateTime(new Date(),ed.getParam("template_mdate_format",ed.getLang("template.mdate_format")));});t._replaceVals(e);}});});},getInfo:function(){return{longname:'Template plugin',author:'Moxiecode Systems AB',authorurl:'http://www.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/template',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_insertTemplate:function(ui,v){var t=this,ed=t.editor,h,el,dom=ed.dom,sel=ed.selection.getContent();h=v.content;each(t.editor.getParam('template_replace_values'),function(v,k){if(typeof(v)!='function')h=h.replace(new RegExp('\\{\\$'+k+'\\}','g'),v);});el=dom.create('div',null,h);n=dom.select('.mceTmpl',el);if(n&&n.length>0){el=dom.create('div',null);el.appendChild(n[0].cloneNode(true));}function hasClass(n,c){return new RegExp('\\b'+c+'\\b','g').test(n.className);};each(dom.select('*',el),function(n){if(hasClass(n,ed.getParam('template_cdate_classes','cdate').replace(/\s+/g,'|')))n.innerHTML=t._getDateTime(new Date(),ed.getParam("template_cdate_format",ed.getLang("template.cdate_format")));if(hasClass(n,ed.getParam('template_mdate_classes','mdate').replace(/\s+/g,'|')))n.innerHTML=t._getDateTime(new Date(),ed.getParam("template_mdate_format",ed.getLang("template.mdate_format")));if(hasClass(n,ed.getParam('template_selected_content_classes','selcontent').replace(/\s+/g,'|')))n.innerHTML=sel;});t._replaceVals(el);ed.execCommand('mceInsertContent',false,el.innerHTML);ed.addVisual();},_replaceVals:function(e){var dom=this.editor.dom,vl=this.editor.getParam('template_replace_values');each(dom.select('*',e),function(e){each(vl,function(v,k){if(dom.hasClass(e,k)){if(typeof(vl[k])=='function')vl[k](e);}});});},_getDateTime:function(d,fmt){if(!fmt)return"";function addZeros(value,len){var i;value=""+value;if(value.length<len){for(i=0;i<(len-value.length);i++)value="0"+value;}return value;}fmt=fmt.replace("%D","%m/%d/%y");fmt=fmt.replace("%r","%I:%M:%S %p");fmt=fmt.replace("%Y",""+d.getFullYear());fmt=fmt.replace("%y",""+d.getYear());fmt=fmt.replace("%m",addZeros(d.getMonth()+1,2));fmt=fmt.replace("%d",addZeros(d.getDate(),2));fmt=fmt.replace("%H",""+addZeros(d.getHours(),2));fmt=fmt.replace("%M",""+addZeros(d.getMinutes(),2));fmt=fmt.replace("%S",""+addZeros(d.getSeconds(),2));fmt=fmt.replace("%I",""+((d.getHours()+11)%12+1));fmt=fmt.replace("%p",""+(d.getHours()<12?"AM":"PM"));fmt=fmt.replace("%B",""+tinyMCE.getLang("template_months_long").split(',')[d.getMonth()]);fmt=fmt.replace("%b",""+tinyMCE.getLang("template_months_short").split(',')[d.getMonth()]);fmt=fmt.replace("%A",""+tinyMCE.getLang("template_day_long").split(',')[d.getDay()]);fmt=fmt.replace("%a",""+tinyMCE.getLang("template_day_short").split(',')[d.getDay()]);fmt=fmt.replace("%%","%");return fmt;}});tinymce.PluginManager.add('template',tinymce.plugins.TemplatePlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/template/editor_plugin_src.js
@@ -1,1 +1,156 @@
+/**
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	var each = tinymce.each;
+
+	tinymce.create('tinymce.plugins.TemplatePlugin', {
+		init : function(ed, url) {
+			var t = this;
+
+			t.editor = ed;
+
+			// Register commands
+			ed.addCommand('mceTemplate', function(ui) {
+				ed.windowManager.open({
+					file : url + '/template.htm',
+					width : ed.getParam('template_popup_width', 750),
+					height : ed.getParam('template_popup_height', 600),
+					inline : 1
+				}, {
+					plugin_url : url
+				});
+			});
+
+			ed.addCommand('mceInsertTemplate', t._insertTemplate, t);
+
+			// Register buttons
+			ed.addButton('template', {title : 'template.desc', cmd : 'mceTemplate'});
+
+			ed.onPreProcess.add(function(ed, o) {
+				var dom = ed.dom;
+
+				each(dom.select('div', o.node), function(e) {
+					if (dom.hasClass(e, 'mceTmpl')) {
+						each(dom.select('*', e), function(e) {
+							if (dom.hasClass(e, ed.getParam('template_mdate_classes', 'mdate').replace(/\s+/g, '|')))
+								e.innerHTML = t._getDateTime(new Date(), ed.getParam("template_mdate_format", ed.getLang("template.mdate_format")));
+						});
+
+						t._replaceVals(e);
+					}
+				});
+			});
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Template plugin',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://www.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/template',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		},
+
+		_insertTemplate : function(ui, v) {
+			var t = this, ed = t.editor, h, el, dom = ed.dom, sel = ed.selection.getContent();
+
+			h = v.content;
+
+			each(t.editor.getParam('template_replace_values'), function(v, k) {
+				if (typeof(v) != 'function')
+					h = h.replace(new RegExp('\\{\\$' + k + '\\}', 'g'), v);
+			});
+
+			el = dom.create('div', null, h);
+
+			// Find template element within div
+			n = dom.select('.mceTmpl', el);
+			if (n && n.length > 0) {
+				el = dom.create('div', null);
+				el.appendChild(n[0].cloneNode(true));
+			}
+
+			function hasClass(n, c) {
+				return new RegExp('\\b' + c + '\\b', 'g').test(n.className);
+			};
+
+			each(dom.select('*', el), function(n) {
+				// Replace cdate
+				if (hasClass(n, ed.getParam('template_cdate_classes', 'cdate').replace(/\s+/g, '|')))
+					n.innerHTML = t._getDateTime(new Date(), ed.getParam("template_cdate_format", ed.getLang("template.cdate_format")));
+
+				// Replace mdate
+				if (hasClass(n, ed.getParam('template_mdate_classes', 'mdate').replace(/\s+/g, '|')))
+					n.innerHTML = t._getDateTime(new Date(), ed.getParam("template_mdate_format", ed.getLang("template.mdate_format")));
+
+				// Replace selection
+				if (hasClass(n, ed.getParam('template_selected_content_classes', 'selcontent').replace(/\s+/g, '|')))
+					n.innerHTML = sel;
+			});
+
+			t._replaceVals(el);
+
+			ed.execCommand('mceInsertContent', false, el.innerHTML);
+			ed.addVisual();
+		},
+
+		_replaceVals : function(e) {
+			var dom = this.editor.dom, vl = this.editor.getParam('template_replace_values');
+
+			each(dom.select('*', e), function(e) {
+				each(vl, function(v, k) {
+					if (dom.hasClass(e, k)) {
+						if (typeof(vl[k]) == 'function')
+							vl[k](e);
+					}
+				});
+			});
+		},
+
+		_getDateTime : function(d, fmt) {
+				if (!fmt)
+					return "";
+
+				function addZeros(value, len) {
+					var i;
+
+					value = "" + value;
+
+					if (value.length < len) {
+						for (i=0; i<(len-value.length); i++)
+							value = "0" + value;
+					}
+
+					return value;
+				}
+
+				fmt = fmt.replace("%D", "%m/%d/%y");
+				fmt = fmt.replace("%r", "%I:%M:%S %p");
+				fmt = fmt.replace("%Y", "" + d.getFullYear());
+				fmt = fmt.replace("%y", "" + d.getYear());
+				fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2));
+				fmt = fmt.replace("%d", addZeros(d.getDate(), 2));
+				fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2));
+				fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2));
+				fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2));
+				fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1));
+				fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM"));
+				fmt = fmt.replace("%B", "" + tinyMCE.getLang("template_months_long").split(',')[d.getMonth()]);
+				fmt = fmt.replace("%b", "" + tinyMCE.getLang("template_months_short").split(',')[d.getMonth()]);
+				fmt = fmt.replace("%A", "" + tinyMCE.getLang("template_day_long").split(',')[d.getDay()]);
+				fmt = fmt.replace("%a", "" + tinyMCE.getLang("template_day_short").split(',')[d.getDay()]);
+				fmt = fmt.replace("%%", "%");
+
+				return fmt;
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('template', tinymce.plugins.TemplatePlugin);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/template/images/template.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/template/js/template.js
@@ -1,1 +1,107 @@
+tinyMCEPopup.requireLangPack();
 
+var TemplateDialog = {
+	preInit : function() {
+		var url = tinyMCEPopup.getParam("template_external_list_url");
+
+		if (url != null)
+			document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></sc'+'ript>');
+	},
+
+	init : function() {
+		var ed = tinyMCEPopup.editor, tsrc, sel, x, u;
+
+ 		tsrc = ed.getParam("template_templates", false);
+ 		sel = document.getElementById('tpath');
+
+		// Setup external template list
+		if (!tsrc && typeof(tinyMCETemplateList) != 'undefined') {
+			for (x=0, tsrc = []; x<tinyMCETemplateList.length; x++)
+				tsrc.push({title : tinyMCETemplateList[x][0], src : tinyMCETemplateList[x][1], description : tinyMCETemplateList[x][2]});
+		}
+
+		for (x=0; x<tsrc.length; x++)
+			sel.options[sel.options.length] = new Option(tsrc[x].title, tinyMCEPopup.editor.documentBaseURI.toAbsolute(tsrc[x].src));
+
+		this.resize();
+		this.tsrc = tsrc;
+	},
+
+	resize : function() {
+		var w, h, e;
+
+		if (!self.innerWidth) {
+			w = document.body.clientWidth - 50;
+			h = document.body.clientHeight - 160;
+		} else {
+			w = self.innerWidth - 50;
+			h = self.innerHeight - 170;
+		}
+
+		e = document.getElementById('templatesrc');
+
+		if (e) {
+			e.style.height = Math.abs(h) + 'px';
+			e.style.width  = Math.abs(w - 5) + 'px';
+		}
+	},
+
+	loadCSSFiles : function(d) {
+		var ed = tinyMCEPopup.editor;
+
+		tinymce.each(ed.getParam("content_css", '').split(','), function(u) {
+			d.write('<link href="' + ed.documentBaseURI.toAbsolute(u) + '" rel="stylesheet" type="text/css" />');
+		});
+	},
+
+	selectTemplate : function(u, ti) {
+		var d = window.frames['templatesrc'].document, x, tsrc = this.tsrc;
+
+		if (!u)
+			return;
+
+		d.body.innerHTML = this.templateHTML = this.getFileContents(u);
+
+		for (x=0; x<tsrc.length; x++) {
+			if (tsrc[x].title == ti)
+				document.getElementById('tmpldesc').innerHTML = tsrc[x].description || '';
+		}
+	},
+
+ 	insert : function() {
+		tinyMCEPopup.execCommand('mceInsertTemplate', false, {
+			content : this.templateHTML,
+			selection : tinyMCEPopup.editor.selection.getContent()
+		});
+
+		tinyMCEPopup.close();
+	},
+
+	getFileContents : function(u) {
+		var x, d, t = 'text/plain';
+
+		function g(s) {
+			x = 0;
+
+			try {
+				x = new ActiveXObject(s);
+			} catch (s) {
+			}
+
+			return x;
+		};
+
+		x = window.ActiveXObject ? g('Msxml2.XMLHTTP') || g('Microsoft.XMLHTTP') : new XMLHttpRequest();
+
+		// Synchronous AJAX load file
+		x.overrideMimeType && x.overrideMimeType(t);
+		x.open("GET", u, false);
+		x.send(null);
+
+		return x.responseText;
+	}
+};
+
+TemplateDialog.preInit();
+tinyMCEPopup.onInit.add(TemplateDialog.init, TemplateDialog);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/template/jscripts/template.js
@@ -1,1 +1,144 @@
+// Import external list url javascript
+var url = tinyMCE.getParam("template_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>');
+}
+
+var TPU = { //Template Popup Utils
+	currentTemplateHTML : null,
+	templates : [],
+	inst : tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')),
+	plugin : tinyMCE.getWindowArg('pluginObj'),
+	data : tinyMCE.selectedInstance.getData('template'),
+
+ 	init : function() {
+ 		document.forms[0].insert.value = tinyMCE.getLang('lang_' + this.data.currentAction, 'Insert', true); 
+		TPU.loadTemplatePaths();
+
+		if (this.data.currentAction == "update")
+			document.getElementById('warning').innerHTML = tinyMCE.getLang('lang_template_warning');
+
+		this.resizeInputs();
+	},
+
+ 	loadTemplatePaths : function() {
+		var tsrc, sel, x, u;
+
+ 		tsrc = tinyMCE.getParam("template_templates", false);
+ 		sel = document.getElementById('tpath');
+
+		// Setup external template list
+		if (!tsrc && typeof(tinyMCETemplateList) != 'undefined') {
+			for (x=0, tsrc = []; x<tinyMCETemplateList.length; x++)
+				tsrc.push({title : tinyMCETemplateList[x][0], src : tinyMCETemplateList[x][1], description : tinyMCETemplateList[x][2]});
+		}
+
+		for (x=0; x<tsrc.length; x++) {
+			u = tsrc[x].src;
+
+			// Force absolute
+			if (u.indexOf('://') == -1 && u.indexOf('/') != 0)
+				u = tinyMCE.documentBasePath + "/" + u;
+
+			tsrc[x].src = u;
+		}
+
+		TPU.templates = tsrc;
+
+		for (x = 0; x < tsrc.length; x++)
+			sel.options[sel.options.length] = new Option(tsrc[x].title, tsrc[x].src);
+	},
+
+ 	selectTemplate : function(o) {
+		var x, d = window.frames['templatesrc'].document;
+
+		this.currentTemplateHTML = this.plugin._replaceValues(this.getFileContents(o.value));
+
+		// Force complete document
+		if (!/<body/gi.test(this.currentTemplateHTML)) {
+			this.currentTemplateHTML = '<html xmlns="http://www.w3.org/1999/xhtml">' + 
+				'<head>' + 
+					'<title>blank_page</title>' + 
+					'<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />' + 
+				'</head>' + 
+				'<body>' + 
+				this.currentTemplateHTML + 
+				'</body>' + 
+				'</html>';
+		}
+
+		// Write HTML to preview iframe
+		d.body.innerHTML = this.currentTemplateHTML;
+
+		// Display description
+ 		for (x = 0; x < TPU.templates.length; x++) {
+			if (TPU.templates[x].src == o.value) {
+				document.getElementById('tmpldesc').innerHTML = TPU.templates[x].description;
+				break;
+			}
+		}
+ 	},
+
+ 	insertTemplate : function() {
+		var sel, opt;
+
+		sel = document.getElementById('tpath');
+		opt = sel.options[sel.selectedIndex];
+
+		// Is it a template or snippet
+		if (TPU.currentTemplateHTML.indexOf('mceTmpl'))
+			tinyMCEPopup.execCommand('mceTemplate', false, {title : opt.text, tsrc : opt.value, body : TPU.currentTemplateHTML});
+		else
+			tinyMCEPopup.execCommand('mceInsertContent', false, TPU.currentTemplateHTML);
+
+		tinyMCEPopup.close();
+	},
+
+	getFileContents : function(u) {
+		var x, d, t = 'text/plain';
+
+		function g(s) {
+			x = 0;
+
+			try {
+				x = new ActiveXObject(s);
+			} catch (s) {
+			}
+
+			return x;
+		};
+
+		x = window.ActiveXObject ? g('Msxml2.XMLHTTP') || g('Microsoft.XMLHTTP') : new XMLHttpRequest();
+
+		// Synchronous AJAX load file
+		x.overrideMimeType && x.overrideMimeType(t);
+		x.open("GET", u, false);
+		x.send(null);
+
+		return x.responseText;
+	},
+
+	resizeInputs : function() {
+		var wHeight, wWidth, elm;
+
+		if (!self.innerWidth) {
+			wHeight = document.body.clientHeight - 160;
+			wWidth = document.body.clientWidth - 40;
+		} else {
+			wHeight = self.innerHeight - 160;
+			wWidth = self.innerWidth - 40;
+		}
+
+		elm = document.getElementById('templatesrc');
+
+		if (elm) {
+			elm.style.height = Math.abs(wHeight) + 'px';
+			elm.style.width  = Math.abs(wWidth - 5) + 'px';
+		}
+	}
+};
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/template/langs/en.js
@@ -1,1 +1,17 @@
+// UK lang variables
 
+tinyMCE.addToLang('template',{
+title : 'Templates',
+label : 'Template',
+desc_label : 'Description',
+desc : 'Insert predefined template content',
+select : 'Select a template',
+preview : 'Preview',
+warning : 'Warning: Updating a template with a different one may cause data loss.',
+def_date_format : '%Y-%m-%d %H:%M:%S',
+months_long : new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"),
+months_short : new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"),
+day_long : new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"),
+day_short : new Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/template/langs/en_dlg.js
@@ -1,1 +1,15 @@
-
+tinyMCE.addI18n('en.template_dlg',{
+title:"Templates",
+label:"Template",
+desc_label:"Description",
+desc:"Insert predefined template content",
+select:"Select a template",
+preview:"Preview",
+warning:"Warning: Updating a template with a different one may cause data loss.",
+mdate_format:"%Y-%m-%d %H:%M:%S",
+cdate_format:"%Y-%m-%d %H:%M:%S",
+months_long:"January,February,March,April,May,June,July,August,September,October,November,December",
+months_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",
+day_long:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday",
+day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun"
+});

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/template/template.htm
@@ -1,1 +1,40 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#template_dlg.title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="js/template.js"></script>
+	<link href="css/template.css" rel="stylesheet" type="text/css" />
+	<base target="_self" />
+</head>
+<body onresize="TemplateDialog.resize();"> 
+	<form onsubmit="TemplateDialog.insert();return false;">
+		<div id="frmbody">
+			<div class="title">{#template_dlg.desc}</div>
+			<div class="frmRow"><label for="tpath" title="{#template_dlg.select}">{#template_dlg.label}:</label>
+			<select id="tpath" name="tpath" onchange="TemplateDialog.selectTemplate(this.options[this.selectedIndex].value, this.options[this.selectedIndex].text);" class="mceFocus">
+				<option value="">{#template_dlg.select}...</option>
+			</select>
+			<span id="warning"></span></div>
+			<div class="frmRow"><label for="tdesc">{#template_dlg.desc_label}:</label>
+			<span id="tmpldesc"></span></div>
+			<fieldset>
+				<legend>{#template_dlg.preview}</legend>
+				<iframe id="templatesrc" name="templatesrc" src="blank.htm" width="690" height="400" frameborder="0"></iframe>
+			</fieldset>
+		</div>
+		
+		<div class="mceActionPanel">
+			<div style="float: left">
+				<input type="submit" id="insert" name="insert" value="{#insert}" />
+			</div>
 
+			<div style="float: right">
+				<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+			</div>
+
+			<br style="clear:both" />
+		</div>
+	</form>
+</body> 
+</html> 
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.VisualChars',{init:function(ed,url){var t=this;t.editor=ed;ed.addCommand('mceVisualChars',t._toggleVisualChars,t);ed.addButton('visualchars',{title:'visualchars.desc',cmd:'mceVisualChars'});ed.onBeforeGetContent.add(function(ed,o){if(t.state){t.state=true;t._toggleVisualChars();}});},getInfo:function(){return{longname:'Visual characters',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualchars',version:tinymce.majorVersion+"."+tinymce.minorVersion};},_toggleVisualChars:function(){var t=this,ed=t.editor,nl,i,h,d=ed.getDoc(),b=ed.getBody(),nv,s=ed.selection,bo;t.state=!t.state;ed.controlManager.setActive('visualchars',t.state);if(t.state){nl=[];tinymce.walk(b,function(n){if(n.nodeType==3&&n.nodeValue&&n.nodeValue.indexOf('\u00a0')!=-1)nl.push(n);},'childNodes');for(i=0;i<nl.length;i++){nv=nl[i].nodeValue;nv=nv.replace(/(\u00a0+)/g,'<span class="mceItemHidden mceVisualNbsp">$1</span>');nv=nv.replace(/\u00a0/g,'\u00b7');ed.dom.setOuterHTML(nl[i],nv,d);}}else{nl=tinymce.grep(ed.dom.select('span',b),function(n){return ed.dom.hasClass(n,'mceVisualNbsp');});for(i=0;i<nl.length;i++)ed.dom.setOuterHTML(nl[i],nl[i].innerHTML.replace(/(&middot;|\u00b7)/g,'&nbsp;'),d);}}});tinymce.PluginManager.add('visualchars',tinymce.plugins.VisualChars);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js
@@ -1,1 +1,73 @@
+/**
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.VisualChars', {
+		init : function(ed, url) {
+			var t = this;
+
+			t.editor = ed;
+
+			// Register commands
+			ed.addCommand('mceVisualChars', t._toggleVisualChars, t);
+
+			// Register buttons
+			ed.addButton('visualchars', {title : 'visualchars.desc', cmd : 'mceVisualChars'});
+
+			ed.onBeforeGetContent.add(function(ed, o) {
+				if (t.state) {
+					t.state = true;
+					t._toggleVisualChars();
+				}
+			});
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Visual characters',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualchars',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		},
+
+		// Private methods
+
+		_toggleVisualChars : function() {
+			var t = this, ed = t.editor, nl, i, h, d = ed.getDoc(), b = ed.getBody(), nv, s = ed.selection, bo;
+
+			t.state = !t.state;
+			ed.controlManager.setActive('visualchars', t.state);
+
+			if (t.state) {
+				nl = [];
+				tinymce.walk(b, function(n) {
+					if (n.nodeType == 3 && n.nodeValue && n.nodeValue.indexOf('\u00a0') != -1)
+						nl.push(n);
+				}, 'childNodes');
+
+				for (i=0; i<nl.length; i++) {
+					nv = nl[i].nodeValue;
+					nv = nv.replace(/(\u00a0+)/g, '<span class="mceItemHidden mceVisualNbsp">$1</span>');
+					nv = nv.replace(/\u00a0/g, '\u00b7');
+					ed.dom.setOuterHTML(nl[i], nv, d);
+				}
+			} else {
+				nl = tinymce.grep(ed.dom.select('span', b), function(n) {
+					return ed.dom.hasClass(n, 'mceVisualNbsp');
+				});
+
+				for (i=0; i<nl.length; i++)
+					ed.dom.setOuterHTML(nl[i], nl[i].innerHTML.replace(/(&middot;|\u00b7)/g, '&nbsp;'), d);
+			}
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('visualchars', tinymce.plugins.VisualChars);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/visualchars/images/visualchars.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/visualchars/langs/en.js
@@ -1,1 +1,6 @@
+// EN lang variables
 
+tinyMCE.addToLang('visualchars',{
+desc : 'Visual control characters on/off.'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm
@@ -1,1 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#xhtmlxtras_dlg.title_abbr_element}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="../../utils/editable_selects.js"></script>
+	<script type="text/javascript" src="js/element_common.js"></script>
+	<script type="text/javascript" src="js/abbr.js"></script>
+	<link rel="stylesheet" type="text/css" href="css/popup.css" />
+	<base target="_self" />
+</head>
+<body style="display: none">
+<form onsubmit="insertAbbr();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;">{#xhtmlxtras_dlg.general_tab}</a></span></li>
+			<!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> -->
+		</ul>
+	</div>
 
+	<div class="panel_wrapper">
+		<div id="general_panel" class="panel current">
+			<fieldset>
+				<legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend>
+				<table border="0" cellpadding="0" cellspacing="4">
+					<tr>
+						<td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> 
+						<td><input id="title" name="title" type="text" value="" class="field mceFocus" /></td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> 
+						<td><input id="id" name="id" type="text" value="" class="field" /></td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> 
+						<td>
+							<select id="class" name="class" class="field mceEditableSelect">
+								<option value="">{#not_set}</option> 
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> 
+						<td><input id="style" name="style" type="text" value="" class="field" /></td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> 
+						<td>
+							<select id="dir" name="dir" class="field"> 
+								<option value="">{#not_set}</option> 
+								<option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> 
+								<option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> 
+							</select>
+						</td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> 
+						<td>
+							<input id="lang" name="lang" type="text" value="" class="field" />
+						</td> 
+					</tr>
+				</table>
+			</fieldset>
+		</div>
+		<div id="events_panel" class="panel">
+			<fieldset>
+				<legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend>
+
+				<table border="0" cellpadding="0" cellspacing="4">
+					<tr>
+						<td class="label"><label for="onfocus">onfocus</label>:</td> 
+						<td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onblur">onblur</label>:</td> 
+						<td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onclick">onclick</label>:</td> 
+						<td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="ondblclick">ondblclick</label>:</td> 
+						<td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmousedown">onmousedown</label>:</td> 
+						<td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmouseup">onmouseup</label>:</td> 
+						<td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmouseover">onmouseover</label>:</td> 
+						<td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmousemove">onmousemove</label>:</td> 
+						<td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmouseout">onmouseout</label>:</td> 
+						<td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onkeypress">onkeypress</label>:</td> 
+						<td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onkeydown">onkeydown</label>:</td> 
+						<td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onkeyup">onkeyup</label>:</td> 
+						<td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> 
+					</tr>
+				</table>
+			</fieldset>
+		</div>
+	</div>
+	<div class="mceActionPanel">
+		<div style="float: left">
+			<input type="submit" id="insert" name="insert" value="{#update}" />
+		</div>
+		<div style="float: left">
+			<input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeAbbr();" style="display: none;" />
+		</div>
+		<div style="float: right">
+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+		</div>
+	</div>
+
+</form>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm
@@ -1,1 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#xhtmlxtras_dlg.title_acronym_element}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="../../utils/editable_selects.js"></script>
+	<script type="text/javascript" src="js/element_common.js"></script>
+	<script type="text/javascript" src="js/acronym.js"></script>
+	<link rel="stylesheet" type="text/css" href="css/popup.css" />
+	<base target="_self" />
+</head>
+<body style="display: none">
+<form onsubmit="insertAcronym();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;">{#xhtmlxtras_dlg.general_tab}</a></span></li>
+			<!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> -->
+		</ul>
+	</div>
 
+	<div class="panel_wrapper">
+		<div id="general_panel" class="panel current">
+			<fieldset>
+				<legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend>
+				<table border="0" cellpadding="0" cellspacing="4">
+					<tr>
+						<td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> 
+						<td><input id="title" name="title" type="text" value="" class="field mceFocus" /></td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> 
+						<td><input id="id" name="id" type="text" value="" class="field" /></td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> 
+						<td>
+							<select id="class" name="class" class="field mceEditableSelect">
+								<option value="">{#not_set}</option> 
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> 
+						<td><input id="style" name="style" type="text" value="" class="field" /></td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> 
+						<td>
+							<select id="dir" name="dir" class="field"> 
+								<option value="">{#not_set}</option> 
+								<option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> 
+								<option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> 
+							</select>
+						</td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> 
+						<td>
+							<input id="lang" name="lang" type="text" value="" class="field" />
+						</td> 
+					</tr>
+				</table>
+			</fieldset>
+		</div>
+		<div id="events_panel" class="panel">
+			<fieldset>
+				<legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend>
+
+				<table border="0" cellpadding="0" cellspacing="4">
+					<tr>
+						<td class="label"><label for="onfocus">onfocus</label>:</td> 
+						<td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onblur">onblur</label>:</td> 
+						<td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onclick">onclick</label>:</td> 
+						<td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="ondblclick">ondblclick</label>:</td> 
+						<td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmousedown">onmousedown</label>:</td> 
+						<td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmouseup">onmouseup</label>:</td> 
+						<td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmouseover">onmouseover</label>:</td> 
+						<td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmousemove">onmousemove</label>:</td> 
+						<td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmouseout">onmouseout</label>:</td> 
+						<td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onkeypress">onkeypress</label>:</td> 
+						<td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onkeydown">onkeydown</label>:</td> 
+						<td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onkeyup">onkeyup</label>:</td> 
+						<td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> 
+					</tr>
+				</table>
+			</fieldset>
+		</div>
+	</div>
+	<div class="mceActionPanel">
+		<div style="float: left">
+			<input type="submit" id="insert" name="insert" value="{#update}" />
+		</div>
+		<div style="float: left">
+			<input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeAcronym();" style="display: none;" />
+		</div>
+		<div style="float: right">
+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+		</div>
+	</div>
+
+</form>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm
@@ -1,1 +1,155 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#xhtmlxtras_dlg.attribs_title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/editable_selects.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="js/attributes.js"></script>
+	<link rel="stylesheet" type="text/css" href="css/attributes.css" />
+	<base target="_self" />
+</head>
+<body style="display: none">
+<form onsubmit="insertAction();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;">{#xhtmlxtras_dlg.attribute_attrib_tab}</a></span></li>
+			<li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.attribute_events_tab}</a></span></li>
+		</ul>
+	</div>
 
+	<div class="panel_wrapper">
+		<div id="general_panel" class="panel current">
+			<fieldset>
+				<legend>{#xhtmlxtras_dlg.attribute_attrib_tab}</legend>
+				<table border="0" cellpadding="0" cellspacing="4">
+					<tr>
+						<td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> 
+						<td><input id="title" name="title" type="text" value="" class="mceFocus" /></td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> 
+						<td><input id="id" name="id" type="text" value="" /></td> 
+					</tr>
+					<tr>
+						<td><label id="classlabel" for="classlist">{#class_name}</label></td>
+						<td>
+							<select id="classlist" name="classlist" class="mceEditableSelect">
+								<option value="" selected>{#not_set}</option>
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> 
+						<td><input id="style" name="style" type="text" value="" /></td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> 
+						<td>
+							<select id="dir" name="dir"> 
+								<option value="">{#not_set}</option> 
+								<option value="ltr">{#xhtmlxtras_dlg.option_ltr}</option> 
+								<option value="rtl">{#xhtmlxtras_dlg.option_rtl}</option> 
+							</select>
+						</td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> 
+						<td>
+							<input id="lang" name="lang" type="text" value="" />
+						</td> 
+					</tr>
+					<tr>
+							<td><label id="tabindexlabel" for="tabindex">{#xhtmlxtras_dlg.attribute_label_tabindex}</label></td>
+							<td><input type="text" id="tabindex" name="tabindex" value="" /></td>
+						</tr>
+
+						<tr>
+							<td><label id="accesskeylabel" for="accesskey">{#xhtmlxtras_dlg.attribute_label_accesskey}</label></td>
+							<td><input type="text" id="accesskey" name="accesskey" value="" /></td>
+						</tr>
+				</table>
+			</fieldset>
+		</div>
+		<div id="events_panel" class="panel">
+			<fieldset>
+				<legend>{#xhtmlxtras_dlg.attribute_events_tab}</legend>
+
+				<table border="0" cellpadding="0" cellspacing="4">
+					<tr>
+						<td class="label"><label for="onfocus">onfocus</label>:</td> 
+						<td><input id="onfocus" name="onfocus" type="text" value="" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onblur">onblur</label>:</td> 
+						<td><input id="onblur" name="onblur" type="text" value="" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onclick">onclick</label>:</td> 
+						<td><input id="onclick" name="onclick" type="text" value="" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="ondblclick">ondblclick</label>:</td> 
+						<td><input id="ondblclick" name="ondblclick" type="text" value="" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmousedown">onmousedown</label>:</td> 
+						<td><input id="onmousedown" name="onmousedown" type="text" value="" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmouseup">onmouseup</label>:</td> 
+						<td><input id="onmouseup" name="onmouseup" type="text" value="" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmouseover">onmouseover</label>:</td> 
+						<td><input id="onmouseover" name="onmouseover" type="text" value="" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmousemove">onmousemove</label>:</td> 
+						<td><input id="onmousemove" name="onmousemove" type="text" value="" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmouseout">onmouseout</label>:</td> 
+						<td><input id="onmouseout" name="onmouseout" type="text" value="" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onkeypress">onkeypress</label>:</td> 
+						<td><input id="onkeypress" name="onkeypress" type="text" value="" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onkeydown">onkeydown</label>:</td> 
+						<td><input id="onkeydown" name="onkeydown" type="text" value="" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onkeyup">onkeyup</label>:</td> 
+						<td><input id="onkeyup" name="onkeyup" type="text" value="" /></td> 
+					</tr>
+				</table>
+			</fieldset>
+		</div>
+	</div>
+	<div class="mceActionPanel">
+		<div style="float: left">
+			<input type="submit" id="insert" name="insert" value="{#insert}" />
+		</div>
+		<div style="float: right">
+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+		</div>
+	</div>
+
+</form>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm
@@ -1,1 +1,150 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#xhtmlxtras_dlg.title_cite_element}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="../../utils/editable_selects.js"></script>
+	<script type="text/javascript" src="js/element_common.js"></script>
+	<script type="text/javascript" src="js/cite.js"></script>
+	<link rel="stylesheet" type="text/css" href="css/popup.css" />
+	<base target="_self" />
+</head>
+<body style="display: none">
+<form onsubmit="insertCite();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;">{#xhtmlxtras_dlg.general_tab}</a></span></li>
+			<!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> -->
+		</ul>
+	</div>
 
+	<div class="panel_wrapper">
+		<div id="general_panel" class="panel current">
+			<fieldset>
+				<legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend>
+				<table border="0" cellpadding="0" cellspacing="4">
+					<tr>
+						<td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> 
+						<td><input id="title" name="title" type="text" value="" class="field mceFocus" /></td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> 
+						<td><input id="id" name="id" type="text" value="" class="field" /></td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> 
+						<td>
+							<select id="class" name="class" class="field mceEditableSelect">
+								<option value="">{#not_set}</option> 
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> 
+						<td><input id="style" name="style" type="text" value="" class="field" /></td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> 
+						<td>
+							<select id="dir" name="dir" class="field"> 
+								<option value="">{#not_set}</option> 
+								<option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> 
+								<option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> 
+							</select>
+						</td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> 
+						<td>
+							<input id="lang" name="lang" type="text" value="" class="field" />
+						</td> 
+					</tr>
+				</table>
+			</fieldset>
+		</div>
+		<div id="events_panel" class="panel">
+			<fieldset>
+				<legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend>
+
+				<table border="0" cellpadding="0" cellspacing="4">
+					<tr>
+						<td class="label"><label for="onfocus">onfocus</label>:</td> 
+						<td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onblur">onblur</label>:</td> 
+						<td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onclick">onclick</label>:</td> 
+						<td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="ondblclick">ondblclick</label>:</td> 
+						<td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmousedown">onmousedown</label>:</td> 
+						<td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmouseup">onmouseup</label>:</td> 
+						<td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmouseover">onmouseover</label>:</td> 
+						<td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmousemove">onmousemove</label>:</td> 
+						<td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmouseout">onmouseout</label>:</td> 
+						<td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onkeypress">onkeypress</label>:</td> 
+						<td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onkeydown">onkeydown</label>:</td> 
+						<td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onkeyup">onkeyup</label>:</td> 
+						<td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> 
+					</tr>
+				</table>
+			</fieldset>
+		</div>
+	</div>
+	<div class="mceActionPanel">
+		<div style="float: left">
+			<input type="submit" id="insert" name="insert" value="{#update}" />
+		</div>
+		<div style="float: left">
+			<input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeCite();" style="display: none;" />
+		</div>
+		<div style="float: right">
+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+		</div>
+	</div>
+
+</form>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css
@@ -1,1 +1,12 @@
+.panel_wrapper div.current {
+	height: 290px;
+}
 
+#id, #style, #title, #dir, #hreflang, #lang, #classlist, #tabindex, #accesskey {
+	width: 200px;
+}
+
+#events_panel input {
+	width: 200px;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/css/popup.css
@@ -1,1 +1,10 @@
+input.field, select.field {width:200px;}
+input.picker {width:179px; margin-left: 5px;}
+input.disabled {border-color:#F2F2F2;}
+img.picker {vertical-align:text-bottom; cursor:pointer;}
+h1 {padding: 0 0 5px 0;}
+.panel_wrapper div.current {height:160px;}
+#xhtmlxtrasdel .panel_wrapper div.current, #xhtmlxtrasins .panel_wrapper div.current {height: 230px;}
+a.browse span {display:block; width:20px; height:20px; background:url('../../../themes/advanced/img/icons.gif') -140px -20px;}
+#datetime {width:180px;}
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/css/xhtmlxtras.css
@@ -1,1 +1,25 @@
+ins {
+	border-bottom: 1px solid green;
+	text-decoration: none;
+	color: green;
+}
 
+del {
+	color: Red;
+	text-decoration: line-through;
+}
+
+cite {
+	border-bottom: 1px dashed blue;
+}
+
+acronym {
+	border-bottom: 1px dotted #CCC;
+	cursor: help;
+}
+
+abbr, html\:abbr {
+	border-bottom: 1px dashed #CCC;
+	cursor: help;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm
@@ -1,1 +1,171 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#xhtmlxtras_dlg.title_del_element}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="../../utils/editable_selects.js"></script>
+	<script type="text/javascript" src="js/element_common.js"></script>
+	<script type="text/javascript" src="js/del.js"></script>
+	<link rel="stylesheet" type="text/css" href="css/popup.css" />
+	<base target="_self" />
+</head>
+<body id="xhtmlxtrasins" style="display: none">
+<form onsubmit="insertDel();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;">{#xhtmlxtras_dlg.general_tab}</a></span></li>
+			<!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> -->
+		</ul>
+	</div>
 
+	<div class="panel_wrapper">
+		<div id="general_panel" class="panel current">
+			<fieldset>
+				<legend>{#xhtmlxtras_dlg.fieldset_general_tab}</legend>
+				<table border="0" cellpadding="0" cellspacing="4">
+					<tr>
+						<td class="label"><label id="datetimelabel" for="datetime">{#xhtmlxtras_dlg.attribute_label_datetime}</label>:</td>
+						<td>
+							<table border="0" cellspacing="0" cellpadding="0">
+								<tr> 
+									<td><input id="datetime" name="datetime" type="text" value="" maxlength="19" class="field mceFocus" /></td> 
+									<td><a href="javascript:insertDateTime('datetime');" onmousedown="return false;" class="browse"><span class="datetime" alt="{#xhtmlxtras_dlg.insert_date}" title="{#xhtmlxtras_dlg.insert_date}"></span></a></td>
+								</tr>
+							</table>
+						</td>
+					</tr>
+					<tr>
+						<td class="label"><label id="citelabel" for="cite">{#xhtmlxtras_dlg.attribute_label_cite}</label>:</td>
+						<td><input id="cite" name="cite" type="text" value="" class="field" /></td> 
+					</tr>
+				</table>
+			</fieldset>
+			<fieldset>
+				<legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend>
+				<table border="0" cellpadding="0" cellspacing="4">
+					<tr>
+						<td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> 
+						<td><input id="title" name="title" type="text" value="" class="field" /></td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> 
+						<td><input id="id" name="id" type="text" value="" class="field" /></td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> 
+						<td>
+							<select id="class" name="class" class="field mceEditableSelect">
+								<option value="">{#not_set}</option> 
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> 
+						<td><input id="style" name="style" type="text" value="" class="field" /></td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> 
+						<td>
+							<select id="dir" name="dir" class="field"> 
+								<option value="">{#not_set}</option> 
+								<option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> 
+								<option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> 
+							</select>
+						</td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> 
+						<td>
+							<input id="lang" name="lang" type="text" value="" class="field" />
+						</td> 
+					</tr>
+				</table>
+			</fieldset>
+		</div>
+		<div id="events_panel" class="panel">
+			<fieldset>
+				<legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend>
+
+				<table border="0" cellpadding="0" cellspacing="4">
+					<tr>
+						<td class="label"><label for="onfocus">onfocus</label>:</td> 
+						<td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onblur">onblur</label>:</td> 
+						<td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onclick">onclick</label>:</td> 
+						<td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="ondblclick">ondblclick</label>:</td> 
+						<td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmousedown">onmousedown</label>:</td> 
+						<td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmouseup">onmouseup</label>:</td> 
+						<td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmouseover">onmouseover</label>:</td> 
+						<td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmousemove">onmousemove</label>:</td> 
+						<td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmouseout">onmouseout</label>:</td> 
+						<td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onkeypress">onkeypress</label>:</td> 
+						<td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onkeydown">onkeydown</label>:</td> 
+						<td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onkeyup">onkeyup</label>:</td> 
+						<td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> 
+					</tr>
+				</table>
+			</fieldset>
+		</div>
+	</div>
+	<div class="mceActionPanel">
+		<div style="float: left">
+			<input type="submit" id="insert" name="insert" value="{#update}" />
+		</div>
+		<div style="float: left">
+			<input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeDel();" style="display: none;" />
+		</div>
+		<div style="float: right">
+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+		</div>
+	</div>
+
+</form>
+
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js
@@ -1,1 +1,1 @@
-
+(function(){tinymce.create('tinymce.plugins.XHTMLXtrasPlugin',{init:function(ed,url){ed.addCommand('mceCite',function(){ed.windowManager.open({file:url+'/cite.htm',width:350+parseInt(ed.getLang('xhtmlxtras.cite_delta_width',0)),height:250+parseInt(ed.getLang('xhtmlxtras.cite_delta_height',0)),inline:1},{plugin_url:url});});ed.addCommand('mceAcronym',function(){ed.windowManager.open({file:url+'/acronym.htm',width:350+parseInt(ed.getLang('xhtmlxtras.acronym_delta_width',0)),height:250+parseInt(ed.getLang('xhtmlxtras.acronym_delta_width',0)),inline:1},{plugin_url:url});});ed.addCommand('mceAbbr',function(){ed.windowManager.open({file:url+'/abbr.htm',width:350+parseInt(ed.getLang('xhtmlxtras.abbr_delta_width',0)),height:250+parseInt(ed.getLang('xhtmlxtras.abbr_delta_width',0)),inline:1},{plugin_url:url});});ed.addCommand('mceDel',function(){ed.windowManager.open({file:url+'/del.htm',width:340+parseInt(ed.getLang('xhtmlxtras.del_delta_width',0)),height:310+parseInt(ed.getLang('xhtmlxtras.del_delta_width',0)),inline:1},{plugin_url:url});});ed.addCommand('mceIns',function(){ed.windowManager.open({file:url+'/ins.htm',width:340+parseInt(ed.getLang('xhtmlxtras.ins_delta_width',0)),height:310+parseInt(ed.getLang('xhtmlxtras.ins_delta_width',0)),inline:1},{plugin_url:url});});ed.addCommand('mceAttributes',function(){ed.windowManager.open({file:url+'/attributes.htm',width:380,height:370,inline:1},{plugin_url:url});});ed.addButton('cite',{title:'xhtmlxtras.cite_desc',cmd:'mceCite'});ed.addButton('acronym',{title:'xhtmlxtras.acronym_desc',cmd:'mceAcronym'});ed.addButton('abbr',{title:'xhtmlxtras.abbr_desc',cmd:'mceAbbr'});ed.addButton('del',{title:'xhtmlxtras.del_desc',cmd:'mceDel'});ed.addButton('ins',{title:'xhtmlxtras.ins_desc',cmd:'mceIns'});ed.addButton('attribs',{title:'xhtmlxtras.attribs_desc',cmd:'mceAttributes'});if(tinymce.isIE){function fix(ed,o){if(o.set){o.content=o.content.replace(/<abbr([^>]+)>/gi,'<html:abbr $1>');o.content=o.content.replace(/<\/abbr>/gi,'</html:abbr>');}};ed.onBeforeSetContent.add(fix);ed.onPostProcess.add(fix);}ed.onNodeChange.add(function(ed,cm,n,co){n=ed.dom.getParent(n,'CITE,ACRONYM,ABBR,DEL,INS');cm.setDisabled('cite',co);cm.setDisabled('acronym',co);cm.setDisabled('abbr',co);cm.setDisabled('del',co);cm.setDisabled('ins',co);cm.setDisabled('attribs',n&&n.nodeName=='BODY');if(n){cm.setDisabled(n.nodeName.toLowerCase(),0);cm.setActive(n.nodeName.toLowerCase(),1);}else{cm.setActive('cite',0);cm.setActive('acronym',0);cm.setActive('abbr',0);cm.setActive('del',0);cm.setActive('ins',0);}});},getInfo:function(){return{longname:'XHTML Xtras Plugin',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras',version:tinymce.majorVersion+"."+tinymce.minorVersion};}});tinymce.PluginManager.add('xhtmlxtras',tinymce.plugins.XHTMLXtrasPlugin);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js
@@ -1,1 +1,134 @@
+/**
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	tinymce.create('tinymce.plugins.XHTMLXtrasPlugin', {
+		init : function(ed, url) {
+			// Register commands
+			ed.addCommand('mceCite', function() {
+				ed.windowManager.open({
+					file : url + '/cite.htm',
+					width : 350 + parseInt(ed.getLang('xhtmlxtras.cite_delta_width', 0)),
+					height : 250 + parseInt(ed.getLang('xhtmlxtras.cite_delta_height', 0)),
+					inline : 1
+				}, {
+					plugin_url : url
+				});
+			});
+
+			ed.addCommand('mceAcronym', function() {
+				ed.windowManager.open({
+					file : url + '/acronym.htm',
+					width : 350 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_width', 0)),
+					height : 250 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_width', 0)),
+					inline : 1
+				}, {
+					plugin_url : url
+				});
+			});
+
+			ed.addCommand('mceAbbr', function() {
+				ed.windowManager.open({
+					file : url + '/abbr.htm',
+					width : 350 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_width', 0)),
+					height : 250 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_width', 0)),
+					inline : 1
+				}, {
+					plugin_url : url
+				});
+			});
+
+			ed.addCommand('mceDel', function() {
+				ed.windowManager.open({
+					file : url + '/del.htm',
+					width : 340 + parseInt(ed.getLang('xhtmlxtras.del_delta_width', 0)),
+					height : 310 + parseInt(ed.getLang('xhtmlxtras.del_delta_width', 0)),
+					inline : 1
+				}, {
+					plugin_url : url
+				});
+			});
+
+			ed.addCommand('mceIns', function() {
+				ed.windowManager.open({
+					file : url + '/ins.htm',
+					width : 340 + parseInt(ed.getLang('xhtmlxtras.ins_delta_width', 0)),
+					height : 310 + parseInt(ed.getLang('xhtmlxtras.ins_delta_width', 0)),
+					inline : 1
+				}, {
+					plugin_url : url
+				});
+			});
+
+			ed.addCommand('mceAttributes', function() {
+				ed.windowManager.open({
+					file : url + '/attributes.htm',
+					width : 380,
+					height : 370,
+					inline : 1
+				}, {
+					plugin_url : url
+				});
+			});
+
+			// Register buttons
+			ed.addButton('cite', {title : 'xhtmlxtras.cite_desc', cmd : 'mceCite'});
+			ed.addButton('acronym', {title : 'xhtmlxtras.acronym_desc', cmd : 'mceAcronym'});
+			ed.addButton('abbr', {title : 'xhtmlxtras.abbr_desc', cmd : 'mceAbbr'});
+			ed.addButton('del', {title : 'xhtmlxtras.del_desc', cmd : 'mceDel'});
+			ed.addButton('ins', {title : 'xhtmlxtras.ins_desc', cmd : 'mceIns'});
+			ed.addButton('attribs', {title : 'xhtmlxtras.attribs_desc', cmd : 'mceAttributes'});
+
+			if (tinymce.isIE) {
+				function fix(ed, o) {
+					if (o.set) {
+						o.content = o.content.replace(/<abbr([^>]+)>/gi, '<html:abbr $1>');
+						o.content = o.content.replace(/<\/abbr>/gi, '</html:abbr>');
+					}
+				};
+
+				ed.onBeforeSetContent.add(fix);
+				ed.onPostProcess.add(fix);
+			}
+
+			ed.onNodeChange.add(function(ed, cm, n, co) {
+				n = ed.dom.getParent(n, 'CITE,ACRONYM,ABBR,DEL,INS');
+
+				cm.setDisabled('cite', co);
+				cm.setDisabled('acronym', co);
+				cm.setDisabled('abbr', co);
+				cm.setDisabled('del', co);
+				cm.setDisabled('ins', co);
+				cm.setDisabled('attribs', n && n.nodeName == 'BODY');
+
+				if (n) {
+					cm.setDisabled(n.nodeName.toLowerCase(), 0);
+					cm.setActive(n.nodeName.toLowerCase(), 1);
+				} else {
+					cm.setActive('cite', 0);
+					cm.setActive('acronym', 0);
+					cm.setActive('abbr', 0);
+					cm.setActive('del', 0);
+					cm.setActive('ins', 0);
+				}
+			});
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'XHTML Xtras Plugin',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			};
+		}
+	});
+
+	// Register plugin
+	tinymce.PluginManager.add('xhtmlxtras', tinymce.plugins.XHTMLXtrasPlugin);
+})();

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/images/abbr.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/images/acronym.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/images/attribs.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/images/cite.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/images/date_time.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/images/del.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/images/ins.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/images/remove_button_bg.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm
@@ -1,1 +1,171 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#xhtmlxtras_dlg.title_ins_element}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="../../utils/editable_selects.js"></script>
+	<script type="text/javascript" src="js/element_common.js"></script>
+	<script type="text/javascript" src="js/ins.js"></script>
+	<link rel="stylesheet" type="text/css" href="css/popup.css" />
+	<base target="_self" />
+</head>
+<body id="xhtmlxtrasins" style="display: none">
+<form onsubmit="insertIns();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;">{#xhtmlxtras_dlg.general_tab}</a></span></li>
+			<!-- <li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#xhtmlxtras_dlg.events_tab}</a></span></li> -->
+		</ul>
+	</div>
 
+	<div class="panel_wrapper">
+		<div id="general_panel" class="panel current">
+			<fieldset>
+				<legend>{#xhtmlxtras_dlg.fieldset_general_tab}</legend>
+				<table border="0" cellpadding="0" cellspacing="4">
+					<tr>
+						<td class="label"><label id="datetimelabel" for="datetime">{#xhtmlxtras_dlg.attribute_label_datetime}</label>:</td> 
+						<td>
+							<table border="0" cellspacing="0" cellpadding="0">
+								<tr> 
+									<td><input id="datetime" name="datetime" type="text" value="" maxlength="19" class="field mceFocus" /></td> 
+									<td><a href="javascript:insertDateTime('datetime');" onmousedown="return false;" class="browse"><span class="datetime" alt="{#xhtmlxtras_dlg.insert_date}" title="{#xhtmlxtras_dlg.insert_date}"></span></a></td>
+								</tr>
+							</table>
+						</td>
+					</tr>
+					<tr>
+						<td class="label"><label id="citelabel" for="cite">{#xhtmlxtras_dlg.attribute_label_cite}</label>:</td> 
+						<td><input id="cite" name="cite" type="text" value="" class="field" /></td> 
+					</tr>
+				</table>
+			</fieldset>
+			<fieldset>
+				<legend>{#xhtmlxtras_dlg.fieldset_attrib_tab}</legend>
+				<table border="0" cellpadding="0" cellspacing="4">
+					<tr>
+						<td class="label"><label id="titlelabel" for="title">{#xhtmlxtras_dlg.attribute_label_title}</label>:</td> 
+						<td><input id="title" name="title" type="text" value="" class="field" /></td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="idlabel" for="id">{#xhtmlxtras_dlg.attribute_label_id}</label>:</td> 
+						<td><input id="id" name="id" type="text" value="" class="field" /></td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="classlabel" for="class">{#xhtmlxtras_dlg.attribute_label_class}</label>:</td> 
+						<td>
+							<select id="class" name="class" class="field mceEditableSelect">
+								<option value="">{#not_set}</option> 
+							</select>
+						</td>
+					</tr>
+					<tr>
+						<td class="label"><label id="stylelabel" for="class">{#xhtmlxtras_dlg.attribute_label_style}</label>:</td> 
+						<td><input id="style" name="style" type="text" value="" class="field" /></td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="dirlabel" for="dir">{#xhtmlxtras_dlg.attribute_label_langdir}</label>:</td> 
+						<td>
+							<select id="dir" name="dir" class="field"> 
+								<option value="">{#not_set}</option> 
+								<option value="ltr">{#xhtmlxtras_dlg.attribute_option_ltr}</option> 
+								<option value="rtl">{#xhtmlxtras_dlg.attribute_option_rtl}</option> 
+							</select>
+						</td> 
+					</tr>
+					<tr>
+						<td class="label"><label id="langlabel" for="lang">{#xhtmlxtras_dlg.attribute_label_langcode}</label>:</td> 
+						<td>
+							<input id="lang" name="lang" type="text" value="" class="field" />
+						</td> 
+					</tr>
+				</table>
+			</fieldset>
+		</div>
+		<div id="events_panel" class="panel">
+			<fieldset>
+				<legend>{#xhtmlxtras_dlg.fieldset_events_tab}</legend>
+
+				<table border="0" cellpadding="0" cellspacing="4">
+					<tr>
+						<td class="label"><label for="onfocus">onfocus</label>:</td> 
+						<td><input id="onfocus" name="onfocus" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onblur">onblur</label>:</td> 
+						<td><input id="onblur" name="onblur" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onclick">onclick</label>:</td> 
+						<td><input id="onclick" name="onclick" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="ondblclick">ondblclick</label>:</td> 
+						<td><input id="ondblclick" name="ondblclick" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmousedown">onmousedown</label>:</td> 
+						<td><input id="onmousedown" name="onmousedown" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmouseup">onmouseup</label>:</td> 
+						<td><input id="onmouseup" name="onmouseup" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmouseover">onmouseover</label>:</td> 
+						<td><input id="onmouseover" name="onmouseover" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmousemove">onmousemove</label>:</td> 
+						<td><input id="onmousemove" name="onmousemove" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onmouseout">onmouseout</label>:</td> 
+						<td><input id="onmouseout" name="onmouseout" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onkeypress">onkeypress</label>:</td> 
+						<td><input id="onkeypress" name="onkeypress" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onkeydown">onkeydown</label>:</td> 
+						<td><input id="onkeydown" name="onkeydown" type="text" value="" class="field" /></td> 
+					</tr>
+
+					<tr>
+						<td class="label"><label for="onkeyup">onkeyup</label>:</td> 
+						<td><input id="onkeyup" name="onkeyup" type="text" value="" class="field" /></td> 
+					</tr>
+				</table>
+			</fieldset>
+		</div>
+	</div>
+	<div class="mceActionPanel">
+		<div style="float: left">
+			<input type="submit" id="insert" name="insert" value="{#update}" />
+		</div>
+		<div style="float: left">
+			<input type="button" id="remove" name="remove" class="button" value="{#xhtmlxtras_dlg.remove}" onclick="removeIns();" style="display: none;" />
+		</div>
+		<div style="float: right">
+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+		</div>
+	</div>
+
+</form>
+
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js
@@ -1,1 +1,26 @@
+ /**
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $
+ *
+ * @author Moxiecode - based on work by Andrew Tetlaw

+ */
 
+function init() {
+	SXE.initElementDialog('abbr');
+	if (SXE.currentAction == "update") {
+		SXE.showRemoveButton();
+	}
+}
+
+function insertAbbr() {
+	SXE.insertElement(tinymce.isIE ? 'html:abbr' : 'abbr');
+	tinyMCEPopup.close();
+}
+
+function removeAbbr() {
+	SXE.removeElement('abbr');
+	tinyMCEPopup.close();
+}
+
+tinyMCEPopup.onInit.add(init);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js
@@ -1,1 +1,26 @@
+ /**
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $
+ *
+ * @author Moxiecode - based on work by Andrew Tetlaw

+ */
 
+function init() {
+	SXE.initElementDialog('acronym');
+	if (SXE.currentAction == "update") {
+		SXE.showRemoveButton();
+	}
+}
+
+function insertAcronym() {
+	SXE.insertElement('acronym');
+	tinyMCEPopup.close();
+}
+
+function removeAcronym() {
+	SXE.removeElement('acronym');
+	tinyMCEPopup.close();
+}
+
+tinyMCEPopup.onInit.add(init);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js
@@ -1,1 +1,124 @@
+ /**
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $
+ *
+ * @author Moxiecode - based on work by Andrew Tetlaw

+ */
 
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+	var inst = tinyMCEPopup.editor;
+	var dom = inst.dom;
+	var elm = inst.selection.getNode();
+	var f = document.forms[0];
+	var onclick = dom.getAttrib(elm, 'onclick');
+
+	setFormValue('title', dom.getAttrib(elm, 'title'));
+	setFormValue('id', dom.getAttrib(elm, 'id'));
+	setFormValue('style', dom.getAttrib(elm, "style"));
+	setFormValue('dir', dom.getAttrib(elm, 'dir'));
+	setFormValue('lang', dom.getAttrib(elm, 'lang'));
+	setFormValue('tabindex', dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : ""));
+	setFormValue('accesskey', dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : ""));
+	setFormValue('onfocus', dom.getAttrib(elm, 'onfocus'));
+	setFormValue('onblur', dom.getAttrib(elm, 'onblur'));
+	setFormValue('onclick', onclick);
+	setFormValue('ondblclick', dom.getAttrib(elm, 'ondblclick'));
+	setFormValue('onmousedown', dom.getAttrib(elm, 'onmousedown'));
+	setFormValue('onmouseup', dom.getAttrib(elm, 'onmouseup'));
+	setFormValue('onmouseover', dom.getAttrib(elm, 'onmouseover'));
+	setFormValue('onmousemove', dom.getAttrib(elm, 'onmousemove'));
+	setFormValue('onmouseout', dom.getAttrib(elm, 'onmouseout'));
+	setFormValue('onkeypress', dom.getAttrib(elm, 'onkeypress'));
+	setFormValue('onkeydown', dom.getAttrib(elm, 'onkeydown'));
+	setFormValue('onkeyup', dom.getAttrib(elm, 'onkeyup'));
+	className = dom.getAttrib(elm, 'class');
+
+	addClassesToList('classlist', 'advlink_styles');
+	selectByValue(f, 'classlist', className, true);
+
+	TinyMCE_EditableSelects.init();
+}
+
+function setFormValue(name, value) {
+	if(value && document.forms[0].elements[name]){
+		document.forms[0].elements[name].value = value;
+	}
+}
+
+function insertAction() {
+	var inst = tinyMCEPopup.editor;
+	var elm = inst.selection.getNode();
+
+	tinyMCEPopup.execCommand("mceBeginUndoLevel");	
+	setAllAttribs(elm);
+	tinyMCEPopup.execCommand("mceEndUndoLevel");
+	tinyMCEPopup.close();
+}
+
+function setAttrib(elm, attrib, value) {
+	var formObj = document.forms[0];
+	var valueElm = formObj.elements[attrib.toLowerCase()];
+	var inst = tinyMCEPopup.editor;
+	var dom = inst.dom;
+
+	if (typeof(value) == "undefined" || value == null) {
+		value = "";
+
+		if (valueElm)
+			value = valueElm.value;
+	}
+
+	if (value != "") {
+		dom.setAttrib(elm, attrib.toLowerCase(), value);
+
+		if (attrib == "style")
+			attrib = "style.cssText";
+
+		if (attrib.substring(0, 2) == 'on')
+			value = 'return true;' + value;
+
+		if (attrib == "class")
+			attrib = "className";
+
+		elm[attrib]=value;
+	} else
+		elm.removeAttribute(attrib);
+}
+
+function setAllAttribs(elm) {
+	var f = document.forms[0];
+
+	setAttrib(elm, 'title');
+	setAttrib(elm, 'id');
+	setAttrib(elm, 'style');
+	setAttrib(elm, 'class', getSelectValue(f, 'classlist'));
+	setAttrib(elm, 'dir');
+	setAttrib(elm, 'lang');
+	setAttrib(elm, 'tabindex');
+	setAttrib(elm, 'accesskey');
+	setAttrib(elm, 'onfocus');
+	setAttrib(elm, 'onblur');
+	setAttrib(elm, 'onclick');
+	setAttrib(elm, 'ondblclick');
+	setAttrib(elm, 'onmousedown');
+	setAttrib(elm, 'onmouseup');
+	setAttrib(elm, 'onmouseover');
+	setAttrib(elm, 'onmousemove');
+	setAttrib(elm, 'onmouseout');
+	setAttrib(elm, 'onkeypress');
+	setAttrib(elm, 'onkeydown');
+	setAttrib(elm, 'onkeyup');
+
+	// Refresh in old MSIE
+//	if (tinyMCE.isMSIE5)
+//		elm.outerHTML = elm.outerHTML;
+}
+
+function insertAttribute() {
+	tinyMCEPopup.close();
+}
+
+tinyMCEPopup.onInit.add(init);
+tinyMCEPopup.requireLangPack();
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/cite.js
@@ -1,1 +1,26 @@
+ /**
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $
+ *
+ * @author Moxiecode - based on work by Andrew Tetlaw

+ */
 
+function init() {
+	SXE.initElementDialog('cite');
+	if (SXE.currentAction == "update") {
+		SXE.showRemoveButton();
+	}
+}
+
+function insertCite() {
+	SXE.insertElement('cite');
+	tinyMCEPopup.close();
+}
+
+function removeCite() {
+	SXE.removeElement('cite');
+	tinyMCEPopup.close();
+}
+
+tinyMCEPopup.onInit.add(init);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js
@@ -1,1 +1,51 @@
+ /**
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $
+ *
+ * @author Moxiecode - based on work by Andrew Tetlaw

+ */
 
+function init() {
+	SXE.initElementDialog('del');
+	if (SXE.currentAction == "update") {
+		setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime'));
+		setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite'));
+		SXE.showRemoveButton();
+	}
+}
+
+function setElementAttribs(elm) {
+	setAllCommonAttribs(elm);
+	setAttrib(elm, 'datetime');
+	setAttrib(elm, 'cite');
+}
+
+function insertDel() {
+	var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'DEL');
+
+	tinyMCEPopup.execCommand('mceBeginUndoLevel');
+	if (elm == null) {
+		var s = SXE.inst.selection.getContent();
+		if(s.length > 0) {
+			tinyMCEPopup.execCommand('mceInsertContent', false, '<del id="#sxe_temp_del#">' + s + '</del>');
+			var elementArray = tinymce.grep(SXE.inst.dom.select('del'), function(n) {return n.id == '#sxe_temp_del#';});
+			for (var i=0; i<elementArray.length; i++) {
+				var elm = elementArray[i];
+				setElementAttribs(elm);
+			}
+		}
+	} else {
+		setElementAttribs(elm);
+	}
+	tinyMCEPopup.editor.nodeChanged();
+	tinyMCEPopup.execCommand('mceEndUndoLevel');
+	tinyMCEPopup.close();
+}
+
+function removeDel() {
+	SXE.removeElement('del');
+	tinyMCEPopup.close();
+}
+
+tinyMCEPopup.onInit.add(init);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/element_common.js
@@ -1,1 +1,221 @@
-
+ /**
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $
+ *
+ * @author Moxiecode - based on work by Andrew Tetlaw

+ */
+
+tinyMCEPopup.requireLangPack();
+
+function initCommonAttributes(elm) {
+	var formObj = document.forms[0], dom = tinyMCEPopup.editor.dom;
+
+	// Setup form data for common element attributes
+	setFormValue('title', dom.getAttrib(elm, 'title'));
+	setFormValue('id', dom.getAttrib(elm, 'id'));
+	selectByValue(formObj, 'class', dom.getAttrib(elm, 'class'), true);
+	setFormValue('style', dom.getAttrib(elm, 'style'));
+	selectByValue(formObj, 'dir', dom.getAttrib(elm, 'dir'));
+	setFormValue('lang', dom.getAttrib(elm, 'lang'));
+	setFormValue('onfocus', dom.getAttrib(elm, 'onfocus'));
+	setFormValue('onblur', dom.getAttrib(elm, 'onblur'));
+	setFormValue('onclick', dom.getAttrib(elm, 'onclick'));
+	setFormValue('ondblclick', dom.getAttrib(elm, 'ondblclick'));
+	setFormValue('onmousedown', dom.getAttrib(elm, 'onmousedown'));
+	setFormValue('onmouseup', dom.getAttrib(elm, 'onmouseup'));
+	setFormValue('onmouseover', dom.getAttrib(elm, 'onmouseover'));
+	setFormValue('onmousemove', dom.getAttrib(elm, 'onmousemove'));
+	setFormValue('onmouseout', dom.getAttrib(elm, 'onmouseout'));
+	setFormValue('onkeypress', dom.getAttrib(elm, 'onkeypress'));
+	setFormValue('onkeydown', dom.getAttrib(elm, 'onkeydown'));
+	setFormValue('onkeyup', dom.getAttrib(elm, 'onkeyup'));
+}
+
+function setFormValue(name, value) {
+	if(document.forms[0].elements[name]) document.forms[0].elements[name].value = value;
+}
+
+function insertDateTime(id) {
+	document.getElementById(id).value = getDateTime(new Date(), "%Y-%m-%dT%H:%M:%S");
+}
+
+function getDateTime(d, fmt) {
+	fmt = fmt.replace("%D", "%m/%d/%y");
+	fmt = fmt.replace("%r", "%I:%M:%S %p");
+	fmt = fmt.replace("%Y", "" + d.getFullYear());
+	fmt = fmt.replace("%y", "" + d.getYear());
+	fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2));
+	fmt = fmt.replace("%d", addZeros(d.getDate(), 2));
+	fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2));
+	fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2));
+	fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2));
+	fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1));
+	fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM"));
+	fmt = fmt.replace("%%", "%");
+
+	return fmt;
+}
+
+function addZeros(value, len) {
+	var i;
+
+	value = "" + value;
+
+	if (value.length < len) {
+		for (i=0; i<(len-value.length); i++)
+			value = "0" + value;
+	}
+
+	return value;
+}
+
+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, value);
+		option.selected = true;
+		sel.options[sel.options.length] = option;
+	}
+
+	return found;
+}
+
+function setAttrib(elm, attrib, value) {
+	var formObj = document.forms[0];
+	var valueElm = formObj.elements[attrib.toLowerCase()];
+	tinyMCEPopup.editor.dom.setAttrib(elm, attrib, value || valueElm.value);
+}
+
+function setAllCommonAttribs(elm) {
+	setAttrib(elm, 'title');
+	setAttrib(elm, 'id');
+	setAttrib(elm, 'class');
+	setAttrib(elm, 'style');
+	setAttrib(elm, 'dir');
+	setAttrib(elm, 'lang');
+	/*setAttrib(elm, 'onfocus');
+	setAttrib(elm, 'onblur');
+	setAttrib(elm, 'onclick');
+	setAttrib(elm, 'ondblclick');
+	setAttrib(elm, 'onmousedown');
+	setAttrib(elm, 'onmouseup');
+	setAttrib(elm, 'onmouseover');
+	setAttrib(elm, 'onmousemove');
+	setAttrib(elm, 'onmouseout');
+	setAttrib(elm, 'onkeypress');
+	setAttrib(elm, 'onkeydown');
+	setAttrib(elm, 'onkeyup');*/
+}
+
+SXE = {
+	currentAction : "insert",
+	inst : tinyMCEPopup.editor,
+	updateElement : null
+}
+
+SXE.focusElement = SXE.inst.selection.getNode();
+
+SXE.initElementDialog = function(element_name) {
+	addClassesToList('class', 'xhtmlxtras_styles');
+	TinyMCE_EditableSelects.init();
+
+	element_name = element_name.toLowerCase();
+	var elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase());
+	if (elm != null && elm.nodeName.toUpperCase() == element_name.toUpperCase()) {
+		SXE.currentAction = "update";
+	}
+
+	if (SXE.currentAction == "update") {
+		initCommonAttributes(elm);
+		SXE.updateElement = elm;
+	}
+
+	document.forms[0].insert.value = tinyMCEPopup.getLang(SXE.currentAction, 'Insert', true); 
+}
+
+SXE.insertElement = function(element_name) {
+	var elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase()), h, tagName;
+
+	tinyMCEPopup.execCommand('mceBeginUndoLevel');
+	if (elm == null) {
+		var s = SXE.inst.selection.getContent();
+		if(s.length > 0) {
+			tagName = element_name;
+
+			if (tinymce.isIE && element_name.indexOf('html:') == 0)
+				element_name = element_name.substring(5).toLowerCase();
+
+			h = '<' + tagName + ' id="#sxe_temp_' + element_name + '#">' + s + '</' + tagName + '>';
+
+			tinyMCEPopup.execCommand('mceInsertContent', false, h);
+
+			var elementArray = tinymce.grep(SXE.inst.dom.select(element_name), function(n) {return n.id == '#sxe_temp_' + element_name + '#';});
+			for (var i=0; i<elementArray.length; i++) {
+				var elm = elementArray[i];
+
+				elm.id = '';
+				elm.setAttribute('id', '');
+				elm.removeAttribute('id');
+
+				setAllCommonAttribs(elm);
+			}
+		}
+	} else {
+		setAllCommonAttribs(elm);
+	}
+	SXE.inst.nodeChanged();
+	tinyMCEPopup.execCommand('mceEndUndoLevel');
+}
+
+SXE.removeElement = function(element_name){
+	element_name = element_name.toLowerCase();
+	elm = SXE.inst.dom.getParent(SXE.focusElement, element_name.toUpperCase());
+	if(elm && elm.nodeName.toUpperCase() == element_name.toUpperCase()){
+		tinyMCEPopup.execCommand('mceBeginUndoLevel');
+		tinyMCE.execCommand('mceRemoveNode', false, elm);
+		SXE.inst.nodeChanged();
+		tinyMCEPopup.execCommand('mceEndUndoLevel');
+	}
+}
+
+SXE.showRemoveButton = function() {
+		document.getElementById("remove").style.display = 'block';
+}
+
+SXE.containsClass = function(elm,cl) {
+	return (elm.className.indexOf(cl) > -1) ? true : false;
+}
+
+SXE.removeClass = function(elm,cl) {
+	if(elm.className == null || elm.className == "" || !SXE.containsClass(elm,cl)) {
+		return true;
+	}
+	var classNames = elm.className.split(" ");
+	var newClassNames = "";
+	for (var x = 0, cnl = classNames.length; x < cnl; x++) {
+		if (classNames[x] != cl) {
+			newClassNames += (classNames[x] + " ");
+		}
+	}
+	elm.className = newClassNames.substring(0,newClassNames.length-1); //removes extra space at the end
+}
+
+SXE.addClass = function(elm,cl) {
+	if(!SXE.containsClass(elm,cl)) elm.className ? elm.className += " " + cl : elm.className = cl;
+	return true;
+}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js
@@ -1,1 +1,50 @@
+ /**
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $
+ *
+ * @author Moxiecode - based on work by Andrew Tetlaw

+ */
 
+function init() {
+	SXE.initElementDialog('ins');
+	if (SXE.currentAction == "update") {
+		setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime'));
+		setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite'));
+		SXE.showRemoveButton();
+	}
+}
+
+function setElementAttribs(elm) {
+	setAllCommonAttribs(elm);
+	setAttrib(elm, 'datetime');
+	setAttrib(elm, 'cite');
+}
+
+function insertIns() {
+	var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'INS');
+	tinyMCEPopup.execCommand('mceBeginUndoLevel');
+	if (elm == null) {
+		var s = SXE.inst.selection.getContent();
+		if(s.length > 0) {
+			tinyMCEPopup.execCommand('mceInsertContent', false, '<ins id="#sxe_temp_ins#">' + s + '</ins>');
+			var elementArray = tinymce.grep(SXE.inst.dom.select('ins'), function(n) {return n.id == '#sxe_temp_ins#';});
+			for (var i=0; i<elementArray.length; i++) {
+				var elm = elementArray[i];
+				setElementAttribs(elm);
+			}
+		}
+	} else {
+		setElementAttribs(elm);
+	}
+	tinyMCEPopup.editor.nodeChanged();
+	tinyMCEPopup.execCommand('mceEndUndoLevel');
+	tinyMCEPopup.close();
+}
+
+function removeIns() {
+	SXE.removeElement('ins');
+	tinyMCEPopup.close();
+}
+
+tinyMCEPopup.onInit.add(init);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/jscripts/abbr.js
@@ -1,1 +1,29 @@
+ /**
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $
+ *
+ * @author Moxiecode - based on work by Andrew Tetlaw

+ */
 
+function preinit() {
+	// Initialize
+	tinyMCE.setWindowArg('mce_windowresize', false);
+}
+
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+	SXE.initElementDialog('abbr');
+	if (SXE.currentAction == "update") {
+		SXE.showRemoveButton();
+	}
+}
+
+function insertAbbr() {
+	SXE.insertElement(tinyMCE.isIE && !tinyMCE.isOpera ? 'html:ABBR' : 'abbr');
+	tinyMCEPopup.close();
+}
+
+function removeAbbr() {
+	SXE.removeElement('abbr');
+	tinyMCEPopup.close();
+}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/jscripts/acronym.js
@@ -1,1 +1,29 @@
+ /**
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $
+ *
+ * @author Moxiecode - based on work by Andrew Tetlaw

+ */
 
+function preinit() {
+	// Initialize
+	tinyMCE.setWindowArg('mce_windowresize', false);
+}
+
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+	SXE.initElementDialog('acronym');
+	if (SXE.currentAction == "update") {
+		SXE.showRemoveButton();
+	}
+}
+
+function insertAcronym() {
+	SXE.insertElement('acronym');
+	tinyMCEPopup.close();
+}
+
+function removeAcronym() {
+	SXE.removeElement('acronym');
+	tinyMCEPopup.close();
+}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/jscripts/attributes.js
@@ -1,1 +1,130 @@
+ /**
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $
+ *
+ * @author Moxiecode - based on work by Andrew Tetlaw

+ */
 
+function preinit() {
+	// Initialize
+	tinyMCE.setWindowArg('mce_windowresize', false);
+}
+
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+	var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
+	var elm = inst.getFocusElement();
+
+	var f = document.forms[0];
+	
+	var onclick = tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onclick'));
+
+	setFormValue('title', tinyMCE.getAttrib(elm, 'title'));
+	setFormValue('id', tinyMCE.getAttrib(elm, 'id'));
+	setFormValue('style', tinyMCE.serializeStyle(tinyMCE.parseStyle(tinyMCE.getAttrib(elm, "style"))));
+	setFormValue('dir', tinyMCE.getAttrib(elm, 'dir'));
+	setFormValue('lang', tinyMCE.getAttrib(elm, 'lang'));
+	setFormValue('tabindex', tinyMCE.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : ""));
+	setFormValue('accesskey', tinyMCE.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : ""));
+	setFormValue('onfocus', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onfocus')));
+	setFormValue('onblur', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onblur')));
+	setFormValue('onclick', onclick);
+	setFormValue('ondblclick', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'ondblclick')));
+	setFormValue('onmousedown', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmousedown')));
+	setFormValue('onmouseup', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseup')));
+	setFormValue('onmouseover', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseover')));
+	setFormValue('onmousemove', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmousemove')));
+	setFormValue('onmouseout', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onmouseout')));
+	setFormValue('onkeypress', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeypress')));
+	setFormValue('onkeydown', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeydown')));
+	setFormValue('onkeyup', tinyMCE.cleanupEventStr(tinyMCE.getAttrib(elm, 'onkeyup')));
+	
+	className = tinyMCE.getVisualAidClass(tinyMCE.getAttrib(elm, 'class'), false);
+		
+	addClassesToList('classlist', 'advlink_styles');
+	selectByValue(f, 'classlist', className, true);
+	
+	TinyMCE_EditableSelects.init();
+}
+
+function setFormValue(name, value) {
+	if(value && document.forms[0].elements[name]){
+		document.forms[0].elements[name].value = value;
+	}
+}
+
+function insertAction() {
+	var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
+	var elm = inst.getFocusElement();
+
+	tinyMCEPopup.execCommand("mceBeginUndoLevel");	
+	tinyMCEPopup.restoreSelection();
+	
+	setAllAttribs(elm);
+	
+	tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);
+	tinyMCE._setEventsEnabled(inst.getBody(), false);
+	tinyMCEPopup.execCommand("mceEndUndoLevel");
+	tinyMCEPopup.close();
+}
+
+function setAttrib(elm, attrib, value) {
+	var formObj = document.forms[0];
+	var valueElm = formObj.elements[attrib.toLowerCase()];
+
+	if (typeof(value) == "undefined" || value == null) {
+		value = "";
+
+		if (valueElm)
+			value = valueElm.value;
+	}
+
+	if (value != "") {
+		tinyMCE.setAttrib(elm, attrib.toLowerCase(), value);
+
+		if (attrib == "style")
+			attrib = "style.cssText";
+
+		if (attrib.substring(0, 2) == 'on')
+			value = 'return true;' + value;
+
+		if (attrib == "class")
+			attrib = "className";
+
+		eval('elm.' + attrib + "=value;");
+	} else
+		elm.removeAttribute(attrib);
+}
+
+function setAllAttribs(elm) {
+	var f = document.forms[0];
+
+	setAttrib(elm, 'title');
+	setAttrib(elm, 'id');
+	setAttrib(elm, 'style');
+	setAttrib(elm, 'class', getSelectValue(f, 'classlist'));
+	setAttrib(elm, 'dir');
+	setAttrib(elm, 'lang');
+	setAttrib(elm, 'tabindex');
+	setAttrib(elm, 'accesskey');
+	setAttrib(elm, 'onfocus');
+	setAttrib(elm, 'onblur');
+	setAttrib(elm, 'onclick');
+	setAttrib(elm, 'ondblclick');
+	setAttrib(elm, 'onmousedown');
+	setAttrib(elm, 'onmouseup');
+	setAttrib(elm, 'onmouseover');
+	setAttrib(elm, 'onmousemove');
+	setAttrib(elm, 'onmouseout');
+	setAttrib(elm, 'onkeypress');
+	setAttrib(elm, 'onkeydown');
+	setAttrib(elm, 'onkeyup');
+
+	// Refresh in old MSIE
+	if (tinyMCE.isMSIE5)
+		elm.outerHTML = elm.outerHTML;
+}
+
+function insertAttribute() {
+	tinyMCEPopup.close();
+}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/jscripts/cite.js
@@ -1,1 +1,29 @@
+ /**
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $
+ *
+ * @author Moxiecode - based on work by Andrew Tetlaw

+ */
 
+function preinit() {
+	// Initialize
+	tinyMCE.setWindowArg('mce_windowresize', false);
+}
+
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+	SXE.initElementDialog('cite');
+	if (SXE.currentAction == "update") {
+		SXE.showRemoveButton();
+	}
+}
+
+function insertCite() {
+	SXE.insertElement('cite');
+	tinyMCEPopup.close();
+}
+
+function removeCite() {
+	SXE.removeElement('cite');
+	tinyMCEPopup.close();
+}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/jscripts/del.js
@@ -1,1 +1,54 @@
+ /**
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $
+ *
+ * @author Moxiecode - based on work by Andrew Tetlaw

+ */
 
+function preinit() {
+	// Initialize
+	tinyMCE.setWindowArg('mce_windowresize', false);
+}
+
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+	SXE.initElementDialog('del');
+	if (SXE.currentAction == "update") {
+		setFormValue('datetime', tinyMCE.getAttrib(SXE.updateElement, 'datetime'));
+		setFormValue('cite', tinyMCE.getAttrib(SXE.updateElement, 'cite'));
+		SXE.showRemoveButton();
+	}
+}
+
+function setElementAttribs(elm) {
+	setAllCommonAttribs(elm);
+	setAttrib(elm, 'datetime');
+	setAttrib(elm, 'cite');
+}
+
+function insertDel() {
+	var elm = tinyMCE.getParentElement(SXE.focusElement, 'del');
+
+	tinyMCEPopup.execCommand('mceBeginUndoLevel');
+	if (elm == null) {
+		var s = SXE.inst.selection.getSelectedHTML();
+		if(s.length > 0) {
+			tinyMCEPopup.execCommand('mceInsertContent', false, '<del id="#sxe_temp_del#">' + s + '</del>');
+			var elementArray = tinyMCE.getElementsByAttributeValue(SXE.inst.getBody(), 'del', 'id', '#sxe_temp_del#');
+			for (var i=0; i<elementArray.length; i++) {
+				var elm = elementArray[i];
+				setElementAttribs(elm);
+			}
+		}
+	} else {
+		setElementAttribs(elm);
+	}
+	tinyMCE.triggerNodeChange();
+	tinyMCEPopup.execCommand('mceEndUndoLevel');
+	tinyMCEPopup.close();
+}
+
+function removeDel() {
+	SXE.removeElement('del');
+	tinyMCEPopup.close();
+}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/jscripts/element_common.js
@@ -1,1 +1,241 @@
-
+ /**
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $
+ *
+ * @author Moxiecode - based on work by Andrew Tetlaw

+ */
+
+function initCommonAttributes(elm) {
+	var formObj = document.forms[0];
+
+	// Setup form data for common element attributes
+	setFormValue('title', tinyMCE.getAttrib(elm, 'title'));
+	setFormValue('id', tinyMCE.getAttrib(elm, 'id'));
+	selectByValue(formObj, 'class', tinyMCE.getAttrib(elm, 'class'), true);
+	setFormValue('style', tinyMCE.getAttrib(elm, 'style'));
+	selectByValue(formObj, 'dir', tinyMCE.getAttrib(elm, 'dir'));
+	setFormValue('lang', tinyMCE.getAttrib(elm, 'lang'));
+	setFormValue('onfocus', tinyMCE.getAttrib(elm, 'onfocus'));
+	setFormValue('onblur', tinyMCE.getAttrib(elm, 'onblur'));
+	setFormValue('onclick', tinyMCE.getAttrib(elm, 'onclick'));
+	setFormValue('ondblclick', tinyMCE.getAttrib(elm, 'ondblclick'));
+	setFormValue('onmousedown', tinyMCE.getAttrib(elm, 'onmousedown'));
+	setFormValue('onmouseup', tinyMCE.getAttrib(elm, 'onmouseup'));
+	setFormValue('onmouseover', tinyMCE.getAttrib(elm, 'onmouseover'));
+	setFormValue('onmousemove', tinyMCE.getAttrib(elm, 'onmousemove'));
+	setFormValue('onmouseout', tinyMCE.getAttrib(elm, 'onmouseout'));
+	setFormValue('onkeypress', tinyMCE.getAttrib(elm, 'onkeypress'));
+	setFormValue('onkeydown', tinyMCE.getAttrib(elm, 'onkeydown'));
+	setFormValue('onkeyup', tinyMCE.getAttrib(elm, 'onkeyup'));
+}
+
+function setFormValue(name, value) {
+	if(document.forms[0].elements[name]) document.forms[0].elements[name].value = value;
+}
+
+function insertDateTime(id) {
+	document.getElementById(id).value = getDateTime(new Date(), "%Y-%m-%dT%H:%M:%S");
+}
+
+function getDateTime(d, fmt) {
+	fmt = fmt.replace("%D", "%m/%d/%y");
+	fmt = fmt.replace("%r", "%I:%M:%S %p");
+	fmt = fmt.replace("%Y", "" + d.getFullYear());
+	fmt = fmt.replace("%y", "" + d.getYear());
+	fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2));
+	fmt = fmt.replace("%d", addZeros(d.getDate(), 2));
+	fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2));
+	fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2));
+	fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2));
+	fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1));
+	fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM"));
+	fmt = fmt.replace("%%", "%");
+
+	return fmt;
+}
+
+function addZeros(value, len) {
+	var i;
+
+	value = "" + value;
+
+	if (value.length < len) {
+		for (i=0; i<(len-value.length); i++)
+			value = "0" + value;
+	}
+
+	return value;
+}
+
+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, value);
+		option.selected = true;
+		sel.options[sel.options.length] = option;
+	}
+
+	return found;
+}
+
+function setAttrib(elm, attrib, value) {
+	var formObj = document.forms[0];
+	var valueElm = formObj.elements[attrib.toLowerCase()];
+
+	if (typeof(value) == "undefined" || value == null) {
+		value = "";
+
+		if (valueElm)
+			value = valueElm.value;
+	}
+
+	if (value != "") {
+		if (attrib == "style")
+			attrib = "style.cssText";
+
+		if (attrib.substring(0, 2) == 'on')
+			value = 'return true;' + value;
+
+		if (attrib == "class") {
+			tinyMCE.addCSSClass(elm, value);
+			return;
+		}
+
+		elm.setAttribute(attrib.toLowerCase(), value);
+	} else
+		elm.removeAttribute(attrib);
+}
+
+function setAllCommonAttribs(elm) {
+	setAttrib(elm, 'title');
+	setAttrib(elm, 'id');
+	setAttrib(elm, 'class');
+	setAttrib(elm, 'style');
+	setAttrib(elm, 'dir');
+	setAttrib(elm, 'lang');
+	/*setAttrib(elm, 'onfocus');
+	setAttrib(elm, 'onblur');
+	setAttrib(elm, 'onclick');
+	setAttrib(elm, 'ondblclick');
+	setAttrib(elm, 'onmousedown');
+	setAttrib(elm, 'onmouseup');
+	setAttrib(elm, 'onmouseover');
+	setAttrib(elm, 'onmousemove');
+	setAttrib(elm, 'onmouseout');
+	setAttrib(elm, 'onkeypress');
+	setAttrib(elm, 'onkeydown');
+	setAttrib(elm, 'onkeyup');*/
+}
+
+SXE = {
+	currentAction : "insert",
+	inst : tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id')),
+	updateElement : null
+}
+
+SXE.focusElement = SXE.inst.getFocusElement();
+
+SXE.initElementDialog = function(element_name) {
+	addClassesToList('class', 'xhtmlxtras_styles');
+	TinyMCE_EditableSelects.init();
+
+	element_name = element_name.toLowerCase();
+	var elm = tinyMCE.getParentElement(SXE.focusElement, element_name);
+	if (elm != null && elm.nodeName == element_name.toUpperCase()) {
+		SXE.currentAction = "update";
+	}
+
+	if (SXE.currentAction == "update") {
+		initCommonAttributes(elm);
+		SXE.updateElement = elm;
+	}
+
+	document.forms[0].insert.value = tinyMCE.getLang('lang_' + SXE.currentAction, 'Insert', true); 
+}
+
+SXE.insertElement = function(element_name) {
+	var elm = tinyMCE.getParentElement(SXE.focusElement, element_name), h, tagName;
+
+	tinyMCEPopup.execCommand('mceBeginUndoLevel');
+	if (elm == null) {
+		var s = SXE.inst.selection.getSelectedHTML();
+		if(s.length > 0) {
+			tagName = element_name;
+
+			if (tinyMCE.isIE && !tinyMCE.isOpera && element_name.indexOf('html:') == 0)
+				element_name = element_name.substring(5).toLowerCase();
+
+			h = '<' + tagName + ' id="#sxe_temp_' + element_name + '#">' + s + '</' + tagName + '>';
+
+			tinyMCEPopup.execCommand('mceInsertContent', false, h);
+
+			var elementArray = tinyMCE.getElementsByAttributeValue(SXE.inst.getBody(), element_name, 'id', '#sxe_temp_' + element_name + '#');
+			for (var i=0; i<elementArray.length; i++) {
+				var elm = elementArray[i];
+
+				elm.id = '';
+				elm.setAttribute('id', '');
+				elm.removeAttribute('id');
+
+				setAllCommonAttribs(elm);
+			}
+		}
+	} else {
+		setAllCommonAttribs(elm);
+	}
+	tinyMCE.triggerNodeChange();
+	tinyMCEPopup.execCommand('mceEndUndoLevel');
+}
+
+SXE.removeElement = function(element_name){
+	element_name = element_name.toLowerCase();
+	elm = tinyMCE.getParentElement(SXE.focusElement, element_name);
+	if(elm && elm.nodeName == element_name.toUpperCase()){
+		tinyMCEPopup.execCommand('mceBeginUndoLevel');
+		tinyMCE.execCommand('mceRemoveNode', false, elm);
+		tinyMCE.triggerNodeChange();
+		tinyMCEPopup.execCommand('mceEndUndoLevel');
+	}
+}
+
+SXE.showRemoveButton = function() {
+		document.getElementById("remove").style.display = 'block';
+}
+
+SXE.containsClass = function(elm,cl) {
+	return (elm.className.indexOf(cl) > -1) ? true : false;
+}
+
+SXE.removeClass = function(elm,cl) {
+	if(elm.className == null || elm.className == "" || !SXE.containsClass(elm,cl)) {
+		return true;
+	}
+	var classNames = elm.className.split(" ");
+	var newClassNames = "";
+	for (var x = 0, cnl = classNames.length; x < cnl; x++) {
+		if (classNames[x] != cl) {
+			newClassNames += (classNames[x] + " ");
+		}
+	}
+	elm.className = newClassNames.substring(0,newClassNames.length-1); //removes extra space at the end
+}
+
+SXE.addClass = function(elm,cl) {
+	if(!SXE.containsClass(elm,cl)) elm.className ? elm.className += " " + cl : elm.className = cl;
+	return true;
+}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/jscripts/ins.js
@@ -1,1 +1,53 @@
+ /**
+ * $Id: editor_plugin_src.js 42 2006-08-08 14:32:24Z spocke $
+ *
+ * @author Moxiecode - based on work by Andrew Tetlaw

+ */
 
+function preinit() {
+	// Initialize
+	tinyMCE.setWindowArg('mce_windowresize', false);
+}
+
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+	SXE.initElementDialog('ins');
+	if (SXE.currentAction == "update") {
+		setFormValue('datetime', tinyMCE.getAttrib(SXE.updateElement, 'datetime'));
+		setFormValue('cite', tinyMCE.getAttrib(SXE.updateElement, 'cite'));
+		SXE.showRemoveButton();
+	}
+}
+
+function setElementAttribs(elm) {
+	setAllCommonAttribs(elm);
+	setAttrib(elm, 'datetime');
+	setAttrib(elm, 'cite');
+}
+
+function insertIns() {
+	var elm = tinyMCE.getParentElement(SXE.focusElement, 'ins');
+	tinyMCEPopup.execCommand('mceBeginUndoLevel');
+	if (elm == null) {
+		var s = SXE.inst.selection.getSelectedHTML();
+		if(s.length > 0) {
+			tinyMCEPopup.execCommand('mceInsertContent', false, '<ins id="#sxe_temp_ins#">' + s + '</ins>');
+			var elementArray = tinyMCE.getElementsByAttributeValue(SXE.inst.getBody(), 'ins', 'id', '#sxe_temp_ins#');
+			for (var i=0; i<elementArray.length; i++) {
+				var elm = elementArray[i];
+				setElementAttribs(elm);
+			}
+		}
+	} else {
+		setElementAttribs(elm);
+	}
+	tinyMCE.triggerNodeChange();
+	tinyMCEPopup.execCommand('mceEndUndoLevel');
+	tinyMCEPopup.close();
+}
+
+function removeIns() {
+	SXE.removeElement('ins');
+	tinyMCEPopup.close();
+}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/en.js
@@ -1,1 +1,43 @@
+// UK lang variables
 
+tinyMCE.addToLang('xhtmlxtras',{
+cite_desc : 'Citation',
+abbr_desc : 'Abbreviation',
+acronym_desc : 'Acronym',
+del_desc : 'Deletion',
+ins_desc : 'Insertion',
+attribute_label_title : 'Title',
+attribute_label_id : 'ID',
+attribute_label_class : 'Class',
+attribute_label_style : 'Style',
+attribute_label_cite : 'Cite',
+attribute_label_datetime : 'Date/Time',
+attribute_label_langdir : 'Text Direction',
+attribute_option_ltr : 'Left to right',
+attribute_option_rtl : 'Right to left',
+attribute_label_langcode : 'Language',
+attribute_label_tabindex : 'TabIndex',
+attribute_label_accesskey : 'AccessKey',
+attribute_label_cite : 'Cite',
+attribute_events_tab : 'Events',
+attribute_attrib_tab : 'Attributes',
+general_tab : 'General',
+attrib_tab : 'Attributes',
+events_tab : 'Events',
+fieldset_general_tab : 'General Settings',
+fieldset_attrib_tab : 'Element Attributes',
+fieldset_events_tab : 'Element Events',
+title_ins_element : 'Insertion Element',
+title_del_element : 'Deletion Element',
+title_acronym_element : 'Acronym Element',
+title_abbr_element : 'Abbreviation Element',
+title_cite_element : 'Citation Element',
+remove : 'Remove',
+not_set : '--not set--',
+insert_date : 'Insert current date/time',
+option_ltr : 'Left to right',
+option_rtl : 'Right to left',
+attribs_desc : 'Insert/Edit Attributes',
+attribs_title : 'Insert/Edit Attributes'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/langs/en_dlg.js
@@ -1,1 +1,32 @@
-
+tinyMCE.addI18n('en.xhtmlxtras_dlg',{
+attribute_label_title:"Title",
+attribute_label_id:"ID",
+attribute_label_class:"Class",
+attribute_label_style:"Style",
+attribute_label_cite:"Cite",
+attribute_label_datetime:"Date/Time",
+attribute_label_langdir:"Text Direction",
+attribute_option_ltr:"Left to right",
+attribute_option_rtl:"Right to left",
+attribute_label_langcode:"Language",
+attribute_label_tabindex:"TabIndex",
+attribute_label_accesskey:"AccessKey",
+attribute_events_tab:"Events",
+attribute_attrib_tab:"Attributes",
+general_tab:"General",
+attrib_tab:"Attributes",
+events_tab:"Events",
+fieldset_general_tab:"General Settings",
+fieldset_attrib_tab:"Element Attributes",
+fieldset_events_tab:"Element Events",
+title_ins_element:"Insertion Element",
+title_del_element:"Deletion Element",
+title_acronym_element:"Acronym Element",
+title_abbr_element:"Abbreviation Element",
+title_cite_element:"Citation Element",
+remove:"Remove",
+insert_date:"Insert current date/time",
+option_ltr:"Left to right",
+option_rtl:"Right to left",
+attribs_title:"Insert/Edit Attributes"
+});

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/zoom/editor_plugin.js
@@ -1,1 +1,1 @@
-
+var TinyMCE_ZoomPlugin={getInfo:function(){return{longname:'Zoom',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',infourl:'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/zoom',version:tinyMCE.majorVersion+"."+tinyMCE.minorVersion}},getControlHTML:function(control_name){if(!tinyMCE.isMSIE||tinyMCE.isMSIE5_0||tinyMCE.isOpera)return"";switch(control_name){case"zoom":return'<select id="{$editor_id}_zoomSelect" name="{$editor_id}_zoomSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceZoom\',false,this.options[this.selectedIndex].value);" class="mceSelectList">'+'<option value="100%">+ 100%</option>'+'<option value="150%">+ 150%</option>'+'<option value="200%">+ 200%</option>'+'<option value="250%">+ 250%</option>'+'</select>'}return""},execCommand:function(editor_id,element,command,user_interface,value){switch(command){case"mceZoom":tinyMCE.getInstanceById(editor_id).contentDocument.body.style.zoom=value;tinyMCE.getInstanceById(editor_id).contentDocument.body.style.mozZoom=value;return true}return false}};tinyMCE.addPlugin("zoom",TinyMCE_ZoomPlugin);

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/zoom/editor_plugin_src.js
@@ -1,1 +1,57 @@
+/**
+ * $Id: editor_plugin_src.js 201 2007-02-12 15:56:56Z spocke $
+ *
+ * @author Moxiecode

+ */
 
+var TinyMCE_ZoomPlugin = {
+	getInfo : function() {
+		return {
+			longname : 'Zoom',
+			author : 'Moxiecode Systems AB',
+			authorurl : 'http://tinymce.moxiecode.com',
+			infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/zoom',
+			version : tinyMCE.majorVersion + "." + tinyMCE.minorVersion
+		};
+	},
+
+	/**
+	 * Returns the HTML contents of the zoom control.
+	 */
+	getControlHTML : function(control_name) {
+		if (!tinyMCE.isMSIE || tinyMCE.isMSIE5_0 || tinyMCE.isOpera)
+			return "";
+
+		switch (control_name) {
+			case "zoom":
+				return '<select id="{$editor_id}_zoomSelect" name="{$editor_id}_zoomSelect" onfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceZoom\',false,this.options[this.selectedIndex].value);" class="mceSelectList">' + 
+						'<option value="100%">+ 100%</option>' + 
+						'<option value="150%">+ 150%</option>' + 
+						'<option value="200%">+ 200%</option>' + 
+						'<option value="250%">+ 250%</option>' + 
+						'</select>';
+		}
+
+		return "";
+	},
+
+	/**
+	 * Executes the mceZoom command.
+	 */
+	execCommand : function(editor_id, element, command, user_interface, value) {
+		// Handle commands
+		switch (command) {
+			case "mceZoom":
+				tinyMCE.getInstanceById(editor_id).contentDocument.body.style.zoom = value;
+				tinyMCE.getInstanceById(editor_id).contentDocument.body.style.mozZoom = value;
+				return true;
+		}
+
+		// Pass to next handler in chain
+		return false;
+	}
+};
+
+tinyMCE.addPlugin("zoom", TinyMCE_ZoomPlugin);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/plugins/zoom/readme.txt
@@ -1,1 +1,2 @@
+Check the TinyMCE documentation for details on this plugin.
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/readme.txt
@@ -1,1 +1,3 @@
+Check this wiki page for installation instructions:
+http://wiki.moxiecode.com/index.php/TinyMCE:Compressor/PHP
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/about.htm
@@ -1,1 +1,57 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#advanced_dlg.about_title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="js/about.js"></script>
+</head>
+<body id="about" style="display: none">
+		<div class="tabs">
+			<ul>
+				<li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advanced_dlg.about_general}</a></span></li>
+				<li id="help_tab" style="display:none"><span><a href="javascript:mcTabs.displayTab('help_tab','help_panel');" onmousedown="return false;">{#advanced_dlg.about_help}</a></span></li>
+				<li id="plugins_tab"><span><a href="javascript:mcTabs.displayTab('plugins_tab','plugins_panel');" onmousedown="return false;">{#advanced_dlg.about_plugins}</a></span></li>
+			</ul>
+		</div>
 
+		<div class="panel_wrapper">
+			<div id="general_panel" class="panel current">
+				<h3>{#advanced_dlg.about_title}</h3>
+				<p>Version: <span id="version"></span> (<span id="date"></span>)</p>
+				<p>TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control released as Open Source under <a href="../../license.txt" target="_blank">LGPL</a>
+				by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.</p>
+				<p>Copyright &copy; 2003-2008, <a href="http://www.moxiecode.com" target="_blank">Moxiecode Systems AB</a>, All rights reserved.</p>
+				<p>For more information about this software visit the <a href="http://tinymce.moxiecode.com" target="_blank">TinyMCE website</a>.</p>
+
+				<div id="buttoncontainer">
+					<a href="http://www.moxiecode.com" target="_blank"><img src="http://tinymce.moxiecode.com/images/gotmoxie.png" alt="Got Moxie?" border="0" /></a>
+					<a href="http://sourceforge.net/projects/tinymce/" target="_blank"><img src="http://sourceforge.net/sflogo.php?group_id=103281" alt="Hosted By Sourceforge" border="0" /></a>
+					<a href="http://www.freshmeat.net/projects/tinymce" target="_blank"><img src="http://tinymce.moxiecode.com/images/fm.gif" alt="Also on freshmeat" border="0" /></a>
+				</div>
+			</div>
+
+			<div id="plugins_panel" class="panel">
+				<div id="pluginscontainer">
+					<h3>{#advanced_dlg.about_loaded}</h3>
+
+					<div id="plugintablecontainer">
+					</div>
+
+					<p>&nbsp;</p>
+				</div>
+			</div>
+
+			<div id="help_panel" class="panel noscroll" style="overflow: visible;">
+				<div id="iframecontainer"></div>
+			</div>
+		</div>
+
+		<div class="mceActionPanel">
+			<div style="float: right">
+				<input type="button" id="cancel" name="cancel" value="{#close}" onclick="tinyMCEPopup.close();" />
+			</div>
+		</div>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/anchor.htm
@@ -1,1 +1,33 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#advanced_dlg.anchor_title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="js/anchor.js"></script>
+	<base target="_self" />
+</head>
+<body style="display: none">
+<form onsubmit="AnchorDialog.update();return false;" action="#">
+	<table border="0" cellpadding="4" cellspacing="0">
+		<tr>
+			<td colspan="2" class="title">{#advanced_dlg.anchor_title}</td>
+		</tr>
+		<tr>
+			<td nowrap="nowrap">{#advanced_dlg.anchor_name}:</td>
+			<td><input name="anchorName" type="text" class="mceFocus" id="anchorName" value="" style="width: 200px" /></td>
+		</tr>
+	</table>
 
+	<div class="mceActionPanel">
+		<div style="float: left">
+			<input type="submit" id="insert" name="insert" value="{#update}" />
+		</div>
+
+		<div style="float: right">
+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+		</div>
+	</div>
+</form>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/charmap.htm
@@ -1,1 +1,55 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#advanced_dlg.charmap_title}</title>
+	<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="js/charmap.js"></script>
+	<base target="_self" />
+</head>
+<body id="charmap" style="display:none">
+<table align="center" border="0" cellspacing="0" cellpadding="2">
+    <tr>
+        <td colspan="2" class="title">{#advanced_dlg.charmap_title}</td>
+    </tr>
+    <tr>
+        <td id="charmapView" rowspan="2" align="left" valign="top">
+			<!-- Chars will be rendered here -->
+        </td>
+        <td width="100" align="center" valign="top">
+            <table border="0" cellpadding="0" cellspacing="0" width="100" style="height:100px">
+                <tr>
+                    <td id="codeV">&nbsp;</td>
+                </tr>
+                <tr>
+                    <td id="codeN">&nbsp;</td>
+                </tr>
+            </table>
+        </td>
+    </tr>
+    <tr>
+        <td valign="bottom" style="padding-bottom: 3px;">
+            <table width="100" align="center" border="0" cellpadding="2" cellspacing="0">
+                <tr>
+                    <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;">HTML-Code</td>
+                </tr>
+                <tr>
+                    <td style="font-size: 16px; font-weight: bold; border-left: 1px solid #666699; border-bottom: 1px solid #666699; border-right: 1px solid #666699;" id="codeA" align="center">&nbsp;</td>
+                </tr>
+                <tr>
+                    <td style="font-size: 1px;">&nbsp;</td>
+                </tr>
+                <tr>
+                    <td align="center" style="border-left: 1px solid #666699; border-top: 1px solid #666699; border-right: 1px solid #666699;">NUM-Code</td>
+                </tr>
+                <tr>
+                    <td style="font-size: 16px; font-weight: bold; border-left: 1px solid #666699; border-bottom: 1px solid #666699; border-right: 1px solid #666699;" id="codeB" align="center">&nbsp;</td>
+                </tr>
+            </table>
+        </td>
+    </tr>
+</table>
 
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/color_picker.htm
@@ -1,1 +1,77 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#advanced_dlg.colorpicker_title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="js/color_picker.js"></script>
+	<base target="_self" />
+</head>
+<body id="colorpicker" style="display: none">
+<form onsubmit="insertAction();return false" action="#">
+	<div class="tabs">
+		<ul>
+			<li id="picker_tab" class="current"><span><a href="javascript:mcTabs.displayTab('picker_tab','picker_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_picker_tab}</a></span></li>
+			<li id="rgb_tab"><span><a href="javascript:;" onclick="generateWebColors();mcTabs.displayTab('rgb_tab','rgb_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_palette_tab}</a></span></li>
+			<li id="named_tab"><span><a  href="javascript:;" onclick="generateNamedColors();javascript:mcTabs.displayTab('named_tab','named_panel');" onmousedown="return false;">{#advanced_dlg.colorpicker_named_tab}</a></span></li>
+		</ul>
+	</div>
 
+	<div class="panel_wrapper">
+		<div id="picker_panel" class="panel current">
+			<fieldset>
+				<legend>{#advanced_dlg.colorpicker_picker_title}</legend>
+				<div id="picker">
+					<img id="colors" src="img/colorpicker.jpg" onclick="computeColor(event)" onmousedown="isMouseDown = true;return false;" onmouseup="isMouseDown = false;" onmousemove="if (isMouseDown && isMouseOver) computeColor(event); return false;" onmouseover="isMouseOver=true;" onmouseout="isMouseOver=false;" />
+
+					<div id="light">
+						<!-- Will be filled with divs -->
+					</div>
+
+					<br style="clear: both" />
+				</div>
+			</fieldset>
+		</div>
+
+		<div id="rgb_panel" class="panel">
+			<fieldset>
+				<legend>{#advanced_dlg.colorpicker_palette_title}</legend>
+				<div id="webcolors">
+					<!-- Gets filled with web safe colors-->
+				</div>
+
+				<br style="clear: both" />
+			</fieldset>
+		</div>
+
+		<div id="named_panel" class="panel">
+			<fieldset>
+				<legend>{#advanced_dlg.colorpicker_named_title}</legend>
+				<div id="namedcolors">
+					<!-- Gets filled with named colors-->
+				</div>
+
+				<br style="clear: both" />
+
+				<div id="colornamecontainer">
+					{#advanced_dlg.colorpicker_name} <span id="colorname"></span>
+				</div>
+			</fieldset>
+		</div>
+	</div>
+
+	<div class="mceActionPanel">
+		<div style="float: left">
+			<input type="submit" id="insert" name="insert" value="{#apply}" />
+		</div>
+
+		<div id="preview"></div>
+
+		<div id="previewblock">
+			<label for="color">{#advanced_dlg.colorpicker_color}</label> <input id="color" type="text" size="8" maxlength="8" class="text mceFocus" />
+		</div>
+	</div>
+</form>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/css/colorpicker.css
@@ -1,1 +1,53 @@
+/* Colorpicker dialog specific CSS */
 
+#preview {
+	float: right;
+	width: 50px;
+	height: 14px;
+	line-height: 1px;
+	border: 1px solid black;
+	margin-left: 5px;
+}
+
+#colorpicker {
+	float: left;
+	cursor: crosshair;
+}
+
+#light {
+	border: 1px solid gray;
+	margin-left: 5px;
+	float: left;
+	width: 15px;
+	cursor: crosshair;
+}
+
+#light div {
+	overflow: hidden;
+}
+
+#previewblock {
+	float: right;
+	padding-left: 10px;
+	height: 20px;
+}
+
+.panel_wrapper div.current {
+	height: 175px;
+}
+
+#namedcolors {
+	width: 150px;
+}
+
+#namedcolors a {
+	display: block;
+	float: left;
+	width: 10px; height: 10px;
+	margin: 1px 1px 0 0;
+	overflow: hidden;
+}
+
+#colornamecontainer {
+	margin-top: 5px;
+}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/css/editor_content.css
@@ -1,1 +1,59 @@
+/* This file contains the CSS data for the editable area(iframe) of TinyMCE */
+/* You can extend this CSS by adding your own CSS file with the the content_css option */
 
+body, td, pre {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+}
+
+body {
+	background-color: #FFFFFF;
+}
+
+.mceVisualAid {
+	border: 1px dashed #BBBBBB !important;
+}
+
+div.mceVisualAid {
+	background-image:url('../images/spacer.gif');
+	visibility: visible !important;
+}
+
+.mceItemAnchor {
+	width: 12px;
+	line-height: 6px;
+	overflow: hidden;
+	padding-left: 12px;
+	background-image: url('../images/anchor_symbol.gif');
+	background-position: bottom;
+	background-repeat: no-repeat;
+}
+
+/* Important is needed in Gecko browsers inorder to style links */
+/*
+a {
+	color: green !important;
+}
+*/
+
+/* Style selection range colors in Gecko browsers */
+/*
+::-moz-selection {
+	background-color: red;
+	color: green;
+}
+*/
+
+/* MSIE specific */
+
+* html body {
+	scrollbar-3dlight-color: #F0F0EE;
+	scrollbar-arrow-color: #676662;
+	scrollbar-base-color: #F0F0EE;
+	scrollbar-darkshadow-color: #DDDDDD;
+	scrollbar-face-color: #E0E0DD;
+	scrollbar-highlight-color: #F0F0EE;
+	scrollbar-shadow-color: #F0F0EE;
+	scrollbar-track-color: #F5F5F5;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/css/editor_popup.css
@@ -1,1 +1,332 @@
-
+/* This file contains the CSS data for all popups in TinyMCE */
+
+body {
+	background-color: #F0F0EE;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 11px;
+	scrollbar-3dlight-color: #F0F0EE;
+	scrollbar-arrow-color: #676662;
+	scrollbar-base-color: #F0F0EE;
+	scrollbar-darkshadow-color: #DDDDDD;
+	scrollbar-face-color: #E0E0DD;
+	scrollbar-highlight-color: #F0F0EE;
+	scrollbar-shadow-color: #F0F0EE;
+	scrollbar-track-color: #F5F5F5;
+	margin: 8px;
+}
+
+td {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 11px;
+}
+
+input {
+	background: #FFFFFF;
+	border: 1px solid #cccccc;
+}
+
+td, input, select, textarea {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+}
+
+input, select, textarea {
+	border: 1px solid #808080;
+}
+
+.input_noborder {
+	border: 0;
+}
+
+#insert, .updateButton {
+   font-weight: bold;
+   width: 90px;
+   height: 21px;
+   border: 0;
+   background-image: url('../images/insert_button_bg.gif');
+   cursor: pointer;
+}
+
+#cancel {
+   font-weight: bold;
+   width: 90px;
+   height: 21px;
+   border: 0;
+   background-image: url('../images/cancel_button_bg.gif');
+   cursor: pointer;
+}
+
+/* Mozilla only style */
+html>body #insert, html>body #cancel {
+	padding-bottom: 2px;
+}
+
+.title {
+	font-size: 12px;
+	font-weight: bold;
+	color: #2B6FB6;
+}
+
+table.charmap {
+	border-style: solid;
+	border-width: 1px;
+	border-color: #AAAAAA;
+}
+
+td.charmap, td.charmapOver {
+	color: #000000;
+	border-color: #AAAAAA;
+	border-style: solid;
+	border-width: 1px;
+	text-align: center;
+	font-size: 12px;
+}
+
+td.charmapOver {
+	background-color: #CCCCCC;
+	cursor: default;
+}
+
+a.charmap {
+	color: #000000;
+	text-decoration: none
+}
+
+.wordWrapCode {
+	vertical-align: middle;
+	border: 1px none #000000;
+	background-color: transparent;
+}
+
+input.radio {
+	border: 1px none #000000;
+	background-color: transparent;
+	vertical-align: middle;
+}
+
+input.checkbox {
+	border: 1px none #000000;
+	background-color: transparent;
+	vertical-align: middle;
+}
+
+.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected {
+	margin-left: 1px;
+}
+
+.mceButtonNormal {
+	border-top: 1px solid;
+	border-left: 1px solid;
+	border-bottom: 1px solid;
+	border-right: 1px solid;
+	border-color: #F0F0EE;
+	cursor: default;
+}
+
+.mceButtonOver {
+	border: 1px solid #0A246A;
+	cursor: default;
+	background-color: #B6BDD2;
+}
+
+.mceButtonDown {
+	cursor: default;
+	border: 1px solid #0A246A;
+	background-color: #8592B5;
+}
+
+.mceButtonDisabled {
+	filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);
+	-moz-opacity:0.3;
+	opacity: 0.3;
+	border-top: 1px solid;
+	border-left: 1px solid;
+	border-bottom: 1px solid;
+	border-right: 1px solid;
+	border-color: #F0F0EE;
+	cursor: default;
+}
+
+.mceActionPanel {
+	margin-top: 5px;
+}
+
+/* Tabs classes */
+
+.tabs {
+	float: left;
+	width: 100%;
+	line-height: normal;
+	background-image: url("../images/xp/tabs_bg.gif");
+}
+
+.tabs ul {
+	margin: 0;
+	padding: 0 0 0;
+	list-style: none;
+}
+
+.tabs li {
+	float: left;
+	background: url("../images/xp/tab_bg.gif") no-repeat left top;
+	margin: 0;
+	margin-left: 0;
+	margin-right: 2px;
+	padding: 0 0 0 10px;
+	line-height: 18px;
+}
+
+.tabs li.current {
+	background: url("../images/xp/tab_sel_bg.gif") no-repeat left top;
+	margin-right: 2px;
+}
+
+.tabs span {
+	float: left;
+	display: block;
+	background: url("../images/xp/tab_end.gif") no-repeat right top;
+	padding: 0px 10px 0 0;
+}
+
+.tabs .current span {
+	background: url("../images/xp/tab_sel_end.gif") no-repeat right top;
+}
+
+.tabs a {
+	text-decoration: none;
+	font-family: Verdana, Arial;
+	font-size: 10px;
+}
+
+.tabs a:link, .tabs a:visited, .tabs a:hover {
+	color: black;
+}
+
+.tabs a:hover {
+}
+
+.tabs .current {
+}
+
+.tabs .current a, .tabs .current a:link, .tabs .current a:visited {
+}
+
+.panel_wrapper div.panel {
+	display: none;
+}
+
+.panel_wrapper div.current {
+	display: block;
+	width: 100%;
+	height: 300px;
+	overflow: visible; /* Should be auto but that breaks Safari */
+}
+
+.panel_wrapper {
+	border: 1px solid #919B9C;
+	border-top: 0px;
+	padding: 10px;
+	padding-top: 5px;
+	clear: both;
+	background-color: white;
+}
+
+fieldset {
+	border: 1px solid #919B9C;
+	font-family: Verdana, Arial;
+	font-size: 10px;
+	padding: 0;
+	margin: 0;
+	padding: 4px;
+}
+
+legend {
+	color: #2B6FB6;
+	font-weight: bold;
+}
+
+.properties {
+	width: 100%;
+}
+
+.properties .column1 {
+}
+
+.properties .column2 {
+	text-align: left;
+}
+
+a:link, a:visited {
+	color: black;
+}
+
+a:hover {
+	color: #2B6FB6;
+}
+
+#plugintable thead {
+	font-weight: bold;
+	background-color: #DDDDDD;
+}
+
+#plugintable, #about #plugintable td {
+	border: 1px solid #919B9C;
+}
+
+#plugintable {
+	width: 99%;
+	margin-top: 10px;
+}
+
+#pluginscontainer {
+	height: 290px;
+	overflow: auto;
+}
+
+/* MSIE Specific styles */
+
+* html .panel_wrapper {
+	width: 100%;
+}
+
+.column {
+	float: left;
+}
+
+h1, h2, h3, h4 {
+	color: #2B6FB6;
+	margin: 0;
+	padding: 0;
+	padding-top: 5px;
+}
+
+h3 {
+	font-size: 14px;
+}
+
+#link .panel_wrapper, #link div.current {
+	height: 125px;
+}
+
+#image .panel_wrapper, #image div.current {
+	height: 190px;
+}
+
+label.msg { display: none; }
+label.invalid { color: #EE0000; display: inline; }
+input.invalid { border: 1px solid #EE0000; }
+
+/* Disables the advanced tab in the table plugin. */
+/*
+#table #advanced_tab {
+	display: none;
+}
+*/
+
+/* Disables the border input field and label in the table plugin. */
+/*
+#table #border, #table #borderlabel {
+	display: none;
+}
+*/
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/css/editor_ui.css
@@ -1,1 +1,98 @@
+/* This file contains the CSS data for the editor UI of TinyMCE instances */
 
+.mceToolbarTop a, .mceToolbarTop a:visited, .mceToolbarTop a:hover, .mceToolbarBottom a, .mceToolbarBottom a:visited, .mceToolbarBottom a:hover {border: 0; margin: 0; padding: 0; background: transparent;}
+.mceSeparatorLine {border: 0; padding: 0; margin-left: 4px; margin-right: 2px;}
+.mceSelectList {font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 7pt !important; font-weight: normal; margin-top: 3px; padding: 0; display: inline; vertical-align: top; background-color: #F0F0EE;}
+.mceLabel, .mceLabelDisabled {font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 9pt;}
+.mceLabel {color: #000000;}
+.mceLabelDisabled {cursor: text; color: #999999;}
+.mceEditor {background: #F0F0EE; border: 1px solid #cccccc; padding: 0; margin: 0;}
+.mceEditorArea { font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; background: #FFFFFF; padding: 0; margin: 0; }
+.mceToolbarTop, .mceToolbarBottom {background: #F0F0EE; line-height: 1px; font-size: 1px;}
+.mceToolbarTop {border-bottom: 1px solid #cccccc; padding-bottom: 1px;}
+.mceToolbarBottom {border-top: 1px solid #cccccc;}
+.mceToolbarContainer {display: block; position: relative; left: 0; top: 0; width: 100%;}
+.mceStatusbarTop, .mceStatusbarBottom, .mceStatusbar {height: 20px;}
+.mceStatusbarTop .mceStatusbarPathText, .mceStatusbarBottom .mceStatusbarPathText, .mceStatusbar .mceStatusbarPathText {font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 9pt; padding: 2px; line-height: 16px; overflow: visible;}
+.mceStatusbarTop {border-bottom: 1px solid #cccccc;}
+.mceStatusbarBottom {border-top: 1px solid #cccccc;}
+.mceStatusbar {border-bottom: 1px solid #cccccc;}
+.mcePathItem, .mcePathItem:link, .mcePathItem:visited, .mcePathItem:hover {text-decoration: none; font-family: 'MS Sans Serif', sans-serif, Verdana, Arial; font-size: 9pt; color: #000000;}
+.mcePathItem:hover {text-decoration: underline;}
+.mceStatusbarPathText {float: left;}
+.mceStatusbarResize {float: right; background-image: url('../images/statusbar_resize.gif'); background-repeat: no-repeat; width: 11px; height: 20px; cursor: se-resize;}
+.mceResizeBox {width: 10px; height: 10px; display: none; border: 1px dotted gray; margin: 0; padding: 0;}
+.mceEditorIframe {border: 0;}
+
+/* Button CSS rules */
+
+a.mceButtonDisabled img, a.mceButtonNormal img, a.mceButtonSelected img {width: 20px; height: 20px; cursor: default; margin-top: 1px; margin-left: 1px;}
+a.mceButtonDisabled img {border: 0 !important;}
+a.mceButtonNormal img, a.mceButtonSelected img {border: 1px solid #F0F0EE !important;}
+a.mceButtonSelected img {border: 1px solid #6779AA !important; background-color: #D4D5D8;}
+a.mceButtonNormal img:hover, a.mceButtonSelected img:hover {border: 1px solid #0A246A !important; cursor: default; background-color: #B6BDD2;}
+a.mceButtonDisabled img {-moz-opacity:0.3; opacity: 0.3; border: 1px solid #F0F0EE !important; cursor: default;}
+a.mceTiledButton img {background-image: url('../images/buttons.gif'); background-repeat: no-repeat;}
+
+/* Menu button CSS rules */
+
+span.mceMenuButton img, span.mceMenuButtonSelected img {border: 1px solid #F0F0EE; margin-left: 1px;}
+span.mceMenuButtonSelected img {border: 1px solid #6779AA; background-color: #B6BDD2;}
+span.mceMenuButtonSelected img.mceMenuButton {border: 1px solid #F0F0EE; background-color: transparent;}
+span.mceMenuButton img.mceMenuButton, span.mceMenuButtonSelected img.mceMenuButton {border-left: 0; margin-left: 0;}
+span.mceMenuButton:hover img, span.mceMenuButtonSelected:hover img {border: 1px solid #0A246A; background-color: #B6BDD2;}
+span.mceMenuButton:hover img.mceMenuButton, span.mceMenuButtonSelected:hover img.mceMenuButton {border-left: 0;}
+span.mceMenuButtonFocus img {border: 1px solid gray; border-right: 0; margin-left: 1px; background-color: #F5F4F2;}
+span.mceMenuButtonFocus img.mceMenuButton {border: 1px solid gray; border-left: 1px solid #F5F4F2; margin-left: 0;}
+span.mceMenuHover img {border: 1px solid #0A246A; background-color: #B6BDD2;}
+span.mceMenuButtonSelected.mceMenuHover img.mceMenuButton {border: 1px solid #0A246A; background-color: #B6BDD2; border-left: 0;}
+
+/* Menu */
+
+.mceMenu {position: absolute; left: 0; top: 0; display: none; z-index: 1000; background-color: white; border: 1px solid gray; font-weight: normal;}
+.mceMenu a, .mceMenuTitle, .mceMenuDisabled {display: block; width: 100%; text-decoration: none; background-color: white; font-family: Tahoma, Verdana, Arial, Helvetica; font-size: 11px; line-height: 20px; color: black;}
+.mceMenu a:hover {background-color: #B6BDD2; color: black; text-decoration: none !important;}
+.mceMenu span {padding-left: 10px; padding-right: 10px; display: block; line-height: 20px;}
+.mceMenuSeparator {border-bottom: 1px solid gray; background-color: gray; height: 1px;}
+.mceMenuTitle span {padding-left: 5px;}
+.mceMenuTitle {background-color: #DDDDDD; font-weight: bold;}
+.mceMenuDisabled {color: gray;}
+span.mceMenuSelectedItem {background-image: url('../images/menu_check.gif'); background-repeat: no-repeat; background-position: 5px 8px; padding-left: 20px;}
+span.mceMenuCheckItem {padding-left: 20px;}
+span.mceMenuLine {display: block; position: absolute; left: 0; top: -1px; background-color: #F5F4F2; width: 30px; height: 1px; overflow: hidden; padding-left: 0; padding-right: 0;}
+.mceColors table, .mceColors td {margin: 0; padding: 2px;}
+a.mceMoreColors {width: auto; padding: 0; margin: 0 3px 3px 3px; text-align: center; border: 1px solid white; text-decoration: none !important;}
+.mceColorPreview {position: absolute; overflow:hidden; left: 0; top: 0; margin-left: 3px; margin-top: 15px; width: 16px; height: 4px; background-color: red;}
+a.mceMoreColors:hover {border: 1px solid #0A246A;}
+.mceColors td a {width: 9px; height: 9px; overflow: hidden; border: 1px solid #808080;}
+
+/* MSIE 6 specific rules */
+
+* html a.mceButtonNormal img, * html a.mceButtonSelected img, * html a.mceButtonDisabled img {border: 0 !important; margin-top: 2px; margin-bottom: 1px;}
+* html a.mceButtonDisabled img {filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); border: 0 !important;}
+* html a.mceButtonDisabled {border: 1px solid #F0F0EE !important;}
+* html a.mceButtonNormal, * html a.mceButtonSelected {border: 1px solid #F0F0EE !important; cursor: default;}
+* html a.mceButtonSelected {border: 1px solid #6779AA !important; background-color: #D4D5D8;}
+* html a.mceButtonNormal:hover, * html a.mceButtonSelected:hover {border: 1px solid #0A246A !important; background-color: #B6BDD2; cursor: default;}
+* html .mceSelectList {margin-top: 2px;}
+* html span.mceMenuButton, * html span.mceMenuButtonFocus {position: relative; left: 0; top: 0;}
+* html span.mceMenuButton img, * html span.mceMenuButtonSelected img, * html span.mceMenuButtonFocus img {position: relative; top: 1px;}
+* html a.mceMoreColors {width: auto;}
+* html .mceColors td a {width: 10px; height: 10px;}
+* html .mceColorPreview {margin-left: 2px; margin-top: 14px;}
+
+/* MSIE 7 specific rules */
+
+*:first-child+html a.mceButtonNormal img, *:first-child+html a.mceButtonSelected img, *:first-child+html a.mceButtonDisabled img {border: 0 !important; margin-top: 2px; margin-bottom: 1px;}
+*:first-child+html a.mceButtonDisabled img {filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30); border: 0 !important;}
+*:first-child+html a.mceButtonDisabled {border: 1px solid #F0F0EE !important;}
+*:first-child+html a.mceButtonNormal, *:first-child+html a.mceButtonSelected {border: 1px solid #F0F0EE !important; cursor: default;}
+*:first-child+html a.mceButtonSelected {border: 1px solid #6779AA !important; background-color: #D4D5D8;}
+*:first-child+html a.mceButtonNormal:hover, *:first-child+html a.mceButtonSelected:hover {border: 1px solid #0A246A !important; background-color: #B6BDD2; cursor: default;}
+*:first-child+html .mceSelectList {margin-top: 2px;}
+*:first-child+html span.mceMenuButton, *:first-child+html span.mceMenuButtonFocus {position: relative; left: 0; top: 0;}
+*:first-child+html span.mceMenuButton img, *:first-child+html span.mceMenuButtonSelected img, *:first-child+html span.mceMenuButtonFocus img {position: relative; top: 1px;}
+*:first-child+html a.mceMoreColors {width: 137px;}
+*:first-child+html .mceColors td a {width: 10px; height: 10px;}
+*:first-child+html .mceColorPreview {margin: 0; padding-left: 4px; margin-top: 14px; width: 14px;}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/cs/about.htm
@@ -1,1 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>O TinyMCE</TITLE>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">O TinyMCE</span></td>
+    <td align="right"><a href="index.htm">Obsah</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>



+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Jdi na: <a href="index.htm">Obsah</a></td>
+    <td align="right"><a href="#">Nahoru</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/cs/common_buttons.htm
@@ -1,1 +1,171 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>

+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 

+    <td align="right"><a href="index.htm">Obsah</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<img src="../../images/spacer.gif" width="1" height="1"> 
+<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/cut.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/copy.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/paste.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/bold.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>
+    <td>Podtrhne text.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>


+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/code.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/table.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/table_insert_row_before.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/table_insert_row_after.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/table_delete_row.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/table_insert_col_before.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/table_insert_col_after.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/table_delete_col.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>

+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Jdi na: <a href="index.htm">Obsah</a></td>
+    <td align="right"><a href="#">Nahoru</a></td>
+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/cs/images/insert_image_window.png differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/cs/images/insert_link_window.png differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/cs/images/insert_table_window.png differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/cs/index.htm
@@ -1,1 +1,27 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>

+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Obsah</span></td>
+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">O TinyMCE</a></li>




+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/cs/insert_image_button.htm
@@ -1,1 +1,67 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>

+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 

+    <td align="right"><a href="index.htm">Obsah</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<img src="images/insert_image_window.png" width="348" height="290"><br>
+<br>


+<br>

+<table border="1" cellspacing="0">
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Jdi na: <a href="index.htm">Obsah</a></td>
+    <td align="right"><a href="#">Nahoru</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/cs/insert_link_button.htm
@@ -1,1 +1,35 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>

+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 

+    <td align="right"><a href="index.htm">Obsah</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<img src="images/insert_link_window.png" width="328" height="160"><br>
+<br>


+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Jdi na: <a href="index.htm">Obsah</a></td>
+    <td align="right"><a href="#">Nahoru</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/cs/insert_table_button.htm
@@ -1,1 +1,69 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>

+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 

+    <td align="right"><a href="index.htm">Obsah</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<img src="images/insert_table_window.png" width="338" height="210"><br>
+<br>

+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Sloupce</strong></td>

+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+</table>
+<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Jdi na: <a href="index.htm">Obsah</a></td>
+    <td align="right"><a href="#">Nahoru</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/cs/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: 0; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/de/about.htm
@@ -1,1 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>&Uuml;ber TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">&Uuml;ber TinyMCE</span></td>
+    <td align="right"><a href="index.htm">Inhalt</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+TinyMCE ist ein kompakter WYSIWYG-Editor f&uuml;r Webbrowser wie MSIE oder Mozilla
+der es Ihnen erm&ouml;glicht HTML-Inhalte auf eine benutzerfreundliche Weise zu

+Textverarbeitungen vorkommen und sollte einfach zu benutzen sein.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Gehe zu: <a href="index.htm">Inhaltsverzeichnis</a></td>
+    <td align="right"><a href="#">nach oben</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/de/common_buttons.htm
@@ -1,1 +1,108 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Allgemeine Schaltfl&auml;chen</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Allgemeine Schaltfl&auml;chen</span></td>
+    <td align="right"><a href="index.htm">Inhalt</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Untenstehend eine kurze Beschreibung jeder Schaltfl&auml;che.<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bold_de_se.gif" width="20" height="20"></td>
+    <td>Fetter Text.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/italic_de_se.gif" width="20" height="20"></td>
+    <td>Kursiver Text.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>
+    <td>Unterstrichener Text.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>
+    <td>Durchgestrichener Text.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>
+    <td>Linksb&uuml;ndig.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>
+    <td>Zentriert.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>
+    <td>Rechtsb&uuml;ndig.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>
+    <td>Blocksatz.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>
+    <td>Unsortierte Liste / Punktierte Liste.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>
+    <td>Sortierte Liste / Nummerierte Liste.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>
+    <td>Einzug verkleinern.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>
+    <td>Einzug vergr&ouml;ssern.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>
+    <td>Letzte Aktion r&uuml;ckg&auml;ngig machen.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>
+    <td>Letzte Aktion wiederholen.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>
+    <td>Einen neuen Hyperlink einf&uuml;gen, lesen Sie mehr &uuml;ber diese Funktion im Kapitel <a href="insert_link_button.htm">Hyperlink einf&uuml;gen</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>
+    <td>Den gegenw&auml;rtige markierten Hyperlink entfernen / Alle gegenw&auml;rtig markierten Hyperlinks entfernen.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>
+    <td>Ein neues Bild einf&uuml;gen, lesen Sie mehr &uuml;ber diese Funktion im Kapitel <a href="insert_image_button.htm">Bild einf&uuml;gen</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>
+    <td>unsauberen Code aufr&auml;umen / Entfernt ungewollte Formatierungen. Diese Funktion ist n&uuml;tzlich,
+		wenn Sie beispielsweise Inhalte aus einem Office Produkt kopieren.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>
+    <td>Zeigt diese Hilfe an.</td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Gehe zu: <a href="index.htm">Inhaltsverzeichnis</a></td>
+    <td align="right"><a href="#">nach oben</a></td>
+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/de/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/de/images/insert_link_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/de/index.htm
@@ -1,1 +1,25 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Inhaltsverzeichnis der Hilfe</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Inhaltsverzeichnis</span></td>
+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Klicken Sie auf die untenstehenden Links um die verschiedenen Bereiche der Hilfe zu betrachten. 
+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">&Uuml;ber TinyMCE</a></li>
+  <li class="toc_li"><a href="common_buttons.htm">Allgemeine Schaltfl&auml;chen</a></li>
+  <li class="toc_li"><a href="insert_image_button.htm">Schaltfl&auml;che Bild einf&uuml;gen</a></li>
+  <li class="toc_li"><a href="insert_link_button.htm">Schaltfl&auml;che Hyperlink einf&uuml;gen</a></li>
+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/de/insert_image_button.htm
@@ -1,1 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Schaltfl&auml;che Bild einf&uuml;gen</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Schaltfl&auml;che Bild einf&uuml;gen</span></td>
+    <td align="right"><a href="index.htm">Inhalt</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Die Schaltfl&auml;che &quot;Bild einf&uuml;gen&quot; &ouml;ffnet das unten gezeigte Fenster.<br>
+<br>
+<img src="images/insert_image_window.gif" width="350" height="166"><br>
+<br>

+Beschreibung des Bildes, welche dann als alternative Textbeschreibung verwendet wird.
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Gehe zu: <a href="index.htm">Inhaltsverzeichnis</a></td>
+    <td align="right"><a href="#">nach oben</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/de/insert_link_button.htm
@@ -1,1 +1,35 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Schaltfl&auml;che Hyperlink einf&uuml;gen</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Schaltfl&auml;che Hyperlink einf&uuml;gen</span></td>
+    <td align="right"><a href="index.htm">Inhalt</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Diese Schaltfl&auml;che &ouml;ffnet das Fenster f&uuml;r die &quot;Hyperlink einf&uuml;gen / bearbeiten&quot;-Funktion.<br>
+<br>
+<img src="images/insert_link_window.gif" width="330" height="166"><br>
+<br>


+ge&ouml;ffnet werden soll.
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Gehe zu: <a href="index.htm">Inhaltsverzeichnis</a></td>
+    <td align="right"><a href="#">nach oben</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/de/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/en/about.htm
@@ -1,1 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>About TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">About TinyMCE</span></td>
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+TinyMCE is a small WYSIWYG editor control for web browsers such as MSIE or Mozilla 
+that enables you to edit HTML contents in a more user friendly way. It has common 
+features that are found in most word processors and should not be difficult to 
+use.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Go to: <a href="index.htm">Table of contents</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/en/common_buttons.htm
@@ -1,1 +1,163 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Common buttons</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Common buttons</span></td>
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Below is a short description about each button.
+<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bold.gif" width="20" height="20" alt="Bold text icon" /></td>
+    <td>Bold text style (Ctrl+B).</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/italic.gif" width="20" height="20" alt="Italic text icon" /></td>
+    <td>Italic text style (Ctrl+I).</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20" alt="Underline text icon." /></td>
+    <td>Underline text style (Ctrl+U).</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20" alt="Strikethrough text icon." /></td>
+    <td>Strikethrough text style.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/justifyleft.gif" width="20" height="20" alt="Align left icon." /></td>
+    <td>Align left.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/justifycenter.gif" width="20" height="20" alt="Align center icon." /></td>
+    <td>Align center.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/justifyright.gif" width="20" height="20" alt="Align right icon." /></td>
+    <td>Align right.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/justifyfull.gif" width="20" height="20" alt="Align full icon." /></td>
+    <td>Align full.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20" alt="Unordered list/bullet list icon." /></td>
+    <td>Unordered list/bullet list.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20" alt="Ordered list/numbered list icon." /></td>
+    <td>Ordered list/numbered list</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20" alt="Outdent/decrease indentation icon." /></td>
+    <td>Outdent/decrease indentation.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20" alt="Indent/increase indentation icon." /></td>
+    <td>Indent/increase indentation.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20" alt="Undo the last operation." /></td>
+    <td>Undo the last operation (Ctrl+Z).</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20" alt="Redo the last operation icon." /></td>
+    <td>Redo the last operation (Ctrl+Y).</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20" alt="Insert a new link icon." /></td>
+    <td>Insert a new link, read more about this function in the <a href="insert_link_button.htm">Insert 
+      link section</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20" alt="Unlinks the current selection icon." /></td>
+    <td>Unlinks the current selection/removes all selected links.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/anchor.gif" width="20" height="20" alt="Insert a new anchor icon." /></td>
+    <td>Insert a new anchor, read more about this function in the <a href="insert_anchor_button.htm">Insert anchor section.</a></td>
+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20" alt="Insert a new image icon." /></td>
+    <td>Insert a new image, read more about this function in the <a href="insert_image_button.htm">Insert 
+      image section</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20" alt="Cleanup code icon." /></td>
+    <td>Cleanup code/Removes unwanted formating. This function is useful when 
+      you copy contents from for example a office product.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20" alt="Show help icon." /></td>
+    <td>Shows this help window.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/code.gif" width="20" height="20" alt="Source code editor icon." /></td>
+    <td>Opens HTML source code editor. </td>
+  </tr>
+  <tr>
+    <td><img src="../../../../plugins/table/images/table.gif" width="20" height="20" alt="Insert table icon." /></td>
+    <td>Inserts a new table at the current location. </td>
+  </tr>
+  <tr>
+    <td><img src="../../../../plugins/table/images/table_insert_row_before.gif" width="20" height="20" alt="Adds a row above icon." /></td>
+    <td>Adds a row above the current one. </td>
+  </tr>
+  <tr>
+    <td><img src="../../../../plugins/table/images/table_insert_row_after.gif" width="20" height="20" alt="Adds a row under icon." /></td>
+    <td>Adds a row under the current one. </td>
+  </tr>
+  <tr>
+    <td><img src="../../../../plugins/table/images/table_delete_row.gif" width="20" height="20" alt="Remove row icon." /></td>
+    <td>Removes the row. </td>
+  </tr>
+  <tr>
+    <td><img src="../../../../plugins/table/images/table_insert_col_before.gif" width="20" height="20" alt="Add column before icon." /></td>
+    <td>Adds a column before the current one.</td>
+  </tr>
+  <tr>
+    <td><img src="../../../../plugins/table/images/table_insert_col_after.gif" width="20" height="20" alt="Add column after icon." /></td>
+    <td>Adds a column after the current one.</td>
+  </tr>
+  <tr>
+    <td><img src="../../../../plugins/table/images/table_delete_col.gif" width="20" height="20" alt="Remove column icon." /></td>
+    <td>Removes the current column.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/hr.gif" width="20" height="20" alt="Insert horizontal ruler icon." /></td>
+    <td>Inserts a new horizontal ruler </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/removeformat.gif" width="20" height="20" alt="Remove formatting icon." /></td>
+    <td>Removes formatting from the selection. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/sub.gif" width="20" height="20" alt="Subscript icon." /></td>
+    <td>Makes the selection to be subscript. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/sup.gif" width="20" height="20" alt="Superscript icon." /></td>
+    <td>Makes the selection to be superscripted. </td>
+  </tr>
+</table>
+<br>
+<hr noshade="noshade" />
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Go to: <a href="index.htm">Table of contents</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/en/create_accessible_content.htm
@@ -1,1 +1,46 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Insert table button</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Create accessible content</span></td>
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+  </tr>
+</table>
+<hr noshade>
+<p>TinyMCE can create HTML content that will be accessible to all users, including those with disabilities using assistive technologies, as well as those using text-based browsers, or those browsing the Web with images turned off. </p>
+
+<p><strong>Things you can do to make your content accessible:</strong></p>
+<ol>
+<li><strong>Include an Image Description:</strong> Blind users, or others who are unable to view images, will rely on the Image Description (or Alt text) to take the place of the image. If an image contains no meaning, such as a decoration or a spacer image, leave the Image Description empty. TinyMCE will then insert an empty Alt text attribute that will force assistive technologies to ignore the image. <br /><br /></li>
+
+<li> <strong>Add Scope to data table header cells:</strong> In the table cell editor dialog window, choose a Scope when creating Header cells so the column or row label in that cell becomes explicitely associated with its data cells. Table cell headers will then be announced with each data cell, making it easier for blind users using a screen reader to understand what the content of each cell represents. <br /><br /></li>
+
+<li><strong> Structure content with properly nested headings:</strong> In the format selection menu choose Heading 1 to Heading 6 to represent headings in your content,  rather than using other font formating options. Blind users using a screen reader can then extract the headings from the page to generate a summary of the content it contains, and use those headings to navigate quickly to subsections within the page.<br /><br /></li>
+
+<li><strong> Include alternate content:</strong> Create an alternate page for non-HTML content such as Flash, Java applets, or  embedded movies. This might be a static image, with a description of the image, and a description of the content that would have appeared in its place. An alternate HTML page could also be created, and a link to it included next to the non-HTML object. This will ensure that the content will be accessible to users of assistive technologies that can not view or play the content, and ensure the content will be available to those who do not have the appropriate plugin or helper application installed.<br /><br /></li>
+
+<li><strong> Check accessbility: </strong> When the AChecker plugin is installed with TinyMCE, click on the Check Accessibility button to generate a report of potential accessibility problems.<br /><br /></li>
+
+</ol>
+
+<p>See the <a href="http://checker.atrc.utoronto.ca" target="_new">AChecker Web Site</a> for further details about creating content that will be accessible to all users.<br />
+</p>
+
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Go to: <a href="index.htm">Table of contents</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+
+<br>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/en/images/insert_anchor_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/en/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/en/images/insert_link_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/en/images/insert_table_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/en/index.htm
@@ -1,1 +1,28 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Help Index</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Table of contents</span></td>
+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Click the links below to go to the different help sections. 
+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">About TinyMCE</a></li>
+  <li class="toc_li"><a href="common_buttons.htm">Common buttons</a></li>
+  <li class="toc_li"><a href="insert_image_button.htm">Insert image button</a></li>
+  <li class="toc_li"><a href="insert_link_button.htm">Insert link button</a></li>
+  <li class="toc_li"><a href="insert_anchor_button.htm">Insert anchor button</a></li>
+  <li class="toc_li"><a href="insert_table_button.htm">Insert table button</a></li>
+ <li class="toc_li"><a href="create_accessible_content.htm">Create accessible content</a></li>
+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/en/insert_anchor_button.htm
@@ -1,1 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Insert anchor button</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Insert anchor button</span></td>
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+This button opens a new window with the insert/edit anchor function.<br>
+<br>
+<img src="images/insert_anchor_window.gif" width="330" height="139" alt="Anchor dialog/window" /><br>
+<br>
+There are one field in this window, this is where you enter the name of you anchor point. Remember the anchor name needs to be unique. <br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Go to: <a href="index.htm">Table of contents</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/en/insert_image_button.htm
@@ -1,1 +1,66 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Insert image button</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Insert image button</span></td>
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+The insert image button opens the window shown below.<br>
+<br>
+<img src="images/insert_image_window.gif" alt="Insert image dialog/window" /><br>
+<br>
+You simply enter a URL to the image you want to link to and enter a image description, 
+this is then displayed as an alternative text descripton of the image on the page.<br>
+<br>
+<strong>Field descriptions:</strong><br>
+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Image URL </strong></td>
+    <td>URL/path to the image.</td>
+  </tr>
+  <tr>
+    <td width="150"><strong>Image description </strong></td>
+    <td>Alternative description of image contents.</td>
+  </tr>
+  <tr>
+    <td><strong>Dimentions</strong></td>
+    <td>Image width/height. </td>
+  </tr>
+  <tr>
+    <td><strong>Alignment</strong></td>
+    <td>Image alignment, useful when wrapping text around images.</td>
+  </tr>
+  <tr>
+    <td><strong>Border</strong></td>
+    <td>Border thickness. </td>
+  </tr>
+  <tr>
+    <td><strong>VSpace</strong></td>
+    <td>Vertical space, useful when wrapping text around images.</td>
+  </tr>
+  <tr>
+    <td><strong>HSpace</strong></td>
+    <td>Horizontal space, useful when wrapping text around images.</td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Go to: <a href="index.htm">Table of contents</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/en/insert_link_button.htm
@@ -1,1 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Insert link button</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Insert link button</span></td>
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+This button opens a new window with the insert/edit link function.<br>
+<br>
+<img src="images/insert_link_window.gif" width="330" height="159" alt="Insert link dialog/window" /><br>
+<br>
+There are two fields in this window the first one &quot;Link URL&quot; is the 
+URL of the link. The target enables you to select how the link is to be opened.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Go to: <a href="index.htm">Table of contents</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/en/insert_table_button.htm
@@ -1,1 +1,72 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Insert table button</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Insert table button</span></td>
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+The insert table button opens the window shown below. This action enables you to create tables. <br>
+<br>
+<img src="images/insert_table_window.gif" width="340" height="229" alt="Image of table window" /><br>
+<br>
+<strong>Field descriptions:</strong><br>
+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Columns</strong></td>
+    <td>Number of columns in the  table. </td>
+  </tr>
+  <tr>
+    <td width="150"><strong>Rows</strong></td>
+    <td>Number of rows in the new table.</td>
+  </tr>
+  <tr>
+    <td><strong>Cellpadding</strong></td>
+    <td>Cellpadding of the table . </td>
+  </tr>
+  <tr>
+    <td><strong>Cellspacing</strong></td>
+    <td>Cellspacing of the table .</td>
+  </tr>
+  <tr>
+    <td><strong>Alignment</strong></td>
+    <td>Table alignment . </td>
+  </tr>
+  <tr>
+    <td><strong>Border</strong></td>
+    <td>Border thinkness of table.</td>
+  </tr>
+  <tr>
+    <td><strong>Width</strong></td>
+    <td>Width in pixels of table .</td>
+  </tr>
+  <tr>
+    <td><strong>Height</strong></td>
+    <td>Height in pixels of table.</td>
+  </tr>
+  <tr>
+    <td><strong>Class</strong></td>
+    <td>Style or CSS class of table.</td>
+  </tr>
+</table>
+<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Go to: <a href="index.htm">Table of contents</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/en/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/es/about.htm
@@ -1,1 +1,29 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Acerca de TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Acerca de  TinyMCE</span></td>
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+TinyMCE es un editor WYSIWYG para navegadores como  MSIE o Mozilla que te permite editar el contenido HTML de una manera m&aacute;s amigable. Tiene la mayor&iacute;a de las opciones de un procesador de texto y no deber&iacute;a ser dificil de usar.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Ir a: <a href="index.htm">Lista de contenidos</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/es/common_buttons.htm
@@ -1,1 +1,156 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Botones de uso com&uacute;n</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Botones de uso com&uacute;n</span></td>
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Peque&ntilde;a descripci&oacute;n de cada boto&oacute;n.<img src="../../images/spacer.gif" width="1" height="1"> 
+<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bold.gif" width="20" height="20"></td>
+    <td>Texto en negrita.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>
+    <td>Texto en cursiva.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>
+    <td>Texto subrayado.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>
+    <td>Texto tachado.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>
+    <td>Alinear a la izquierda.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>
+    <td>Alinear al centro.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>
+    <td>Alinear a la derecha.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>
+    <td>Alinear justificado.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>
+    <td>Lista desordenada/lista por puntos.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>
+    <td>Lista ordenada/lista numerada</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>
+    <td>Disminuir la sangr&iacute;a.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>
+    <td>Aumentar la sangr&iacute;a.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>
+    <td>Deshacer la &uacute;ltima operaci&oacute;n.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>
+    <td>Rehacer la &uacute;ltima operaci&oacute;n.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>
+    <td>Insertar un enlace, m&aacute;s informaci&oacute;n en <a href="insert_link_button.htm">insertar enlace</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>
+    <td>Quita el enlace al texto seleccionado.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>
+    <td>Insertar un imagen, m&aacute;s informaci&oacute;n en <a href="insert_image_button.htm">insertar imagen</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>
+    <td>Limpiar c&oacute;digo, esta funci&oacute;n es &uacute;til cuando copias el c&oacute;digo de otra p&aacute;gina.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>
+    <td>Muestra esta ventana de ayuda.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/code.gif" width="20" height="20"></td>
+    <td>Abre el editor de HTML. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table.gif" width="20" height="20"></td>
+    <td>Inserta una nueva tabla de 2x2. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>
+    <td>A&ntilde;ade una fila encima. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>
+    <td>A&ntilde;ade una fila debajo. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>
+    <td>Elimina una fila. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>
+    <td>A&ntilde;ade una columna antes de la actual .</td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>
+    <td>A&ntilde;ade una columna despu&eacute;s de la actual.</td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>
+    <td>Elimina la columna actual.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>
+    <td>Inserta un separador horizontal </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>
+    <td>Elimina el formato de la selecci&oacute;n. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>
+    <td>Sub&iacute;ndice. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>
+    <td>Super&iacute;ndice. </td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Ir a: <a href="index.htm">Lista de contenidos</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/es/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/es/images/insert_link_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/es/images/insert_table_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/es/index.htm
@@ -1,1 +1,26 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>&Iacute;ndice de la ayuda</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Lista de contenidos</span></td>
+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Selecciona una secci&oacute;n para ver la ayuda. 
+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">Acerca de  TinyMCE</a></li>
+  <li class="toc_li"><a href="common_buttons.htm">Botones</a></li>
+  <li class="toc_li"><a href="insert_image_button.htm">Insertar imagen</a></li>
+  <li class="toc_li"><a href="insert_link_button.htm">Insertar enlaces</a></li>
+  <li class="toc_li"><a href="insert_table_button.htm">Insertar tabla</a></li>
+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/es/insert_image_button.htm
@@ -1,1 +1,65 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Insertar imagen</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Insertar imagen</span></td>
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+El bot&oacute;n insertar imagen abre la siguiente ventana.<br>
+<br>
+<img src="images/insert_image_window.gif"><br>
+<br>
+Tu s&oacute;lo tienes que escribir la URL de la imagen que quieres que aparezca y escribir una descripci&oacute;n de esta, esta descripci&oacute;n aparecera como un texto alternativo que describa la imagen.<br>
+<br>
+<strong>Descripci&oacute;n de los campos:</strong><br>
+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Image URL </strong></td>
+    <td>URL de la imagen.</td>
+  </tr>
+  <tr>
+    <td width="150"><strong>Image description </strong></td>
+    <td>Descripci&oacute;n alternativa del contenido de la imagen.</td>
+  </tr>
+  <tr>
+    <td><strong>Dimentions</strong></td>
+    <td>Altura/anchura de la imagen. </td>
+  </tr>
+  <tr>
+    <td><strong>Alignment</strong></td>
+    <td>Alineamiento, &uacute;til cuando colocas texto alrededor de la imagen.</td>
+  </tr>
+  <tr>
+    <td><strong>Border</strong></td>
+    <td>Anchura del borde. </td>
+  </tr>
+  <tr>
+    <td><strong>VSpace</strong></td>
+    <td>Espacio vertical, &uacute;til cuando colocas texto alrededor de la imagen.</td>
+  </tr>
+  <tr>
+    <td><strong>HSpace</strong></td>
+    <td>Espacio horizontal, &uacute;til cuando colocas texto alrededor de la imagen.</td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Ir a: <a href="index.htm">Lista de contenidos</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/es/insert_link_button.htm
@@ -1,1 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Insertar enlaces</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Insertar enlaces</span></td>
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Este bot&oacute;n abre una nueva ventana con la funci&oacute;n insertar/editar enlace.<br>
+<br>
+<img src="images/insert_link_window.gif" width="330" height="159"><br>
+<br>
+Hay dos campos en esta ventana, el primero &quot;Link URL&quot; es donde hay que escribir la direcci&oacute;n del enlace. El segundo &quot;Target&quot; indica c&oacute;mo se abrir&aacute; el enlace.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Ir a: <a href="index.htm">Lista de contenidos</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/es/insert_table_button.htm
@@ -1,1 +1,68 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Insertar tabla</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Insertar tabla</span></td>
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+El bot&oacute;n insertar tabla abre la siguiente ventana. Esta acci&ocaute;n te permite crear tablas.<br>
+<br>
+<img src="images/insert_table_window.gif" width="340" height="209"><br>
+<br>
+<strong>Descripci&oacute;n de los campos:</strong><br>
+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Columns</strong></td>
+    <td>N&uacute;mero de columnas.</td>
+  </tr>
+  <tr>
+    <td width="150"><strong>Rows</strong></td>
+    <td>NA&uacute;mero de filas.</td>
+  </tr>
+  <tr>
+    <td><strong>Cellpadding</strong></td>
+    <td>Desplazamiento entre celdas . </td>
+  </tr>
+  <tr>
+    <td><strong>Cellspacing</strong></td>
+    <td>Espacio entre celdas .</td>
+  </tr>
+  <tr>
+    <td><strong>Alignment</strong></td>
+    <td>Alineamiento de la tabla. </td>
+  </tr>
+  <tr>
+    <td><strong>Border</strong></td>
+    <td>Anchura del borde de la tabla.</td>
+  </tr>
+  <tr>
+    <td><strong>Width</strong></td>
+    <td>Anchura de la tabla en pixels .</td>
+  </tr>
+  <tr>
+    <td><strong>Height</strong></td>
+    <td>Altura de la tabla en pixels.</td>
+  </tr>
+</table>
+<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Ir a: <a href="index.htm">Tabla de contenidos</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/es/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fi/about.htm
@@ -1,1 +1,29 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>About TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 

+    <td align="right"><a href="#">Alkuun</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fi/common_buttons.htm
@@ -1,1 +1,157 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Common buttons</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Yleiset napit</span></td>

+  </tr>
+</table>
+<hr noshade>
+<br>
+Alla on lyhyt selostus kaikista toimintonapeista.<img src="../../images/spacer.gif" width="1" height="1"> 
+<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bold.gif" width="20" height="20"></td>
+    <td>Lihavointi.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>
+    <td>Kursivointi.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>
+    <td>Alleviivaus.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>
+    <td>Yliviivaus.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>
+    <td>vasen tasaus.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>
+    <td>Keskitys.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>
+    <td>Oikea tasaus.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>
+    <td>Pakotettu tasaus.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>
+    <td>Peruuta viimeinen muutos.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>
+    <td>Tee uudelleen viimeinen peruutettu muutos.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/code.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../images/table.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>
+    <td>Poista valittu rivi. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>
+    <td>Poistaa valitun sarakkeen.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>

+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 

+    <td align="right"><a href="#">Alkuun</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fi/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fi/images/insert_link_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fi/images/insert_table_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fi/index.htm
@@ -1,1 +1,26 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>

+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 

+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<ul class="toc_ul">

+  <li class="toc_li"><a href="common_buttons.htm">Toimintonapit</a></li>



+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fi/insert_image_button.htm
@@ -1,1 +1,66 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Insert image button</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 

+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<img src="images/insert_image_window.gif"><br>
+<br>

+<br>
+<br>
+<strong>Kenttien selitykset:</strong><br>
+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Kuvan URL</strong></td>
+    <td>Kuvan URL tai polku.</td>
+  </tr>
+  <tr>
+    <td width="150"><strong>Kuvan selite</strong></td>

+  </tr>
+  <tr>
+    <td><strong>Ulottuvuudet</strong></td>
+    <td>Kuvan leveys ja korkeus. </td>
+  </tr>
+  <tr>
+    <td><strong>Asettelu</strong></td>

+  </tr>
+  <tr>
+    <td><strong>Reuna</strong></td>

+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 

+    <td align="right"><a href="#">Alkuun</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fi/insert_link_button.htm
@@ -1,1 +1,36 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Insert link button</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<img src="images/insert_link_window.gif" width="336" height="208"><br>
+<br>
+


+The target enables you to select how the link is to be opened.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 

+    <td align="right"><a href="#">Alkuun</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fi/insert_table_button.htm
@@ -1,1 +1,68 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Insert table button</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<img src="images/insert_table_window.gif" width="340" height="209"><br>
+<br>
+<strong>Kenttien selitteet:</strong><br>
+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Sarakkeet</strong></td>

+  </tr>
+  <tr>
+    <td width="150"><strong>Rivit</strong></td>

+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>
+    <td><strong>Asettelu</strong></td>
+    <td>Taulun asettelu. </td>
+  </tr>
+  <tr>
+    <td><strong>Reuna</strong></td>
+    <td>Reunan leveys.</td>
+  </tr>
+  <tr>
+    <td><strong>Leveys</strong></td>

+  </tr>
+  <tr>
+    <td><strong>Korkeus</strong></td>

+  </tr>
+</table>
+<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 

+    <td align="right"><a href="#">Alkuun</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fi/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr/about.htm
@@ -1,1 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>&Agrave; propos de TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">&Agrave; propos de TinyMCE</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+TinyMCE est un petit &eacute;diteur "WYSIWYG" pour page Web comme MSIE ou Mozilla qui
+vous permet de manipuler du contenu HTML d'une fa&ccedil;on plus intuitive.
+Il est simple d'utilisation et poss&egrave;de les fonctionalit&eacute;s ls plus r&eacute;pendues que l'on peut retrouver dans
+les traitements de texte.
+<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr/common_buttons.htm
@@ -1,1 +1,161 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Outils communs</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Outils communs</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Ci-dessous une courte description de chacuns des outils.<img src="../../images/spacer.gif" width="1" height="1"> 
+<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bold_fr.gif" width="20" height="20"></td>
+    <td>Met le texte s&eacute;lectionn&eacute; en gras.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>
+    <td>Met le texte s&eacute;lectionn&eacute; en italique.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>
+    <td>Souligne le texte s&eacute;lectionn&eacute;.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>
+    <td>Barre le texte s&eacute;lectionn&eacute;.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>
+    <td>Alignement &agrave; gauche.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>
+    <td>Alignement au centr&eacute;.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>
+    <td>Alignement &agrave; droite.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>
+    <td>Texte justifi&eacute;.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>
+    <td>Liste &agrave; puces.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>
+    <td>Liste num&eacute;rot&eacute;e</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>
+    <td>R&eacute;duit l'indentation.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>
+    <td>Augmente l'indentation.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>
+    <td>Annule la derni&egrave;re op&eacute;ration.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>
+    <td>Refait la derni&egrave;re op&eacute;ration annul&eacute;e.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>
+    <td>Ins&egrave;re ou modifie un hyperlien. Allez &agrave; la page <a href="insert_link_button.htm">
+        Outil d'ajout d'hyperliens</a> pour plus de d&eacute;tails.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>
+    <td>Efface les hyperliens qui sont s&eacute;lection&eacute;es.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>
+    <td>Ins&egrave;re ou modifie une image. Allez &agrave; la page <a href="insert_image_button.htm">
+        Outil d'ajout d'images</a> pour plus de d&eacute;tails.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>
+    <td>Nettoie le code et retire les param&egrave;tres non d&eacute;sir&eacute;s.  Cet outil
+    est tr&egrave;s utile lorsque vous copiez du contenu provenant de logiciels
+    de bureatique.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>
+    <td>Affiche cette page d'aide.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/code.gif" width="20" height="20"></td>
+    <td>Ouvre un &eacute;diteur permettant de modifier le code HTML. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table.gif" width="20" height="20"></td>
+    <td>Ins&egrave;re un nouveau tableau &agrave; la position actuelle.  Allez &agrave; la page <a href="insert_table_button.htm">
+        Outil d'ajout de tableau</a> pour plus de d&eacute;tails.</td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>
+    <td>Ajoute une ligne au tableau avant la ligne courante. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>
+    <td>Ajoute une ligne au tableau apr&egrave;s la ligne courante. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>
+    <td>Supprime la ligne courante. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>
+    <td>Ajoute une colonne au tableau avant la colonne courante. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>
+    <td>Ajoute une colonne au tableau apr&egrave;s la colonne courante. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>
+    <td>Supprime la colonne courante. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>
+    <td>Ins&egrave;re un s&eacute;parateur horizontal. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>
+    <td>Supprime les formattages du texte s&eacute;lectionn&eacute;. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>
+    <td>Transforme le texte s&eacute;lectionn&eacute; en texte souscrit. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>
+    <td>Transforme le texte s&eacute;lectionn&eacute; en indice sup&eacute;rieur. </td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr/images/insert_link_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr/images/insert_table_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr/index.htm
@@ -1,1 +1,26 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Table des mati&egrave;res de l'aide</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Table des mati&egrave;res</span></td>
+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Faites votre s&eacute;lection parmis les th&egrave;mes suivants:
+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">&Agrave; propos de TinyMCE</a></li>
+  <li class="toc_li"><a href="common_buttons.htm">Outils communs</a></li>
+  <li class="toc_li"><a href="insert_image_button.htm">Outil d'ajout d'images</a></li>
+  <li class="toc_li"><a href="insert_link_button.htm">Outil d'ajout d'hyperliens</a></li>
+  <li class="toc_li"><a href="insert_table_button.htm">Outil d'ajout de tableau</a></li>
+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr/insert_image_button.htm
@@ -1,1 +1,67 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Outil d'ajout d'images</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Outil d'ajout d'images</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+L'outil d'ajout d'images ouvre la fen&ecirc;tre ci-dessous.<br>
+<br>
+<img src="images/insert_image_window.gif"><br>
+<br>
+Vous entrez tout simplement l'adresse de l'image que vous d&eacute;sirez ajouter et
+entrez une description facultative.  La description sera affich&eacute;e en texte alternatif
+sur l'image lorsqu'elle sera publi&eacute;e.<br>
+<br>
+<strong>Description des champs:</strong><br>
+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Adresse de l'image </strong></td>
+    <td>Adresse URL de l'image &agrave; ins&eacute;rer.</td>
+  </tr>
+  <tr>
+    <td width="150"><strong>Description de l'image </strong></td>
+    <td>Description alternative de l'image.</td>
+  </tr>
+  <tr>
+    <td><strong>Dimensions</strong></td>
+    <td>Largeur et Hauteur de l'image en pixel. </td>
+  </tr>
+  <tr>
+    <td><strong>Alignement</strong></td>
+    <td>Alignement de l'image. Tr&egrave;s utile pour faire contourner le texte autour des images.</td>
+  </tr>
+  <tr>
+    <td><strong>Bordure</strong></td>
+    <td>&Eacute;paisseur en pixel de la bordure. </td>
+  </tr>
+  <tr>
+    <td><strong>VSpace</strong></td>
+    <td>Espacement vertical. Tr&egrave;s utile pour faire contourner le texte autour des images.</td>
+  </tr>
+  <tr>
+    <td><strong>HSpace</strong></td>
+    <td>Espacement horizontal. Tr&egrave;s utile pour faire contourner le texte autour des images.</td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr/insert_link_button.htm
@@ -1,1 +1,35 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Outil d'ajout d'hyperliens</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Outil d'ajout d'hyperliens</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+L'outil d'ajout d'hyperlien ouvre la fen&ecirc;tre ci-dessous.<br>
+<br>
+<img src="images/insert_link_window.gif"><br>
+<br>
+Il y a deux champs dans cette fen&ecirc;tre. L'Adresse URL est l'adresse
+de l'hyperlien.  La destination vous permet de choisir de quelle fa&ccedil;on
+l'hyperlien sera ouvert.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr/insert_table_button.htm
@@ -1,1 +1,72 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Outil d'ajout de tableau</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Outil d'ajout de tableau</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<img src="images/insert_table_window.gif"><br>
+<br>
+<strong>Description des champs:</strong><br>
+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Colonnes</strong></td>
+    <td>Nombre de colonnes du tableau. </td>
+  </tr>
+  <tr>
+    <td width="150"><strong>Lignes</strong></td>
+    <td>Nombre de lignes du tableau. </td>
+  </tr>
+  <tr>
+    <td><strong>Cellpadding</strong></td>

+  </tr>
+  <tr>
+    <td><strong>Cellspacing</strong></td>
+    <td>Espacement entre les cellules du tableau. </td>
+  </tr>
+  <tr>
+    <td><strong>Alignement</strong></td>
+    <td>Alignement du tableau. </td>
+  </tr>
+  <tr>
+    <td><strong>Bordure</strong></td>

+  </tr>
+  <tr>
+    <td><strong>Largeur</strong></td>
+    <td>Largeur en pixel du tableau.</td>
+  </tr>
+  <tr>
+    <td><strong>Hauteur</strong></td>
+    <td>Hauteur en pixel du tableau.</td>
+  </tr>
+  <tr>
+    <td><strong>Classe CSS</strong></td>
+    <td>Nom de la classe CSS pour appliquer un style.</td>
+  </tr>
+</table>
+<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr_ca/about.htm
@@ -1,1 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>&Agrave; propos de TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">&Agrave; propos de TinyMCE</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+TinyMCE est un petit &eacute;diteur "WYSIWYG" pour page Web comme MSIE ou Mozilla qui
+vous permet de manipuler du contenu HTML d'une fa&ccedil;on plus intuitive.
+Il est simple d'utilisation et poss&egrave;de les fonctionalit&eacute;s ls plus r&eacute;pendues que l'on peut retrouver dans
+les traitements de texte.
+<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr_ca/common_buttons.htm
@@ -1,1 +1,161 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Outils communs</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Outils communs</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Ci-dessous une courte description de chacuns des outils.<img src="../../images/spacer.gif" width="1" height="1"> 
+<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bold_fr.gif" width="20" height="20"></td>
+    <td>Met le texte s&eacute;lectionn&eacute; en gras.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>
+    <td>Met le texte s&eacute;lectionn&eacute; en italique.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>
+    <td>Souligne le texte s&eacute;lectionn&eacute;.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>
+    <td>Barre le texte s&eacute;lectionn&eacute;.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>
+    <td>Alignement &agrave; gauche.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>
+    <td>Alignement au centr&eacute;.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>
+    <td>Alignement &agrave; droite.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>
+    <td>Texte justifi&eacute;.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>
+    <td>Liste &agrave; puces.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>
+    <td>Liste num&eacute;rot&eacute;e</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>
+    <td>R&eacute;duit l'indentation.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>
+    <td>Augmente l'indentation.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>
+    <td>Annule la derni&egrave;re op&eacute;ration.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>
+    <td>Refait la derni&egrave;re op&eacute;ration annul&eacute;e.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>
+    <td>Ins&egrave;re ou modifie un hyperlien. Allez &agrave; la page <a href="insert_link_button.htm">
+        Outil d'ajout d'hyperliens</a> pour plus de d&eacute;tails.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>
+    <td>Efface les hyperliens qui sont s&eacute;lection&eacute;es.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>
+    <td>Ins&egrave;re ou modifie une image. Allez &agrave; la page <a href="insert_image_button.htm">
+        Outil d'ajout d'images</a> pour plus de d&eacute;tails.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>
+    <td>Nettoie le code et retire les param&egrave;tres non d&eacute;sir&eacute;s.  Cet outil
+    est tr&egrave;s utile lorsque vous copiez du contenu provenant de logiciels
+    de bureatique.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>
+    <td>Affiche cette page d'aide.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/code.gif" width="20" height="20"></td>
+    <td>Ouvre un &eacute;diteur permettant de modifier le code HTML. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table.gif" width="20" height="20"></td>
+    <td>Ins&egrave;re un nouveau tableau &agrave; la position actuelle.  Allez &agrave; la page <a href="insert_table_button.htm">
+        Outil d'ajout de tableau</a> pour plus de d&eacute;tails.</td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>
+    <td>Ajoute une ligne au tableau avant la ligne courante. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>
+    <td>Ajoute une ligne au tableau apr&egrave;s la ligne courante. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>
+    <td>Supprime la ligne courante. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>
+    <td>Ajoute une colonne au tableau avant la colonne courante. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>
+    <td>Ajoute une colonne au tableau apr&egrave;s la colonne courante. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>
+    <td>Supprime la colonne courante. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>
+    <td>Ins&egrave;re un s&eacute;parateur horizontal. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>
+    <td>Supprime les formattages du texte s&eacute;lectionn&eacute;. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>
+    <td>Transforme le texte s&eacute;lectionn&eacute; en texte souscrit. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>
+    <td>Transforme le texte s&eacute;lectionn&eacute; en indice sup&eacute;rieur. </td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr_ca/images/insert_anchor_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr_ca/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr_ca/images/insert_link_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr_ca/images/insert_table_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr_ca/index.htm
@@ -1,1 +1,26 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Table des mati&egrave;res de l'aide</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Table des mati&egrave;res</span></td>
+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Faites votre s&eacute;lection parmis les th&egrave;mes suivants:
+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">&Agrave; propos de TinyMCE</a></li>
+  <li class="toc_li"><a href="common_buttons.htm">Outils communs</a></li>
+  <li class="toc_li"><a href="insert_image_button.htm">Outil d'ajout d'images</a></li>
+  <li class="toc_li"><a href="insert_link_button.htm">Outil d'ajout d'hyperliens</a></li>
+  <li class="toc_li"><a href="insert_table_button.htm">Outil d'ajout de tableau</a></li>
+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr_ca/insert_anchor_button.htm
@@ -1,1 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Outil d'ajout d'ancres</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Outil d'ajout d'ancres</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+L'outil d'ajout d'ancres ouvre la fen&ecirc;tre ci-dessous.<br>
+<br>
+<img src="images/insert_anchor_window.gif"><br>
+<br>

+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr_ca/insert_image_button.htm
@@ -1,1 +1,67 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Outil d'ajout d'images</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Outil d'ajout d'images</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+L'outil d'ajout d'images ouvre la fen&ecirc;tre ci-dessous.<br>
+<br>
+<img src="images/insert_image_window.gif"><br>
+<br>
+Vous entrez tout simplement l'adresse de l'image que vous d&eacute;sirez ajouter et
+entrez une description facultative.  La description sera affich&eacute;e en texte alternatif
+sur l'image lorsqu'elle sera publi&eacute;e.<br>
+<br>
+<strong>Description des champs:</strong><br>
+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Adresse de l'image </strong></td>
+    <td>Adresse URL de l'image &agrave; ins&eacute;rer.</td>
+  </tr>
+  <tr>
+    <td width="150"><strong>Description de l'image </strong></td>
+    <td>Description alternative de l'image.</td>
+  </tr>
+  <tr>
+    <td><strong>Dimensions</strong></td>
+    <td>Largeur et Hauteur de l'image en pixel. </td>
+  </tr>
+  <tr>
+    <td><strong>Alignement</strong></td>
+    <td>Alignement de l'image. Tr&egrave;s utile pour faire contourner le texte autour des images.</td>
+  </tr>
+  <tr>
+    <td><strong>Bordure</strong></td>
+    <td>&Eacute;paisseur en pixel de la bordure. </td>
+  </tr>
+  <tr>
+    <td><strong>VSpace</strong></td>
+    <td>Espacement vertical. Tr&egrave;s utile pour faire contourner le texte autour des images.</td>
+  </tr>
+  <tr>
+    <td><strong>HSpace</strong></td>
+    <td>Espacement horizontal. Tr&egrave;s utile pour faire contourner le texte autour des images.</td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr_ca/insert_link_button.htm
@@ -1,1 +1,35 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Outil d'ajout d'hyperliens</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Outil d'ajout d'hyperliens</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+L'outil d'ajout d'hyperlien ouvre la fen&ecirc;tre ci-dessous.<br>
+<br>
+<img src="images/insert_link_window.gif"><br>
+<br>
+Il y a deux champs dans cette fen&ecirc;tre. L'Adresse URL est l'adresse
+de l'hyperlien.  La destination vous permet de choisir de quelle fa&ccedil;on
+l'hyperlien sera ouvert.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr_ca/insert_table_button.htm
@@ -1,1 +1,72 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Outil d'ajout de tableau</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Outil d'ajout de tableau</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<img src="images/insert_table_window.gif"><br>
+<br>
+<strong>Description des champs:</strong><br>
+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Colonnes</strong></td>
+    <td>Nombre de colonnes du tableau. </td>
+  </tr>
+  <tr>
+    <td width="150"><strong>Lignes</strong></td>
+    <td>Nombre de lignes du tableau. </td>
+  </tr>
+  <tr>
+    <td><strong>Cellpadding</strong></td>

+  </tr>
+  <tr>
+    <td><strong>Cellspacing</strong></td>
+    <td>Espacement entre les cellules du tableau. </td>
+  </tr>
+  <tr>
+    <td><strong>Alignement</strong></td>
+    <td>Alignement du tableau. </td>
+  </tr>
+  <tr>
+    <td><strong>Bordure</strong></td>

+  </tr>
+  <tr>
+    <td><strong>Largeur</strong></td>
+    <td>Largeur en pixel du tableau.</td>
+  </tr>
+  <tr>
+    <td><strong>Hauteur</strong></td>
+    <td>Hauteur en pixel du tableau.</td>
+  </tr>
+  <tr>
+    <td><strong>Classe CSS</strong></td>
+    <td>Nom de la classe CSS pour appliquer un style.</td>
+  </tr>
+</table>
+<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/fr_ca/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/hu/about.htm
@@ -1,1 +1,29 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>&Uuml;ber TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">A TinyMCE-r&#337;l</span></td>
+    <td align="right"><a href="index.htm">Tartalom</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+A TinyMCE egy kompakt WYSIWYG-szerkeszt&#337; az MSIE-hoz &eacute;s a Mozill&aacute;hoz hasonl&oacute; webb&ouml;ng&eacute;sz&#337;k sz&aacute;m&aacute;ra, mely lehet&#337;s&eacute;get ny&uacute;jt &ouml;nnek a HTML tartalmak egyszer&#369; szerkeszt&eacute;s&eacute;re. A legt&ouml;bb sz&ouml;vegszerkeszt&#337;ben el&eacute;rhet&#337; funkci&oacute;kat ny&uacute;jtja egyszer&#369;en kezelhet&#337; form&aacute;ban.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Ugr&aacute;s a <a href="index.htm">Tartalomjegyz&eacute;kre</a></td>
+    <td align="right"><a href="#">ugr&aacute;s a lap tetej&eacute;re </a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/hu/common_buttons.htm
@@ -1,1 +1,107 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Allgemeine Schaltfl&auml;chen</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Allgemeine Schaltfl&auml;chen</span></td>
+    <td align="right"><a href="index.htm">Tartalom</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Untenstehend eine kurze Beschreibung jeder Schaltfl&auml;che.<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bold.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>

+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/hu/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/hu/images/insert_link_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/hu/index.htm
@@ -1,1 +1,25 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Inhaltsverzeichnis der Hilfe</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 

+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<ul class="toc_ul">




+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/hu/insert_image_button.htm
@@ -1,1 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Schaltfl&auml;che Bild einf&uuml;gen</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">K&eacute;p beilleszt&eacute;se gomb </span></td>
+    <td align="right"><a href="index.htm">Tartalom</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br> 
+A K&eacute;p beilleszt&eacute;se gomb az al&aacute;bbi ablakot nyitja meg.
+<br>
+<br>
+<img src="images/insert_image_window.gif" width="350" height="166"><br>
+<br>
+Egyszer&#369;en meg kell adni a beilleszteni k&iacute;v&aacute;nt k&eacute;p el&eacute;r&eacute;s&eacute;nek URL-j&eacute;t, valamint egy r&ouml;vd le&iacute;r&aacute;st, mely alternat&iacute;v sz&ouml;vegk&eacute;nt ker&uuml;l megjelen&iacute;t&eacute;sre (pl. nem grafikus b&ouml;ng&eacute;sz&#337;kben).<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Ugr&aacute;s a <a href="index.htm">Tartalomjegyz&eacute;kre</a></td>
+    <td align="right"><a href="#">ugr&aacute;s a lap tetej&eacute;re </a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/hu/insert_link_button.htm
@@ -1,1 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Schaltfl&auml;che Hyperlink einf&uuml;gen</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Link beilleszt&eacute;se gomb </span></td>
+    <td align="right"><a href="index.htm">Tartalom</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+A Link beilleszt&eacute;se gomb az al&aacute;bbi ablakot nyitja meg.<br>
+<br>
+<img src="images/insert_link_window.gif" width="330" height="166"><br>
+<br>
+K&eacute;t mez&#337;t kell kit&ouml;ltenie ebben az ablakban. Az els&#337; - &quot;Link URL&quot; - a hivatkoz&aacute;s URL-je. A m&aacute;sodik lehet&#337;s&eacute;get ad &Ouml;nnek a hivatkozt&aacute;s megjelen&iacute;t&eacute;s&eacute;nek kiv&aacute;laszt&aacute;s&aacute;hoz.<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Ugr&aacute;s a <a href="index.htm">Tartalomjegyz&eacute;kre</a></td>
+    <td align="right"><a href="#">ugr&aacute;s a lap tetej&eacute;re </a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/hu/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/images/table.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/images/table_delete_col.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/images/table_delete_row.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/images/table_insert_col_after.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/images/table_insert_col_before.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/images/table_insert_row_after.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/images/table_insert_row_before.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/it/about.htm
@@ -1,1 +1,38 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+  <title>Informazioni su TinyMCE</title>
+  <link href="style.css" rel="stylesheet" type="text/css">
+</head>
+<body>
+<table class="pageheader" border="0" cellpadding="1" cellspacing="3"
+ width="100%">
+  <tbody>
+    <tr>
+      <td><span class="title">Informazioni su TinyMCE</span></td>
+      <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+    </tr>
+  </tbody>
+</table>
+<hr noshade="noshade">
+<br>
+TinyMCE &egrave; un piccolo WYSIWYG (What You See Is What You Get,
+quello che vedi &egrave; quello che ottieni) editor per i web browser
+come MSIE o Mozilla che permette di editare HTML in modo comodo. Ha le
+funzionalit&agrave; comuni di molti word processor e non dovrebbe
+essere difficile da usare.<br>
+<br>
+<hr noshade="noshade">
+<table class="pagefooter" border="0" cellpadding="1" cellspacing="3"
+ width="100%">
+  <tbody>
+    <tr>
+      <td>Vai a: <a href="index.htm">Tavola dei contenuti</a></td>
+      <td align="right"><a href="#">Su</a></td>
+    </tr>
+  </tbody>
+</table>
+<br>
+<br>
+</body>
+</html>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/it/common_buttons.htm
@@ -1,1 +1,181 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+  <title>Pulsanti comuni</title>
+  <link href="style.css" rel="stylesheet" type="text/css">
+</head>
+<body>
+<table class="pageheader" border="0" cellpadding="1" cellspacing="3"
+ width="100%">
+  <tbody>
+    <tr>
+      <td><span class="title">Pulsanti comuni<br>
+      </span></td>
+      <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+    </tr>
+  </tbody>
+</table>
+<hr noshade="noshade">
+<br>
+Di seguito una breve descrizione di ogni pulsante.<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tbody>
+    <tr>
+      <td><img src="../../images/bold.gif" height="20" width="20"></td>
+      <td>Testo <span style="font-weight: bold;">grassetto</span>.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/italic.gif" height="20" width="20"></td>
+      <td>Testo <span style="font-style: italic;">corsivo</span>.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/underline.gif" height="20" width="20"></td>
+      <td>Testo <span style="text-decoration: underline;">sottolineato</span>.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/strikethrough.gif" height="20"
+ width="20"></td>
+      <td>Testo <span style="text-decoration: line-through;">barrato</span>.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/left.gif" height="20" width="20"></td>
+      <td>Allinea a sinistra.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/center.gif" height="20" width="20"></td>
+      <td>Allinea al centro.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/right.gif" height="20" width="20"></td>
+      <td>Allinea a destra.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/full.gif" height="20" width="20"></td>
+      <td>Giustifica.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/bullist.gif" height="20" width="20"></td>
+      <td>Lista non ordinata.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/numlist.gif" height="20" width="20"></td>
+      <td>Lista ordianta.<br>
+      </td>
+    </tr>
+    <tr>
+      <td><img src="../../images/outdent.gif" height="20" width="20"></td>
+      <td>Diminuisci l'indentazione.<br>
+      </td>
+    </tr>
+    <tr>
+      <td><img src="../../images/indent.gif" height="20" width="20"></td>
+      <td>Aumenta l'indentazione.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/undo.gif" height="20" width="20"></td>
+      <td>Annulla l'ultima operazione.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/redo.gif" height="20" width="20"></td>
+      <td>Ripeti l'ultima operazione.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/link.gif" height="20" width="20"></td>
+      <td>Inserieci un nuovo collegamento, maggiori informazioni su
+questa funzione nella <a href="insert_link_button.htm">Sezione
+'Inserisci un collegamento'</a></td>
+    </tr>
+    <tr>
+      <td><img src="../../images/unlink.gif" height="20" width="20"></td>
+      <td>Rimuovi tutti i collegamenti selezionati<br>
+      </td>
+    </tr>
+    <tr>
+    <td><img src="../../images/anchor.gif" height="20" width="20"></td>
+    <td>Inserisci una nuova &agrave;ncora, maggiori informazioni su
+questa funzione nella <a href="insert_anchor_button.htm">Sezione 'Inserisci un'&agrave;ncora'.</a></td>
+  </tr>
+    <tr>
+      <td><img src="../../images/image.gif" height="20" width="20"></td>
+      <td>Inserieci una nuova immagine, maggiori informazioni su questa
+funzione nella <a href="insert_image_button.htm">Sezione 'Inserisci
+una immagine'</a>.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/cleanup.gif" height="20" width="20"></td>
+      <td>Ripulisci il codice/rimuovi la formattazione non voluta.
+Questa funzione &egrave; utile quando si copia per esempio da un
+programma office<br>
+      </td>
+    </tr>
+    <tr>
+      <td><img src="../../images/help.gif" height="20" width="20"></td>
+      <td>Mostra questa guida<br>
+      </td>
+    </tr>
 
+  <tr>
+    <td><img src="../../images/code.gif" width="20" height="20"></td>
+    <td>Apre l'editor del sorgente HTML. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table.gif" width="20" height="20"></td>
+    <td>Inserisce una nuova tabella 2x2 alla posizione corrente.</td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>
+    <td>Aggiunge una riga sopra quella corrente.</td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>
+    <td>Aggiunge una roga sotto quella corrente.</td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>
+    <td>Rimuove la riga corrente. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>
+    <td>Aggiunge una colonna prima di quella corrente.</td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>
+    <td>Aggiunge una colonna dopo quella corrente.</td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>
+    <td>Rimuove la colonna corrente.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>
+    <td>Inserisce una nuova riga orizzontale.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>
+    <td>Rimuove la formattazione dalla selezione. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>
+    <td>Formatta la selezione come pedice. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>
+    <td>Formatta la selezione come apice. </td>
+  </tr>
+
+  </tbody>
+</table>
+<br>
+<hr noshade="noshade">
+<table class="pagefooter" border="0" cellpadding="1" cellspacing="3"
+ width="100%">
+  <tbody>
+    <tr>
+      <td>Vai a: <a href="index.htm">Tavola dei contenuti</a></td>
+      <td align="right"><a href="#">Su</a></td>
+    </tr>
+  </tbody>
+</table>
+</body>
+</html>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/it/images/insert_anchor_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/it/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/it/images/insert_link_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/it/images/insert_table_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/it/index.htm
@@ -1,1 +1,31 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+  <title>Indice della guida</title>
+  <link href="style.css" rel="stylesheet" type="text/css">
+</head>
+<body onload="window.focus();">
+<table class="pageheader" border="0" cellpadding="1" cellspacing="3"
+ width="100%">
+  <tbody>
+    <tr>
+      <td><span class="title">Tavola dei contenuti<br>
+      </span></td>
+      <td align="right">&nbsp;</td>
+    </tr>
+  </tbody>
+</table>
+<hr noshade="noshade">
+<br>
+Seleziona un argomento:<br>
+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">Informazioni su TinyMCE</a></li>
+  <li class="toc_li"><a href="common_buttons.htm">Pulsanti comuni</a></li>
+  <li class="toc_li"><a href="insert_image_button.htm">Pulsante 'Inserisci immagine'<br></a></li>
+  <li class="toc_li"><a href="insert_link_button.htm">Pulsante 'Inserisci collegamento'</a></li>
+  <li class="toc_li"><a href="insert_anchor_button.htm">Pulsante 'Inserisci &agrave;ncora'</a></li>
+  <li class="toc_li"><a href="insert_table_button.htm">Pulsante 'Inserisci tabella'</a></li>
+</ul>
+<hr noshade="noshade">
+</body>
+</html>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/it/insert_anchor_button.htm
@@ -1,1 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Bottone 'Inserisci &agrave;ncora'</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Bottone 'Inserisci &agrave;ncora'</span></td>
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Questo bottone apre una nuova finestra che permette di aggiungere o modificare un'&agrave;ncora<br>
+<br>
+<img src="images/insert_anchor_window.gif" width="326" height="117"><br>
+<br>
+C'&egrave; un solo campo in questa finestra, dove devi inserire il nome del tuo punto di &agrave;ncoraggio. Ricorda che il nome dell' &agrave;ncora deve essere univoco. <br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Vai a: <a href="index.htm">Tavola dei contenuti</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/it/insert_image_button.htm
@@ -1,1 +1,67 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Pulsante 'Inserisci immagine'</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Pulsante 'Inserisci immagine'</span></td>
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Il pulsante 'inserisci immagine' apre la finestra mostrata qui sotto.<br>
+<br>
+<img src="images/insert_image_window.gif"><br>
+<br>
+Si inserisce semplicemente l'url dell'immagine che si vuole collegare e una descrizione di quell'immagine,
+che sar&agrave; mostrato come testo alternativo dell'immagine sulla pagina.
+<br>
+<br>
+<strong>Descrizione dei parametri:</strong><br>
+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>URL immagine </strong></td>
+    <td>URL/indirizzo dell'immagine.</td>
+  </tr>
+  <tr>
+    <td width="150"><strong>Descrizione dell'immagine </strong></td>
+    <td>Descrizione alternativa del contenuto dell'immagine.</td>
+  </tr>
+  <tr>
+    <td><strong>Dimensioni</strong></td>
+    <td>Larghezza/Altezza dell'immagine. </td>
+  </tr>
+  <tr>
+    <td><strong>Allineamento</strong></td>
+    <td>Allineamento dell'immagine, utile quando si inserisce del testo attorno all'immagine.</td>
+  </tr>
+  <tr>
+    <td><strong>Bordo</strong></td>
+    <td>Spessore del bordo. </td>
+  </tr>
+  <tr>
+    <td><strong>Spazio verticale</strong></td>
+    <td>Spazio verticale,  utile quando si inserisce del testo attorno all'immagine.</td>
+  </tr>
+  <tr>
+    <td><strong>Spazio orizzontale</strong></td>
+    <td>Spazio orizzontale, utile quando si inserisce del testo attorno all'immagine.</td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Vai a: <a href="index.htm">Tavola dei contenuti</a></td>
+    <td align="right"><a href="#">Su</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/it/insert_link_button.htm
@@ -1,1 +1,42 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+  <title>Pulsante 'Inserisci collegamento'</title>
+  <link href="style.css" rel="stylesheet" type="text/css">
+</head>
+<body>
+<table class="pageheader" border="0" cellpadding="1" cellspacing="3"
+ width="100%">
+  <tbody>
+    <tr>
+      <td><span class="title">Pulsante 'Inserisci collegamento'<br>
+      </span></td>
+      <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+    </tr>
+  </tbody>
+</table>
+<hr noshade="noshade">
+<br>
+Questo pulsante apre una nuova finstra con le funzioni di
+inserimento/modifica del collegamento.<br>
+<br>
+<img src="images/insert_link_window.gif" height="156" width="326"><br>
+<br>
+Ci sono due campi in questa finestra: il primo, "Link URL" &egrave;
+l'indirizzo del collegamento. Il 'target' permette di selezionare come
+il collegamento deve essere aperto.<br>
+<br>
+<hr noshade="noshade">
+<table class="pagefooter" border="0" cellpadding="1" cellspacing="3"
+ width="100%">
+  <tbody>
+    <tr>
+      <td>Vai a: <a href="index.htm">Tavola dei contenuti</a></td>
+      <td align="right"><a href="#">Su</a></td>
+    </tr>
+  </tbody>
+</table>
+<br>
+<br>
+</body>
+</html>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/it/insert_table_button.htm
@@ -1,1 +1,72 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Pulsante 'Inserisci tabella'</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Pulsante 'Inserisci tabella'</span></td>
+    <td align="right"><a href="index.htm"><acronym title="Table of contents">TOC</acronym></a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Il pulsante 'Inserisci tabella' apre la finestra mostrata qui sotto. Questa azione permette di creare tabelle.<br>
+<br>
+<img src="images/insert_table_window.gif" width="346" height="225"><br>
+<br>
+<strong>Descrizione dei parametri:</strong><br>
+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Colonne</strong></td>
+    <td>Numero di colonne nella nuova tabella. </td>
+  </tr>
+  <tr>
+    <td width="150"><strong>Righe</strong></td>
+    <td>Numero di righe nella nuova tabella.</td>
+  </tr>
+  <tr>
+    <td><strong>Cellpadding</strong></td>
+    <td>Spazio tra il bordo di una cella e il suo contenuto. </td>
+  </tr>
+  <tr>
+    <td><strong>Cellspacing</strong></td>
+    <td>Spazio tra le celle della tabella.</td>
+  </tr>
+  <tr>
+    <td><strong>Allineamento</strong></td>
+    <td>Allineamento della tabella. </td>
+  </tr>
+  <tr>
+    <td><strong>Bordo</strong></td>
+    <td>Spessore del bordo della tabella.</td>
+  </tr>
+  <tr>
+    <td><strong>Larghezza</strong></td>
+    <td>Larghezza, in pixel, della tabella.</td>
+  </tr>
+  <tr>
+    <td><strong>Altezza</strong></td>
+    <td>Altezza, in pixel, della tabella.</td>
+  </tr>
+    <tr>
+    <td><strong>Classe</strong></td>
+    <td>Stile o classe CSS della tabella.</td>
+  </tr>
+</table>
+<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Vai a: <a href="index.htm">Tavola dei contenuti</a></td>
+    <td align="right"><a href="#">Su</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/it/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/nl/about.htm
@@ -1,1 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Over TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Over TinyMCE</span></td>
+    <td align="right"><a href="index.htm">Inhoudsopgave</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+TinyMCE is een kleine <i>What-You-See-Is-What-You-Get</i> (WYSIWYG)
+editor voor teksten. De bediening vindt plaats in de web browser, zoals MSIE of Mozilla.
+Het werken met deze editor is eenvoudig, omdat de bediening veel lijkt op het werken
+met teksten in (office-)tekstverwerkers.
+<br><br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr>
+    <td>Ga naar: <a href="index.htm">Inhoudsopgave</a></td>
+    <td align="right"><a href="#">Naar boven</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/nl/common_buttons.htm
@@ -1,1 +1,189 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Functies van TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr>
+    <td><span class="title">Functies van TinyMCE</span></td>
+    <td align="right"><a href="index.htm">Inhoudsopgave</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Het werken met de editor komt sterk overeen met wat u gewend bent van uw tekstverwerker:
+Dubbel-klik op een woord in de tekst, of trek een kader met de muis terwijl u
+de linkerknop inhoudt om een gedeelte van de tekst te kiezen. Het aldus gemarkeerde woord of
+tekstfragment noemen we 'selecteerd'. Met de knoppen en stijl-keuzelijsten
+in de editor kunt u hiervan vervolgens de opmaak aanpassen of (indien deze reeds was toegekend) verwijderen.
+<br><br>
+De meeste functies voert u eenvoudig uit door het klikken
+van de knoppen (buttons) boven het tekstvenster in de editor. Hieronder vindt u van elk van deze
+knoppen een beknopte beschrijving.
+<br>
+<br>
+<table width=100% border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td width=20><img src="../../images/bold.gif" width="20" height="20"></td>
+    <td>Gekozen tekstfragment 'Vet' (Bold) maken.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>
+    <td>Gekozen tekstfragment 'Cursief' (Italic) maken.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>
+    <td>Gekozen tekstfragment 'Onderstrepen' (Underline).</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>
+    <td>Gekozen tekstfragment 'Doorstrepen' (Strikethrough).</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>
+    <td>Gekozen tekstfragment naar links uitlijnen.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>
+    <td>Gekozen tekstfragment centreren.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>
+    <td>Gekozen tekstfragment naar rechts uitlijnen.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>
+    <td>Gekozen tekstfragment 'uitvullen' tot complete regels.</td>
+  </tr>
+</table>
+<br>
+<table width=100% border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>
+    <td>Gekozen tekstfragment omzetten naar ongeordende (bullet-)lijst of opsomming.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>
+    <td>Gekozen tekstfragment omzetten naar doorgenummerde lijst.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>
+    <td>Inspringniveau van het gekozen tekstfragment verkleinen.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>
+    <td>Inspringniveau van het gekozen tekstfragment vergroten.</td>
+  </tr>
+  <tr>
+    <td width=20><img src="../../images/undo.gif" width="20" height="20"></td>
+    <td>De laaste bewerking ongedaan maken. De toetscombinatie CRTL-Z doet hetzelfde.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>
+    <td>De laatste bewerking opnieuw uitvoeren.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>
+    <td>Invoegen van een <i>Link</i> (Cross-Link) via dialoogmenu.<br>
+		  Zie de beschrijving bij <a href="insert_link_button.htm">Links en verwijzingen in tekst invoegen</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>
+    <td>Verwijdert alle gevonden <i>Links</i> (Cross-Links) uit de tekstselectie.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/anchor.gif" width="20" height="20"></td>
+    <td>Anker aan de tekstselectie toekennen of wijzigen.<br>
+		  Zie de beschrijving bij <a href="insert_anchor_button.htm">Anker Toevoegen.</a></td>
+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>
+    <td>Voegt een afbeelding in.<br>
+		  Zie de beschrijving bij <a href="insert_image_button.htm">Afbeeldingen invoegen</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>
+    <td>Schoont ongewenste opmaak en codering van de tekstselectie op. Deze functie is erg nuttig na het
+		  overkopi&euml;ren van teksten vanuit uw (Office-)tekstverwerker.</td>
+  </tr>
+	<tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>
+    <td>Toont dit helpvenster met uitleg van alle functionaliteit van de editor.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/code.gif" width="20" height="20"></td>
+    <td>Opent het venster met de HTML-broncode voor het direct maken van wijzigingen
+		  in de achterliggende pagina-codering. Kennis van de HTML-taal is vereist.</td>
+  </tr>
+</table>
+
+<br>
+<table width=100% border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../images/table.gif" width="20" height="20"></td>
+    <td>Voegt een nieuwe tabel met 2 rijen en kolommen in op de huidige positie in te tekst. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>
+    <td>Voegt een nieuwe rij toe aan de tabel boven de huidige.</td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>
+    <td>Voegt een nieuwe rij toe aan de tabel onder de huidige.</td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>
+    <td>Verwijdert de huidige rij uit de tabel.</td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>
+    <td>Voegt een nieuwe kolom toe aan de tabel voor de huidige.</td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>
+    <td>Voegt een nieuwe kolom toe aan de tabel achter de huidige.</td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>
+    <td>Verwijdert de huidige kolom uit de tabel.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>
+    <td>Voegt een horizontale lijn in de tekst toe.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>
+    <td>Verwijdert alle tekst-opmaak van de tekstselectie.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/visualaid.gif" width="20" height="20"></td>
+    <td>Toon of verberg hulplijnen voor tabellen in het tekstvenster.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>
+    <td>Verandert het gekozen tekstfragment in <i>Subscript</i>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>
+    <td>Verandert het gekozen tekstfragment in <i>Superscript</i>.</td>
+  </tr>
+	<tr>
+    <td><img src="../../images/charmap.gif" width="20" height="20"></td>
+    <td>De <i>Karaktertabel</i> maakt het eenvoudig invoegen van bijzondere karakters mogelijk.<br>
+		  Zie de beschrijving bij <a href="insert_specchar_button.htm">Bijzondere karakers in de tekst invoegen.</a></td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr>
+    <td>Ga naar: <a href="index.htm">Inhoudsopgave</a></td>
+    <td align="right"><a href="#">Naar boven</a></td>
+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/nl/images/html_source_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/nl/images/insert_anchor_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/nl/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/nl/images/insert_link_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/nl/images/insert_specchar_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/nl/images/insert_table_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/nl/index.htm
@@ -1,1 +1,28 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Help Index</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Inhoudsopgave</span></td>
+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Klik op de onderwerpen in onderstaande inhoudsopgave voor meer informatie.
+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">Over TinyMCE</a></li>
+  <li class="toc_li"><a href="common_buttons.htm">Functies van TinyMCE</a></li>
+	<li class="toc_li"><a href="insert_image_button.htm">Afbeeldingen invoegen</a></li>
+	<li class="toc_li"><a href="insert_link_button.htm">Links en verwijzingen in tekst invoegen</a></li>
+  <li class="toc_li"><a href="insert_specchar_button.htm">Bijzondere karakers in de tekst invoegen</a></li>
+  <li class="toc_li"><a href="insert_anchor_button.htm">Ankers in de tekst gebruiken</a></li>
+  <li class="toc_li"><a href="insert_table_button.htm">Tabellen invoegen en aanpassen</a></li>
+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/nl/insert_anchor_button.htm
@@ -1,1 +1,38 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Ankers in de tekst gebruiken</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr>
+    <td><span class="title">Ankers in de tekst gebruiken</span></td>
+    <td align="right"><a href="index.htm">Inhoudsopgave</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Met de knop 'Invoegen Anker' kunt u in de tekst z.g. HTML-ankers invoegen en
+aanpassen. Deze ankers maken het mogelijk snel naar bepaalde tekstfragmenten te springen.
+Door het toevoegen van de ankernaam (voorafgegaan door een '#')
+aan de link naar een pagina (Zie <a href="insert_link_button.htm">'Links en verwijzingen in tekst invoegen'</a>)
+kan op deze wijze desgewenst direct naar een bepaalde passage in een pagina worden doorgelinkt.
+<br><br>
+Voor het toevoegen of aanpassen van een anker wordt onderstaand dialoogvenster getoond.<br>
+<br>
+<center><img src="images/insert_anchor_window.gif"></center>
+<br>
+Bij het veld 'Anker naam' kan de gewenste naam van het anker worden ingevuld.
+Let op: Binnen een complete pagina binnen uw website dient de naam van dit anker uniek zijn.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr>
+    <td>Ga naar: <a href="index.htm">Inhoudsopgave</a></td>
+    <td align="right"><a href="#">Naar boven</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/nl/insert_image_button.htm
@@ -1,1 +1,66 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Afbeeldingen invoegen</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Afbeeldingen invoegen</span></td>
+    <td align="right"><a href="index.htm">Inhoudsopgave</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Voer simpelweg de URL van de afbeelding en de beschrijving in.
+De omschrijvende tekst wordt in sommige browsers bij de muiswijzer getoond
+wanneer deze boven de afbeelding wordt stilgehouden.
+De knop 'Afbeelding Invoegen' opent onderstaand dialoogvenster.<br>
+<br>
+<center><img src="images/insert_image_window.gif"></center>
+<br>
+<strong>Omschrijving van de velden:</strong><br>
+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Afbeelding</strong></td>
+    <td>In dit veld dient u een complete URL op te geven van de afbeelding.</td>
+  </tr>
+  <tr>
+    <td width="150"><strong>Beschrijving</strong></td>
+    <td>Omschrijvende tekst die in sommige browsers bij de muiswijzer wordt getoond wanneer deze boven de afbeelding wordt stilgehouden.</td>
+  </tr>
+  <tr>
+    <td><strong>Uitlijning</strong></td>
+    <td>Uit de lijst kan worden gekozen op welke wijze de afbeelding in de tekst wordt ingebed.</td>
+  </tr>
+	<tr>
+    <td><strong>Afmetingen</strong></td>
+    <td>De breedte en hoogte van de afbeelding in pixels. Laat deze velden leeg als de originele afmetingen gewenst zijn.</td>
+  </tr>
+  <tr>
+    <td><strong>Omranding</strong></td>
+    <td>De dikte (in pixels) van de omranding om de afbeelding.</td>
+  </tr>
+  <tr>
+    <td><strong>Verticale marge</strong></td>
+    <td>De verticale marge (in pixels) gebruikt voor de omloop van teksten om de afbeelding.</td>
+  </tr>
+  <tr>
+    <td><strong>Horizontale marge</strong></td>
+    <td>De horizontale marge (in pixels) gebruikt voor de omloop van teksten om de afbeelding.</td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr>
+    <td>Ga naar: <a href="index.htm">Inhoudsopgave</a></td>
+    <td align="right"><a href="#">Naar boven</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/nl/insert_link_button.htm
@@ -1,1 +1,36 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Links en verwijzingen in tekst invoegen</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Links en verwijzingen in tekst invoegen</span></td>
+    <td align="right"><a href="index.htm">Inhoudsopgave</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+De knop 'Link Invoegen' leidt u naar onderstaand dialoogvenster waarmee u eenvoudig
+een <i>Link</i> (Cross-Link) kunt aanbrengen in uw teksten.
+<br><br>
+<center><img src="images/insert_link_window.gif"></center>
+<br>
+Bij 'Link URL' dient de de url van
+de link te worden ingevuld (desgewenst voorafgegaan door 'http://' voor een externe
+website), bij 'target' kan worden bepaald hoe de link moet openen.
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr>
+    <td>Ga naar: <a href="index.htm">Inhoudsopgave</a></td>
+    <td align="right"><a href="#">Naar boven</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/nl/insert_specchar_button.htm
@@ -1,1 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Bijzondere karakers in de tekst invoegen</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr>
+    <td><span class="title">Bijzondere karakers in de tekst invoegen</span></td>
+    <td align="right"><a href="index.htm">Inhoudsopgave</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Met de knop 'Bijzondere Karakters' kunt u in de tekst bijzondere karakters, die soms
+op het toetsenbord lastig te vinden zijn, invoegen.
+<br><br>
+Voor het invoegen van een deze karakters wordt onderstaand keuzevenster getoond.
+Door het eenvoudigweg klikken op het gewenste karakter in het overzicht, wordt het op de huidige positie in de tekst ingevoegd.<br>
+<br>
+<center><img src="images/insert_specchar_window.gif"></center>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr>
+    <td>Ga naar: <a href="index.htm">Inhoudsopgave</a></td>
+    <td align="right"><a href="#">Naar boven</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/nl/insert_table_button.htm
@@ -1,1 +1,74 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Tabellen invoegen en aanpassen</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Tabellen invoegen en aanpassen</span></td>
+    <td align="right"><a href="index.htm">Inhoudsopgave</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+De knop 'Invoegen Tabel' stelt u in staat op de huidige plek een nieuwe tabel
+in uw tekst in te voegen en opent onderstaand dialoogvenster.<br>
+<br>
+<center><img src="images/insert_table_window.gif"></center>
+<br>
+<strong>Omschrijving van de velden:</strong><br>
+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Kolommen</strong></td>
+    <td>Het gewenste aantal kolommen in de tabel.</td>
+  </tr>
+  <tr>
+    <td width="150"><strong>Rijen</strong></td>
+    <td>Het gewenste aantal rijen in de tabel.</td>
+  </tr>
+  <tr>
+    <td><strong>Celvulling</strong></td>
+    <td>De 'Celvulling' (Cellpadding)<br>
+		De opvulmarge rondom binnen elke cel in de tabel in pixels.</td>
+  </tr>
+  <tr>
+    <td><strong>Celafstand</strong></td>
+    <td>De 'Celafstand' (Cellspacing)<br>
+		De ruimte tussen de cellen onderling binnen de tabel in pixels.</td>
+  </tr>
+  <tr>
+    <td><strong>Positionering</strong></td>
+    <td>De positionering van de tabel in de paragraaf.</td>
+  </tr>
+  <tr>
+    <td><strong>Omranding</strong></td>
+    <td>De dikte in pixels van de omranding van de tabel.</td>
+  </tr>
+  <tr>
+    <td><strong>Breedte</strong></td>
+    <td>De breedte van de tabel (in pixels of percentuele notatie).</td>
+  </tr>
+  <tr>
+    <td><strong>Hoogte</strong></td>
+    <td>De breedte van de tabel (in pixels of percentuele notatie).</td>
+  </tr>
+  <tr>
+    <td><strong>CSS-Stijl</strong></td>
+    <td>Optionele stijlkeuze uit de voor de website aangemaakte <i>Cascading Style Sheet</i> (CSS).</td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr>
+    <td>Ga naar: <a href="index.htm">Inhoudsopgave</a></td>
+    <td align="right"><a href="#">Naar boven</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/nl/style.css
@@ -1,1 +1,29 @@
+/* body { background-color: #FFFFFF; } */
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/no/about.htm
@@ -1,1 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>About TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Om TinyMCE</span></td>
+    <td align="right"><a href="index.htm">IF</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+TinyMCE er en liten WYSIWYG-editor for weblesere som
+f.eks. MSIE og Mozilla og gj&oslash;r det mulig &aring; redigere
+HTML-innhold p&aring; et mer anvendervennlig vis.
+Applikasjonen har funksjoner som ligner dem man finner i vanlige tekstbehandlere
+og burde ikke v&aelig;re spesielt vanskelig &aring; benytte.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>G&aring; til: <a href="index.htm">Innholdsoversikt</a></td>
+    <td align="right"><a href="#">Toppen</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/no/common_buttons.htm
@@ -1,1 +1,164 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Vanlige knapper</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Grunnleggende knapper</span></td>
+    <td align="right"><a href="index.htm">IF</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Nedenfor finner du en kort beskrivelse av hver knapp/funksjon.<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bold_de_se.gif" width="20" height="20"></td>
+    <td>Fet tekst.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/italic_de_se.gif" width="20" height="20"></td>
+    <td>Kursiv tekst.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>
+    <td>Understreket tekst.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>
+    <td>Gjennomstreket tekst.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>
+    <td>Rett venstremarg.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>
+    <td>Sentrer.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>
+    <td>Rett h&oslash;yremarg.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>
+    <td>Rette marger.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>
+    <td>Punktliste.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>
+    <td>Nummerliste</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>
+    <td>Reduser innrykk.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>
+    <td>&Oslash;k innrykk.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>
+    <td>Angre seneste endring.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>
+    <td>Gj&oslash;r om seneste endring.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>
+    <td>Lage/Redigere lenke, l&aelig;r mer om denne funksjonen i
+      kapittelet <a href="insert_link_button.htm">Lage/Redigere lenke</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>
+    <td>Ta bort lenker fra markerte lenker.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/anchor.gif" width="20" height="20"></td>
+    <td>Lage/Redigere anker, l&aelig;r mer om denna funksjonen i
+      kapittelet <a href="insert_anchor_button.htm">Lage/Redigere anker</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>
+    <td>Lage/Redigere bilde, l&aelig;r mer om denne funksjonen i 
+      kapittelet <a href="insert_image_button.htm">Lage/Redigere bilde</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>
+    <td>Rense/Ordne koden. Denne funksjonen tar bort un&oslash;dvendig
+      formatering. B&oslash;r anvendes n&aring;r man f.eks. kopierer tekst
+      fra Office-program. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>
+    <td>Viser denne hjelp.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/code.gif" width="20" height="20"></td>
+    <td>&Aring;pner en HTML-kodeeditor. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table.gif" width="20" height="20"></td>
+    <td>Lager en ny tabell (2x2). </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>
+    <td>Lager en rad ovenfor den n&aring;v&aelig;rende raden. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>
+    <td>Lager en rad under den n&aring;v&aelig;rende raden. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>
+    <td>Tar bort en rad. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>
+    <td>Lager en kolonne f&oslash;r den n&aring;v&aelig;rende kolonnen. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>
+    <td>Lager en kolonne etter den n&aring;v&aelig;rende kolonnen. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>
+    <td>Tar bort en kolonne. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>
+    <td>Lager en horisontal linje. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>
+    <td>Tar bort formatering fra markert omr&aring;de. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>
+    <td>Lager nedsenket tekst. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>
+    <td>Lager opph&oslash;yd tekst. </td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>G&aring; til: <a href="index.htm">Innholdsoversikt</a></td>
+    <td align="right"><a href="#">Toppen</a></td>
+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/no/images/insert_anchor_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/no/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/no/images/insert_link_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/no/images/insert_table_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/no/index.htm
@@ -1,1 +1,28 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Hjelp Index</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Innholdsoversikt</span></td>
+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Klikk p&aring; lenkene nedenfor for &aring; g&aring; til de ulike
+hjelp-kapitlene.
+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">Om TinyMCE</a></li>
+  <li class="toc_li"><a href="common_buttons.htm">Grunnleggende funksjoner</a></li>
+  <li class="toc_li"><a href="insert_image_button.htm">Lage/Redigere bilde</a></li>
+  <li class="toc_li"><a href="insert_link_button.htm">Lage/Redigere lenke</a></li>
+  <li class="toc_li"><a href="insert_anchor_button.htm">Lage/Redigere anker </a></li>
+  <li class="toc_li"><a href="insert_table_button.htm">Lage/Redigere tabell</a></li>
+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/no/insert_anchor_button.htm
@@ -1,1 +1,35 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Lage/Redigere anker</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Lage/Redigere anker</span></td>
+    <td align="right"><a href="index.htm">IF</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Denne funksjon &aring;pner et nytt vindu lik det nedenfor.<br>
+<br>
+<img src="images/insert_anchor_window.gif" width="330" height="139"><br>
+<br>
+Dette vinduet har et felt som man skal fylle i med et unikt
+navn, denne funksjon  gj&oslash;r det mulig &aring; skape
+ankerpunkter/bokmerker.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>G&aring; til: <a href="index.htm">Innholdsoversikt</a></td>
+    <td align="right"><a href="#">Toppen</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/no/insert_image_button.htm
@@ -1,1 +1,72 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Lage/Redigere bilde</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Lage/Redigere bilde</span></td>
+    <td align="right"><a href="index.htm">IF</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Funktionen "Lage/Redigere bilde" &aring;pner et nytt vindu som ser ut som 
+bilden nedenfor.<br>
+<br>
+<img src="images/insert_image_window.gif"><br>
+<br>
+I dette vinduet skriver du inn URL:en til bildet du vil lenke til
+samt en bildebeskrivelse, denne beskrivelsen kommer til &aring; vises som en alternativ 
+tekst til bildet.<br>
+<br>
+<strong>Feltforklaring:</strong><br>
+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Bildets URL </strong></td>
+    <td>URL/s&oslash;kevei til bildet.</td>
+  </tr>
+  <tr>
+    <td width="150"><strong>Bildets beskrivelse</strong></td>
+    <td>Bildets beskrivelse, denne beskrivelsen kommer til &aring; vises som en
+      alternativ tekst til bildet.</td>
+  </tr>
+  <tr>
+    <td><strong>Dimensjoner</strong></td>
+    <td>Bildets bredde og h&oslash;yde. </td>
+  </tr>
+  <tr>
+    <td><strong>Justering</strong></td>
+    <td>Bildets justering, kan v&aelig;re anvendelig n&aring;r man vil at
+      tekst skal flyte rundt bildet. </td>
+  </tr>
+  <tr>
+    <td><strong>Ramme</strong></td>
+    <td>Bilderammens bredde. </td>
+  </tr>
+  <tr>
+    <td><strong>Vertikalt tomrom </strong></td>
+    <td>Vertikalt tomrom , kan v&aelig;ra anvendelig n&aring;r man vil
+      at tekst skal flyte rundt bildet. </td>
+  </tr>
+  <tr>
+    <td><strong>Horisontalt tomrom</strong></td>
+    <td>Horisontalt tomrom, kan v&aelig;re anvendelig n&aring;r man vil
+      at tekst skal flyte rundt bildet. </td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>G&aring; til: <a href="index.htm">Innholdsoversikt</a></td>
+    <td align="right"><a href="#">Toppen</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/no/insert_link_button.htm
@@ -1,1 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Lage/Redigere lenke</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Lage/Redigere lenke</span></td>
+    <td align="right"><a href="index.htm">IF</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Denne funksjon &aring;pner et nytt vindu lik det nedenfor.<br>
+<br>
+<img src="images/insert_link_window.gif" width="330" height="159"><br>
+<br>
+Dette vinduet har to felt, lenkens URL/addresse samt hvordan lenken 
+skal &aring;pnes.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>G&aring; til: <a href="index.htm">Innholdsoversikt</a></td>
+    <td align="right"><a href="#">Toppen</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/no/insert_table_button.htm
@@ -1,1 +1,73 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Lage/Redigere tabell</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Lage/Redigere tabell </span></td>
+    <td align="right"><a href="index.htm">IF</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Lage tabell-knappen &aring;pner et nytt vindu, ved hjelp av
+dette vinduet kan du lage tabeller.<br>
+<br>
+<img src="images/insert_table_window.gif" width="340" height="229"><br>
+<br>
+<strong>Feltforklaring:</strong><br>
+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Kolonner</strong></td>
+    <td>Antall kolonner i tabellen.</td>
+  </tr>
+  <tr>
+    <td width="150"><strong>Rader</strong></td>
+    <td>Antall rader i tabellen.</td>
+  </tr>
+  <tr>
+    <td><strong>Celleutfylling</strong></td>
+    <td>Antall pixler utfylling i hver celle. </td>
+  </tr>
+  <tr>
+    <td><strong>Cellemellomrom</strong></td>
+    <td>Antall pixler mellomrom mellom cellene.</td>
+  </tr>
+  <tr>
+    <td><strong>Justering</strong></td>
+    <td>Tabellens justering. </td>
+  </tr>
+  <tr>
+    <td><strong>Rammebredde</strong></td>
+    <td>Rammens bredde.</td>
+  </tr>
+  <tr>
+    <td><strong>Bredde</strong></td>
+    <td>Bredde i pixler.</td>
+  </tr>
+  <tr>
+    <td><strong>H&oslash;yde</strong></td>
+    <td>H&oslash;yde i pixler. </td>
+  </tr>
+  <tr>
+    <td><strong>Stil</strong></td>
+    <td>Stilmal p&aring; tabellen. </td>
+  </tr>
+</table>
+<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>G&aring; til: <a href="index.htm">Innholdsoversikt</a></td>
+    <td align="right"><a href="#">Toppen</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/no/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/pl/about.htm
@@ -1,1 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<meta name="generator" content="WebSite PRO 4.3" />
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
+<TITLE>O TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">O TinyMCE</span></td>

+  </tr>
+</table>
+<hr noshade>
+<br>




+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/pl/common_buttons.htm
@@ -1,1 +1,165 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<meta name="generator" content="WebSite PRO 4.3" />
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">

+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bold.gif" width="20" height="20"></td>
+    <td>Pogrubienie tekstu.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>
+    <td>Pochylenie tekstu.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>
+    <td>Wyjustowanie.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>


+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/anchor.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>


+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>


+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>
+    <td>Pokazanie tego okna pomocy.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/code.gif" width="20" height="20"></td>
+    <td>Otwarcie edytora kodu HTML.</td>
+  </tr>
+  <tr>
+    <td><img src="../images/table.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>
+    <td>Wstawienie wiersza ponad aktualnie zaznaczonym.</td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>
+    <td>Wstawienie poziomej linii.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>

+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/pl/images/insert_anchor_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/pl/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/pl/images/insert_link_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/pl/images/insert_table_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/pl/index.htm
@@ -1,1 +1,29 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<meta name="generator" content="WebSite PRO 4.3" />
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
+<TITLE>Spis pomocy</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 

+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">O TinyMCE</a></li>



+  <li class="toc_li"><a href="insert_anchor_button.htm">Przycisk "Wstaw zakotwiczenie"</a></li>

+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/pl/insert_anchor_button.htm
@@ -1,1 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<meta name="generator" content="WebSite PRO 4.3" />
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
+<TITLE>Przycisk "Wstaw zakotwiczenie"</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Przycisk "Wstaw zakotwiczenie"</span></td>

+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<img src="images/insert_anchor_window.gif" width="330" height="139"><br>
+<br>


+<br><br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/pl/insert_image_button.htm
@@ -1,1 +1,66 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<meta name="generator" content="WebSite PRO 4.3" />
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">

+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<img src="images/insert_image_window.gif"><br>
+<br>


+<br><br>

+<table border="1" cellspacing="0">
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>
+    <td><strong>Wymiary</strong></td>

+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/pl/insert_link_button.htm
@@ -1,1 +1,36 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<meta name="generator" content="WebSite PRO 4.3" />
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">

+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<img src="images/insert_link_window.gif" width="330" height="159"><br>
+<br>


+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/pl/insert_table_button.htm
@@ -1,1 +1,74 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<meta name="generator" content="WebSite PRO 4.3" />
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">

+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<img src="images/insert_table_window.gif" width="340" height="229"><br>
+<br>

+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Kolumny</strong></td>
+    <td>Liczba kolumn w tabeli. </td>
+  </tr>
+  <tr>
+    <td width="150"><strong>Wiersze</strong></td>
+    <td>Liczba wierszy w tabeli.</td>
+  </tr>
+  <tr>
+    <td><strong>Cellpadding</strong></td>

+  </tr>
+  <tr>
+    <td><strong>Cellspacing</strong></td>

+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>
+    <td><strong>Klasa</strong></td>
+    <td>Styl lub klasa CSS tabeli.</td>
+  </tr>
+</table>
+<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/pl/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/sv/about.htm
@@ -1,1 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>About TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Om TinyMCE</span></td>
+    <td align="right"><a href="index.htm">IF</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+TinyMCE &auml;r en liten WYSIWYG-editor f&ouml;r webl&auml;sare som
+MSIE och Mozilla vilken m&ouml;jligg&ouml;r f&ouml;r anv&auml;ndare att redigera 
+HTML-inneh&aring;ll p&aring; ett mer anv&auml;ndarv&auml;nligt s&auml;tt.
+Applikationen har funktioner som liknar dem man finner i vanliga ordbehandlare
+och borde inte vara speciellt sv&aring;rt att anv&auml;nda.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>G&aring; till: <a href="index.htm">Inneh&aring;llsf&ouml;rteckning</a></td>
+    <td align="right"><a href="#">Toppen</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/sv/common_buttons.htm
@@ -1,1 +1,164 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Common buttons</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Grundl&auml;ggande knappar</span></td>
+    <td align="right"><a href="index.htm">IF</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Nedan finner du en kort beskrivning av varje knapp/funktion.<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bold_de_se.gif" width="20" height="20"></td>
+    <td>Fet text.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/italic_de_se.gif" width="20" height="20"></td>
+    <td>Kursiv text.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>
+    <td>Understruken text.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>
+    <td>Genomstruken text.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>
+    <td>Rak v&auml;nstermarginal.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>
+    <td>Centrera.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>
+    <td>Rak h&ouml;germarginal.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>
+    <td>Raka marginaler.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>
+    <td>Punktlista.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>
+    <td>Numrerad lista</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>
+    <td>Minska indrag.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>
+    <td>&Ouml;ka utdrag.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>
+    <td>&Aring;ngra senaste &auml;ndringen.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>
+    <td>G&ouml;r om senaste &auml;ndringen.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>
+    <td>Skapa/Redigera l&auml;nk, l&auml;s mer om denna funktion i
+      kapitlet <a href="insert_link_button.htm">Skapa/Redigera l&auml;nk</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>
+    <td>Ta bort l&auml;nkar fr&aring;n markerade l&auml;nkar.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/anchor.gif" width="20" height="20"></td>
+    <td>Skapa/Redigera ankare, l&auml;r mer om denna funktion i
+      kapitlet <a href="insert_anchor_button.htm">Skapa/Redigera ankare</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>
+    <td>Skapa/Redigera bild, l&auml;r mer om denna funktion i 
+      kapitlet <a href="insert_image_button.htm">Skapa/Redigera bild</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>
+    <td>Rensa/St&auml;da k&aring;den. Denna funktion tar bort on&ouml;dig
+      formatering. B&ouml;r anv&auml;ndas n&auml;r man t.ex. kopierar text
+      fr&aring;n Office-program. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>
+    <td>Visad denna hj&auml;lp.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/code.gif" width="20" height="20"></td>
+    <td>&Ouml;ppnar en HTML-k&auml;kodseditor . </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table.gif" width="20" height="20"></td>
+    <td>Skapar en ny tabell (2x2) . </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>
+    <td>Skapar en rad ovanf&ouml;r den nuvarande raden . </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>
+    <td>Skapar en rad under den nuvarande raden . </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>
+    <td>Tar bort en rad. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>
+    <td>Skapar en kolumn f&ouml;re den nuvarande kolumnen. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>
+    <td>Skapar en kolumn efter den nuvarande kolumnen. </td>
+  </tr>
+  <tr>
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>
+    <td>Tar bort en kolumn. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>
+    <td>Skapar en horisontell linje. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>
+    <td>Tar bort formatering fr&aring;n markerat omr&aring;de. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>
+    <td>Skapar neds&auml;nkt text. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>
+    <td>Skapar upph&ouml;jd text. </td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>G&aring; till: <a href="index.htm">Inneh&aring;llsf&ouml;rteckning</a></td>
+    <td align="right"><a href="#">Toppen</a></td>
+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/sv/images/insert_anchor_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/sv/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/sv/images/insert_link_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/sv/images/insert_table_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/sv/index.htm
@@ -1,1 +1,28 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Help Index</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Inneh&aring;llsf&ouml;rteckning</span></td>
+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Klicka p&aring; l&auml;nkarna nedan f&ouml;r att g&aring; till olika
+hj&auml;lp-kapitel. 
+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">Om TinyMCE</a></li>
+  <li class="toc_li"><a href="common_buttons.htm">Grundl&auml;ggande funktioner</a></li>
+  <li class="toc_li"><a href="insert_image_button.htm">Skapa/Redigera bild</a></li>
+  <li class="toc_li"><a href="insert_link_button.htm">Skapa/Redigera l&auml;nk</a></li>
+  <li class="toc_li"><a href="insert_anchor_button.htm">Skapa/Redigera ankare </a></li>
+  <li class="toc_li"><a href="insert_table_button.htm">Skapa/Redigera tabell</a></li>
+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/sv/insert_anchor_button.htm
@@ -1,1 +1,35 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Skapa/Redigera l&auml;nk</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Skapa/Redigera ankare </span></td>
+    <td align="right"><a href="index.htm">IF</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Denna funktion &ouml;ppnar ett nytt f&ouml;nster liknande det nedan.<br>
+<br>
+<img src="images/insert_anchor_window.gif" width="330" height="139"><br>
+<br>
+Detta f&ouml;nster har ett f&auml;lt som man skall fylla i med ett unik
+namn, denna funktion  g&ouml;r det m&ouml;jligt att skapa
+ankarpunkter/bokm&auml;rken.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>G&aring; till: <a href="index.htm">Inneh&aring;llsf&ouml;rteckning</a></td>
+    <td align="right"><a href="#">Toppen</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/sv/insert_image_button.htm
@@ -1,1 +1,72 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Skapa/Redigera bild</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Skapa/Redigera bild</span></td>
+    <td align="right"><a href="index.htm">IF</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Funktionen "Skapa/Redigera bild" &ouml;ppnar ett nytt f&ouml;nster som ser ut som 
+bilden nedan.<br>
+<br>
+<img src="images/insert_image_window.gif"><br>
+<br>
+I detta f&ouml;nster skriver du in URL:en till bilden du vill l&auml;nka till 
+samt en bildbeskrivning, denna beskrivning kommer att visas som en alternativ 
+text till bilden.<br>
+<br>

+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Bilderns URL </strong></td>
+    <td>URL/s&ouml;kv&auml;g till bilden.</td>
+  </tr>
+  <tr>
+    <td width="150"><strong>Bildens beskrivning</strong></td>
+    <td>Bildens beskrivning, denna beskrivning kommer att visas som en
+      alternativ text till bilden.</td>
+  </tr>
+  <tr>
+    <td><strong>Dimensioner</strong></td>
+    <td>Bildens bredd och h&ouml;jd. </td>
+  </tr>
+  <tr>
+    <td><strong>Justering</strong></td>
+    <td>Bildens justering, kan vara anv&auml;ndbart n&auml;r man vill att
+      text skall flyta runt bilden. </td>
+  </tr>
+  <tr>
+    <td><strong>Ram</strong></td>
+    <td>Bildramens bredd. </td>
+  </tr>
+  <tr>
+    <td><strong>Vertikalt tomrum </strong></td>
+    <td>Vertikalt tomrum , kan vara anv&auml;ndbart n&auml;r man vill
+      att text skall flyta runt bilden. </td>
+  </tr>
+  <tr>
+    <td><strong>Horizontellt tomrom</strong></td>
+    <td>Horisontellt tomrum, kan vara anv&auml;ndbart n&auml;r man vill
+      att text skall flyta runt bilden. </td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>G&aring; till: <a href="index.htm">Inneh&aring;llsf&ouml;rteckning</a></td>
+    <td align="right"><a href="#">Toppen</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/sv/insert_link_button.htm
@@ -1,1 +1,34 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Skapa/Redigera l&auml;nk</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Skapa/Redigera l&auml;nk</span></td>
+    <td align="right"><a href="index.htm">IF</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Denna funktion &ouml;ppnar ett nytt f&ouml;nster liknande det nedan.<br>
+<br>
+<img src="images/insert_link_window.gif" width="330" height="159"><br>
+<br>
+Detta f&ouml;nster har tv&aring; f&auml;lt l&auml;nkens URL/adress samt hur l&auml;nken 
+skall &ouml;ppnas.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>G&aring; till: <a href="index.htm">Inneh&aring;llsf&ouml;rteckning</a></td>
+    <td align="right"><a href="#">Toppen</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/sv/insert_table_button.htm
@@ -1,1 +1,73 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>
+<TITLE>Skapa/Redigera tabell</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Skapa/Redigera tabell </span></td>
+    <td align="right"><a href="index.htm">IF</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Skapa tabell-knappen &ouml;ppnar ett nytt f&ouml;nster, med hj&auml;lp av
+detta f&ouml;nster kan du skapa tabeller. <br>
+<br>
+<img src="images/insert_table_window.gif" width="340" height="229"><br>
+<br>

+<table border="1" cellspacing="0">
+  <tr>
+    <td width="150"><strong>Kolumner</strong></td>
+    <td>Antal kolumner i tabellen. </td>
+  </tr>
+  <tr>
+    <td width="150"><strong>Rader</strong></td>
+    <td>Antal rader i tabellen .</td>
+  </tr>
+  <tr>
+    <td><strong>Cellutfyllnad</strong></td>
+    <td>Antal pixlars utfyllnad i varje cell. </td>
+  </tr>
+  <tr>
+    <td><strong>Cellmellanrum</strong></td>
+    <td>Antal pixlars mellanrum mellan cellerna.</td>
+  </tr>
+  <tr>
+    <td><strong>Justering</strong></td>
+    <td>Tabellens justering. </td>
+  </tr>
+  <tr>
+    <td><strong>Rambredd</strong></td>
+    <td>Ramens bredd .</td>
+  </tr>
+  <tr>
+    <td><strong>Bredd</strong></td>
+    <td>Bredd i pixlar.</td>
+  </tr>
+  <tr>
+    <td><strong>H&ouml;jd</strong></td>
+    <td>H&ouml;jd i pixlar. </td>
+  </tr>
+  <tr>
+    <td><strong>Stil</strong></td>
+    <td>Stilmall p&aring; tabellen. </td>
+  </tr>
+</table>
+<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 

+    <td align="right"><a href="#">Toppen</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/sv/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/zh_cn/about.htm
@@ -1,1 +1,30 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>

+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/zh_cn/common_buttons.htm
@@ -1,1 +1,161 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>

+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<br>
+<table cellpadding="3" cellspacing="1" bgcolor="#000000">
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/bold.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/left.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/center.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/right.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/full.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/link.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/anchor.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/image.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/help.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/code.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../images/table.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../images/table_insert_row_before.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../images/table_insert_row_after.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../images/table_delete_row.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../images/table_insert_col_before.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../images/table_insert_col_after.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../images/table_delete_col.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/hr.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/removeformat.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/sub.gif" width="20" height="20"></td>

+  </tr>
+  <tr bgcolor="#FFFFFF">
+    <td><img src="../../images/sup.gif" width="20" height="20"></td>

+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/zh_cn/images/insert_anchor_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/zh_cn/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/zh_cn/images/insert_link_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/docs/zh_cn/images/insert_table_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/zh_cn/index.htm
@@ -1,1 +1,28 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>

+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 

+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<ul class="toc_ul">






+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/zh_cn/insert_anchor_button.htm
@@ -1,1 +1,32 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>

+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>

+<br>
+<img src="images/insert_anchor_window.gif" width="320" height="127"><br>

+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/zh_cn/insert_image_button.htm
@@ -1,1 +1,64 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>

+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>

+<br>
+<img src="images/insert_image_window.gif" width="340" height="295"><br>

+<br>

+<table cellpadding="3" cellspacing="1" bgcolor="#000000">
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/zh_cn/insert_link_button.htm
@@ -1,1 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>

+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>

+<br>
+<img src="images/insert_link_window.gif" width="320" height="155" border="0"><br>

+<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/zh_cn/insert_table_button.htm
@@ -1,1 +1,72 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<HEAD>

+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>

+<br>
+<img src="images/insert_table_window.gif" width="340" height="239" border="0"><br>
+<br>

+<table cellpadding="3" cellspacing="1" bgcolor="#000000">
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+  <tr>


+  </tr>
+</table>
+<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/docs/zh_cn/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/editor_content.css
@@ -1,1 +1,28 @@
+body {
+	background-color: #FFFFFF;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+	scrollbar-3dlight-color: #F0F0EE;
+	scrollbar-arrow-color: #676662;
+	scrollbar-base-color: #F0F0EE;
+	scrollbar-darkshadow-color: #DDDDDD;
+	scrollbar-face-color: #E0E0DD;
+	scrollbar-highlight-color: #F0F0EE;
+	scrollbar-shadow-color: #F0F0EE;
+	scrollbar-track-color: #F5F5F5;
+}
 
+td {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+}
+
+pre {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+}
+
+.mceVisualAid {
+	border: 1px dashed #BBBBBB;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/editor_popup.css
@@ -1,1 +1,122 @@
+body {
+	background-color: #F0F0EE;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 11px;
+	scrollbar-3dlight-color: #F0F0EE;
+	scrollbar-arrow-color: #676662;
+	scrollbar-base-color: #F0F0EE;
+	scrollbar-darkshadow-color: #DDDDDD;
+	scrollbar-face-color: #E0E0DD;
+	scrollbar-highlight-color: #F0F0EE;
+	scrollbar-shadow-color: #F0F0EE;
+	scrollbar-track-color: #F5F5F5;
+}
 
+td {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 11px;
+}
+
+input {
+	background: #FFFFFF;
+	border: 1px solid #cccccc;
+}
+
+td, input, select, textarea {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+}
+
+input, select, textarea {
+	border: 1px solid #808080;
+}
+
+.input_noborder {
+	border: 0px solid #808080;
+}
+
+#insert {
+   font-weight: bold;
+}
+
+#cancel {
+   font-weight: bold;
+}
+
+.title {
+	font-size: 12px;
+	font-weight: bold;
+}
+
+table.charmap {
+	border-style: solid;
+	border-width: 1px;
+	border-color: #AAAAAA;
+}
+
+td.charmap, td.charmapOver {
+	color: #000000;
+	border-color: #AAAAAA;
+	border-style: solid;
+	border-width: 1px;
+	text-align: center;
+	font-size: 12px;
+}
+
+td.charmapOver {
+	background-color: #CCCCCC;
+	cursor: arrow;
+}
+
+a.charmap {
+	color: #000000;
+	text-decoration: none
+}
+
+.wordWrapCode {
+	vertical-align: middle;
+	border: 1px none #000000;
+	background-color: transparent;
+}
+
+input.radio {
+	border: 1px none #000000;
+	background-color: transparent;
+	vertical-align: middle;
+}
+
+input.checkbox {
+	border: 1px none #000000;
+	background-color: transparent;
+	vertical-align: middle;
+}
+
+.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected {
+	margin-left: 1px;
+}
+
+.mceButtonNormal {
+	border-top: 1px solid;
+	border-left: 1px solid;
+	border-bottom: 1px solid;
+	border-right: 1px solid;
+	border-color: #F0F0EE;
+	cursor: arrow;
+}
+
+.mceButtonOver {
+	border: 1px solid #0A246A;
+	cursor: arrow;
+	background-color: #B6BDD2;
+}
+
+.mceButtonDown {
+	cursor: arrow;
+	border: 1px solid #0A246A;
+	background-color: #8592B5;
+}
+
+legend {
+	font-weight: bold;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/editor_template.js
@@ -1,1 +1,1 @@
-
+(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,extend=tinymce.extend,each=tinymce.each,Cookie=tinymce.util.Cookie,lastExtID,explode=tinymce.explode;tinymce.ThemeManager.requireLangPack('advanced');tinymce.create('tinymce.themes.AdvancedTheme',{controls:{bold:['bold_desc','Bold'],italic:['italic_desc','Italic'],underline:['underline_desc','Underline'],strikethrough:['striketrough_desc','Strikethrough'],justifyleft:['justifyleft_desc','JustifyLeft'],justifycenter:['justifycenter_desc','JustifyCenter'],justifyright:['justifyright_desc','JustifyRight'],justifyfull:['justifyfull_desc','JustifyFull'],bullist:['bullist_desc','InsertUnorderedList'],numlist:['numlist_desc','InsertOrderedList'],outdent:['outdent_desc','Outdent'],indent:['indent_desc','Indent'],cut:['cut_desc','Cut'],copy:['copy_desc','Copy'],paste:['paste_desc','Paste'],undo:['undo_desc','Undo'],redo:['redo_desc','Redo'],link:['link_desc','mceLink'],unlink:['unlink_desc','unlink'],image:['image_desc','mceImage'],cleanup:['cleanup_desc','mceCleanup'],help:['help_desc','mceHelp'],code:['code_desc','mceCodeEditor'],hr:['hr_desc','InsertHorizontalRule'],removeformat:['removeformat_desc','RemoveFormat'],sub:['sub_desc','subscript'],sup:['sup_desc','superscript'],forecolor:['forecolor_desc','ForeColor'],forecolorpicker:['forecolor_desc','mceForeColor'],backcolor:['backcolor_desc','HiliteColor'],backcolorpicker:['backcolor_desc','mceBackColor'],charmap:['charmap_desc','mceCharMap'],visualaid:['visualaid_desc','mceToggleVisualAid'],anchor:['anchor_desc','mceInsertAnchor'],newdocument:['newdocument_desc','mceNewDocument'],blockquote:['blockquote_desc','mceBlockQuote']},stateControls:['bold','italic','underline','strikethrough','bullist','numlist','justifyleft','justifycenter','justifyright','justifyfull','sub','sup','blockquote'],init:function(ed,url){var t=this,s,v;t.editor=ed;t.url=url;t.onResolveName=new tinymce.util.Dispatcher(this);t.settings=s=extend({theme_advanced_path:true,theme_advanced_toolbar_location:'bottom',theme_advanced_buttons1:"bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,|,sub,sup,|,charmap",theme_advanced_blockformats:"p,address,pre,h1,h2,h3,h4,h5,h6",theme_advanced_toolbar_align:"center",theme_advanced_fonts:"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",theme_advanced_font_sizes:"1,2,3,4,5,6,7",theme_advanced_more_colors:1,theme_advanced_row_height:23,theme_advanced_resize_horizontal:1,theme_advanced_resizing_use_cookie:1},ed.settings);if((v=s.theme_advanced_path_location)&&v!='none')s.theme_advanced_statusbar_location=s.theme_advanced_path_location;if(s.theme_advanced_statusbar_location=='none')s.theme_advanced_statusbar_location=0;ed.onInit.add(function(){ed.onNodeChange.add(t._nodeChanged,t);if(ed.settings.content_css!==false)ed.dom.loadCSS(ed.baseURI.toAbsolute("themes/advanced/skins/"+ed.settings.skin+"/content.css"));});ed.onSetProgressState.add(function(ed,b,ti){var co,id=ed.id,tb;if(b){t.progressTimer=setTimeout(function(){co=ed.getContainer();co=co.insertBefore(DOM.create('DIV',{style:'position:relative'}),co.firstChild);tb=DOM.get(ed.id+'_tbl');DOM.add(co,'div',{id:id+'_blocker','class':'mceBlocker',style:{width:tb.clientWidth+2,height:tb.clientHeight+2}});DOM.add(co,'div',{id:id+'_progress','class':'mceProgress',style:{left:tb.clientWidth/ 2, top : tb.clientHeight /2}});},ti||0);}else{DOM.remove(id+'_blocker');DOM.remove(id+'_progress');clearTimeout(t.progressTimer);}});DOM.loadCSS(ed.baseURI.toAbsolute(s.editor_css||"themes/advanced/skins/"+ed.settings.skin+"/ui.css"));if(s.skin_variant)DOM.loadCSS(ed.baseURI.toAbsolute(s.editor_css||"themes/advanced/skins/"+ed.settings.skin+"/ui_"+s.skin_variant+".css"));},createControl:function(n,cf){var cd,c;if(c=cf.createControl(n))return c;switch(n){case"styleselect":return this._createStyleSelect();case"formatselect":return this._createBlockFormats();case"fontselect":return this._createFontSelect();case"fontsizeselect":return this._createFontSizeSelect();case"forecolor":return this._createForeColorMenu();case"backcolor":return this._createBackColorMenu();}if((cd=this.controls[n]))return cf.createButton(n,{title:"advanced."+cd[0],cmd:cd[1],ui:cd[2],value:cd[3]});},execCommand:function(cmd,ui,val){var f=this['_'+cmd];if(f){f.call(this,ui,val);return true;}return false;},_importClasses:function(e){var ed=this.editor,c=ed.controlManager.get('styleselect');if(c.getLength()==0){each(ed.dom.getClasses(),function(o){c.add(o['class'],o['class']);});}},_createStyleSelect:function(n){var t=this,ed=t.editor,cf=ed.controlManager,c=cf.createListBox('styleselect',{title:'advanced.style_select',onselect:function(v){if(c.selectedValue===v){ed.execCommand('mceSetStyleInfo',0,{command:'removeformat'});c.select();return false;}else ed.execCommand('mceSetCSSClass',0,v);}});if(c){each(ed.getParam('theme_advanced_styles','','hash'),function(v,k){if(v)c.add(t.editor.translate(k),v);});c.onPostRender.add(function(ed,n){Event.add(n.id+'_text','focus',t._importClasses,t);Event.add(n.id+'_text','mousedown',t._importClasses,t);});}return c;},_createFontSelect:function(){var c,t=this,ed=t.editor;c=ed.controlManager.createListBox('fontselect',{title:'advanced.fontdefault',cmd:'FontName'});if(c){each(ed.getParam('theme_advanced_fonts',t.settings.theme_advanced_fonts,'hash'),function(v,k){c.add(ed.translate(k),v,{style:v.indexOf('dings')==-1?'font-family:'+v:''});});}return c;},_createFontSizeSelect:function(){var t=this,ed=t.editor,c,lo=["1 (8 pt)","2 (10 pt)","3 (12 pt)","4 (14 pt)","5 (18 pt)","6 (24 pt)","7 (36 pt)"],fz=[8,10,12,14,18,24,36];c=ed.controlManager.createListBox('fontsizeselect',{title:'advanced.font_size',cmd:'FontSize'});if(c){each(ed.getParam('theme_advanced_font_sizes',t.settings.theme_advanced_font_sizes,'hash'),function(v,k){c.add(k!=v?k:lo[parseInt(v)-1],v,{'style':'font-size:'+fz[v-1]+'pt','class':'mceFontSize'+v});});}return c;},_createBlockFormats:function(){var c,fmts={p:'advanced.paragraph',address:'advanced.address',pre:'advanced.pre',h1:'advanced.h1',h2:'advanced.h2',h3:'advanced.h3',h4:'advanced.h4',h5:'advanced.h5',h6:'advanced.h6',div:'advanced.div',blockquote:'advanced.blockquote',code:'advanced.code',dt:'advanced.dt',dd:'advanced.dd',samp:'advanced.samp'},t=this;c=t.editor.controlManager.createListBox('formatselect',{title:'advanced.block',cmd:'FormatBlock'});if(c){each(t.editor.getParam('theme_advanced_blockformats',t.settings.theme_advanced_blockformats,'hash'),function(v,k){c.add(t.editor.translate(k!=v?k:fmts[v]),v,{'class':'mce_formatPreview mce_'+v});});}return c;},_createForeColorMenu:function(){var c,t=this,s=t.settings,o={},v;if(s.theme_advanced_more_colors){o.more_colors_func=function(){t._mceColorPicker(0,{color:c.value,func:function(co){c.setColor(co);}});};}if(v=s.theme_advanced_text_colors)o.colors=v;o.title='advanced.forecolor_desc';o.cmd='ForeColor';o.scope=this;c=t.editor.controlManager.createColorSplitButton('forecolor',o);return c;},_createBackColorMenu:function(){var c,t=this,s=t.settings,o={},v;if(s.theme_advanced_more_colors){o.more_colors_func=function(){t._mceColorPicker(0,{color:c.value,func:function(co){c.setColor(co);}});};}if(v=s.theme_advanced_background_colors)o.colors=v;o.title='advanced.backcolor_desc';o.cmd='HiliteColor';o.scope=this;c=t.editor.controlManager.createColorSplitButton('backcolor',o);return c;},renderUI:function(o){var n,ic,tb,t=this,ed=t.editor,s=t.settings,sc,p,nl;n=p=DOM.create('span',{id:ed.id+'_parent','class':'mceEditor '+ed.settings.skin+'Skin'+(s.skin_variant?' '+ed.settings.skin+'Skin'+t._ufirst(s.skin_variant):'')});if(!DOM.boxModel)n=DOM.add(n,'div',{'class':'mceOldBoxModel'});n=sc=DOM.add(n,'table',{id:ed.id+'_tbl','class':'mceLayout',cellSpacing:0,cellPadding:0});n=tb=DOM.add(n,'tbody');switch((s.theme_advanced_layout_manager||'').toLowerCase()){case"rowlayout":ic=t._rowLayout(s,tb,o);break;case"customlayout":ic=ed.execCallback("theme_advanced_custom_layout",s,tb,o,p);break;default:ic=t._simpleLayout(s,tb,o,p);}n=o.targetNode;nl=DOM.stdMode?sc.getElementsByTagName('tr'):sc.rows;DOM.addClass(nl[0],'mceFirst');DOM.addClass(nl[nl.length-1],'mceLast');each(DOM.select('tr',tb),function(n){DOM.addClass(n.firstChild,'mceFirst');DOM.addClass(n.childNodes[n.childNodes.length-1],'mceLast');});if(DOM.get(s.theme_advanced_toolbar_container))DOM.get(s.theme_advanced_toolbar_container).appendChild(p);else DOM.insertAfter(p,n);Event.add(ed.id+'_path_row','click',function(e){e=e.target;if(e.nodeName=='A'){t._sel(e.className.replace(/^.*mcePath_([0-9]+).*$/,'$1'));return Event.cancel(e);}});if(!ed.getParam('accessibility_focus')||ed.getParam('tab_focus'))Event.add(DOM.add(p,'a',{href:'#'},'<!-- IE -->'),'focus',function(){tinyMCE.get(ed.id).focus();});if(s.theme_advanced_toolbar_location=='external')o.deltaHeight=0;t.deltaHeight=o.deltaHeight;o.targetNode=null;return{iframeContainer:ic,editorContainer:ed.id+'_parent',sizeContainer:sc,deltaHeight:o.deltaHeight};},getInfo:function(){return{longname:'Advanced theme',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',version:tinymce.majorVersion+"."+tinymce.minorVersion}},resizeBy:function(dw,dh){var e=DOM.get(this.editor.id+'_tbl');this.resizeTo(e.clientWidth+dw,e.clientHeight+dh);},resizeTo:function(w,h){var ed=this.editor,s=ed.settings,e=DOM.get(ed.id+'_tbl'),ifr=DOM.get(ed.id+'_ifr'),dh;w=Math.max(s.theme_advanced_resizing_min_width||100,w);h=Math.max(s.theme_advanced_resizing_min_height||100,h);w=Math.min(s.theme_advanced_resizing_max_width||0xFFFF,w);h=Math.min(s.theme_advanced_resizing_max_height||0xFFFF,h);dh=e.clientHeight-ifr.clientHeight;DOM.setStyle(ifr,'height',h-dh);DOM.setStyles(e,{width:w,height:h});},destroy:function(){var id=this.editor.id;Event.clear(id+'_resize');Event.clear(id+'_path_row');Event.clear(id+'_external_close');},_simpleLayout:function(s,tb,o,p){var t=this,ed=t.editor,lo=s.theme_advanced_toolbar_location,sl=s.theme_advanced_statusbar_location,n,ic,etb,c;if(lo=='top')t._addToolbars(tb,o);if(lo=='external'){n=c=DOM.create('div',{style:'position:relative'});n=DOM.add(n,'div',{id:ed.id+'_external','class':'mceExternalToolbar'});DOM.add(n,'a',{id:ed.id+'_external_close',href:'javascript:;','class':'mceExternalClose'});n=DOM.add(n,'table',{id:ed.id+'_tblext',cellSpacing:0,cellPadding:0});etb=DOM.add(n,'tbody');if(p.firstChild.className=='mceOldBoxModel')p.firstChild.appendChild(c);else p.insertBefore(c,p.firstChild);t._addToolbars(etb,o);ed.onMouseUp.add(function(){var e=DOM.get(ed.id+'_external');DOM.show(e);DOM.hide(lastExtID);var f=Event.add(ed.id+'_external_close','click',function(){DOM.hide(ed.id+'_external');Event.remove(ed.id+'_external_close','click',f);});DOM.show(e);DOM.setStyle(e,'top',0-DOM.getRect(ed.id+'_tblext').h-1);DOM.hide(e);DOM.show(e);e.style.filter='';lastExtID=ed.id+'_external';e=null;});}if(sl=='top')t._addStatusBar(tb,o);if(!s.theme_advanced_toolbar_container){n=DOM.add(tb,'tr');n=ic=DOM.add(n,'td',{'class':'mceIframeContainer'});}if(lo=='bottom')t._addToolbars(tb,o);if(sl=='bottom')t._addStatusBar(tb,o);return ic;},_rowLayout:function(s,tb,o){var t=this,ed=t.editor,dc,da,cf=ed.controlManager,n,ic,to,a;dc=s.theme_advanced_containers_default_class||'';da=s.theme_advanced_containers_default_align||'center';each(explode(s.theme_advanced_containers||''),function(c,i){var v=s['theme_advanced_container_'+c]||'';switch(v.toLowerCase()){case'mceeditor':n=DOM.add(tb,'tr');n=ic=DOM.add(n,'td',{'class':'mceIframeContainer'});break;case'mceelementpath':t._addStatusBar(tb,o);break;default:a=(s['theme_advanced_container_'+c+'_align']||da).toLowerCase();a='mce'+t._ufirst(a);n=DOM.add(DOM.add(tb,'tr'),'td',{'class':'mceToolbar '+(s['theme_advanced_container_'+c+'_class']||dc)+' '+a||da});to=cf.createToolbar("toolbar"+i);t._addControls(v,to);DOM.setHTML(n,to.renderHTML());o.deltaHeight-=s.theme_advanced_row_height;}});return ic;},_addControls:function(v,tb){var t=this,s=t.settings,di,cf=t.editor.controlManager;if(s.theme_advanced_disable&&!t._disabled){di={};each(explode(s.theme_advanced_disable),function(v){di[v]=1;});t._disabled=di;}else di=t._disabled;each(explode(v),function(n){var c;if(di&&di[n])return;if(n=='tablecontrols'){each(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"],function(n){n=t.createControl(n,cf);if(n)tb.add(n);});return;}c=t.createControl(n,cf);if(c)tb.add(c);});},_addToolbars:function(c,o){var t=this,i,tb,ed=t.editor,s=t.settings,v,cf=ed.controlManager,di,n,h=[],a;a=s.theme_advanced_toolbar_align.toLowerCase();a='mce'+t._ufirst(a);n=DOM.add(DOM.add(c,'tr'),'td',{'class':'mceToolbar '+a});if(!ed.getParam('accessibility_focus')||ed.getParam('tab_focus'))h.push(DOM.createHTML('a',{href:'#',onfocus:'tinyMCE.get(\''+ed.id+'\').focus();'},'<!-- IE -->'));h.push(DOM.createHTML('a',{href:'#',accesskey:'q',title:ed.getLang("advanced.toolbar_focus")},'<!-- IE -->'));for(i=1;(v=s['theme_advanced_buttons'+i]);i++){tb=cf.createToolbar("toolbar"+i,{'class':'mceToolbarRow'+i});if(s['theme_advanced_buttons'+i+'_add'])v+=','+s['theme_advanced_buttons'+i+'_add'];if(s['theme_advanced_buttons'+i+'_add_before'])v=s['theme_advanced_buttons'+i+'_add_before']+','+v;t._addControls(v,tb);h.push(tb.renderHTML());o.deltaHeight-=s.theme_advanced_row_height;}h.push(DOM.createHTML('a',{href:'#',accesskey:'z',title:ed.getLang("advanced.toolbar_focus"),onfocus:'tinyMCE.getInstanceById(\''+ed.id+'\').focus();'},'<!-- IE -->'));DOM.setHTML(n,h.join(''));},_addStatusBar:function(tb,o){var n,t=this,ed=t.editor,s=t.settings,r,mf,me,td;n=DOM.add(tb,'tr');n=td=DOM.add(n,'td',{'class':'mceStatusbar'});n=DOM.add(n,'div',{id:ed.id+'_path_row'},s.theme_advanced_path?ed.translate('advanced.path')+': ':'&nbsp;');DOM.add(n,'a',{href:'#',accesskey:'x'});if(s.theme_advanced_resizing&&!tinymce.isOldWebKit){DOM.add(td,'a',{id:ed.id+'_resize',href:'javascript:;',onclick:"return false;",'class':'mceResize'});if(s.theme_advanced_resizing_use_cookie){ed.onPostRender.add(function(){var o=Cookie.getHash("TinyMCE_"+ed.id+"_size"),c=DOM.get(ed.id+'_tbl');if(!o)return;if(s.theme_advanced_resize_horizontal)c.style.width=Math.max(10,o.cw)+'px';c.style.height=Math.max(10,o.ch)+'px';DOM.get(ed.id+'_ifr').style.height=Math.max(10,parseInt(o.ch)+t.deltaHeight)+'px';});}ed.onPostRender.add(function(){Event.add(ed.id+'_resize','mousedown',function(e){var c,p,w,h,n,pa;c=DOM.get(ed.id+'_tbl');w=c.clientWidth;h=c.clientHeight;miw=s.theme_advanced_resizing_min_width||100;mih=s.theme_advanced_resizing_min_height||100;maw=s.theme_advanced_resizing_max_width||0xFFFF;mah=s.theme_advanced_resizing_max_height||0xFFFF;p=DOM.add(DOM.get(ed.id+'_parent'),'div',{'class':'mcePlaceHolder'});DOM.setStyles(p,{width:w,height:h});DOM.hide(c);DOM.show(p);r={x:e.screenX,y:e.screenY,w:w,h:h,dx:null,dy:null};mf=Event.add(DOM.doc,'mousemove',function(e){var w,h;r.dx=e.screenX-r.x;r.dy=e.screenY-r.y;w=Math.max(miw,r.w+r.dx);h=Math.max(mih,r.h+r.dy);w=Math.min(maw,w);h=Math.min(mah,h);if(s.theme_advanced_resize_horizontal)p.style.width=w+'px';p.style.height=h+'px';return Event.cancel(e);});me=Event.add(DOM.doc,'mouseup',function(e){var ifr;Event.remove(DOM.doc,'mousemove',mf);Event.remove(DOM.doc,'mouseup',me);c.style.display='';DOM.remove(p);if(r.dx===null)return;ifr=DOM.get(ed.id+'_ifr');if(s.theme_advanced_resize_horizontal)c.style.width=Math.max(10,r.w+r.dx)+'px';c.style.height=Math.max(10,r.h+r.dy)+'px';ifr.style.height=Math.max(10,ifr.clientHeight+r.dy)+'px';if(s.theme_advanced_resizing_use_cookie){Cookie.setHash("TinyMCE_"+ed.id+"_size",{cw:r.w+r.dx,ch:r.h+r.dy});}});return Event.cancel(e);});});}o.deltaHeight-=21;n=tb=null;},_nodeChanged:function(ed,cm,n,co){var t=this,p,de=0,v,c,s=t.settings;tinymce.each(t.stateControls,function(c){cm.setActive(c,ed.queryCommandState(t.controls[c][1]));});cm.setActive('visualaid',ed.hasVisual);cm.setDisabled('undo',!ed.undoManager.hasUndo()&&!ed.typing);cm.setDisabled('redo',!ed.undoManager.hasRedo());cm.setDisabled('outdent',!ed.queryCommandState('Outdent'));p=DOM.getParent(n,'A');if(c=cm.get('link')){if(!p||!p.name){c.setDisabled(!p&&co);c.setActive(!!p);}}if(c=cm.get('unlink')){c.setDisabled(!p&&co);c.setActive(!!p&&!p.name);}if(c=cm.get('anchor')){c.setActive(!!p&&p.name);if(tinymce.isWebKit){p=DOM.getParent(n,'IMG');c.setActive(!!p&&DOM.getAttrib(p,'mce_name')=='a');}}p=DOM.getParent(n,'IMG');if(c=cm.get('image'))c.setActive(!!p&&n.className.indexOf('mceItem')==-1);if(c=cm.get('styleselect')){if(n.className){t._importClasses();c.select(n.className);}else c.select();}if(c=cm.get('formatselect')){p=DOM.getParent(n,DOM.isBlock);if(p)c.select(p.nodeName.toLowerCase());}if(c=cm.get('fontselect'))c.select(ed.queryCommandValue('FontName'));if(c=cm.get('fontsizeselect'))c.select(''+ed.queryCommandValue('FontSize'));if(s.theme_advanced_path&&s.theme_advanced_statusbar_location){p=DOM.get(ed.id+'_path')||DOM.add(ed.id+'_path_row','span',{id:ed.id+'_path'});DOM.setHTML(p,'');ed.dom.getParent(n,function(n){var na=n.nodeName.toLowerCase(),u,pi,ti='';if(n.nodeType!=1||(DOM.hasClass(n,'mceItemHidden')||DOM.hasClass(n,'mceItemRemoved')))return;if(v=DOM.getAttrib(n,'mce_name'))na=v;if(tinymce.isIE&&n.scopeName!=='HTML')na=n.scopeName+':'+na;na=na.replace(/mce\:/g,'');switch(na){case'b':na='strong';break;case'i':na='em';break;case'img':if(v=DOM.getAttrib(n,'src'))ti+='src: '+v+' ';break;case'a':if(v=DOM.getAttrib(n,'name')){ti+='name: '+v+' ';na+='#'+v;}if(v=DOM.getAttrib(n,'href'))ti+='href: '+v+' ';break;case'font':if(s.convert_fonts_to_spans)na='span';if(v=DOM.getAttrib(n,'face'))ti+='font: '+v+' ';if(v=DOM.getAttrib(n,'size'))ti+='size: '+v+' ';if(v=DOM.getAttrib(n,'color'))ti+='color: '+v+' ';break;case'span':if(v=DOM.getAttrib(n,'style'))ti+='style: '+v+' ';break;}if(v=DOM.getAttrib(n,'id'))ti+='id: '+v+' ';if(v=n.className){v=v.replace(/(webkit-[\w\-]+|Apple-[\w\-]+|mceItem\w+|mceVisualAid)/g,'');if(v&&v.indexOf('mceItem')==-1){ti+='class: '+v+' ';if(DOM.isBlock(n)||na=='img'||na=='span')na+='.'+v;}}na=na.replace(/(html:)/g,'');na={name:na,node:n,title:ti};t.onResolveName.dispatch(t,na);ti=na.title;na=na.name;pi=DOM.create('a',{'href':"javascript:;",onmousedown:"return false;",title:ti,'class':'mcePath_'+(de++)},na);if(p.hasChildNodes()){p.insertBefore(DOM.doc.createTextNode(' \u00bb '),p.firstChild);p.insertBefore(pi,p.firstChild);}else p.appendChild(pi);},ed.getBody());}},_sel:function(v){this.editor.execCommand('mceSelectNodeDepth',false,v);},_mceInsertAnchor:function(ui,v){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/anchor.htm',width:320+parseInt(ed.getLang('advanced.anchor_delta_width',0)),height:90+parseInt(ed.getLang('advanced.anchor_delta_height',0)),inline:true},{theme_url:this.url});},_mceCharMap:function(){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/charmap.htm',width:550+parseInt(ed.getLang('advanced.charmap_delta_width',0)),height:250+parseInt(ed.getLang('advanced.charmap_delta_height',0)),inline:true},{theme_url:this.url});},_mceHelp:function(){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/about.htm',width:480,height:380,inline:true},{theme_url:this.url});},_mceColorPicker:function(u,v){var ed=this.editor;v=v||{};ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/color_picker.htm',width:375+parseInt(ed.getLang('advanced.colorpicker_delta_width',0)),height:250+parseInt(ed.getLang('advanced.colorpicker_delta_height',0)),close_previous:false,inline:true},{input_color:v.color,func:v.func,theme_url:this.url});},_mceCodeEditor:function(ui,val){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/source_editor.htm',width:parseInt(ed.getParam("theme_advanced_source_editor_width",720)),height:parseInt(ed.getParam("theme_advanced_source_editor_height",580)),inline:true,resizable:true,maximizable:true},{theme_url:this.url});},_mceImage:function(ui,val){var ed=this.editor;if(ed.dom.getAttrib(ed.selection.getNode(),'class').indexOf('mceItem')!=-1)return;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/image.htm',width:355+parseInt(ed.getLang('advanced.image_delta_width',0)),height:275+parseInt(ed.getLang('advanced.image_delta_height',0)),inline:true},{theme_url:this.url});},_mceLink:function(ui,val){var ed=this.editor;ed.windowManager.open({url:tinymce.baseURL+'/themes/advanced/link.htm',width:310+parseInt(ed.getLang('advanced.link_delta_width',0)),height:200+parseInt(ed.getLang('advanced.link_delta_height',0)),inline:true},{theme_url:this.url});},_mceNewDocument:function(){var ed=this.editor;ed.windowManager.confirm('advanced.newdocument',function(s){if(s)ed.execCommand('mceSetContent',false,'');});},_mceForeColor:function(){var t=this;this._mceColorPicker(0,{color:t.fgColor,func:function(co){t.fgColor=co;t.editor.execCommand('ForeColor',false,co);}});},_mceBackColor:function(){var t=this;this._mceColorPicker(0,{color:t.bgColor,func:function(co){t.bgColor=co;t.editor.execCommand('HiliteColor',false,co);}});},_ufirst:function(s){return s.substring(0,1).toUpperCase()+s.substring(1);}});tinymce.ThemeManager.add('advanced',tinymce.themes.AdvancedTheme);}());

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/editor_template_src.js
@@ -1,1 +1,1052 @@
-
+/**
+ * $Id: editor_template_src.js 852 2008-05-27 05:52:09Z spocke $
+ *
+ * @author Moxiecode

+ */
+
+(function() {
+	var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, each = tinymce.each, Cookie = tinymce.util.Cookie, lastExtID, explode = tinymce.explode;
+
+	// Tell it to load theme specific language pack(s)
+	tinymce.ThemeManager.requireLangPack('advanced');
+
+	tinymce.create('tinymce.themes.AdvancedTheme', {
+		// Control name lookup, format: title, command
+		controls : {
+			bold : ['bold_desc', 'Bold'],
+			italic : ['italic_desc', 'Italic'],
+			underline : ['underline_desc', 'Underline'],
+			strikethrough : ['striketrough_desc', 'Strikethrough'],
+			justifyleft : ['justifyleft_desc', 'JustifyLeft'],
+			justifycenter : ['justifycenter_desc', 'JustifyCenter'],
+			justifyright : ['justifyright_desc', 'JustifyRight'],
+			justifyfull : ['justifyfull_desc', 'JustifyFull'],
+			bullist : ['bullist_desc', 'InsertUnorderedList'],
+			numlist : ['numlist_desc', 'InsertOrderedList'],
+			outdent : ['outdent_desc', 'Outdent'],
+			indent : ['indent_desc', 'Indent'],
+			cut : ['cut_desc', 'Cut'],
+			copy : ['copy_desc', 'Copy'],
+			paste : ['paste_desc', 'Paste'],
+			undo : ['undo_desc', 'Undo'],
+			redo : ['redo_desc', 'Redo'],
+			link : ['link_desc', 'mceLink'],
+			unlink : ['unlink_desc', 'unlink'],
+			image : ['image_desc', 'mceImage'],
+			cleanup : ['cleanup_desc', 'mceCleanup'],
+			help : ['help_desc', 'mceHelp'],
+			code : ['code_desc', 'mceCodeEditor'],
+			hr : ['hr_desc', 'InsertHorizontalRule'],
+			removeformat : ['removeformat_desc', 'RemoveFormat'],
+			sub : ['sub_desc', 'subscript'],
+			sup : ['sup_desc', 'superscript'],
+			forecolor : ['forecolor_desc', 'ForeColor'],
+			forecolorpicker : ['forecolor_desc', 'mceForeColor'],
+			backcolor : ['backcolor_desc', 'HiliteColor'],
+			backcolorpicker : ['backcolor_desc', 'mceBackColor'],
+			charmap : ['charmap_desc', 'mceCharMap'],
+			visualaid : ['visualaid_desc', 'mceToggleVisualAid'],
+			anchor : ['anchor_desc', 'mceInsertAnchor'],
+			newdocument : ['newdocument_desc', 'mceNewDocument'],
+			blockquote : ['blockquote_desc', 'mceBlockQuote']
+		},
+
+		stateControls : ['bold', 'italic', 'underline', 'strikethrough', 'bullist', 'numlist', 'justifyleft', 'justifycenter', 'justifyright', 'justifyfull', 'sub', 'sup', 'blockquote'],
+
+		init : function(ed, url) {
+			var t = this, s, v;
+	
+			t.editor = ed;
+			t.url = url;
+			t.onResolveName = new tinymce.util.Dispatcher(this);
+
+			// Default settings
+			t.settings = s = extend({
+				theme_advanced_path : true,
+				theme_advanced_toolbar_location : 'bottom',
+				theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",
+				theme_advanced_buttons2 : "bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",
+				theme_advanced_buttons3 : "hr,removeformat,visualaid,|,sub,sup,|,charmap",
+				theme_advanced_blockformats : "p,address,pre,h1,h2,h3,h4,h5,h6",
+				theme_advanced_toolbar_align : "center",
+				theme_advanced_fonts : "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",
+				theme_advanced_font_sizes : "1,2,3,4,5,6,7",
+				theme_advanced_more_colors : 1,
+				theme_advanced_row_height : 23,
+				theme_advanced_resize_horizontal : 1,
+				theme_advanced_resizing_use_cookie : 1
+			}, ed.settings);
+
+			if ((v = s.theme_advanced_path_location) && v != 'none')
+				s.theme_advanced_statusbar_location = s.theme_advanced_path_location;
+
+			if (s.theme_advanced_statusbar_location == 'none')
+				s.theme_advanced_statusbar_location = 0;
+
+			// Init editor
+			ed.onInit.add(function() {
+				ed.onNodeChange.add(t._nodeChanged, t);
+
+				if (ed.settings.content_css !== false)
+					ed.dom.loadCSS(ed.baseURI.toAbsolute("themes/advanced/skins/" + ed.settings.skin + "/content.css"));
+			});
+
+			ed.onSetProgressState.add(function(ed, b, ti) {
+				var co, id = ed.id, tb;
+
+				if (b) {
+					t.progressTimer = setTimeout(function() {
+						co = ed.getContainer();
+						co = co.insertBefore(DOM.create('DIV', {style : 'position:relative'}), co.firstChild);
+						tb = DOM.get(ed.id + '_tbl');
+
+						DOM.add(co, 'div', {id : id + '_blocker', 'class' : 'mceBlocker', style : {width : tb.clientWidth + 2, height : tb.clientHeight + 2}});
+						DOM.add(co, 'div', {id : id + '_progress', 'class' : 'mceProgress', style : {left : tb.clientWidth / 2, top : tb.clientHeight / 2}});
+					}, ti || 0);
+				} else {
+					DOM.remove(id + '_blocker');
+					DOM.remove(id + '_progress');
+					clearTimeout(t.progressTimer);
+				}
+			});
+
+			DOM.loadCSS(ed.baseURI.toAbsolute(s.editor_css || "themes/advanced/skins/" + ed.settings.skin + "/ui.css"));
+
+			if (s.skin_variant)
+				DOM.loadCSS(ed.baseURI.toAbsolute(s.editor_css || "themes/advanced/skins/" + ed.settings.skin + "/ui_" + s.skin_variant + ".css"));
+		},
+
+		createControl : function(n, cf) {
+			var cd, c;
+
+			if (c = cf.createControl(n))
+				return c;
+
+			switch (n) {
+				case "styleselect":
+					return this._createStyleSelect();
+
+				case "formatselect":
+					return this._createBlockFormats();
+
+				case "fontselect":
+					return this._createFontSelect();
+
+				case "fontsizeselect":
+					return this._createFontSizeSelect();
+
+				case "forecolor":
+					return this._createForeColorMenu();
+
+				case "backcolor":
+					return this._createBackColorMenu();
+			}
+
+			if ((cd = this.controls[n]))
+				return cf.createButton(n, {title : "advanced." + cd[0], cmd : cd[1], ui : cd[2], value : cd[3]});
+		},
+
+		execCommand : function(cmd, ui, val) {
+			var f = this['_' + cmd];
+
+			if (f) {
+				f.call(this, ui, val);
+				return true;
+			}
+
+			return false;
+		},
+
+		_importClasses : function(e) {
+			var ed = this.editor, c = ed.controlManager.get('styleselect');
+
+			if (c.getLength() == 0) {
+				each(ed.dom.getClasses(), function(o) {
+					c.add(o['class'], o['class']);
+				});
+			}
+		},
+
+		_createStyleSelect : function(n) {
+			var t = this, ed = t.editor, cf = ed.controlManager, c = cf.createListBox('styleselect', {
+				title : 'advanced.style_select',
+				onselect : function(v) {
+					if (c.selectedValue === v) {
+						ed.execCommand('mceSetStyleInfo', 0, {command : 'removeformat'});
+						c.select();
+						return false;
+					} else
+						ed.execCommand('mceSetCSSClass', 0, v);
+				}
+			});
+
+			if (c) {
+				each(ed.getParam('theme_advanced_styles', '', 'hash'), function(v, k) {
+					if (v)
+						c.add(t.editor.translate(k), v);
+				});
+
+				c.onPostRender.add(function(ed, n) {
+					Event.add(n.id + '_text', 'focus', t._importClasses, t);
+					Event.add(n.id + '_text', 'mousedown', t._importClasses, t);
+				});
+			}
+
+			return c;
+		},
+
+		_createFontSelect : function() {
+			var c, t = this, ed = t.editor;
+
+			c = ed.controlManager.createListBox('fontselect', {title : 'advanced.fontdefault', cmd : 'FontName'});
+			if (c) {
+				each(ed.getParam('theme_advanced_fonts', t.settings.theme_advanced_fonts, 'hash'), function(v, k) {
+					c.add(ed.translate(k), v, {style : v.indexOf('dings') == -1 ? 'font-family:' + v : ''});
+				});
+			}
+
+			return c;
+		},
+
+		_createFontSizeSelect : function() {
+			var t = this, ed = t.editor, c, lo = [
+				"1 (8 pt)",
+				"2 (10 pt)",
+				"3 (12 pt)",
+				"4 (14 pt)",
+				"5 (18 pt)",
+				"6 (24 pt)",
+				"7 (36 pt)"
+			], fz = [8, 10, 12, 14, 18, 24, 36];
+
+			c = ed.controlManager.createListBox('fontsizeselect', {title : 'advanced.font_size', cmd : 'FontSize'});
+			if (c) {
+				each(ed.getParam('theme_advanced_font_sizes', t.settings.theme_advanced_font_sizes, 'hash'), function(v, k) {
+					c.add(k != v ? k : lo[parseInt(v) - 1], v, {'style' : 'font-size:' + fz[v - 1] + 'pt', 'class' : 'mceFontSize' + v});
+				});
+			}
+
+			return c;
+		},
+
+		_createBlockFormats : function() {
+			var c, fmts = {
+				p : 'advanced.paragraph',
+				address : 'advanced.address',
+				pre : 'advanced.pre',
+				h1 : 'advanced.h1',
+				h2 : 'advanced.h2',
+				h3 : 'advanced.h3',
+				h4 : 'advanced.h4',
+				h5 : 'advanced.h5',
+				h6 : 'advanced.h6',
+				div : 'advanced.div',
+				blockquote : 'advanced.blockquote',
+				code : 'advanced.code',
+				dt : 'advanced.dt',
+				dd : 'advanced.dd',
+				samp : 'advanced.samp'
+			}, t = this;
+
+			c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', cmd : 'FormatBlock'});
+			if (c) {
+				each(t.editor.getParam('theme_advanced_blockformats', t.settings.theme_advanced_blockformats, 'hash'), function(v, k) {
+					c.add(t.editor.translate(k != v ? k : fmts[v]), v, {'class' : 'mce_formatPreview mce_' + v});
+				});
+			}
+
+			return c;
+		},
+
+		_createForeColorMenu : function() {
+			var c, t = this, s = t.settings, o = {}, v;
+
+			if (s.theme_advanced_more_colors) {
+				o.more_colors_func = function() {
+					t._mceColorPicker(0, {
+						color : c.value,
+						func : function(co) {
+							c.setColor(co);
+						}
+					});
+				};
+			}
+
+			if (v = s.theme_advanced_text_colors)
+				o.colors = v;
+
+			o.title = 'advanced.forecolor_desc';
+			o.cmd = 'ForeColor';
+			o.scope = this;
+
+			c = t.editor.controlManager.createColorSplitButton('forecolor', o);
+
+			return c;
+		},
+
+		_createBackColorMenu : function() {
+			var c, t = this, s = t.settings, o = {}, v;
+
+			if (s.theme_advanced_more_colors) {
+				o.more_colors_func = function() {
+					t._mceColorPicker(0, {
+						color : c.value,
+						func : function(co) {
+							c.setColor(co);
+						}
+					});
+				};
+			}
+
+			if (v = s.theme_advanced_background_colors)
+				o.colors = v;
+
+			o.title = 'advanced.backcolor_desc';
+			o.cmd = 'HiliteColor';
+			o.scope = this;
+
+			c = t.editor.controlManager.createColorSplitButton('backcolor', o);
+
+			return c;
+		},
+
+		renderUI : function(o) {
+			var n, ic, tb, t = this, ed = t.editor, s = t.settings, sc, p, nl;
+
+			n = p = DOM.create('span', {id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '')});
+
+			if (!DOM.boxModel)
+				n = DOM.add(n, 'div', {'class' : 'mceOldBoxModel'});
+
+			n = sc = DOM.add(n, 'table', {id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0});
+			n = tb = DOM.add(n, 'tbody');
+
+			switch ((s.theme_advanced_layout_manager || '').toLowerCase()) {
+				case "rowlayout":
+					ic = t._rowLayout(s, tb, o);
+					break;
+
+				case "customlayout":
+					ic = ed.execCallback("theme_advanced_custom_layout", s, tb, o, p);
+					break;
+
+				default:
+					ic = t._simpleLayout(s, tb, o, p);
+			}
+
+			n = o.targetNode;
+
+			// Add classes to first and last TRs
+			nl = DOM.stdMode ? sc.getElementsByTagName('tr') : sc.rows; // Quick fix for IE 8
+			DOM.addClass(nl[0], 'mceFirst');
+			DOM.addClass(nl[nl.length - 1], 'mceLast');
+
+			// Add classes to first and last TDs
+			each(DOM.select('tr', tb), function(n) {
+				DOM.addClass(n.firstChild, 'mceFirst');
+				DOM.addClass(n.childNodes[n.childNodes.length - 1], 'mceLast');
+			});
+
+			if (DOM.get(s.theme_advanced_toolbar_container))
+				DOM.get(s.theme_advanced_toolbar_container).appendChild(p);
+			else
+				DOM.insertAfter(p, n);
+
+			Event.add(ed.id + '_path_row', 'click', function(e) {
+				e = e.target;
+
+				if (e.nodeName == 'A') {
+					t._sel(e.className.replace(/^.*mcePath_([0-9]+).*$/, '$1'));
+
+					return Event.cancel(e);
+				}
+			});
+/*
+			if (DOM.get(ed.id + '_path_row')) {
+				Event.add(ed.id + '_tbl', 'mouseover', function(e) {
+					var re;
+	
+					e = e.target;
+
+					if (e.nodeName == 'SPAN' && DOM.hasClass(e.parentNode, 'mceButton')) {
+						re = DOM.get(ed.id + '_path_row');
+						t.lastPath = re.innerHTML;
+						DOM.setHTML(re, e.parentNode.title);
+					}
+				});
+
+				Event.add(ed.id + '_tbl', 'mouseout', function(e) {
+					if (t.lastPath) {
+						DOM.setHTML(ed.id + '_path_row', t.lastPath);
+						t.lastPath = 0;
+					}
+				});
+			}
+*/
+
+			if (!ed.getParam('accessibility_focus') || ed.getParam('tab_focus'))
+				Event.add(DOM.add(p, 'a', {href : '#'}, '<!-- IE -->'), 'focus', function() {tinyMCE.get(ed.id).focus();});
+
+			if (s.theme_advanced_toolbar_location == 'external')
+				o.deltaHeight = 0;
+
+			t.deltaHeight = o.deltaHeight;
+			o.targetNode = null;
+
+			return {
+				iframeContainer : ic,
+				editorContainer : ed.id + '_parent',
+				sizeContainer : sc,
+				deltaHeight : o.deltaHeight
+			};
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Advanced theme',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			}
+		},
+
+		resizeBy : function(dw, dh) {
+			var e = DOM.get(this.editor.id + '_tbl');
+
+			this.resizeTo(e.clientWidth + dw, e.clientHeight + dh);
+		},
+
+		resizeTo : function(w, h) {
+			var ed = this.editor, s = ed.settings, e = DOM.get(ed.id + '_tbl'), ifr = DOM.get(ed.id + '_ifr'), dh;
+
+			// Boundery fix box
+			w = Math.max(s.theme_advanced_resizing_min_width || 100, w);
+			h = Math.max(s.theme_advanced_resizing_min_height || 100, h);
+			w = Math.min(s.theme_advanced_resizing_max_width || 0xFFFF, w);
+			h = Math.min(s.theme_advanced_resizing_max_height || 0xFFFF, h);
+
+			// Calc difference between iframe and container
+			dh = e.clientHeight - ifr.clientHeight;
+
+			// Resize iframe and container
+			DOM.setStyle(ifr, 'height', h - dh);
+			DOM.setStyles(e, {width : w, height : h});
+		},
+
+		destroy : function() {
+			var id = this.editor.id;
+
+			Event.clear(id + '_resize');
+			Event.clear(id + '_path_row');
+			Event.clear(id + '_external_close');
+		},
+
+		// Internal functions
+
+		_simpleLayout : function(s, tb, o, p) {
+			var t = this, ed = t.editor, lo = s.theme_advanced_toolbar_location, sl = s.theme_advanced_statusbar_location, n, ic, etb, c;
+
+			// Create toolbar container at top
+			if (lo == 'top')
+				t._addToolbars(tb, o);
+
+			// Create external toolbar
+			if (lo == 'external') {
+				n = c = DOM.create('div', {style : 'position:relative'});
+				n = DOM.add(n, 'div', {id : ed.id + '_external', 'class' : 'mceExternalToolbar'});
+				DOM.add(n, 'a', {id : ed.id + '_external_close', href : 'javascript:;', 'class' : 'mceExternalClose'});
+				n = DOM.add(n, 'table', {id : ed.id + '_tblext', cellSpacing : 0, cellPadding : 0});
+				etb = DOM.add(n, 'tbody');
+
+				if (p.firstChild.className == 'mceOldBoxModel')
+					p.firstChild.appendChild(c);
+				else
+					p.insertBefore(c, p.firstChild);
+
+				t._addToolbars(etb, o);
+
+				ed.onMouseUp.add(function() {
+					var e = DOM.get(ed.id + '_external');
+					DOM.show(e);
+
+					DOM.hide(lastExtID);
+
+					var f = Event.add(ed.id + '_external_close', 'click', function() {
+						DOM.hide(ed.id + '_external');
+						Event.remove(ed.id + '_external_close', 'click', f);
+					});
+
+					DOM.show(e);
+					DOM.setStyle(e, 'top', 0 - DOM.getRect(ed.id + '_tblext').h - 1);
+
+					// Fixes IE rendering bug
+					DOM.hide(e);
+					DOM.show(e);
+					e.style.filter = '';
+
+					lastExtID = ed.id + '_external';
+
+					e = null;
+				});
+			}
+
+			if (sl == 'top')
+				t._addStatusBar(tb, o);
+
+			// Create iframe container
+			if (!s.theme_advanced_toolbar_container) {
+				n = DOM.add(tb, 'tr');
+				n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'});
+			}
+
+			// Create toolbar container at bottom
+			if (lo == 'bottom')
+				t._addToolbars(tb, o);
+
+			if (sl == 'bottom')
+				t._addStatusBar(tb, o);
+
+			return ic;
+		},
+
+		_rowLayout : function(s, tb, o) {
+			var t = this, ed = t.editor, dc, da, cf = ed.controlManager, n, ic, to, a;
+
+			dc = s.theme_advanced_containers_default_class || '';
+			da = s.theme_advanced_containers_default_align || 'center';
+
+			each(explode(s.theme_advanced_containers || ''), function(c, i) {
+				var v = s['theme_advanced_container_' + c] || '';
+
+				switch (v.toLowerCase()) {
+					case 'mceeditor':
+						n = DOM.add(tb, 'tr');
+						n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'});
+						break;
+
+					case 'mceelementpath':
+						t._addStatusBar(tb, o);
+						break;
+
+					default:
+						a = (s['theme_advanced_container_' + c + '_align'] || da).toLowerCase();
+						a = 'mce' + t._ufirst(a);
+
+						n = DOM.add(DOM.add(tb, 'tr'), 'td', {
+							'class' : 'mceToolbar ' + (s['theme_advanced_container_' + c + '_class'] || dc) + ' ' + a || da
+						});
+
+						to = cf.createToolbar("toolbar" + i);
+						t._addControls(v, to);
+						DOM.setHTML(n, to.renderHTML());
+						o.deltaHeight -= s.theme_advanced_row_height;
+				}
+			});
+
+			return ic;
+		},
+
+		_addControls : function(v, tb) {
+			var t = this, s = t.settings, di, cf = t.editor.controlManager;
+
+			if (s.theme_advanced_disable && !t._disabled) {
+				di = {};
+
+				each(explode(s.theme_advanced_disable), function(v) {
+					di[v] = 1;
+				});
+
+				t._disabled = di;
+			} else
+				di = t._disabled;
+
+			each(explode(v), function(n) {
+				var c;
+
+				if (di && di[n])
+					return;
+
+				// Compatiblity with 2.x
+				if (n == 'tablecontrols') {
+					each(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"], function(n) {
+						n = t.createControl(n, cf);
+
+						if (n)
+							tb.add(n);
+					});
+
+					return;
+				}
+
+				c = t.createControl(n, cf);
+
+				if (c)
+					tb.add(c);
+			});
+		},
+
+		_addToolbars : function(c, o) {
+			var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a;
+
+			a = s.theme_advanced_toolbar_align.toLowerCase();
+			a = 'mce' + t._ufirst(a);
+
+			n = DOM.add(DOM.add(c, 'tr'), 'td', {'class' : 'mceToolbar ' + a});
+
+			if (!ed.getParam('accessibility_focus') || ed.getParam('tab_focus'))
+				h.push(DOM.createHTML('a', {href : '#', onfocus : 'tinyMCE.get(\'' + ed.id + '\').focus();'}, '<!-- IE -->'));
+
+			h.push(DOM.createHTML('a', {href : '#', accesskey : 'q', title : ed.getLang("advanced.toolbar_focus")}, '<!-- IE -->'));
+
+			// Create toolbar and add the controls
+			for (i=1; (v = s['theme_advanced_buttons' + i]); i++) {
+				tb = cf.createToolbar("toolbar" + i, {'class' : 'mceToolbarRow' + i});
+
+				if (s['theme_advanced_buttons' + i + '_add'])
+					v += ',' + s['theme_advanced_buttons' + i + '_add'];
+
+				if (s['theme_advanced_buttons' + i + '_add_before'])
+					v = s['theme_advanced_buttons' + i + '_add_before'] + ',' + v;
+
+				t._addControls(v, tb);
+
+				//n.appendChild(n = tb.render());
+				h.push(tb.renderHTML());
+
+				o.deltaHeight -= s.theme_advanced_row_height;
+			}
+
+			h.push(DOM.createHTML('a', {href : '#', accesskey : 'z', title : ed.getLang("advanced.toolbar_focus"), onfocus : 'tinyMCE.getInstanceById(\'' + ed.id + '\').focus();'}, '<!-- IE -->'));
+			DOM.setHTML(n, h.join(''));
+		},
+
+		_addStatusBar : function(tb, o) {
+			var n, t = this, ed = t.editor, s = t.settings, r, mf, me, td;
+
+			n = DOM.add(tb, 'tr');
+			n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'});
+			n = DOM.add(n, 'div', {id : ed.id + '_path_row'}, s.theme_advanced_path ? ed.translate('advanced.path') + ': ' : '&nbsp;');
+			DOM.add(n, 'a', {href : '#', accesskey : 'x'});
+
+			if (s.theme_advanced_resizing && !tinymce.isOldWebKit) {
+				DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize'});
+
+				if (s.theme_advanced_resizing_use_cookie) {
+					ed.onPostRender.add(function() {
+						var o = Cookie.getHash("TinyMCE_" + ed.id + "_size"), c = DOM.get(ed.id + '_tbl');
+
+						if (!o)
+							return;
+
+						if (s.theme_advanced_resize_horizontal)
+							c.style.width = Math.max(10, o.cw) + 'px';
+
+						c.style.height = Math.max(10, o.ch) + 'px';
+						DOM.get(ed.id + '_ifr').style.height = Math.max(10, parseInt(o.ch) + t.deltaHeight) + 'px';
+					});
+				}
+
+				ed.onPostRender.add(function() {
+					Event.add(ed.id + '_resize', 'mousedown', function(e) {
+						var c, p, w, h, n, pa;
+
+						// Measure container
+						c = DOM.get(ed.id + '_tbl');
+						w = c.clientWidth;
+						h = c.clientHeight;
+
+						miw = s.theme_advanced_resizing_min_width || 100;
+						mih = s.theme_advanced_resizing_min_height || 100;
+						maw = s.theme_advanced_resizing_max_width || 0xFFFF;
+						mah = s.theme_advanced_resizing_max_height || 0xFFFF;
+
+						// Setup placeholder
+						p = DOM.add(DOM.get(ed.id + '_parent'), 'div', {'class' : 'mcePlaceHolder'});
+						DOM.setStyles(p, {width : w, height : h});
+
+						// Replace with placeholder
+						DOM.hide(c);
+						DOM.show(p);
+
+						// Create internal resize obj
+						r = {
+							x : e.screenX,
+							y : e.screenY,
+							w : w,
+							h : h,
+							dx : null,
+							dy : null
+						};
+
+						// Start listening
+						mf = Event.add(DOM.doc, 'mousemove', function(e) {
+							var w, h;
+
+							// Calc delta values
+							r.dx = e.screenX - r.x;
+							r.dy = e.screenY - r.y;
+
+							// Boundery fix box
+							w = Math.max(miw, r.w + r.dx);
+							h = Math.max(mih, r.h + r.dy);
+							w = Math.min(maw, w);
+							h = Math.min(mah, h);
+
+							// Resize placeholder
+							if (s.theme_advanced_resize_horizontal)
+								p.style.width = w + 'px';
+
+							p.style.height = h + 'px';
+
+							return Event.cancel(e);
+						});
+
+						me = Event.add(DOM.doc, 'mouseup', function(e) {
+							var ifr;
+
+							// Stop listening
+							Event.remove(DOM.doc, 'mousemove', mf);
+							Event.remove(DOM.doc, 'mouseup', me);
+
+							c.style.display = '';
+							DOM.remove(p);
+
+							if (r.dx === null)
+								return;
+
+							ifr = DOM.get(ed.id + '_ifr');
+
+							if (s.theme_advanced_resize_horizontal)
+								c.style.width = Math.max(10, r.w + r.dx) + 'px';
+
+							c.style.height = Math.max(10, r.h + r.dy) + 'px';
+							ifr.style.height = Math.max(10, ifr.clientHeight + r.dy) + 'px';
+
+							if (s.theme_advanced_resizing_use_cookie) {
+								Cookie.setHash("TinyMCE_" + ed.id + "_size", {
+									cw : r.w + r.dx,
+									ch : r.h + r.dy
+								});
+							}
+						});
+
+						return Event.cancel(e);
+					});
+				});
+			}
+
+			o.deltaHeight -= 21;
+			n = tb = null;
+		},
+
+		_nodeChanged : function(ed, cm, n, co) {
+			var t = this, p, de = 0, v, c, s = t.settings;
+
+			tinymce.each(t.stateControls, function(c) {
+				cm.setActive(c, ed.queryCommandState(t.controls[c][1]));
+			});
+
+			cm.setActive('visualaid', ed.hasVisual);
+			cm.setDisabled('undo', !ed.undoManager.hasUndo() && !ed.typing);
+			cm.setDisabled('redo', !ed.undoManager.hasRedo());
+			cm.setDisabled('outdent', !ed.queryCommandState('Outdent'));
+
+			p = DOM.getParent(n, 'A');
+			if (c = cm.get('link')) {
+				if (!p || !p.name) {
+					c.setDisabled(!p && co);
+					c.setActive(!!p);
+				}
+			}
+
+			if (c = cm.get('unlink')) {
+				c.setDisabled(!p && co);
+				c.setActive(!!p && !p.name);
+			}
+
+			if (c = cm.get('anchor')) {
+				c.setActive(!!p && p.name);
+
+				if (tinymce.isWebKit) {
+					p = DOM.getParent(n, 'IMG');
+					c.setActive(!!p && DOM.getAttrib(p, 'mce_name') == 'a');
+				}
+			}
+
+			p = DOM.getParent(n, 'IMG');
+			if (c = cm.get('image'))
+				c.setActive(!!p && n.className.indexOf('mceItem') == -1);
+
+			if (c = cm.get('styleselect')) {
+				if (n.className) {
+					t._importClasses();
+					c.select(n.className);
+				} else
+					c.select();
+			}
+
+			if (c = cm.get('formatselect')) {
+				p = DOM.getParent(n, DOM.isBlock);
+
+				if (p)
+					c.select(p.nodeName.toLowerCase());
+			}
+
+			if (c = cm.get('fontselect'))
+				c.select(ed.queryCommandValue('FontName'));
+
+			if (c = cm.get('fontsizeselect'))
+				c.select('' + ed.queryCommandValue('FontSize'));
+
+			if (s.theme_advanced_path && s.theme_advanced_statusbar_location) {
+				p = DOM.get(ed.id + '_path') || DOM.add(ed.id + '_path_row', 'span', {id : ed.id + '_path'});
+				DOM.setHTML(p, '');
+
+				ed.dom.getParent(n, function(n) {
+					var na = n.nodeName.toLowerCase(), u, pi, ti = '';
+
+					// Ignore non element and hidden elements
+					if (n.nodeType != 1 || (DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved')))
+						return;
+
+					// Fake name
+					if (v = DOM.getAttrib(n, 'mce_name'))
+						na = v;
+	
+					// Handle prefix
+					if (tinymce.isIE && n.scopeName !== 'HTML')
+						na = n.scopeName + ':' + na;
+
+					// Remove internal prefix
+					na = na.replace(/mce\:/g, '');
+
+					// Handle node name
+					switch (na) {
+						case 'b':
+							na = 'strong';
+							break;
+
+						case 'i':
+							na = 'em';
+							break;
+
+						case 'img':
+							if (v = DOM.getAttrib(n, 'src'))
+								ti += 'src: ' + v + ' ';
+
+							break;
+
+						case 'a':
+							if (v = DOM.getAttrib(n, 'name')) {
+								ti += 'name: ' + v + ' ';
+								na += '#' + v;
+							}
+
+							if (v = DOM.getAttrib(n, 'href'))
+								ti += 'href: ' + v + ' ';
+
+							break;
+
+						case 'font':
+							if (s.convert_fonts_to_spans)
+								na = 'span';
+
+							if (v = DOM.getAttrib(n, 'face'))
+								ti += 'font: ' + v + ' ';
+
+							if (v = DOM.getAttrib(n, 'size'))
+								ti += 'size: ' + v + ' ';
+
+							if (v = DOM.getAttrib(n, 'color'))
+								ti += 'color: ' + v + ' ';
+
+							break;
+
+						case 'span':
+							if (v = DOM.getAttrib(n, 'style'))
+								ti += 'style: ' + v + ' ';
+
+							break;
+					}
+
+					if (v = DOM.getAttrib(n, 'id'))
+						ti += 'id: ' + v + ' ';
+
+					if (v = n.className) {
+						v = v.replace(/(webkit-[\w\-]+|Apple-[\w\-]+|mceItem\w+|mceVisualAid)/g, '');
+
+						if (v && v.indexOf('mceItem') == -1) {
+							ti += 'class: ' + v + ' ';
+
+							if (DOM.isBlock(n) || na == 'img' || na == 'span')
+								na += '.' + v;
+						}
+					}
+
+					na = na.replace(/(html:)/g, '');
+					na = {name : na, node : n, title : ti};
+					t.onResolveName.dispatch(t, na);
+					ti = na.title;
+					na = na.name;
+
+					//u = "javascript:tinymce.EditorManager.get('" + ed.id + "').theme._sel('" + (de++) + "');";
+					pi = DOM.create('a', {'href' : "javascript:;", onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na);
+
+					if (p.hasChildNodes()) {
+						p.insertBefore(DOM.doc.createTextNode(' \u00bb '), p.firstChild);
+						p.insertBefore(pi, p.firstChild);
+					} else
+						p.appendChild(pi);
+				}, ed.getBody());
+			}
+		},
+
+		// Commands gets called by execCommand
+
+		_sel : function(v) {
+			this.editor.execCommand('mceSelectNodeDepth', false, v);
+		},
+
+		_mceInsertAnchor : function(ui, v) {
+			var ed = this.editor;
+
+			ed.windowManager.open({
+				url : tinymce.baseURL + '/themes/advanced/anchor.htm',
+				width : 320 + parseInt(ed.getLang('advanced.anchor_delta_width', 0)),
+				height : 90 + parseInt(ed.getLang('advanced.anchor_delta_height', 0)),
+				inline : true
+			}, {
+				theme_url : this.url
+			});
+		},
+
+		_mceCharMap : function() {
+			var ed = this.editor;
+
+			ed.windowManager.open({
+				url : tinymce.baseURL + '/themes/advanced/charmap.htm',
+				width : 550 + parseInt(ed.getLang('advanced.charmap_delta_width', 0)),
+				height : 250 + parseInt(ed.getLang('advanced.charmap_delta_height', 0)),
+				inline : true
+			}, {
+				theme_url : this.url
+			});
+		},
+
+		_mceHelp : function() {
+			var ed = this.editor;
+
+			ed.windowManager.open({
+				url : tinymce.baseURL + '/themes/advanced/about.htm',
+				width : 480,
+				height : 380,
+				inline : true
+			}, {
+				theme_url : this.url
+			});
+		},
+
+		_mceColorPicker : function(u, v) {
+			var ed = this.editor;
+
+			v = v || {};
+
+			ed.windowManager.open({
+				url : tinymce.baseURL + '/themes/advanced/color_picker.htm',
+				width : 375 + parseInt(ed.getLang('advanced.colorpicker_delta_width', 0)),
+				height : 250 + parseInt(ed.getLang('advanced.colorpicker_delta_height', 0)),
+				close_previous : false,
+				inline : true
+			}, {
+				input_color : v.color,
+				func : v.func,
+				theme_url : this.url
+			});
+		},
+
+		_mceCodeEditor : function(ui, val) {
+			var ed = this.editor;
+
+			ed.windowManager.open({
+				url : tinymce.baseURL + '/themes/advanced/source_editor.htm',
+				width : parseInt(ed.getParam("theme_advanced_source_editor_width", 720)),
+				height : parseInt(ed.getParam("theme_advanced_source_editor_height", 580)),
+				inline : true,
+				resizable : true,
+				maximizable : true
+			}, {
+				theme_url : this.url
+			});
+		},
+
+		_mceImage : function(ui, val) {
+			var ed = this.editor;
+
+			// Internal image object like a flash placeholder
+			if (ed.dom.getAttrib(ed.selection.getNode(), 'class').indexOf('mceItem') != -1)
+				return;
+
+			ed.windowManager.open({
+				url : tinymce.baseURL + '/themes/advanced/image.htm',
+				width : 355 + parseInt(ed.getLang('advanced.image_delta_width', 0)),
+				height : 275 + parseInt(ed.getLang('advanced.image_delta_height', 0)),
+				inline : true
+			}, {
+				theme_url : this.url
+			});
+		},
+
+		_mceLink : function(ui, val) {
+			var ed = this.editor;
+
+			ed.windowManager.open({
+				url : tinymce.baseURL + '/themes/advanced/link.htm',
+				width : 310 + parseInt(ed.getLang('advanced.link_delta_width', 0)),
+				height : 200 + parseInt(ed.getLang('advanced.link_delta_height', 0)),
+				inline : true
+			}, {
+				theme_url : this.url
+			});
+		},
+
+		_mceNewDocument : function() {
+			var ed = this.editor;
+
+			ed.windowManager.confirm('advanced.newdocument', function(s) {
+				if (s)
+					ed.execCommand('mceSetContent', false, '');
+			});
+		},
+
+		_mceForeColor : function() {
+			var t = this;
+
+			this._mceColorPicker(0, {
+				color: t.fgColor,
+				func : function(co) {
+					t.fgColor = co;
+					t.editor.execCommand('ForeColor', false, co);
+				}
+			});
+		},
+
+		_mceBackColor : function() {
+			var t = this;
+
+			this._mceColorPicker(0, {
+				color: t.bgColor,
+				func : function(co) {
+					t.bgColor = co;
+					t.editor.execCommand('HiliteColor', false, co);
+				}
+			});
+		},
+
+		_ufirst : function(s) {
+			return s.substring(0, 1).toUpperCase() + s.substring(1);
+		}
+	});
+
+	tinymce.ThemeManager.add('advanced', tinymce.themes.AdvancedTheme);
+}());

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/editor_ui.css
@@ -1,1 +1,200 @@
-
+.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected {
+	margin-top: 1px;
+	margin-left: 1px;
+}
+
+.mceButtonNormal {
+	border-top: 1px solid;
+	border-left: 1px solid;
+	border-bottom: 1px solid;
+	border-right: 1px solid;
+	border-color: #F0F0EE;
+	cursor: arrow;
+}
+
+.mceButtonOver {
+/*	border-top: 1px solid buttonhighlight;
+	border-left: 1px solid buttonhighlight;
+	border-bottom: 1px solid buttonshadow;
+	border-right: 1px solid buttonshadow;*/
+	border: 1px solid #0A246A;
+	cursor: arrow;
+	background-color: #B6BDD2;
+}
+
+.mceButtonDown {
+/*	border-bottom: 1px solid buttonhighlight;
+	border-right: 1px solid buttonhighlight;
+	border-top: 1px solid buttonshadow;
+	border-left: 1px solid buttonshadow;*/
+	cursor: arrow;
+	border: 1px solid #0A246A;
+	background-color: #8592B5;
+}
+
+.mceButtonSelected {
+	border: 1px solid;
+	border-color: #C0C0BB;
+	cursor: arrow;
+}
+
+.mceButtonDisabled {
+	filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);
+	-moz-opacity:0.3;
+	opacity: 0.3;
+	border-top: 1px solid;
+	border-left: 1px solid;
+	border-bottom: 1px solid;
+	border-right: 1px solid;
+	border-color: #F0F0EE;
+	cursor: arrow;
+}
+
+.mceSeparator {
+	border-top: 1px solid buttonhighlight;
+	border-left: 1px solid buttonhighlight;
+	border-bottom: 1px solid buttonshadow;
+	border-right: 1px solid buttonshadow;
+	margin-right: 2px;
+	margin-left: 2px;
+}
+
+.mceSeparatorLine {
+	margin:2px;
+	margin-left: 4px;
+	background-color: #F0F0EE;
+	border-top: 1px solid buttonshadow;
+	border-left: 1px solid buttonshadow;
+	border-bottom: 1px solid buttonhighlight;
+	border-right: 1px solid buttonhighlight;
+	width: 0px;
+	height: 15px;
+}
+
+.mceSelectList {
+	font-family: "MS Sans Serif";
+	font-size: 7pt;
+	font-weight: normal;
+	margin-top: 3px;
+	padding: 0px;
+	display: inline;
+	vertical-align: top;
+	background-color: #F0F0EE
+}
+
+.mceLabel, .mceLabelDisabled {
+	font-family: "MS Sans Serif";
+	font-size: 9pt;
+}
+
+.mceLabel {
+	color: #000000;
+}
+
+.mceLabelDisabled {
+	cursor: text;
+	color: #999999;
+}
+
+.mceEditor {
+	background: #F0F0EE;
+	border: 1px solid #cccccc;
+}
+
+.mceEditorArea {
+	font-family: "MS Sans Serif";
+	background: #FFFFFF;
+}
+
+.mceToolbarTop, .mceToolbarBottom {
+	background: #F0F0EE;
+}
+
+.mceToolbarTop {
+	border-bottom: 1px solid #cccccc;
+}
+
+.mceToolbarBottom {
+	border-top: 1px solid #cccccc;
+}
+
+.mcePathTop, .mcePathBottom, .mcePath {
+	font-family: "MS Sans Serif";
+	font-size: 9pt;
+	padding: 2px;
+	height: 20px;
+}
+
+.mcePathTop {
+	border-bottom: 1px solid #cccccc;
+}
+
+.mcePathBottom {
+	border-top: 1px solid #cccccc;
+}
+
+.mcePathItem, .mcePathItem:link, .mcePathItem:visited, .mcePathItem:hover {
+	text-decoration: none;
+	font-family: "MS Sans Serif";
+	font-size: 9pt;
+	color: #000000;
+}
+
+.mcePathItem:hover {
+	text-decoration: underline;
+}
+
+.mcePath {
+	border-bottom: 1px solid #cccccc;
+}
+
+.mceDialog {
+	position: absolute;
+	left: 100px;
+	top: 100px;
+	z-index: 1000;
+}
+
+.mceDialogHeader {
+	background: #F0F0EE;
+	width: 100%;
+	height: 16px;
+	margin: 0px;
+	padding: 0px;
+	border: 1px solid black;
+	border-bottom: 0px;
+}
+
+.mceDialogTitle {
+	float: left;
+	font-family: "MS Sans Serif";
+	font-size: 9pt;
+	height: 14px;
+}
+
+.mceDialogClose {
+	float: right;
+	width: 16px;
+	height: 16px;
+	background-image: url('images/close.gif');
+	background-repeat: no-repeat;
+	background-position: 0px 1px;
+	margin: 0px;
+	padding: 0px;
+}
+
+.mceDialogClose a {
+	width: 16px;
+	height: 14px;
+	display: block;
+	font-family: "MS Sans Serif";
+	font-size: 9pt;
+	margin: 0px;
+	padding: 0px;
+}
+
+.mceDialogIFrameWrapper {
+	border: 1px solid black;
+	clear: both;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/image.htm
@@ -1,1 +1,87 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#advanced_dlg.image_title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="js/image.js"></script>
+	<base target="_self" />
+</head>
+<body id="image" style="display: none">
+<form onsubmit="ImageDialog.update();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;">{#advanced_dlg.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">{#advanced_dlg.image_src}</label></td>
+            <td><table border="0" cellspacing="0" cellpadding="0">
+                <tr>
+                  <td><input id="src" name="src" type="text" class="mceFocus" value="" style="width: 200px" onchange="ImageDialog.getImageData();" /></td>
+                  <td id="srcbrowsercontainer">&nbsp;</td>
+                </tr>
+              </table></td>
+          </tr>
+		  <tr>
+			<td><label for="image_list">{#advanced_dlg.image_list}</label></td>
+			<td><select id="image_list" name="image_list" onchange="document.getElementById('src').value=this.options[this.selectedIndex].value;document.getElementById('alt').value=this.options[this.selectedIndex].text;"></select></td>
+		  </tr>
+          <tr>
+            <td nowrap="nowrap"><label for="alt">{#advanced_dlg.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">{#advanced_dlg.image_align}</label></td>
+            <td><select id="align" name="align" onchange="ImageDialog.updateStyle();">
+                <option value="">{#not_set}</option>
+                <option value="baseline">{#advanced_dlg.image_align_baseline}</option>
+                <option value="top">{#advanced_dlg.image_align_top}</option>
+                <option value="middle">{#advanced_dlg.image_align_middle}</option>
+                <option value="bottom">{#advanced_dlg.image_align_bottom}</option>
+                <option value="text-top">{#advanced_dlg.image_align_texttop}</option>
+                <option value="text-bottom">{#advanced_dlg.image_align_textbottom}</option>
+                <option value="left">{#advanced_dlg.image_align_left}</option>
+                <option value="right">{#advanced_dlg.image_align_right}</option>
+              </select></td>
+          </tr>
+          <tr>
+            <td nowrap="nowrap"><label for="width">{#advanced_dlg.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">{#advanced_dlg.image_border}</label></td>
+            <td><input id="border" name="border" type="text" value="" size="3" maxlength="3" onchange="ImageDialog.updateStyle();" /></td>
+          </tr>
+          <tr>
+            <td nowrap="nowrap"><label for="vspace">{#advanced_dlg.image_vspace}</label></td>
+            <td><input id="vspace" name="vspace" type="text" value="" size="3" maxlength="3" onchange="ImageDialog.updateStyle();" /></td>
+          </tr>
+          <tr>
+            <td nowrap="nowrap"><label for="hspace">{#advanced_dlg.image_hspace}</label></td>
+            <td><input id="hspace" name="hspace" type="text" value="" size="3" maxlength="3" onchange="ImageDialog.updateStyle();" /></td>
+          </tr>
+        </table>
+		</div>
+	</div>
+
+	<div class="mceActionPanel">
+		<div style="float: left">
+			<input type="submit" id="insert" name="insert" value="{#insert}" />
+		</div>
+
+		<div style="float: right">
+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+		</div>
+	</div>
+</form>
+</body>
+</html>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/Thumbs.db differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/anchor.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/anchor_symbol.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/backcolor.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/bold.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/bold_de_se.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/bold_es.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/bold_fr.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/bold_ru.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/bold_tw.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/browse.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/bullist.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/button_menu.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/buttons.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/cancel_button_bg.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/center.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/charmap.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/cleanup.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/close.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/code.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/color.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/colors.jpg differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/copy.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/custom_1.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/cut.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/forecolor.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/full.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/help.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/hr.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/image.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/indent.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/insert_button_bg.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/italic.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/italic_de_se.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/italic_es.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/italic_ru.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/italic_tw.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/justifycenter.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/justifyfull.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/justifyleft.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/justifyright.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/left.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/link.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/menu_check.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/newdocument.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/numlist.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/opacity.png differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/outdent.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/paste.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/redo.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/removeformat.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/right.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/separator.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/spacer.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/statusbar_resize.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/strikethrough.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/sub.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/sup.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/table.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/table_delete_col.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/table_delete_row.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/table_insert_col_after.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/table_insert_col_before.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/table_insert_row_after.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/table_insert_row_before.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/underline.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/underline_es.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/underline_fr.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/underline_ru.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/underline_tw.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/undo.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/unlink.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/visualaid.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/xp/Thumbs.db differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/xp/tab_bg.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/xp/tab_end.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/xp/tab_sel_bg.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/xp/tab_sel_end.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/images/xp/tabs_bg.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/img/colorpicker.jpg differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/img/icons.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/js/about.js
@@ -1,1 +1,73 @@
+tinyMCEPopup.requireLangPack();
 
+function init() {
+	var ed, tcont;
+
+	tinyMCEPopup.resizeToInnerSize();
+	ed = tinyMCEPopup.editor;
+
+	// Give FF some time
+	window.setTimeout('insertHelpIFrame();', 10);
+
+	tcont = document.getElementById('plugintablecontainer');
+	document.getElementById('plugins_tab').style.display = 'none';
+
+	var html = "";
+	html += '<table id="plugintable">';
+	html += '<thead>';
+	html += '<tr>';
+	html += '<td>' + ed.getLang('advanced_dlg.about_plugin') + '</td>';
+	html += '<td>' + ed.getLang('advanced_dlg.about_author') + '</td>';
+	html += '<td>' + ed.getLang('advanced_dlg.about_version') + '</td>';
+	html += '</tr>';
+	html += '</thead>';
+	html += '<tbody>';
+
+	tinymce.each(ed.plugins, function(p, n) {
+		var info;
+
+		if (!p.getInfo)
+			return;
+
+		html += '<tr>';
+
+		info = p.getInfo();
+
+		if (info.infourl != null && info.infourl != '')
+			html += '<td width="50%" title="' + n + '"><a href="' + info.infourl + '" target="_blank">' + info.longname + '</a></td>';
+		else
+			html += '<td width="50%" title="' + n + '">' + info.longname + '</td>';
+
+		if (info.authorurl != null && info.authorurl != '')
+			html += '<td width="35%"><a href="' + info.authorurl + '" target="_blank">' + info.author + '</a></td>';
+		else
+			html += '<td width="35%">' + info.author + '</td>';
+
+		html += '<td width="15%">' + info.version + '</td>';
+		html += '</tr>';
+
+		document.getElementById('plugins_tab').style.display = '';
+
+	});
+
+	html += '</tbody>';
+	html += '</table>';
+
+	tcont.innerHTML = html;
+
+	tinyMCEPopup.dom.get('version').innerHTML = tinymce.majorVersion + "." + tinymce.minorVersion;
+	tinyMCEPopup.dom.get('date').innerHTML = tinymce.releaseDate;
+}
+
+function insertHelpIFrame() {
+	var html;
+
+	if (tinyMCEPopup.getParam('docs_url')) {
+		html = '<iframe width="100%" height="300" src="' + tinyMCEPopup.editor.baseURI.toAbsolute(tinyMCEPopup.getParam('docs_url')) + '"></iframe>';
+		document.getElementById('iframecontainer').innerHTML = html;
+		document.getElementById('help_tab').style.display = 'block';
+	}
+}
+
+tinyMCEPopup.onInit.add(init);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/js/anchor.js
@@ -1,1 +1,38 @@
+tinyMCEPopup.requireLangPack();
 
+var AnchorDialog = {
+	init : function(ed) {
+		var action, elm, f = document.forms[0];
+
+		this.editor = ed;
+		elm = ed.dom.getParent(ed.selection.getNode(), 'A,IMG');
+		v = ed.dom.getAttrib(elm, 'name');
+
+		if (v) {
+			this.action = 'update';
+			f.anchorName.value = v;
+		}
+
+		f.insert.value = ed.getLang(elm ? 'update' : 'insert');
+	},
+
+	update : function() {
+		var ed = this.editor;
+		
+		tinyMCEPopup.restoreSelection();
+
+		if (this.action != 'update')
+			ed.selection.collapse(1);
+
+		// Webkit acts weird if empty inline element is inserted so we need to use a image instead
+		if (tinymce.isWebKit)
+			ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('img', {mce_name : 'a', name : document.forms[0].anchorName.value, 'class' : 'mceItemAnchor'}));
+		else
+			ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('a', {name : document.forms[0].anchorName.value, 'class' : 'mceItemAnchor'}, ''));
+
+		tinyMCEPopup.close();
+	}
+};
+
+tinyMCEPopup.onInit.add(AnchorDialog.init, AnchorDialog);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/js/charmap.js
@@ -1,1 +1,326 @@
-
+tinyMCEPopup.requireLangPack();
+
+var charmap = [
+	['&nbsp;',    '&#160;',  true, 'no-break space'],
+	['&amp;',     '&#38;',   true, 'ampersand'],
+	['&quot;',    '&#34;',   true, 'quotation mark'],
+// finance
+	['&cent;',    '&#162;',  true, 'cent sign'],
+	['&euro;',    '&#8364;', true, 'euro sign'],
+	['&pound;',   '&#163;',  true, 'pound sign'],
+	['&yen;',     '&#165;',  true, 'yen sign'],
+// signs
+	['&copy;',    '&#169;',  true, 'copyright sign'],
+	['&reg;',     '&#174;',  true, 'registered sign'],
+	['&trade;',   '&#8482;', true, 'trade mark sign'],
+	['&permil;',  '&#8240;', true, 'per mille sign'],
+	['&micro;',   '&#181;',  true, 'micro sign'],
+	['&middot;',  '&#183;',  true, 'middle dot'],
+	['&bull;',    '&#8226;', true, 'bullet'],
+	['&hellip;',  '&#8230;', true, 'three dot leader'],
+	['&prime;',   '&#8242;', true, 'minutes / feet'],
+	['&Prime;',   '&#8243;', true, 'seconds / inches'],
+	['&sect;',    '&#167;',  true, 'section sign'],
+	['&para;',    '&#182;',  true, 'paragraph sign'],
+	['&szlig;',   '&#223;',  true, 'sharp s / ess-zed'],
+// quotations
+	['&lsaquo;',  '&#8249;', true, 'single left-pointing angle quotation mark'],
+	['&rsaquo;',  '&#8250;', true, 'single right-pointing angle quotation mark'],
+	['&laquo;',   '&#171;',  true, 'left pointing guillemet'],
+	['&raquo;',   '&#187;',  true, 'right pointing guillemet'],
+	['&lsquo;',   '&#8216;', true, 'left single quotation mark'],
+	['&rsquo;',   '&#8217;', true, 'right single quotation mark'],
+	['&ldquo;',   '&#8220;', true, 'left double quotation mark'],
+	['&rdquo;',   '&#8221;', true, 'right double quotation mark'],
+	['&sbquo;',   '&#8218;', true, 'single low-9 quotation mark'],
+	['&bdquo;',   '&#8222;', true, 'double low-9 quotation mark'],
+	['&lt;',      '&#60;',   true, 'less-than sign'],
+	['&gt;',      '&#62;',   true, 'greater-than sign'],
+	['&le;',      '&#8804;', true, 'less-than or equal to'],
+	['&ge;',      '&#8805;', true, 'greater-than or equal to'],
+	['&ndash;',   '&#8211;', true, 'en dash'],
+	['&mdash;',   '&#8212;', true, 'em dash'],
+	['&macr;',    '&#175;',  true, 'macron'],
+	['&oline;',   '&#8254;', true, 'overline'],
+	['&curren;',  '&#164;',  true, 'currency sign'],
+	['&brvbar;',  '&#166;',  true, 'broken bar'],
+	['&uml;',     '&#168;',  true, 'diaeresis'],
+	['&iexcl;',   '&#161;',  true, 'inverted exclamation mark'],
+	['&iquest;',  '&#191;',  true, 'turned question mark'],
+	['&circ;',    '&#710;',  true, 'circumflex accent'],
+	['&tilde;',   '&#732;',  true, 'small tilde'],
+	['&deg;',     '&#176;',  true, 'degree sign'],
+	['&minus;',   '&#8722;', true, 'minus sign'],
+	['&plusmn;',  '&#177;',  true, 'plus-minus sign'],
+	['&divide;',  '&#247;',  true, 'division sign'],
+	['&frasl;',   '&#8260;', true, 'fraction slash'],
+	['&times;',   '&#215;',  true, 'multiplication sign'],
+	['&sup1;',    '&#185;',  true, 'superscript one'],
+	['&sup2;',    '&#178;',  true, 'superscript two'],
+	['&sup3;',    '&#179;',  true, 'superscript three'],
+	['&frac14;',  '&#188;',  true, 'fraction one quarter'],
+	['&frac12;',  '&#189;',  true, 'fraction one half'],
+	['&frac34;',  '&#190;',  true, 'fraction three quarters'],
+// math / logical
+	['&fnof;',    '&#402;',  true, 'function / florin'],
+	['&int;',     '&#8747;', true, 'integral'],
+	['&sum;',     '&#8721;', true, 'n-ary sumation'],
+	['&infin;',   '&#8734;', true, 'infinity'],
+	['&radic;',   '&#8730;', true, 'square root'],
+	['&sim;',     '&#8764;', false,'similar to'],
+	['&cong;',    '&#8773;', false,'approximately equal to'],
+	['&asymp;',   '&#8776;', true, 'almost equal to'],
+	['&ne;',      '&#8800;', true, 'not equal to'],
+	['&equiv;',   '&#8801;', true, 'identical to'],
+	['&isin;',    '&#8712;', false,'element of'],
+	['&notin;',   '&#8713;', false,'not an element of'],
+	['&ni;',      '&#8715;', false,'contains as member'],
+	['&prod;',    '&#8719;', true, 'n-ary product'],
+	['&and;',     '&#8743;', false,'logical and'],
+	['&or;',      '&#8744;', false,'logical or'],
+	['&not;',     '&#172;',  true, 'not sign'],
+	['&cap;',     '&#8745;', true, 'intersection'],
+	['&cup;',     '&#8746;', false,'union'],
+	['&part;',    '&#8706;', true, 'partial differential'],
+	['&forall;',  '&#8704;', false,'for all'],
+	['&exist;',   '&#8707;', false,'there exists'],
+	['&empty;',   '&#8709;', false,'diameter'],
+	['&nabla;',   '&#8711;', false,'backward difference'],
+	['&lowast;',  '&#8727;', false,'asterisk operator'],
+	['&prop;',    '&#8733;', false,'proportional to'],
+	['&ang;',     '&#8736;', false,'angle'],
+// undefined
+	['&acute;',   '&#180;',  true, 'acute accent'],
+	['&cedil;',   '&#184;',  true, 'cedilla'],
+	['&ordf;',    '&#170;',  true, 'feminine ordinal indicator'],
+	['&ordm;',    '&#186;',  true, 'masculine ordinal indicator'],
+	['&dagger;',  '&#8224;', true, 'dagger'],
+	['&Dagger;',  '&#8225;', true, 'double dagger'],
+// alphabetical special chars
+	['&Agrave;',  '&#192;',  true, 'A - grave'],
+	['&Aacute;',  '&#193;',  true, 'A - acute'],
+	['&Acirc;',   '&#194;',  true, 'A - circumflex'],
+	['&Atilde;',  '&#195;',  true, 'A - tilde'],
+	['&Auml;',    '&#196;',  true, 'A - diaeresis'],
+	['&Aring;',   '&#197;',  true, 'A - ring above'],
+	['&AElig;',   '&#198;',  true, 'ligature AE'],
+	['&Ccedil;',  '&#199;',  true, 'C - cedilla'],
+	['&Egrave;',  '&#200;',  true, 'E - grave'],
+	['&Eacute;',  '&#201;',  true, 'E - acute'],
+	['&Ecirc;',   '&#202;',  true, 'E - circumflex'],
+	['&Euml;',    '&#203;',  true, 'E - diaeresis'],
+	['&Igrave;',  '&#204;',  true, 'I - grave'],
+	['&Iacute;',  '&#205;',  true, 'I - acute'],
+	['&Icirc;',   '&#206;',  true, 'I - circumflex'],
+	['&Iuml;',    '&#207;',  true, 'I - diaeresis'],
+	['&ETH;',     '&#208;',  true, 'ETH'],
+	['&Ntilde;',  '&#209;',  true, 'N - tilde'],
+	['&Ograve;',  '&#210;',  true, 'O - grave'],
+	['&Oacute;',  '&#211;',  true, 'O - acute'],
+	['&Ocirc;',   '&#212;',  true, 'O - circumflex'],
+	['&Otilde;',  '&#213;',  true, 'O - tilde'],
+	['&Ouml;',    '&#214;',  true, 'O - diaeresis'],
+	['&Oslash;',  '&#216;',  true, 'O - slash'],
+	['&OElig;',   '&#338;',  true, 'ligature OE'],
+	['&Scaron;',  '&#352;',  true, 'S - caron'],
+	['&Ugrave;',  '&#217;',  true, 'U - grave'],
+	['&Uacute;',  '&#218;',  true, 'U - acute'],
+	['&Ucirc;',   '&#219;',  true, 'U - circumflex'],
+	['&Uuml;',    '&#220;',  true, 'U - diaeresis'],
+	['&Yacute;',  '&#221;',  true, 'Y - acute'],
+	['&Yuml;',    '&#376;',  true, 'Y - diaeresis'],
+	['&THORN;',   '&#222;',  true, 'THORN'],
+	['&agrave;',  '&#224;',  true, 'a - grave'],
+	['&aacute;',  '&#225;',  true, 'a - acute'],
+	['&acirc;',   '&#226;',  true, 'a - circumflex'],
+	['&atilde;',  '&#227;',  true, 'a - tilde'],
+	['&auml;',    '&#228;',  true, 'a - diaeresis'],
+	['&aring;',   '&#229;',  true, 'a - ring above'],
+	['&aelig;',   '&#230;',  true, 'ligature ae'],
+	['&ccedil;',  '&#231;',  true, 'c - cedilla'],
+	['&egrave;',  '&#232;',  true, 'e - grave'],
+	['&eacute;',  '&#233;',  true, 'e - acute'],
+	['&ecirc;',   '&#234;',  true, 'e - circumflex'],
+	['&euml;',    '&#235;',  true, 'e - diaeresis'],
+	['&igrave;',  '&#236;',  true, 'i - grave'],
+	['&iacute;',  '&#237;',  true, 'i - acute'],
+	['&icirc;',   '&#238;',  true, 'i - circumflex'],
+	['&iuml;',    '&#239;',  true, 'i - diaeresis'],
+	['&eth;',     '&#240;',  true, 'eth'],
+	['&ntilde;',  '&#241;',  true, 'n - tilde'],
+	['&ograve;',  '&#242;',  true, 'o - grave'],
+	['&oacute;',  '&#243;',  true, 'o - acute'],
+	['&ocirc;',   '&#244;',  true, 'o - circumflex'],
+	['&otilde;',  '&#245;',  true, 'o - tilde'],
+	['&ouml;',    '&#246;',  true, 'o - diaeresis'],
+	['&oslash;',  '&#248;',  true, 'o slash'],
+	['&oelig;',   '&#339;',  true, 'ligature oe'],
+	['&scaron;',  '&#353;',  true, 's - caron'],
+	['&ugrave;',  '&#249;',  true, 'u - grave'],
+	['&uacute;',  '&#250;',  true, 'u - acute'],
+	['&ucirc;',   '&#251;',  true, 'u - circumflex'],
+	['&uuml;',    '&#252;',  true, 'u - diaeresis'],
+	['&yacute;',  '&#253;',  true, 'y - acute'],
+	['&thorn;',   '&#254;',  true, 'thorn'],
+	['&yuml;',    '&#255;',  true, 'y - diaeresis'],
+    ['&Alpha;',   '&#913;',  true, 'Alpha'],
+	['&Beta;',    '&#914;',  true, 'Beta'],
+	['&Gamma;',   '&#915;',  true, 'Gamma'],
+	['&Delta;',   '&#916;',  true, 'Delta'],
+	['&Epsilon;', '&#917;',  true, 'Epsilon'],
+	['&Zeta;',    '&#918;',  true, 'Zeta'],
+	['&Eta;',     '&#919;',  true, 'Eta'],
+	['&Theta;',   '&#920;',  true, 'Theta'],
+	['&Iota;',    '&#921;',  true, 'Iota'],
+	['&Kappa;',   '&#922;',  true, 'Kappa'],
+	['&Lambda;',  '&#923;',  true, 'Lambda'],
+	['&Mu;',      '&#924;',  true, 'Mu'],
+	['&Nu;',      '&#925;',  true, 'Nu'],
+	['&Xi;',      '&#926;',  true, 'Xi'],
+	['&Omicron;', '&#927;',  true, 'Omicron'],
+	['&Pi;',      '&#928;',  true, 'Pi'],
+	['&Rho;',     '&#929;',  true, 'Rho'],
+	['&Sigma;',   '&#931;',  true, 'Sigma'],
+	['&Tau;',     '&#932;',  true, 'Tau'],
+	['&Upsilon;', '&#933;',  true, 'Upsilon'],
+	['&Phi;',     '&#934;',  true, 'Phi'],
+	['&Chi;',     '&#935;',  true, 'Chi'],
+	['&Psi;',     '&#936;',  true, 'Psi'],
+	['&Omega;',   '&#937;',  true, 'Omega'],
+	['&alpha;',   '&#945;',  true, 'alpha'],
+	['&beta;',    '&#946;',  true, 'beta'],
+	['&gamma;',   '&#947;',  true, 'gamma'],
+	['&delta;',   '&#948;',  true, 'delta'],
+	['&epsilon;', '&#949;',  true, 'epsilon'],
+	['&zeta;',    '&#950;',  true, 'zeta'],
+	['&eta;',     '&#951;',  true, 'eta'],
+	['&theta;',   '&#952;',  true, 'theta'],
+	['&iota;',    '&#953;',  true, 'iota'],
+	['&kappa;',   '&#954;',  true, 'kappa'],
+	['&lambda;',  '&#955;',  true, 'lambda'],
+	['&mu;',      '&#956;',  true, 'mu'],
+	['&nu;',      '&#957;',  true, 'nu'],
+	['&xi;',      '&#958;',  true, 'xi'],
+	['&omicron;', '&#959;',  true, 'omicron'],
+	['&pi;',      '&#960;',  true, 'pi'],
+	['&rho;',     '&#961;',  true, 'rho'],
+	['&sigmaf;',  '&#962;',  true, 'final sigma'],
+	['&sigma;',   '&#963;',  true, 'sigma'],
+	['&tau;',     '&#964;',  true, 'tau'],
+	['&upsilon;', '&#965;',  true, 'upsilon'],
+	['&phi;',     '&#966;',  true, 'phi'],
+	['&chi;',     '&#967;',  true, 'chi'],
+	['&psi;',     '&#968;',  true, 'psi'],
+	['&omega;',   '&#969;',  true, 'omega'],
+// symbols
+	['&alefsym;', '&#8501;', false,'alef symbol'],
+	['&piv;',     '&#982;',  false,'pi symbol'],
+	['&real;',    '&#8476;', false,'real part symbol'],
+	['&thetasym;','&#977;',  false,'theta symbol'],
+	['&upsih;',   '&#978;',  false,'upsilon - hook symbol'],
+	['&weierp;',  '&#8472;', false,'Weierstrass p'],
+	['&image;',   '&#8465;', false,'imaginary part'],
+// arrows
+	['&larr;',    '&#8592;', true, 'leftwards arrow'],
+	['&uarr;',    '&#8593;', true, 'upwards arrow'],
+	['&rarr;',    '&#8594;', true, 'rightwards arrow'],
+	['&darr;',    '&#8595;', true, 'downwards arrow'],
+	['&harr;',    '&#8596;', true, 'left right arrow'],
+	['&crarr;',   '&#8629;', false,'carriage return'],
+	['&lArr;',    '&#8656;', false,'leftwards double arrow'],
+	['&uArr;',    '&#8657;', false,'upwards double arrow'],
+	['&rArr;',    '&#8658;', false,'rightwards double arrow'],
+	['&dArr;',    '&#8659;', false,'downwards double arrow'],
+	['&hArr;',    '&#8660;', false,'left right double arrow'],
+	['&there4;',  '&#8756;', false,'therefore'],
+	['&sub;',     '&#8834;', false,'subset of'],
+	['&sup;',     '&#8835;', false,'superset of'],
+	['&nsub;',    '&#8836;', false,'not a subset of'],
+	['&sube;',    '&#8838;', false,'subset of or equal to'],
+	['&supe;',    '&#8839;', false,'superset of or equal to'],
+	['&oplus;',   '&#8853;', false,'circled plus'],
+	['&otimes;',  '&#8855;', false,'circled times'],
+	['&perp;',    '&#8869;', false,'perpendicular'],
+	['&sdot;',    '&#8901;', false,'dot operator'],
+	['&lceil;',   '&#8968;', false,'left ceiling'],
+	['&rceil;',   '&#8969;', false,'right ceiling'],
+	['&lfloor;',  '&#8970;', false,'left floor'],
+	['&rfloor;',  '&#8971;', false,'right floor'],
+	['&lang;',    '&#9001;', false,'left-pointing angle bracket'],
+	['&rang;',    '&#9002;', false,'right-pointing angle bracket'],
+	['&loz;',     '&#9674;', true,'lozenge'],
+	['&spades;',  '&#9824;', false,'black spade suit'],
+	['&clubs;',   '&#9827;', true, 'black club suit'],
+	['&hearts;',  '&#9829;', true, 'black heart suit'],
+	['&diams;',   '&#9830;', true, 'black diamond suit'],
+	['&ensp;',    '&#8194;', false,'en space'],
+	['&emsp;',    '&#8195;', false,'em space'],
+	['&thinsp;',  '&#8201;', false,'thin space'],
+	['&zwnj;',    '&#8204;', false,'zero width non-joiner'],
+	['&zwj;',     '&#8205;', false,'zero width joiner'],
+	['&lrm;',     '&#8206;', false,'left-to-right mark'],
+	['&rlm;',     '&#8207;', false,'right-to-left mark'],
+	['&shy;',     '&#173;',  false,'soft hyphen']
+];
+
+tinyMCEPopup.onInit.add(function() {
+	tinyMCEPopup.dom.setHTML('charmapView', renderCharMapHTML());
+});
+
+function renderCharMapHTML() {
+	var charsPerRow = 20, tdWidth=20, tdHeight=20, i;
+	var html = '<table border="0" cellspacing="1" cellpadding="0" width="' + (tdWidth*charsPerRow) + '"><tr height="' + tdHeight + '">';
+	var cols=-1;
+
+	for (i=0; i<charmap.length; i++) {
+		if (charmap[i][2]==true) {
+			cols++;
+			html += ''
+				+ '<td class="charmap">'
+				+ '<a onmouseover="previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');" onfocus="previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');" href="javascript:void(0)" onclick="insertChar(\'' + charmap[i][1].substring(2,charmap[i][1].length-1) + '\');" onclick="return false;" onmousedown="return false;" title="' + charmap[i][3] + '">'
+				+ charmap[i][1]
+				+ '</a></td>';
+			if ((cols+1) % charsPerRow == 0)
+				html += '</tr><tr height="' + tdHeight + '">';
+		}
+	 }
+
+	if (cols % charsPerRow > 0) {
+		var padd = charsPerRow - (cols % charsPerRow);
+		for (var i=0; i<padd-1; i++)
+			html += '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap">&nbsp;</td>';
+	}
+
+	html += '</tr></table>';
+
+	return html;
+}
+
+function insertChar(chr) {
+	tinyMCEPopup.execCommand('mceInsertContent', false, '&#' + chr + ';');
+
+	// Refocus in window
+	if (tinyMCEPopup.isWindow)
+		window.focus();
+
+	tinyMCEPopup.editor.focus();
+	tinyMCEPopup.close();
+}
+
+function previewChar(codeA, codeB, codeN) {
+	var elmA = document.getElementById('codeA');
+	var elmB = document.getElementById('codeB');
+	var elmV = document.getElementById('codeV');
+	var elmN = document.getElementById('codeN');
+
+	if (codeA=='#160;') {
+		elmV.innerHTML = '__';
+	} else {
+		elmV.innerHTML = '&' + codeA;
+	}
+
+	elmB.innerHTML = '&amp;' + codeA;
+	elmA.innerHTML = '&amp;' + codeB;
+	elmN.innerHTML = codeN;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/js/color_picker.js
@@ -1,1 +1,254 @@
-
+tinyMCEPopup.requireLangPack();
+
+var detail = 50, strhex = "0123456789abcdef", i, isMouseDown = false, isMouseOver = false;
+
+var colors = [
+	"#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033",
+	"#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099",
+	"#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff",
+	"#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033",
+	"#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399",
+	"#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff",
+	"#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333",
+	"#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399",
+	"#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff",
+	"#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633",
+	"#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699",
+	"#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff",
+	"#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633",
+	"#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999",
+	"#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff",
+	"#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933",
+	"#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999",
+	"#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff",
+	"#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33",
+	"#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99",
+	"#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff",
+	"#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33",
+	"#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99",
+	"#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff",
+	"#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33",
+	"#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99",
+	"#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff"
+];
+
+var named = {
+	'#F0F8FF':'AliceBlue','#FAEBD7':'AntiqueWhite','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige',
+	'#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'BlanchedAlmond','#0000FF':'Blue','#8A2BE2':'BlueViolet','#A52A2A':'Brown',
+	'#DEB887':'BurlyWood','#5F9EA0':'CadetBlue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'CornflowerBlue',
+	'#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'DarkBlue','#008B8B':'DarkCyan','#B8860B':'DarkGoldenRod',
+	'#A9A9A9':'DarkGray','#A9A9A9':'DarkGrey','#006400':'DarkGreen','#BDB76B':'DarkKhaki','#8B008B':'DarkMagenta','#556B2F':'DarkOliveGreen',
+	'#FF8C00':'Darkorange','#9932CC':'DarkOrchid','#8B0000':'DarkRed','#E9967A':'DarkSalmon','#8FBC8F':'DarkSeaGreen','#483D8B':'DarkSlateBlue',
+	'#2F4F4F':'DarkSlateGray','#2F4F4F':'DarkSlateGrey','#00CED1':'DarkTurquoise','#9400D3':'DarkViolet','#FF1493':'DeepPink','#00BFFF':'DeepSkyBlue',
+	'#696969':'DimGray','#696969':'DimGrey','#1E90FF':'DodgerBlue','#B22222':'FireBrick','#FFFAF0':'FloralWhite','#228B22':'ForestGreen',
+	'#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'GhostWhite','#FFD700':'Gold','#DAA520':'GoldenRod','#808080':'Gray','#808080':'Grey',
+	'#008000':'Green','#ADFF2F':'GreenYellow','#F0FFF0':'HoneyDew','#FF69B4':'HotPink','#CD5C5C':'IndianRed','#4B0082':'Indigo','#FFFFF0':'Ivory',
+	'#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'LavenderBlush','#7CFC00':'LawnGreen','#FFFACD':'LemonChiffon','#ADD8E6':'LightBlue',
+	'#F08080':'LightCoral','#E0FFFF':'LightCyan','#FAFAD2':'LightGoldenRodYellow','#D3D3D3':'LightGray','#D3D3D3':'LightGrey','#90EE90':'LightGreen',
+	'#FFB6C1':'LightPink','#FFA07A':'LightSalmon','#20B2AA':'LightSeaGreen','#87CEFA':'LightSkyBlue','#778899':'LightSlateGray','#778899':'LightSlateGrey',
+	'#B0C4DE':'LightSteelBlue','#FFFFE0':'LightYellow','#00FF00':'Lime','#32CD32':'LimeGreen','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon',
+	'#66CDAA':'MediumAquaMarine','#0000CD':'MediumBlue','#BA55D3':'MediumOrchid','#9370D8':'MediumPurple','#3CB371':'MediumSeaGreen','#7B68EE':'MediumSlateBlue',
+	'#00FA9A':'MediumSpringGreen','#48D1CC':'MediumTurquoise','#C71585':'MediumVioletRed','#191970':'MidnightBlue','#F5FFFA':'MintCream','#FFE4E1':'MistyRose','#FFE4B5':'Moccasin',
+	'#FFDEAD':'NavajoWhite','#000080':'Navy','#FDF5E6':'OldLace','#808000':'Olive','#6B8E23':'OliveDrab','#FFA500':'Orange','#FF4500':'OrangeRed','#DA70D6':'Orchid',
+	'#EEE8AA':'PaleGoldenRod','#98FB98':'PaleGreen','#AFEEEE':'PaleTurquoise','#D87093':'PaleVioletRed','#FFEFD5':'PapayaWhip','#FFDAB9':'PeachPuff',
+	'#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'PowderBlue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'RosyBrown','#4169E1':'RoyalBlue',
+	'#8B4513':'SaddleBrown','#FA8072':'Salmon','#F4A460':'SandyBrown','#2E8B57':'SeaGreen','#FFF5EE':'SeaShell','#A0522D':'Sienna','#C0C0C0':'Silver',
+	'#87CEEB':'SkyBlue','#6A5ACD':'SlateBlue','#708090':'SlateGray','#708090':'SlateGrey','#FFFAFA':'Snow','#00FF7F':'SpringGreen',
+	'#4682B4':'SteelBlue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet',
+	'#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'WhiteSmoke','#FFFF00':'Yellow','#9ACD32':'YellowGreen'
+};
+
+function init() {
+	var inputColor = convertRGBToHex(tinyMCEPopup.getWindowArg('input_color'));
+
+	tinyMCEPopup.resizeToInnerSize();
+
+	generatePicker();
+
+	if (inputColor) {
+		changeFinalColor(inputColor);
+
+		col = convertHexToRGB(inputColor);
+
+		if (col)
+			updateLight(col.r, col.g, col.b);
+	}
+}
+
+function insertAction() {
+	var color = document.getElementById("color").value, f = tinyMCEPopup.getWindowArg('func');
+
+	tinyMCEPopup.restoreSelection();
+
+	if (f)
+		f(color);
+
+	tinyMCEPopup.close();
+}
+
+function showColor(color, name) {
+	if (name)
+		document.getElementById("colorname").innerHTML = name;
+
+	document.getElementById("preview").style.backgroundColor = color;
+	document.getElementById("color").value = color.toLowerCase();
+}
+
+function convertRGBToHex(col) {
+	var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi");
+
+	if (!col)
+		return col;
+
+	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 {r : r, g : g, b : b};
+	}
+
+	return null;
+}
+
+function generatePicker() {
+	var el = document.getElementById('light'), h = '', i;
+
+	for (i = 0; i < detail; i++){
+		h += '<div id="gs'+i+'" style="background-color:#000000; width:15px; height:3px; border-style:none; border-width:0px;"'
+		+ ' onclick="changeFinalColor(this.style.backgroundColor)"'
+		+ ' onmousedown="isMouseDown = true; return false;"'
+		+ ' onmouseup="isMouseDown = false;"'
+		+ ' onmousemove="if (isMouseDown && isMouseOver) changeFinalColor(this.style.backgroundColor); return false;"'
+		+ ' onmouseover="isMouseOver = true;"'
+		+ ' onmouseout="isMouseOver = false;"'
+		+ '></div>';
+	}
+
+	el.innerHTML = h;
+}
+
+function generateWebColors() {
+	var el = document.getElementById('webcolors'), h = '', i;
+
+	if (el.className == 'generated')
+		return;
+
+	h += '<table border="0" cellspacing="1" cellpadding="0">'
+		+ '<tr>';
+
+	for (i=0; i<colors.length; i++) {
+		h += '<td bgcolor="' + colors[i] + '" width="10" height="10">'
+			+ '<a href="javascript:insertAction();" onfocus="showColor(\'' + colors[i] +  '\');" onmouseover="showColor(\'' + colors[i] +  '\');" style="display:block;width:10px;height:10px;overflow:hidden;">'
+			+ '</a></td>';
+		if ((i+1) % 18 == 0)
+			h += '</tr><tr>';
+	}
+
+	h += '</table>';
+
+	el.innerHTML = h;
+	el.className = 'generated';
+}
+
+function generateNamedColors() {
+	var el = document.getElementById('namedcolors'), h = '', n, v, i = 0;
+
+	if (el.className == 'generated')
+		return;
+
+	for (n in named) {
+		v = named[n];
+		h += '<a href="javascript:insertAction();" onmouseover="showColor(\'' + n +  '\',\'' + v + '\');" style="background-color: ' + n + '"><!-- IE --></a>'
+	}
+
+	el.innerHTML = h;
+	el.className = 'generated';
+}
+
+function dechex(n) {
+	return strhex.charAt(Math.floor(n / 16)) + strhex.charAt(n % 16);
+}
+
+function computeColor(e) {
+	var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB;
+
+	x = e.offsetX ? e.offsetX : (e.target ? e.clientX - e.target.x : 0);
+	y = e.offsetY ? e.offsetY : (e.target ? e.clientY - e.target.y : 0);
+
+	partWidth = document.getElementById('colors').width / 6;
+	partDetail = detail / 2;
+	imHeight = document.getElementById('colors').height;
+
+	r = (x >= 0)*(x < partWidth)*255 + (x >= partWidth)*(x < 2*partWidth)*(2*255 - x * 255 / partWidth) + (x >= 4*partWidth)*(x < 5*partWidth)*(-4*255 + x * 255 / partWidth) + (x >= 5*partWidth)*(x < 6*partWidth)*255;
+	g = (x >= 0)*(x < partWidth)*(x * 255 / partWidth) + (x >= partWidth)*(x < 3*partWidth)*255	+ (x >= 3*partWidth)*(x < 4*partWidth)*(4*255 - x * 255 / partWidth);
+	b = (x >= 2*partWidth)*(x < 3*partWidth)*(-2*255 + x * 255 / partWidth) + (x >= 3*partWidth)*(x < 5*partWidth)*255 + (x >= 5*partWidth)*(x < 6*partWidth)*(6*255 - x * 255 / partWidth);
+
+	coef = (imHeight - y) / imHeight;
+	r = 128 + (r - 128) * coef;
+	g = 128 + (g - 128) * coef;
+	b = 128 + (b - 128) * coef;
+
+	changeFinalColor('#' + dechex(r) + dechex(g) + dechex(b));
+	updateLight(r, g, b);
+}
+
+function updateLight(r, g, b) {
+	var i, partDetail = detail / 2, finalCoef, finalR, finalG, finalB, color;
+
+	for (i=0; i<detail; i++) {
+		if ((i>=0) && (i<partDetail)) {
+			finalCoef = i / partDetail;
+			finalR = dechex(255 - (255 - r) * finalCoef);
+			finalG = dechex(255 - (255 - g) * finalCoef);
+			finalB = dechex(255 - (255 - b) * finalCoef);
+		} else {
+			finalCoef = 2 - i / partDetail;
+			finalR = dechex(r * finalCoef);
+			finalG = dechex(g * finalCoef);
+			finalB = dechex(b * finalCoef);
+		}
+
+		color = finalR + finalG + finalB;
+
+		setCol('gs' + i, '#'+color);
+	}
+}
+
+function changeFinalColor(color) {
+	if (color.indexOf('#') == -1)
+		color = convertRGBToHex(color);
+
+	setCol('preview', color);
+	document.getElementById('color').value = color;
+}
+
+function setCol(e, c) {
+	try {
+		document.getElementById(e).style.backgroundColor = c;
+	} catch (ex) {
+		// Ignore IE warning
+	}
+}
+
+tinyMCEPopup.onInit.add(init);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/js/image.js
@@ -1,1 +1,246 @@
-
+var ImageDialog = {
+	preInit : function() {
+		var url;
+
+		tinyMCEPopup.requireLangPack();
+
+		if (url = tinyMCEPopup.getParam("external_image_list_url"))
+			document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>');
+	},
+
+	init : function() {
+		var f = document.forms[0], ed = tinyMCEPopup.editor;
+
+		// Setup browse button
+		document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image');
+		if (isVisible('srcbrowser'))
+			document.getElementById('src').style.width = '180px';
+
+		e = ed.selection.getNode();
+
+		this.fillFileList('image_list', 'tinyMCEImageList');
+
+		if (e.nodeName == 'IMG') {
+			f.src.value = ed.dom.getAttrib(e, 'src');
+			f.alt.value = ed.dom.getAttrib(e, 'alt');
+			f.border.value = this.getAttrib(e, 'border');
+			f.vspace.value = this.getAttrib(e, 'vspace');
+			f.hspace.value = this.getAttrib(e, 'hspace');
+			f.width.value = ed.dom.getAttrib(e, 'width');
+			f.height.value = ed.dom.getAttrib(e, 'height');
+			f.insert.value = ed.getLang('update');
+			this.styleVal = ed.dom.getAttrib(e, 'style');
+			selectByValue(f, 'image_list', f.src.value);
+			selectByValue(f, 'align', this.getAttrib(e, 'align'));
+			this.updateStyle();
+		}
+	},
+
+	fillFileList : function(id, l) {
+		var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
+
+		l = window[l];
+
+		if (l && l.length > 0) {
+			lst.options[lst.options.length] = new Option('', '');
+
+			tinymce.each(l, function(o) {
+				lst.options[lst.options.length] = new Option(o[0], o[1]);
+			});
+		} else
+			dom.remove(dom.getParent(id, 'tr'));
+	},
+
+	update : function() {
+		var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, args = {}, el;
+
+		tinyMCEPopup.restoreSelection();
+
+		if (f.src.value === '') {
+			if (ed.selection.getNode().nodeName == 'IMG') {
+				ed.dom.remove(ed.selection.getNode());
+				ed.execCommand('mceRepaint');
+			}
+
+			tinyMCEPopup.close();
+			return;
+		}
+
+		if (!ed.settings.inline_styles) {
+			args = tinymce.extend(args, {
+				vspace : nl.vspace.value,
+				hspace : nl.hspace.value,
+				border : nl.border.value,
+				align : getSelectValue(f, 'align')
+			});
+		} else
+			args.style = this.styleVal;
+
+		tinymce.extend(args, {
+			src : f.src.value,
+			alt : f.alt.value,
+			width : f.width.value,
+			height : f.height.value
+		});
+
+		el = ed.selection.getNode();
+
+		if (el && el.nodeName == 'IMG') {
+			ed.dom.setAttribs(el, args);
+		} else {
+			ed.execCommand('mceInsertContent', false, '<img id="__mce_tmp" />', {skip_undo : 1});
+			ed.dom.setAttribs('__mce_tmp', args);
+			ed.dom.setAttrib('__mce_tmp', 'id', '');
+			ed.undoManager.add();
+		}
+
+		tinyMCEPopup.close();
+	},
+
+	updateStyle : function() {
+		var dom = tinyMCEPopup.dom, st, v, f = document.forms[0];
+
+		if (tinyMCEPopup.editor.settings.inline_styles) {
+			st = tinyMCEPopup.dom.parseStyle(this.styleVal);
+
+			// Handle align
+			v = getSelectValue(f, 'align');
+			if (v) {
+				if (v == 'left' || v == 'right') {
+					st['float'] = v;
+					delete st['vertical-align'];
+				} else {
+					st['vertical-align'] = v;
+					delete st['float'];
+				}
+			} else {
+				delete st['float'];
+				delete st['vertical-align'];
+			}
+
+			// Handle border
+			v = f.border.value;
+			if (v || v == '0') {
+				if (v == '0')
+					st['border'] = '0';
+				else
+					st['border'] = v + 'px solid black';
+			} else
+				delete st['border'];
+
+			// Handle hspace
+			v = f.hspace.value;
+			if (v) {
+				delete st['margin'];
+				st['margin-left'] = v + 'px';
+				st['margin-right'] = v + 'px';
+			} else {
+				delete st['margin-left'];
+				delete st['margin-right'];
+			}
+
+			// Handle vspace
+			v = f.vspace.value;
+			if (v) {
+				delete st['margin'];
+				st['margin-top'] = v + 'px';
+				st['margin-bottom'] = v + 'px';
+			} else {
+				delete st['margin-top'];
+				delete st['margin-bottom'];
+			}
+
+			// Merge
+			st = tinyMCEPopup.dom.parseStyle(dom.serializeStyle(st));
+			this.styleVal = dom.serializeStyle(st);
+		}
+	},
+
+	getAttrib : function(e, at) {
+		var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2;
+
+		if (ed.settings.inline_styles) {
+			switch (at) {
+				case 'align':
+					if (v = dom.getStyle(e, 'float'))
+						return v;
+
+					if (v = dom.getStyle(e, 'vertical-align'))
+						return v;
+
+					break;
+
+				case 'hspace':
+					v = dom.getStyle(e, 'margin-left')
+					v2 = dom.getStyle(e, 'margin-right');
+					if (v && v == v2)
+						return parseInt(v.replace(/[^0-9]/g, ''));
+
+					break;
+
+				case 'vspace':
+					v = dom.getStyle(e, 'margin-top')
+					v2 = dom.getStyle(e, 'margin-bottom');
+					if (v && v == v2)
+						return parseInt(v.replace(/[^0-9]/g, ''));
+
+					break;
+
+				case 'border':
+					v = 0;
+
+					tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) {
+						sv = dom.getStyle(e, 'border-' + sv + '-width');
+
+						// False or not the same as prev
+						if (!sv || (sv != v && v !== 0)) {
+							v = 0;
+							return false;
+						}
+
+						if (sv)
+							v = sv;
+					});
+
+					if (v)
+						return parseInt(v.replace(/[^0-9]/g, ''));
+
+					break;
+			}
+		}
+
+		if (v = dom.getAttrib(e, at))
+			return v;
+
+		return '';
+	},
+
+	resetImageData : function() {
+		var f = document.forms[0];
+
+		f.width.value = f.height.value = "";	
+	},
+
+	updateImageData : function() {
+		var f = document.forms[0], t = ImageDialog;
+
+		if (f.width.value == "")
+			f.width.value = t.preloadImg.width;
+
+		if (f.height.value == "")
+			f.height.value = t.preloadImg.height;
+	},
+
+	getImageData : function() {
+		var f = document.forms[0];
+
+		this.preloadImg = new Image();
+		this.preloadImg.onload = this.updateImageData;
+		this.preloadImg.onerror = this.resetImageData;
+		this.preloadImg.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(f.src.value);
+	}
+};
+
+ImageDialog.preInit();
+tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/js/link.js
@@ -1,1 +1,156 @@
+tinyMCEPopup.requireLangPack();
 
+var LinkDialog = {
+	preInit : function() {
+		var url;
+
+		if (url = tinyMCEPopup.getParam("external_link_list_url"))
+			document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>');
+	},
+
+	init : function() {
+		var f = document.forms[0], ed = tinyMCEPopup.editor;
+
+		// Setup browse button
+		document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser', 'href', 'file', 'theme_advanced_link');
+		if (isVisible('hrefbrowser'))
+			document.getElementById('href').style.width = '180px';
+
+		this.fillClassList('class_list');
+		this.fillFileList('link_list', 'tinyMCELinkList');
+		this.fillTargetList('target_list');
+
+		if (e = ed.dom.getParent(ed.selection.getNode(), 'A')) {
+			f.href.value = ed.dom.getAttrib(e, 'href');
+			f.linktitle.value = ed.dom.getAttrib(e, 'title');
+			f.insert.value = ed.getLang('update');
+			selectByValue(f, 'link_list', f.href.value);
+			selectByValue(f, 'target_list', ed.dom.getAttrib(e, 'target'));
+			selectByValue(f, 'class_list', ed.dom.getAttrib(e, 'class'));
+		}
+	},
+
+	update : function() {
+		var f = document.forms[0], ed = tinyMCEPopup.editor, e, b;
+
+		tinyMCEPopup.restoreSelection();
+		e = ed.dom.getParent(ed.selection.getNode(), 'A');
+
+		// Remove element if there is no href
+		if (!f.href.value) {
+			if (e) {
+				tinyMCEPopup.execCommand("mceBeginUndoLevel");
+				b = ed.selection.getBookmark();
+				ed.dom.remove(e, 1);
+				ed.selection.moveToBookmark(b);
+				tinyMCEPopup.execCommand("mceEndUndoLevel");
+				tinyMCEPopup.close();
+				return;
+			}
+		}
+
+		tinyMCEPopup.execCommand("mceBeginUndoLevel");
+
+		// Create new anchor elements
+		if (e == null) {
+			tinyMCEPopup.execCommand("CreateLink", false, "#mce_temp_url#", {skip_undo : 1});
+
+			tinymce.each(ed.dom.select("a"), function(n) {
+				if (ed.dom.getAttrib(n, 'href') == '#mce_temp_url#') {
+					e = n;
+
+					ed.dom.setAttribs(e, {
+						href : f.href.value,
+						title : f.linktitle.value,
+						target : f.target_list ? f.target_list.options[f.target_list.selectedIndex].value : null,
+						'class' : f.class_list ? f.class_list.options[f.class_list.selectedIndex].value : null
+					});
+				}
+			});
+		} else {
+			ed.dom.setAttribs(e, {
+				href : f.href.value,
+				title : f.linktitle.value,
+				target : f.target_list ? f.target_list.options[f.target_list.selectedIndex].value : null,
+				'class' : f.class_list ? f.class_list.options[f.class_list.selectedIndex].value : null
+			});
+		}
+
+		// Don't move caret if selection was image
+		if (e.childNodes.length != 1 || e.firstChild.nodeName != 'IMG') {
+			ed.focus();
+			ed.selection.select(e);
+			ed.selection.collapse(0);
+			tinyMCEPopup.storeSelection();
+		}
+
+		tinyMCEPopup.execCommand("mceEndUndoLevel");
+		tinyMCEPopup.close();
+	},
+
+	checkPrefix : function(n) {
+		if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_email')))
+			n.value = 'mailto:' + n.value;
+
+		if (/^\s*www./i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_external')))
+			n.value = 'http://' + n.value;
+	},
+
+	fillFileList : function(id, l) {
+		var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
+
+		l = window[l];
+
+		if (l && l.length > 0) {
+			lst.options[lst.options.length] = new Option('', '');
+
+			tinymce.each(l, function(o) {
+				lst.options[lst.options.length] = new Option(o[0], o[1]);
+			});
+		} else
+			dom.remove(dom.getParent(id, 'tr'));
+	},
+
+	fillClassList : function(id) {
+		var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
+
+		if (v = tinyMCEPopup.getParam('theme_advanced_styles')) {
+			cl = [];
+
+			tinymce.each(v.split(';'), function(v) {
+				var p = v.split('=');
+
+				cl.push({'title' : p[0], 'class' : p[1]});
+			});
+		} else
+			cl = tinyMCEPopup.editor.dom.getClasses();
+
+		if (cl.length > 0) {
+			lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), '');
+
+			tinymce.each(cl, function(o) {
+				lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']);
+			});
+		} else
+			dom.remove(dom.getParent(id, 'tr'));
+	},
+
+	fillTargetList : function(id) {
+		var dom = tinyMCEPopup.dom, lst = dom.get(id), v;
+
+		lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), '');
+		lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_same'), '_self');
+		lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_blank'), '_blank');
+
+		if (v = tinyMCEPopup.getParam('theme_advanced_link_targets')) {
+			tinymce.each(v.split(','), function(v) {
+				v = v.split('=');
+				lst.options[lst.options.length] = new Option(v[0], v[1]);
+			});
+		}
+	}
+};
+
+LinkDialog.preInit();
+tinyMCEPopup.onInit.add(LinkDialog.init, LinkDialog);
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/js/source_editor.js
@@ -1,1 +1,63 @@
+tinyMCEPopup.requireLangPack();
+tinyMCEPopup.onInit.add(onLoadInit);
 
+function saveContent() {
+	tinyMCEPopup.editor.setContent(document.getElementById('htmlSource').value);
+	tinyMCEPopup.close();
+}
+
+function onLoadInit() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	// Remove Gecko spellchecking
+	if (tinymce.isGecko)
+		document.body.spellcheck = tinyMCEPopup.editor.getParam("gecko_spellcheck");
+
+	document.getElementById('htmlSource').value = tinyMCEPopup.editor.getContent();
+
+	if (tinyMCEPopup.editor.getParam("theme_advanced_source_editor_wrap", true)) {
+		setWrap('soft');
+		document.getElementById('wraped').checked = true;
+	}
+
+	resizeInputs();
+}
+
+function setWrap(val) {
+	var v, n, s = document.getElementById('htmlSource');
+
+	s.wrap = val;
+
+	if (!tinymce.isIE) {
+		v = s.value;
+		n = s.cloneNode(false);
+		n.setAttribute("wrap", val);
+		s.parentNode.replaceChild(n, s);
+		n.value = v;
+	}
+}
+
+function toggleWordWrap(elm) {
+	if (elm.checked)
+		setWrap('soft');
+	else
+		setWrap('off');
+}
+
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;
+
+function resizeInputs() {
+	var el = document.getElementById('htmlSource');
+
+	if (!tinymce.isIE) {
+		 wHeight = self.innerHeight - 65;
+		 wWidth = self.innerWidth - 16;
+	} else {
+		 wHeight = document.body.clientHeight - 70;
+		 wWidth = document.body.clientWidth - 16;
+	}
+
+	el.style.height = Math.abs(wHeight) + 'px';
+	el.style.width  = Math.abs(wWidth) + 'px';
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/jscripts/about.js
@@ -1,1 +1,76 @@
+function init() {
+	var inst;
 
+	tinyMCEPopup.resizeToInnerSize();
+	inst = tinyMCE.selectedInstance;
+
+	// Give FF some time
+	window.setTimeout('insertHelpIFrame();', 10);
+
+	var tcont = document.getElementById('plugintablecontainer');
+	var plugins = tinyMCE.getParam('plugins', '', true, ',');
+	if (plugins.length == 0)
+		document.getElementById('plugins_tab').style.display = 'none';
+
+	var html = "";
+	html += '<table id="plugintable">';
+	html += '<thead>';
+	html += '<tr>';
+	html += '<td>' + tinyMCE.getLang('lang_plugin') + '</td>';
+	html += '<td>' + tinyMCE.getLang('lang_author') + '</td>';
+	html += '<td>' + tinyMCE.getLang('lang_version') + '</td>';
+	html += '</tr>';
+	html += '</thead>';
+	html += '<tbody>';
+
+	for (var i=0; i<inst.plugins.length; i++) {
+		var info = getPluginInfo(inst.plugins[i]);
+
+		html += '<tr>';
+
+		if (info.infourl != null && info.infourl != '')
+			html += '<td width="50%" title="' + plugins[i] + '"><a href="' + info.infourl + '" target="mceplugin">' + info.longname + '</a></td>';
+		else
+			html += '<td width="50%" title="' + plugins[i] + '">' + info.longname + '</td>';
+
+		if (info.authorurl != null && info.authorurl != '')
+			html += '<td width="35%"><a href="' + info.authorurl + '" target="mceplugin">' + info.author + '</a></td>';
+		else
+			html += '<td width="35%">' + info.author + '</td>';
+
+		html += '<td width="15%">' + info.version + '</td>';
+		html += '</tr>';
+	}
+
+	html += '</tbody>';
+	html += '</table>';
+
+	tcont.innerHTML = html;
+}
+
+function getPluginInfo(name) {
+	if (tinyMCE.plugins[name].getInfo)
+		return tinyMCE.plugins[name].getInfo();
+
+	return {
+		longname : name,
+		authorurl : '',
+		infourl : '',
+		author : '--',
+		version : '--'
+	};
+}
+
+function insertHelpIFrame() {
+	var html = '<iframe width="100%" height="300" src="' + tinyMCE.themeURL + "/docs/" + tinyMCE.settings['docs_language'] + "/index.htm" + '"></iframe>';
+
+	document.getElementById('iframecontainer').innerHTML = html;
+
+	html = '';
+	html += '<a href="http://www.moxiecode.com" target="_blank"><img src="http://tinymce.moxiecode.com/images/gotmoxie.png" alt="Got Moxie?" border="0" /></a> ';
+	html += '<a href="http://sourceforge.net/projects/tinymce/" target="_blank"><img src="http://sourceforge.net/sflogo.php?group_id=103281" alt="Hosted By Sourceforge" border="0" /></a> ';
+	html += '<a href="http://www.freshmeat.net/projects/tinymce" target="_blank"><img src="http://tinymce.moxiecode.com/images/fm.gif" alt="Also on freshmeat" border="0" /></a> ';
+
+	document.getElementById('buttoncontainer').innerHTML = html;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/jscripts/anchor.js
@@ -1,1 +1,75 @@
+var action, element;
 
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
+	var anchor = tinyMCE.getParentElement(inst.getFocusElement(), "a", "name");
+	var img = inst.getFocusElement();
+	action = 'insert';
+
+	if (anchor != null) {
+		element = anchor;
+		action = "update";
+	}
+
+	if (tinyMCE.getAttrib(img, "class") == "mceItemAnchor") {
+		element = img;
+		action = "update";
+	}
+
+	if (action == "update")
+		document.forms[0].anchorName.value = element.nodeName == "IMG" ? element.getAttribute("title") : element.getAttribute("name");
+
+	document.forms[0].insert.value = tinyMCE.getLang('lang_' + action, 'Insert', true);
+}
+
+function insertAnchor() {
+	var inst = tinyMCE.getInstanceById(tinyMCE.getWindowArg('editor_id'));
+	var name = document.forms[0].anchorName.value, e;
+
+	tinyMCEPopup.execCommand("mceBeginUndoLevel");
+
+	if (action == "update") {
+		if (element.nodeName == "IMG")
+			element.setAttribute("title", name);
+		else
+			element.setAttribute("name", name);
+	} else {
+		var rng = inst.getRng();
+
+		if (rng.collapse)
+			rng.collapse(false);
+
+		name = name.replace(/&/g, '&amp;');
+		name = name.replace(/\"/g, '&quot;');
+		name = name.replace(/</g, '&lt;');
+		name = name.replace(/>/g, '&gt;');
+
+		// Fix for bug #1447335
+		if (tinyMCE.isGecko)
+			html = '<a id="mceNewAnchor" name="' + name + '"></a>';
+		else
+			html = '<a name="' + name + '"></a>';
+
+		tinyMCEPopup.execCommand("mceInsertContent", false, html);
+
+		// Fix for bug #1447335 force cursor after the anchor element
+		if (tinyMCE.isGecko) {
+			e = inst.getDoc().getElementById('mceNewAnchor');
+
+			if (e) {
+				inst.selection.selectNode(e, true, false, false);
+				e.removeAttribute('id');
+			}
+		}
+
+		tinyMCE.handleVisualAid(inst.getBody(), true, inst.visualAid, inst);
+	}
+
+	tinyMCEPopup.execCommand("mceEndUndoLevel");
+
+	tinyMCE.triggerNodeChange();
+	tinyMCEPopup.close();
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/jscripts/charmap.js
@@ -1,1 +1,327 @@
-
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+}
+
+var charmap = new Array();
+
+// for mor details please see w3c.org
+// now here is the complete list ;)
+
+charmap = [
+	['&nbsp;',    '&#160;',  true, 'no-break space'],
+	['&amp;',     '&#38;',   true, 'ampersand'],
+	['&quot;',    '&#34;',   true, 'quotation mark'],
+// finance
+	['&cent;',    '&#162;',  true, 'cent sign'],
+	['&euro;',    '&#8364;', true, 'euro sign'],
+	['&pound;',   '&#163;',  true, 'pound sign'],
+	['&yen;',     '&#165;',  true, 'yen sign'],
+// signs
+	['&copy;',    '&#169;',  true, 'copyright sign'],
+	['&reg;',     '&#174;',  true, 'registered sign'],
+	['&trade;',   '&#8482;', true, 'trade mark sign'],
+	['&permil;',  '&#8240;', true, 'per mille sign'],
+	['&micro;',   '&#181;',  true, 'micro sign'],
+	['&middot;',  '&#183;',  true, 'middle dot'],
+	['&bull;',    '&#8226;', true, 'bullet'],
+	['&hellip;',  '&#8230;', true, 'three dot leader'],
+	['&prime;',   '&#8242;', true, 'minutes / feet'],
+	['&Prime;',   '&#8243;', true, 'seconds / inches'],
+	['&sect;',    '&#167;',  true, 'section sign'],
+	['&para;',    '&#182;',  true, 'paragraph sign'],
+	['&szlig;',   '&#223;',  true, 'sharp s / ess-zed'],
+// quotations
+	['&lsaquo;',  '&#8249;', true, 'single left-pointing angle quotation mark'],
+	['&rsaquo;',  '&#8250;', true, 'single right-pointing angle quotation mark'],
+	['&laquo;',   '&#171;',  true, 'left pointing guillemet'],
+	['&raquo;',   '&#187;',  true, 'right pointing guillemet'],
+	['&lsquo;',   '&#8216;', true, 'left single quotation mark'],
+	['&rsquo;',   '&#8217;', true, 'right single quotation mark'],
+	['&ldquo;',   '&#8220;', true, 'left double quotation mark'],
+	['&rdquo;',   '&#8221;', true, 'right double quotation mark'],
+	['&sbquo;',   '&#8218;', true, 'single low-9 quotation mark'],
+	['&bdquo;',   '&#8222;', true, 'double low-9 quotation mark'],
+	['&lt;',      '&#60;',   true, 'less-than sign'],
+	['&gt;',      '&#62;',   true, 'greater-than sign'],
+	['&le;',      '&#8804;', true, 'less-than or equal to'],
+	['&ge;',      '&#8805;', true, 'greater-than or equal to'],
+	['&ndash;',   '&#8211;', true, 'en dash'],
+	['&mdash;',   '&#8212;', true, 'em dash'],
+	['&macr;',    '&#175;',  true, 'macron'],
+	['&oline;',   '&#8254;', true, 'overline'],
+	['&curren;',  '&#164;',  true, 'currency sign'],
+	['&brvbar;',  '&#166;',  true, 'broken bar'],
+	['&uml;',     '&#168;',  true, 'diaeresis'],
+	['&iexcl;',   '&#161;',  true, 'inverted exclamation mark'],
+	['&iquest;',  '&#191;',  true, 'turned question mark'],
+	['&circ;',    '&#710;',  true, 'circumflex accent'],
+	['&tilde;',   '&#732;',  true, 'small tilde'],
+	['&deg;',     '&#176;',  true, 'degree sign'],
+	['&minus;',   '&#8722;', true, 'minus sign'],
+	['&plusmn;',  '&#177;',  true, 'plus-minus sign'],
+	['&divide;',  '&#247;',  true, 'division sign'],
+	['&frasl;',   '&#8260;', true, 'fraction slash'],
+	['&times;',   '&#215;',  true, 'multiplication sign'],
+	['&sup1;',    '&#185;',  true, 'superscript one'],
+	['&sup2;',    '&#178;',  true, 'superscript two'],
+	['&sup3;',    '&#179;',  true, 'superscript three'],
+	['&frac14;',  '&#188;',  true, 'fraction one quarter'],
+	['&frac12;',  '&#189;',  true, 'fraction one half'],
+	['&frac34;',  '&#190;',  true, 'fraction three quarters'],
+// math / logical
+	['&fnof;',    '&#402;',  true, 'function / florin'],
+	['&int;',     '&#8747;', true, 'integral'],
+	['&sum;',     '&#8721;', true, 'n-ary sumation'],
+	['&infin;',   '&#8734;', true, 'infinity'],
+	['&radic;',   '&#8730;', true, 'square root'],
+	['&sim;',     '&#8764;', false,'similar to'],
+	['&cong;',    '&#8773;', false,'approximately equal to'],
+	['&asymp;',   '&#8776;', true, 'almost equal to'],
+	['&ne;',      '&#8800;', true, 'not equal to'],
+	['&equiv;',   '&#8801;', true, 'identical to'],
+	['&isin;',    '&#8712;', false,'element of'],
+	['&notin;',   '&#8713;', false,'not an element of'],
+	['&ni;',      '&#8715;', false,'contains as member'],
+	['&prod;',    '&#8719;', true, 'n-ary product'],
+	['&and;',     '&#8743;', false,'logical and'],
+	['&or;',      '&#8744;', false,'logical or'],
+	['&not;',     '&#172;',  true, 'not sign'],
+	['&cap;',     '&#8745;', true, 'intersection'],
+	['&cup;',     '&#8746;', false,'union'],
+	['&part;',    '&#8706;', true, 'partial differential'],
+	['&forall;',  '&#8704;', false,'for all'],
+	['&exist;',   '&#8707;', false,'there exists'],
+	['&empty;',   '&#8709;', false,'diameter'],
+	['&nabla;',   '&#8711;', false,'backward difference'],
+	['&lowast;',  '&#8727;', false,'asterisk operator'],
+	['&prop;',    '&#8733;', false,'proportional to'],
+	['&ang;',     '&#8736;', false,'angle'],
+// undefined
+	['&acute;',   '&#180;',  true, 'acute accent'],
+	['&cedil;',   '&#184;',  true, 'cedilla'],
+	['&ordf;',    '&#170;',  true, 'feminine ordinal indicator'],
+	['&ordm;',    '&#186;',  true, 'masculine ordinal indicator'],
+	['&dagger;',  '&#8224;', true, 'dagger'],
+	['&Dagger;',  '&#8225;', true, 'double dagger'],
+// alphabetical special chars
+	['&Agrave;',  '&#192;',  true, 'A - grave'],
+	['&Aacute;',  '&#193;',  true, 'A - acute'],
+	['&Acirc;',   '&#194;',  true, 'A - circumflex'],
+	['&Atilde;',  '&#195;',  true, 'A - tilde'],
+	['&Auml;',    '&#196;',  true, 'A - diaeresis'],
+	['&Aring;',   '&#197;',  true, 'A - ring above'],
+	['&AElig;',   '&#198;',  true, 'ligature AE'],
+	['&Ccedil;',  '&#199;',  true, 'C - cedilla'],
+	['&Egrave;',  '&#200;',  true, 'E - grave'],
+	['&Eacute;',  '&#201;',  true, 'E - acute'],
+	['&Ecirc;',   '&#202;',  true, 'E - circumflex'],
+	['&Euml;',    '&#203;',  true, 'E - diaeresis'],
+	['&Igrave;',  '&#204;',  true, 'I - grave'],
+	['&Iacute;',  '&#205;',  true, 'I - acute'],
+	['&Icirc;',   '&#206;',  true, 'I - circumflex'],
+	['&Iuml;',    '&#207;',  true, 'I - diaeresis'],
+	['&ETH;',     '&#208;',  true, 'ETH'],
+	['&Ntilde;',  '&#209;',  true, 'N - tilde'],
+	['&Ograve;',  '&#210;',  true, 'O - grave'],
+	['&Oacute;',  '&#211;',  true, 'O - acute'],
+	['&Ocirc;',   '&#212;',  true, 'O - circumflex'],
+	['&Otilde;',  '&#213;',  true, 'O - tilde'],
+	['&Ouml;',    '&#214;',  true, 'O - diaeresis'],
+	['&Oslash;',  '&#216;',  true, 'O - slash'],
+	['&OElig;',   '&#338;',  true, 'ligature OE'],
+	['&Scaron;',  '&#352;',  true, 'S - caron'],
+	['&Ugrave;',  '&#217;',  true, 'U - grave'],
+	['&Uacute;',  '&#218;',  true, 'U - acute'],
+	['&Ucirc;',   '&#219;',  true, 'U - circumflex'],
+	['&Uuml;',    '&#220;',  true, 'U - diaeresis'],
+	['&Yacute;',  '&#221;',  true, 'Y - acute'],
+	['&Yuml;',    '&#376;',  true, 'Y - diaeresis'],
+	['&THORN;',   '&#222;',  true, 'THORN'],
+	['&agrave;',  '&#224;',  true, 'a - grave'],
+	['&aacute;',  '&#225;',  true, 'a - acute'],
+	['&acirc;',   '&#226;',  true, 'a - circumflex'],
+	['&atilde;',  '&#227;',  true, 'a - tilde'],
+	['&auml;',    '&#228;',  true, 'a - diaeresis'],
+	['&aring;',   '&#229;',  true, 'a - ring above'],
+	['&aelig;',   '&#230;',  true, 'ligature ae'],
+	['&ccedil;',  '&#231;',  true, 'c - cedilla'],
+	['&egrave;',  '&#232;',  true, 'e - grave'],
+	['&eacute;',  '&#233;',  true, 'e - acute'],
+	['&ecirc;',   '&#234;',  true, 'e - circumflex'],
+	['&euml;',    '&#235;',  true, 'e - diaeresis'],
+	['&igrave;',  '&#236;',  true, 'i - grave'],
+	['&iacute;',  '&#237;',  true, 'i - acute'],
+	['&icirc;',   '&#238;',  true, 'i - circumflex'],
+	['&iuml;',    '&#239;',  true, 'i - diaeresis'],
+	['&eth;',     '&#240;',  true, 'eth'],
+	['&ntilde;',  '&#241;',  true, 'n - tilde'],
+	['&ograve;',  '&#242;',  true, 'o - grave'],
+	['&oacute;',  '&#243;',  true, 'o - acute'],
+	['&ocirc;',   '&#244;',  true, 'o - circumflex'],
+	['&otilde;',  '&#245;',  true, 'o - tilde'],
+	['&ouml;',    '&#246;',  true, 'o - diaeresis'],
+	['&oslash;',  '&#248;',  true, 'o slash'],
+	['&oelig;',   '&#339;',  true, 'ligature oe'],
+	['&scaron;',  '&#353;',  true, 's - caron'],
+	['&ugrave;',  '&#249;',  true, 'u - grave'],
+	['&uacute;',  '&#250;',  true, 'u - acute'],
+	['&ucirc;',   '&#251;',  true, 'u - circumflex'],
+	['&uuml;',    '&#252;',  true, 'u - diaeresis'],
+	['&yacute;',  '&#253;',  true, 'y - acute'],
+	['&thorn;',   '&#254;',  true, 'thorn'],
+	['&yuml;',    '&#255;',  true, 'y - diaeresis'],
+    ['&Alpha;',   '&#913;',  true, 'Alpha'],
+	['&Beta;',    '&#914;',  true, 'Beta'],
+	['&Gamma;',   '&#915;',  true, 'Gamma'],
+	['&Delta;',   '&#916;',  true, 'Delta'],
+	['&Epsilon;', '&#917;',  true, 'Epsilon'],
+	['&Zeta;',    '&#918;',  true, 'Zeta'],
+	['&Eta;',     '&#919;',  true, 'Eta'],
+	['&Theta;',   '&#920;',  true, 'Theta'],
+	['&Iota;',    '&#921;',  true, 'Iota'],
+	['&Kappa;',   '&#922;',  true, 'Kappa'],
+	['&Lambda;',  '&#923;',  true, 'Lambda'],
+	['&Mu;',      '&#924;',  true, 'Mu'],
+	['&Nu;',      '&#925;',  true, 'Nu'],
+	['&Xi;',      '&#926;',  true, 'Xi'],
+	['&Omicron;', '&#927;',  true, 'Omicron'],
+	['&Pi;',      '&#928;',  true, 'Pi'],
+	['&Rho;',     '&#929;',  true, 'Rho'],
+	['&Sigma;',   '&#931;',  true, 'Sigma'],
+	['&Tau;',     '&#932;',  true, 'Tau'],
+	['&Upsilon;', '&#933;',  true, 'Upsilon'],
+	['&Phi;',     '&#934;',  true, 'Phi'],
+	['&Chi;',     '&#935;',  true, 'Chi'],
+	['&Psi;',     '&#936;',  true, 'Psi'],
+	['&Omega;',   '&#937;',  true, 'Omega'],
+	['&alpha;',   '&#945;',  true, 'alpha'],
+	['&beta;',    '&#946;',  true, 'beta'],
+	['&gamma;',   '&#947;',  true, 'gamma'],
+	['&delta;',   '&#948;',  true, 'delta'],
+	['&epsilon;', '&#949;',  true, 'epsilon'],
+	['&zeta;',    '&#950;',  true, 'zeta'],
+	['&eta;',     '&#951;',  true, 'eta'],
+	['&theta;',   '&#952;',  true, 'theta'],
+	['&iota;',    '&#953;',  true, 'iota'],
+	['&kappa;',   '&#954;',  true, 'kappa'],
+	['&lambda;',  '&#955;',  true, 'lambda'],
+	['&mu;',      '&#956;',  true, 'mu'],
+	['&nu;',      '&#957;',  true, 'nu'],
+	['&xi;',      '&#958;',  true, 'xi'],
+	['&omicron;', '&#959;',  true, 'omicron'],
+	['&pi;',      '&#960;',  true, 'pi'],
+	['&rho;',     '&#961;',  true, 'rho'],
+	['&sigmaf;',  '&#962;',  true, 'final sigma'],
+	['&sigma;',   '&#963;',  true, 'sigma'],
+	['&tau;',     '&#964;',  true, 'tau'],
+	['&upsilon;', '&#965;',  true, 'upsilon'],
+	['&phi;',     '&#966;',  true, 'phi'],
+	['&chi;',     '&#967;',  true, 'chi'],
+	['&psi;',     '&#968;',  true, 'psi'],
+	['&omega;',   '&#969;',  true, 'omega'],
+// symbols
+	['&alefsym;', '&#8501;', false,'alef symbol'],
+	['&piv;',     '&#982;',  false,'pi symbol'],
+	['&real;',    '&#8476;', false,'real part symbol'],
+	['&thetasym;','&#977;',  false,'theta symbol'],
+	['&upsih;',   '&#978;',  false,'upsilon - hook symbol'],
+	['&weierp;',  '&#8472;', false,'Weierstrass p'],
+	['&image;',   '&#8465;', false,'imaginary part'],
+// arrows
+	['&larr;',    '&#8592;', true, 'leftwards arrow'],
+	['&uarr;',    '&#8593;', true, 'upwards arrow'],
+	['&rarr;',    '&#8594;', true, 'rightwards arrow'],
+	['&darr;',    '&#8595;', true, 'downwards arrow'],
+	['&harr;',    '&#8596;', true, 'left right arrow'],
+	['&crarr;',   '&#8629;', false,'carriage return'],
+	['&lArr;',    '&#8656;', false,'leftwards double arrow'],
+	['&uArr;',    '&#8657;', false,'upwards double arrow'],
+	['&rArr;',    '&#8658;', false,'rightwards double arrow'],
+	['&dArr;',    '&#8659;', false,'downwards double arrow'],
+	['&hArr;',    '&#8660;', false,'left right double arrow'],
+	['&there4;',  '&#8756;', false,'therefore'],
+	['&sub;',     '&#8834;', false,'subset of'],
+	['&sup;',     '&#8835;', false,'superset of'],
+	['&nsub;',    '&#8836;', false,'not a subset of'],
+	['&sube;',    '&#8838;', false,'subset of or equal to'],
+	['&supe;',    '&#8839;', false,'superset of or equal to'],
+	['&oplus;',   '&#8853;', false,'circled plus'],
+	['&otimes;',  '&#8855;', false,'circled times'],
+	['&perp;',    '&#8869;', false,'perpendicular'],
+	['&sdot;',    '&#8901;', false,'dot operator'],
+	['&lceil;',   '&#8968;', false,'left ceiling'],
+	['&rceil;',   '&#8969;', false,'right ceiling'],
+	['&lfloor;',  '&#8970;', false,'left floor'],
+	['&rfloor;',  '&#8971;', false,'right floor'],
+	['&lang;',    '&#9001;', false,'left-pointing angle bracket'],
+	['&rang;',    '&#9002;', false,'right-pointing angle bracket'],
+	['&loz;',     '&#9674;', true,'lozenge'],
+	['&spades;',  '&#9824;', false,'black spade suit'],
+	['&clubs;',   '&#9827;', true, 'black club suit'],
+	['&hearts;',  '&#9829;', true, 'black heart suit'],
+	['&diams;',   '&#9830;', true, 'black diamond suit'],
+	['&ensp;',    '&#8194;', false,'en space'],
+	['&emsp;',    '&#8195;', false,'em space'],
+	['&thinsp;',  '&#8201;', false,'thin space'],
+	['&zwnj;',    '&#8204;', false,'zero width non-joiner'],
+	['&zwj;',     '&#8205;', false,'zero width joiner'],
+	['&lrm;',     '&#8206;', false,'left-to-right mark'],
+	['&rlm;',     '&#8207;', false,'right-to-left mark'],
+	['&shy;',     '&#173;',  false,'soft hyphen']
+];
+
+function renderCharMapHTML() {
+	var charsPerRow = 20, tdWidth=20, tdHeight=20;
+	var html = '<table border="0" cellspacing="1" cellpadding="0" width="' + (tdWidth*charsPerRow) + '"><tr height="' + tdHeight + '">';
+	var cols=-1;
+	for (var i=0; i<charmap.length; i++) {
+		if (charmap[i][2]==true) {
+			cols++;
+			html += ''
+				+ '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap"'
+				+ ' onmouseover="this.className=\'charmapOver\';'
+				+ 'previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');"'
+				+ ' onmouseout="this.className=\'charmap\';"'
+				+ ' nowrap="nowrap" onclick="insertChar(\'' + charmap[i][1].substring(2,charmap[i][1].length-1) + '\');"><a style="text-decoration: none;" onfocus="previewChar(\'' + charmap[i][1].substring(1,charmap[i][1].length) + '\',\'' + charmap[i][0].substring(1,charmap[i][0].length) + '\',\'' + charmap[i][3] + '\');" href="javascript:insertChar(\'' + charmap[i][1].substring(2,charmap[i][1].length-1) + '\');" onclick="return false;" onmousedown="return false;" title="' + charmap[i][3] + '">'
+				+ charmap[i][1]
+				+ '</a></td>';
+			if ((cols+1) % charsPerRow == 0)
+				html += '</tr><tr height="' + tdHeight + '">';
+		}
+	 }
+	if (cols % charsPerRow > 0) {
+		var padd = charsPerRow - (cols % charsPerRow);
+		for (var i=0; i<padd-1; i++)
+			html += '<td width="' + tdWidth + '" height="' + tdHeight + '" class="charmap">&nbsp;</td>';
+	}
+	html += '</tr></table>';
+	document.write(html);
+}
+
+function insertChar(chr) {
+	tinyMCEPopup.execCommand('mceInsertContent', false, '&#' + chr + ';');
+
+	// Refocus in window
+	if (tinyMCEPopup.isWindow)
+		window.focus();
+
+	tinyMCEPopup.close();
+}
+
+function previewChar(codeA, codeB, codeN) {
+	var elmA = document.getElementById('codeA');
+	var elmB = document.getElementById('codeB');
+	var elmV = document.getElementById('codeV');
+	var elmN = document.getElementById('codeN');
+
+	if (codeA=='#160;') {
+		elmV.innerHTML = '__';
+	} else {
+		elmV.innerHTML = '&' + codeA;
+	}
+
+	elmB.innerHTML = '&amp;' + codeA;
+	elmA.innerHTML = '&amp;' + codeB;
+	elmN.innerHTML = codeN;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/jscripts/color_picker.js
@@ -1,1 +1,249 @@
-
+var detail = 50, strhex = "0123456789abcdef", i, isMouseDown = false, isMouseOver = false;
+
+var colors = new Array(
+	"#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033",
+	"#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099",
+	"#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff",
+	"#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033",
+	"#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399",
+	"#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff",
+	"#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333",
+	"#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399",
+	"#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff",
+	"#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633",
+	"#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699",
+	"#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff",
+	"#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633",
+	"#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999",
+	"#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff",
+	"#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933",
+	"#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999",
+	"#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff",
+	"#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33",
+	"#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99",
+	"#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff",
+	"#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33",
+	"#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99",
+	"#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff",
+	"#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33",
+	"#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99",
+	"#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff"
+);
+
+var named = {
+	'#F0F8FF':'AliceBlue','#FAEBD7':'AntiqueWhite','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige',
+	'#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'BlanchedAlmond','#0000FF':'Blue','#8A2BE2':'BlueViolet','#A52A2A':'Brown',
+	'#DEB887':'BurlyWood','#5F9EA0':'CadetBlue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'CornflowerBlue',
+	'#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'DarkBlue','#008B8B':'DarkCyan','#B8860B':'DarkGoldenRod',
+	'#A9A9A9':'DarkGray','#A9A9A9':'DarkGrey','#006400':'DarkGreen','#BDB76B':'DarkKhaki','#8B008B':'DarkMagenta','#556B2F':'DarkOliveGreen',
+	'#FF8C00':'Darkorange','#9932CC':'DarkOrchid','#8B0000':'DarkRed','#E9967A':'DarkSalmon','#8FBC8F':'DarkSeaGreen','#483D8B':'DarkSlateBlue',
+	'#2F4F4F':'DarkSlateGray','#2F4F4F':'DarkSlateGrey','#00CED1':'DarkTurquoise','#9400D3':'DarkViolet','#FF1493':'DeepPink','#00BFFF':'DeepSkyBlue',
+	'#696969':'DimGray','#696969':'DimGrey','#1E90FF':'DodgerBlue','#B22222':'FireBrick','#FFFAF0':'FloralWhite','#228B22':'ForestGreen',
+	'#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'GhostWhite','#FFD700':'Gold','#DAA520':'GoldenRod','#808080':'Gray','#808080':'Grey',
+	'#008000':'Green','#ADFF2F':'GreenYellow','#F0FFF0':'HoneyDew','#FF69B4':'HotPink','#CD5C5C':'IndianRed','#4B0082':'Indigo','#FFFFF0':'Ivory',
+	'#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'LavenderBlush','#7CFC00':'LawnGreen','#FFFACD':'LemonChiffon','#ADD8E6':'LightBlue',
+	'#F08080':'LightCoral','#E0FFFF':'LightCyan','#FAFAD2':'LightGoldenRodYellow','#D3D3D3':'LightGray','#D3D3D3':'LightGrey','#90EE90':'LightGreen',
+	'#FFB6C1':'LightPink','#FFA07A':'LightSalmon','#20B2AA':'LightSeaGreen','#87CEFA':'LightSkyBlue','#778899':'LightSlateGray','#778899':'LightSlateGrey',
+	'#B0C4DE':'LightSteelBlue','#FFFFE0':'LightYellow','#00FF00':'Lime','#32CD32':'LimeGreen','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon',
+	'#66CDAA':'MediumAquaMarine','#0000CD':'MediumBlue','#BA55D3':'MediumOrchid','#9370D8':'MediumPurple','#3CB371':'MediumSeaGreen','#7B68EE':'MediumSlateBlue',
+	'#00FA9A':'MediumSpringGreen','#48D1CC':'MediumTurquoise','#C71585':'MediumVioletRed','#191970':'MidnightBlue','#F5FFFA':'MintCream','#FFE4E1':'MistyRose','#FFE4B5':'Moccasin',
+	'#FFDEAD':'NavajoWhite','#000080':'Navy','#FDF5E6':'OldLace','#808000':'Olive','#6B8E23':'OliveDrab','#FFA500':'Orange','#FF4500':'OrangeRed','#DA70D6':'Orchid',
+	'#EEE8AA':'PaleGoldenRod','#98FB98':'PaleGreen','#AFEEEE':'PaleTurquoise','#D87093':'PaleVioletRed','#FFEFD5':'PapayaWhip','#FFDAB9':'PeachPuff',
+	'#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'PowderBlue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'RosyBrown','#4169E1':'RoyalBlue',
+	'#8B4513':'SaddleBrown','#FA8072':'Salmon','#F4A460':'SandyBrown','#2E8B57':'SeaGreen','#FFF5EE':'SeaShell','#A0522D':'Sienna','#C0C0C0':'Silver',
+	'#87CEEB':'SkyBlue','#6A5ACD':'SlateBlue','#708090':'SlateGray','#708090':'SlateGrey','#FFFAFA':'Snow','#00FF7F':'SpringGreen',
+	'#4682B4':'SteelBlue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet',
+	'#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'WhiteSmoke','#FFFF00':'Yellow','#9ACD32':'YellowGreen'
+};
+
+function init() {
+	var inputColor = convertRGBToHex(tinyMCE.getWindowArg('input_color'));
+
+	if (tinyMCE.isMSIE)
+		tinyMCEPopup.resizeToInnerSize();
+
+	generatePicker();
+
+	if (inputColor) {
+		changeFinalColor(inputColor);
+
+		col = convertHexToRGB(inputColor);
+
+		if (col)
+			updateLight(col.r, col.g, col.b);
+	}
+}
+
+function insertAction() {
+	var color = document.getElementById("color").value;
+
+	tinyMCEPopup.execCommand(tinyMCE.getWindowArg('command'), false, color);
+	tinyMCEPopup.close();
+}
+
+function showColor(color, name) {
+	if (name)
+		document.getElementById("colorname").innerHTML = name;
+
+	document.getElementById("preview").style.backgroundColor = color;
+	document.getElementById("color").value = color;
+}
+
+function convertRGBToHex(col) {
+	var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi");
+
+	if (!col)
+		return col;
+
+	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 {r : r, g : g, b : b};
+	}
+
+	return null;
+}
+
+function generatePicker() {
+	var el = document.getElementById('light'), h = '', i;
+
+	for (i = 0; i < detail; i++){
+		h += '<div id="gs'+i+'" style="background-color:#000000; width:15px; height:3px; border-style:none; border-width:0px;"'
+		+ ' onclick="changeFinalColor(this.style.backgroundColor)"'
+		+ ' onmousedown="isMouseDown = true; return false;"'
+		+ ' onmouseup="isMouseDown = false;"'
+		+ ' onmousemove="if (isMouseDown && isMouseOver) changeFinalColor(this.style.backgroundColor); return false;"'
+		+ ' onmouseover="isMouseOver = true;"'
+		+ ' onmouseout="isMouseOver = false;"'
+		+ '></div>';
+	}
+
+	el.innerHTML = h;
+}
+
+function generateWebColors() {
+	var el = document.getElementById('webcolors'), h = '', i;
+
+	if (el.className == 'generated')
+		return;
+
+	h += '<table border="0" cellspacing="1" cellpadding="0">'
+		+ '<tr>';
+
+	for (i=0; i<colors.length; i++) {
+		h += '<td bgcolor="' + colors[i] + '">'
+			+ '<a href="javascript:selectColor();" onfocus="showColor(\'' + colors[i] +  '\');" onmouseover="showColor(\'' + colors[i] +  '\');">'
+			+ '<img border="0" src="images/spacer.gif" width="10" height="10" title="' + colors[i] +  '" alt="' + colors[i] +  '" /></a></td>';
+		if ((i+1) % 18 == 0)
+			h += '</tr><tr>';
+	}
+
+	h += '</table>';
+
+	el.innerHTML = h;
+	el.className = 'generated';
+}
+
+function generateNamedColors() {
+	var el = document.getElementById('namedcolors'), h = '', n, v, i = 0;
+
+	if (el.className == 'generated')
+		return;
+
+	for (n in named) {
+		v = named[n];
+		h += '<a href="javascript:selectColor();" onmouseover="showColor(\'' + n +  '\',\'' + v + '\');" style="background-color: ' + n + '"><!-- IE --></a>'
+	}
+
+	el.innerHTML = h;
+	el.className = 'generated';
+}
+
+function selectColor() {
+	var color = document.getElementById("color").value;
+
+	if(window.opener)
+		window.opener.tinyMCE.execInstanceCommand(tinyMCE.getWindowArg('editor_id'),tinyMCE.getWindowArg('command'),false,color);
+
+	window.close();
+}
+
+function dechex(n) {
+	return strhex.charAt(Math.floor(n / 16)) + strhex.charAt(n % 16);
+}
+
+function computeColor(e) {
+	var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB;
+
+	x = e.offsetX ? e.offsetX : (e.target ? e.clientX - e.target.x : 0);
+	y = e.offsetY ? e.offsetY : (e.target ? e.clientY - e.target.y : 0);
+
+	partWidth = document.getElementById('colorpicker').width / 6;
+	partDetail = detail / 2;
+	imHeight = document.getElementById('colorpicker').height;
+
+	r = (x >= 0)*(x < partWidth)*255 + (x >= partWidth)*(x < 2*partWidth)*(2*255 - x * 255 / partWidth) + (x >= 4*partWidth)*(x < 5*partWidth)*(-4*255 + x * 255 / partWidth) + (x >= 5*partWidth)*(x < 6*partWidth)*255;
+	g = (x >= 0)*(x < partWidth)*(x * 255 / partWidth) + (x >= partWidth)*(x < 3*partWidth)*255	+ (x >= 3*partWidth)*(x < 4*partWidth)*(4*255 - x * 255 / partWidth);
+	b = (x >= 2*partWidth)*(x < 3*partWidth)*(-2*255 + x * 255 / partWidth) + (x >= 3*partWidth)*(x < 5*partWidth)*255 + (x >= 5*partWidth)*(x < 6*partWidth)*(6*255 - x * 255 / partWidth);
+
+	coef = (imHeight - y) / imHeight;
+	r = 128 + (r - 128) * coef;
+	g = 128 + (g - 128) * coef;
+	b = 128 + (b - 128) * coef;
+
+	changeFinalColor('#' + dechex(r) + dechex(g) + dechex(b));
+	updateLight(r, g, b);
+}
+
+function updateLight(r, g, b) {
+	var i, partDetail = detail / 2, finalCoef, finalR, finalG, finalB, color;
+
+	for (i=0; i<detail; i++) {
+		if ((i>=0) && (i<partDetail)) {
+			finalCoef = i / partDetail;
+			finalR = dechex(255 - (255 - r) * finalCoef);
+			finalG = dechex(255 - (255 - g) * finalCoef);
+			finalB = dechex(255 - (255 - b) * finalCoef);
+		} else {
+			finalCoef = 2 - i / partDetail;
+			finalR = dechex(r * finalCoef);
+			finalG = dechex(g * finalCoef);
+			finalB = dechex(b * finalCoef);
+		}
+
+		color = finalR + finalG + finalB;
+
+		document.getElementById('gs' + i).style.backgroundColor = '#'+color;
+	}
+}
+
+function changeFinalColor(color) {
+	if (color.indexOf('#') == -1)
+		color = convertRGBToHex(color);
+
+	document.getElementById('preview').style.backgroundColor = color;
+	document.getElementById('color').value = color;
+}
+
+window.focus();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/jscripts/image.js
@@ -1,1 +1,82 @@
+var url = tinyMCE.getParam("external_image_list_url");
+if (url != null) {
+	// Fix relative
+	if (url.charAt(0) != '/' && url.indexOf('://') == -1)
+		url = tinyMCE.documentBasePath + "/" + url;
 
+	document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');
+}
+
+function insertImage() {
+	var src = document.forms[0].src.value;
+	var alt = document.forms[0].alt.value;
+	var border = document.forms[0].border.value;
+	var vspace = document.forms[0].vspace.value;
+	var hspace = document.forms[0].hspace.value;
+	var width = document.forms[0].width.value;
+	var height = document.forms[0].height.value;
+	var align = document.forms[0].align.options[document.forms[0].align.selectedIndex].value;
+
+	tinyMCEPopup.restoreSelection();
+	tinyMCE.themes['advanced']._insertImage(src, alt, border, hspace, vspace, width, height, align);
+	tinyMCEPopup.close();
+}
+
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image');
+
+	var formObj = document.forms[0];
+
+	for (var i=0; i<document.forms[0].align.options.length; i++) {
+		if (document.forms[0].align.options[i].value == tinyMCE.getWindowArg('align'))
+			document.forms[0].align.options.selectedIndex = i;
+	}
+
+	formObj.src.value = tinyMCE.getWindowArg('src');
+	formObj.alt.value = tinyMCE.getWindowArg('alt');
+	formObj.border.value = tinyMCE.getWindowArg('border');
+	formObj.vspace.value = tinyMCE.getWindowArg('vspace');
+	formObj.hspace.value = tinyMCE.getWindowArg('hspace');
+	formObj.width.value = tinyMCE.getWindowArg('width');
+	formObj.height.value = tinyMCE.getWindowArg('height');
+	formObj.insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true); 
+
+	// Handle file browser
+	if (isVisible('srcbrowser'))
+		document.getElementById('src').style.width = '180px';
+
+	// Auto select image in list
+	if (typeof(tinyMCEImageList) != "undefined" && tinyMCEImageList.length > 0) {
+		for (var i=0; i<formObj.image_list.length; i++) {
+			if (formObj.image_list.options[i].value == tinyMCE.getWindowArg('src'))
+				formObj.image_list.options[i].selected = true;
+		}
+	}
+}
+
+var preloadImg = new Image();
+
+function resetImageData() {
+	var formObj = document.forms[0];
+	formObj.width.value = formObj.height.value = "";	
+}
+
+function updateImageData() {
+	var formObj = document.forms[0];
+
+	if (formObj.width.value == "")
+		formObj.width.value = preloadImg.width;
+
+	if (formObj.height.value == "")
+		formObj.height.value = preloadImg.height;
+}
+
+function getImageData() {
+	preloadImg = new Image();
+	tinyMCE.addEvent(preloadImg, "load", updateImageData);
+	tinyMCE.addEvent(preloadImg, "error", function () {var formObj = document.forms[0];formObj.width.value = formObj.height.value = "";});
+	preloadImg.src = tinyMCE.convertRelativeToAbsoluteURL(tinyMCE.settings['base_href'], document.forms[0].src.value);
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/jscripts/link.js
@@ -1,1 +1,67 @@
+var url = tinyMCE.getParam("external_link_list_url");
+if (url != null) {
+	// Fix relative
+	if (url.charAt(0) != '/' && url.indexOf('://') == -1)
+		url = tinyMCE.documentBasePath + "/" + url;
 
+	document.write('<sc'+'ript language="javascript" type="text/javascript" src="' + url + '"></sc'+'ript>');
+}
+
+function init() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','theme_advanced_link');
+
+	// Handle file browser
+	if (isVisible('hrefbrowser'))
+		document.getElementById('href').style.width = '180px';
+
+	var formObj = document.forms[0];
+
+	for (var i=0; i<document.forms[0].target.options.length; i++) {
+		var option = document.forms[0].target.options[i];
+
+		if (option.value == tinyMCE.getWindowArg('target'))
+			option.selected = true;
+	}
+
+	document.forms[0].href.value = tinyMCE.getWindowArg('href');
+	document.forms[0].linktitle.value = tinyMCE.getWindowArg('title');
+	document.forms[0].insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true); 
+
+	addClassesToList('styleSelect', 'theme_advanced_link_styles');
+	selectByValue(formObj, 'styleSelect', tinyMCE.getWindowArg('className'), true);
+
+	// Hide css select row if no CSS classes
+	if (formObj.styleSelect && formObj.styleSelect.options.length <= 1) {
+		var sr = document.getElementById('styleSelectRow');
+		sr.style.display = 'none';
+		sr.parentNode.removeChild(sr);
+	}
+
+	// Auto select link in list
+	if (typeof(tinyMCELinkList) != "undefined" && tinyMCELinkList.length > 0) {
+		var formObj = document.forms[0];
+
+		for (var i=0; i<formObj.link_list.length; i++) {
+			if (formObj.link_list.options[i].value == tinyMCE.getWindowArg('href'))
+				formObj.link_list.options[i].selected = true;
+		}
+	}
+}
+
+function insertLink() {
+	var href = document.forms[0].href.value;
+	var target = document.forms[0].target.options[document.forms[0].target.selectedIndex].value;
+	var title = document.forms[0].linktitle.value;
+	var style_class = document.forms[0].styleSelect ? document.forms[0].styleSelect.value : "";
+	var dummy;
+
+	if (target == '_self')
+		target = '';
+
+	tinyMCEPopup.restoreSelection();
+	tinyMCE.themes['advanced']._insertLink(href, target, title, dummy, style_class);
+	tinyMCEPopup.close();
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/jscripts/source_editor.js
@@ -1,1 +1,60 @@
+function saveContent() {
+	tinyMCE.setContent(document.getElementById('htmlSource').value);
+	tinyMCE.closeWindow(window);
+}
 
+function onLoadInit() {
+	tinyMCEPopup.resizeToInnerSize();
+
+	// Remove Gecko spellchecking
+	if (tinyMCE.isGecko)
+		document.body.spellcheck = tinyMCE.getParam("gecko_spellcheck");
+
+	document.getElementById('htmlSource').value = tinyMCE.getContent(tinyMCE.getWindowArg('editor_id'));
+
+	resizeInputs();
+
+	if (tinyMCE.getParam("theme_advanced_source_editor_wrap", true)) {
+		setWrap('soft');
+		document.getElementById('wraped').checked = true;
+	}
+}
+
+function setWrap(val) {
+	var s = document.getElementById('htmlSource');
+
+	s.wrap = val;
+
+	if (tinyMCE.isGecko || tinyMCE.isOpera) {
+		var v = s.value;
+		var n = s.cloneNode(false);
+		n.setAttribute("wrap", val);
+		s.parentNode.replaceChild(n, s);
+		n.value = v;
+	}
+}
+
+function toggleWordWrap(elm) {
+	if (elm.checked)
+		setWrap('soft');
+	else
+		setWrap('off');
+}
+
+var wHeight=0, wWidth=0, owHeight=0, owWidth=0;
+
+function resizeInputs() {
+	var el = document.getElementById('htmlSource');
+
+	if (!tinyMCE.isMSIE) {
+		 wHeight = self.innerHeight - 60;
+		 wWidth = self.innerWidth - 16;
+	} else {
+		 wHeight = document.body.clientHeight - 60;
+		 wWidth = document.body.clientWidth - 16;
+	}
+
+	el.style.height = Math.abs(wHeight) + 'px';
+	el.style.width  = Math.abs(wWidth) + 'px';
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/ar.js
@@ -1,1 +1,64 @@
+// Arabic lang variables
 
+tinyMCE.addToLang('',{
+theme_style_select : '&#1578;&#1589;&#1575;&#1605;&#1610;&#1605;',
+theme_code_desc : '&#1588;&#1601;&#1585;&#1577; &#1575;&#1604;&#1605;&#1589;&#1583;&#1585;',
+theme_code_title : '&#1588;&#1601;&#1585;&#1577; &#1575;&#1604;&#1605;&#1589;&#1583;&#1585;',
+theme_code_wordwrap : 'Word wrap',
+theme_sub_desc : '&#1605;&#1606;&#1582;&#1601;&#1590;',
+theme_sup_desc : '&#1605;&#1585;&#1578;&#1601;&#1593;',
+theme_hr_desc : '&#1573;&#1583;&#1585;&#1575;&#1580; &#1582;&#1591; &#1601;&#1575;&#1589;&#1604;',
+theme_removeformat_desc : '&#1573;&#1586;&#1575;&#1604;&#1577; &#1575;&#1604;&#1578;&#1606;&#1587;&#1610;&#1602;&#1575;&#1578;',
+theme_custom1_desc : 'Your custom description here',
+insert_image_border : '&#1587;&#1605;&#1603; &#1575;&#1604;&#1581;&#1583;&#1608;&#1583;',
+insert_image_dimensions : '&#1575;&#1604;&#1605;&#1608;&#1575;&#1589;&#1601;&#1575;&#1578;',
+insert_image_vspace : '&#1578;&#1576;&#1575;&#1593;&#1583; &#1593;&#1605;&#1608;&#1583;&#1610;',
+insert_image_hspace : '&#1578;&#1576;&#1575;&#1593;&#1583; &#1571;&#1601;&#1602;&#1610;',
+insert_image_align : '&#1605;&#1581;&#1575;&#1584;&#1575;&#1577;',
+insert_image_align_default : 'Default',
+insert_image_align_baseline : '&#1593;&#1604;&#1609; &#1575;&#1604;&#1587;&#1591;&#1585;',
+insert_image_align_top : '&#1571;&#1593;&#1604;&#1609;',
+insert_image_align_middle : '&#1608;&#1587;&#1591;',
+insert_image_align_bottom : '&#1571;&#1587;&#1601;&#1604;',
+insert_image_align_texttop : '&#1571;&#1593;&#1604;&#1609; &#1575;&#1604;&#1606;&#1589;',
+insert_image_align_absmiddle : '&#1608;&#1587;&#1591; &#1575;&#1604;&#1587;&#1591;&#1585;',
+insert_image_align_absbottom : '&#1571;&#1587;&#1601;&#1604; &#1575;&#1604;&#1606;&#1589;',
+insert_image_align_left : '&#1610;&#1587;&#1575;&#1585;',
+insert_image_align_right : '&#1610;&#1605;&#1610;&#1606;',
+theme_font_size : '-- Font size --',
+theme_fontdefault : '-- Font family --',
+theme_block : '-- Format --',
+theme_paragraph : 'Paragraph',
+theme_div : 'Div',
+theme_address : 'Address',
+theme_pre : 'Preformatted',
+theme_h1 : 'Heading 1',
+theme_h2 : 'Heading 2',
+theme_h3 : 'Heading 3',
+theme_h4 : 'Heading 4',
+theme_h5 : 'Heading 5',
+theme_h6 : 'Heading 6',
+theme_colorpicker_title : '&#1604;&#1608;&#1606; &#1575;&#1604;&#1606;&#1589;',
+theme_colorpicker_apply : 'Apply',
+theme_forecolor_desc : '&#1604;&#1608;&#1606; &#1575;&#1604;&#1606;&#1589;',
+theme_backcolor_desc : 'Select background color',
+theme_charmap_title : '&#1573;&#1583;&#1585;&#1575;&#1580;  &#1585;&#1605;&#1586;..&#1616;',
+theme_charmap_desc : '&#1573;&#1583;&#1585;&#1575;&#1580;  &#1585;&#1605;&#1586;..&#1616;',
+theme_visualaid_desc : 'Toggle guidelines/invisible elements',
+insert_anchor_title : 'Insert/edit anchor',
+insert_anchor_name : 'Anchor name',
+theme_anchor_desc : 'Insert/edit anchor',
+theme_insert_link_titlefield : 'Title',
+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',
+theme_path : 'Path',
+cut_desc : 'Cut',
+copy_desc : 'Copy',
+paste_desc : 'Paste',
+link_list : 'Link list',
+image_list : 'Image list',
+browse : 'Browse',
+image_props_desc : 'Image properties',
+newdocument_desc : 'New document',
+newdocument : 'Are you sure you want clear all contents?'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/ca.js
@@ -1,1 +1,65 @@
+// CA lang variables by Marc Bria
 
+tinyMCE.addToLang('',{
+theme_style_select : 'Estils',
+theme_code_desc : 'Editar codi HTML',
+theme_code_title : 'Editor codi HTML',



+theme_hr_desc : 'Insertar un separador horitzontal',
+theme_removeformat_desc : 'Eliminar format',

+insert_image_border : 'Marc',
+insert_image_dimensions : 'Dimensions',
+insert_image_vspace : 'Espai vertical',
+insert_image_hspace : 'Espai horizontal',
+insert_image_align : 'Alineament',
+insert_image_align_default : 'Per defecte',

+insert_image_align_top : 'Superior',
+insert_image_align_middle : 'Centre',
+insert_image_align_bottom : 'Inferior',
+insert_image_align_texttop : 'Alinear text amunt',
+insert_image_align_absmiddle : 'Centrat horitzontal',
+insert_image_align_absbottom : 'Centrat a baix',
+insert_image_align_left : 'Esquerra',
+insert_image_align_right : 'Dreta',
+insert_image_delta_height : 10,
+theme_font_size : '-- Mida font --',
+theme_fontdefault : '-- Font family --',
+theme_block : '-- Format --',
+theme_paragraph : 'Paragraph',
+theme_div : 'Div',
+theme_address : 'Address',
+theme_pre : 'Preformatejat',






+theme_colorpicker_title : 'Selecciona el color',
+theme_colorpicker_apply : 'Apply',
+theme_forecolor_desc : 'Selecciona color frontal',
+theme_backcolor_desc : 'Selecciona color de fons',









+cut_desc : 'Retallar',
+copy_desc : 'Copiar',
+paste_desc : 'Enganxar',


+browse : 'Explorar',
+image_props_desc : 'Image properties',
+newdocument_desc : 'New document',
+newdocument : 'Are you sure you want clear all contents?'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/cs.js
@@ -1,1 +1,71 @@
+/**
+ * Czech lang variables 
+ * encoding: utf-8
+ *  
+ * $Id$ 
+ */  
 
+
+tinyMCE.addToLang('',{
+theme_style_select : 'Styly',
+theme_code_desc : 'Zobrazit HTML',
+theme_code_title : 'Editace HTML',
+theme_code_wordwrap : 'Bez dělení slov',
+theme_sub_desc : 'Dolní index',
+theme_sup_desc : 'Horní index',
+theme_hr_desc : 'Vložit vodorovný oddělovač',
+theme_removeformat_desc : 'Zrušit formátování',
+theme_custom1_desc : 'Libovolný popisek',
+insert_image_border : 'Rámeček',
+insert_image_dimensions : 'Rozměry',
+insert_image_vspace : 'Vertikální okraj',
+insert_image_hspace : 'Horizontální okraj',
+insert_image_align : 'Zarovnání',
+insert_image_align_default : 'Výchozí',
+insert_image_align_baseline : 'Na účaří',
+insert_image_align_top : 'Nahoru',
+insert_image_align_middle : 'Na střed',
+insert_image_align_bottom : 'Dolů',
+insert_image_align_texttop : 'Nejvyšší bod textu',
+insert_image_align_absmiddle : 'Střed řádku',
+insert_image_align_absbottom : 'Spodek řádku',
+insert_image_align_left : 'Vlevo',
+insert_image_align_right : 'Vpravo',
+theme_font_size : '-- Velikost textu --',
+theme_fontdefault : '-- Písmo --',
+theme_block : '-- Formát --',
+theme_paragraph : 'Odstavec',
+theme_div : 'Div',
+theme_address : 'Adresa',
+theme_pre : 'Předformát',
+theme_h1 : 'Nadpis 1',
+theme_h2 : 'Nadpis 2',
+theme_h3 : 'Nadpis 3',
+theme_h4 : 'Nadpis 4',
+theme_h5 : 'Nadpis 5',
+theme_h6 : 'Nadpis 6',
+theme_colorpicker_title : 'Výběr barvy',
+theme_colorpicker_apply : 'Vybrat',
+theme_forecolor_desc : 'Barva popředí',
+theme_backcolor_desc : 'Barva pozadí',
+theme_charmap_title : 'Výběr znaku',
+theme_charmap_desc : 'Vložit znak',
+theme_visualaid_desc : 'Zapnout značky/neviditelné prvky',
+insert_anchor_title : 'Vložení/editace záložky',
+insert_anchor_name : 'Název',
+theme_anchor_desc : 'Vložit/editovat záložku',
+theme_insert_link_titlefield : 'Název',
+theme_clipboard_msg : 'Funkce Kopírovat/vyjmout/vložit nejsou použitelné v Mozille a Firefoxu.\nChcete více informací o tomto problému?',
+theme_path : 'Cesta',
+cut_desc : 'Vyjmout',
+copy_desc : 'Kopírovat',
+paste_desc : 'Vložit',
+link_list : 'Seznam',
+image_list : 'Seznam',
+browse : 'Procházet',
+image_props_desc : 'Vlastnosti obrázku',
+newdocument_desc : 'Nový dokument',
+newdocument : 'Jste si opravdu jistý(á), že chcete vymazat veškerý obsah?'
+});
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/da.js
@@ -1,1 +1,77 @@
+// DK lang variables contributed by Jan Moelgaard
 
+tinyMCE.addToLang('',{
+theme_style_select : 'Stilelementer',
+theme_code_desc : 'Rediger html-kode',
+theme_code_title : 'HTML Kodeeditor',
+theme_code_wordwrap : 'Ombrydning',
+theme_sub_desc : 'S&#230;nket skrift',
+theme_sup_desc : 'H&#230;vet skrift',
+theme_hr_desc : 'Inds&#230;t horisontal linje',
+theme_removeformat_desc : 'Fjern formatering',
+theme_custom1_desc : 'Inds&#230;t din egen beskrivelse her',
+insert_image_border : 'Kant',
+insert_image_dimensions : 'Dimensioner',
+insert_image_vspace : 'Flyt til venstre',
+insert_image_hspace : 'Flyt til h&#248;jre',
+insert_image_align : 'Justering',
+insert_image_align_default : 'Standard',
+insert_image_align_baseline : 'Bundlinje',
+insert_image_align_top : 'Top',
+insert_image_align_middle : 'Midt i',
+insert_image_align_bottom : 'I bunden',
+insert_image_align_texttop : 'I toppen af teksten',
+insert_image_align_absmiddle : 'Absolut midte',
+insert_image_align_absbottom : 'Absolut bund',
+insert_image_align_left : 'Venstre',
+insert_image_align_right : 'H&#248;jre',
+theme_font_size : '-- Font st&#248;rrelse --',
+theme_fontdefault : '-- Font gruppe --',
+theme_block : '-- Format --',
+theme_paragraph : 'Afsnit',
+theme_div : 'Div',
+theme_address : 'Addresse',
+theme_pre : 'Pr&#230;formateret',
+theme_h1 : 'Overskrift 1',
+theme_h2 : 'Overskrift 2',
+theme_h3 : 'Overskrift 3',
+theme_h4 : 'Overskrift 4',
+theme_h5 : 'Overskrift 5',
+theme_h6 : 'Overskrift 6',
+theme_colorpicker_title : 'V&#230;lg en farve',
+theme_colorpicker_apply : 'Anvend',
+theme_forecolor_desc : 'V&#230;lg forgrundsfarve',
+theme_backcolor_desc : 'V&#230;lg baggrundsfarve',
+theme_charmap_title : 'V&#230;lg specialkarakter',
+theme_charmap_desc : 'Inds&#230;t specialkarakter',
+theme_visualaid_desc : 'Sl&#229; linjer/usynlige elementer til og fra',
+insert_anchor_title : 'Inds&#230;t/rediger bogm&#230;rke',
+insert_anchor_name : 'Bogm&#230;rkets navn',
+theme_anchor_desc : 'Inds&#230;t/rediger bogm&#230;rke',
+theme_insert_link_titlefield : 'Title',
+theme_clipboard_msg : 'Kopier/Klip/Inds&#230;t virker ikke i Mozilla og Firefox.\nVil du vide mere om dette?',
+theme_path : 'Sti',
+cut_desc : 'Klip',
+copy_desc : 'Kopier',
+paste_desc : 'Inds&#230;t',
+link_list : 'Linkliste',
+image_list : 'Billedliste',
+browse : 'Gennemse',
+image_props_desc : 'Billedegenskaber',
+newdocument_desc : 'Nyt dokument',
+class_name : 'Klasse',
+newdocument : 'Er du sikker p&#229;, at du vil slette alt?',
+about_title : 'About TinyMCE',
+about : 'Om',
+license : 'Licens',
+plugins : 'Plugins',
+plugin : 'Plugin',
+author : 'Forfatter',
+version : 'Version',
+loaded_plugins : 'Indl&#230;ste plugins',
+help : 'Hj&#230;lp',
+not_set : '-- Ikke defineret --',
+close : 'Luk',
+toolbar_focus : 'Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/de.js
@@ -1,1 +1,77 @@
+// DE lang variables
 
+tinyMCE.addToLang('',{
+theme_style_select : '-- CSS-Stile --',
+theme_code_desc : 'HTML-Quelltext editieren',
+theme_code_title : 'HTML-Quelltexteditor',
+theme_code_wordwrap : 'Zeilenumbruch',
+theme_sub_desc : 'Tiefergestellt',
+theme_sup_desc : 'Hochgestellt',
+theme_hr_desc : 'Horizontalen Balken einf&uuml;gen',
+theme_removeformat_desc : 'Formatierung l&ouml;schen',
+theme_custom1_desc : 'Eigene Beschreibung',
+insert_image_border : 'Rahmen',
+insert_image_dimensions : 'Gr&ouml;&szlig;e',
+insert_image_vspace : 'Vertikaler Raum',
+insert_image_hspace : 'Horizontaler Raum',
+insert_image_align : 'Ausrichtung',
+insert_image_align_default : '-- Nicht festgelegt --',
+insert_image_align_baseline : 'Grundlinie',
+insert_image_align_top : 'Oben',
+insert_image_align_middle : 'Mitte',
+insert_image_align_bottom : 'Unten',
+insert_image_align_texttop : 'Mit dem Text',
+insert_image_align_absmiddle : 'Absolute mittig',
+insert_image_align_absbottom : 'Absolut unten',
+insert_image_align_left : 'Links',
+insert_image_align_right : 'Rechts',
+theme_font_size : '-- Schriftgr&ouml;&szlig;e --',
+theme_fontdefault : '-- Schriftfamilie --',
+theme_block : '-- Format --',
+theme_paragraph : 'Absatz',
+theme_div : 'Block',
+theme_address : 'Adresse',
+theme_pre : 'Vorformatiert',
+theme_h1 : '&Uuml;berschrift 1',
+theme_h2 : '&Uuml;berschrift 2',
+theme_h3 : '&Uuml;berschrift 3',
+theme_h4 : '&Uuml;berschrift 4',
+theme_h5 : '&Uuml;berschrift 5',
+theme_h6 : '&Uuml;berschrift 6',
+theme_colorpicker_title : 'Farbe ausw&auml;hlen',
+theme_colorpicker_apply : 'Farbe festlegen',
+theme_forecolor_desc : 'Schriftfarbe ausw&auml;hlen',
+theme_backcolor_desc : 'Hintergrundfarbe ausw&auml;hlen',
+theme_charmap_title : 'Sonderzeichen einf&uuml;gen',
+theme_charmap_desc : 'Sonderzeichen einf&uuml;gen',
+theme_visualaid_desc : 'Hilfslinen/Unsichtbare Elemente anzeigen',
+insert_anchor_title : 'Anker einf&uuml;gen/bearbeiten',
+insert_anchor_name : 'Ankername',
+theme_anchor_desc : 'Anker einf&uuml;gen/bearbeiten',
+theme_insert_link_titlefield : 'Titel',
+theme_clipboard_msg : 'Zwischenablagefunktionen sind in Mozilla und Firefox nicht verf&uuml;gbar.\nW&uuml;nschen Sie hierzu weitere Informationen?',
+theme_path : 'Pfad',
+cut_desc : 'Ausschneiden',
+copy_desc : 'Kopieren',
+paste_desc : 'Einf&uuml;gen',
+link_list : 'Hyperlink-Liste',
+image_list : 'Bild-Liste',
+browse : 'Durchsuchen',
+image_props_desc : 'Bildeigenschaften',
+newdocument_desc : 'Neues Dokument',
+class_name : 'CSS-Klasse',
+newdocument : 'Sind Sie sicher, dass Sie alle Inhalte l&ouml;schen wollen?',
+about_title : '&Uuml;ber TinyMCE',
+about : '&Uuml;ber',
+license : 'Lizenz',
+plugins : 'Plugins',
+plugin : 'Plugin',
+author : 'Autor',
+version : 'Version',
+loaded_plugins : 'Geladene Plugins',
+help : 'Hilfe',
+not_set : '-- Nicht festgelegt --',
+close : 'Schlie&szlig;en',
+toolbar_focus : 'Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/el.js
@@ -1,1 +1,65 @@
+// Greek lang variables by Jacaranda Bill
 
+tinyMCE.addToLang('',{



+theme_code_wordwrap : 'Word wrap',




















+theme_font_size : '-- Font size --',
+theme_fontdefault : '-- Font family --',
+theme_block : '-- Format --',

+theme_div : 'Div',

+theme_pre : 'Preformatted',









+theme_backcolor_desc : 'Select background color',







+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',
+theme_path : 'Path',
+cut_desc : 'Cut',
+copy_desc : 'Copy',
+paste_desc : 'Paste',
+link_list : 'Link list',
+image_list : 'Image list',
+browse : 'Browse',
+image_props_desc : 'Image properties',
+newdocument_desc : 'New document',

+newdocument : 'Are you sure you want clear all contents?'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js
@@ -1,1 +1,62 @@
-
+tinyMCE.addI18n('en.advanced',{
+style_select:"Styles",
+font_size:"Font size",
+fontdefault:"Font family",
+block:"Format",
+paragraph:"Paragraph",
+div:"Div",
+address:"Address",
+pre:"Preformatted",
+h1:"Heading 1",
+h2:"Heading 2",
+h3:"Heading 3",
+h4:"Heading 4",
+h5:"Heading 5",
+h6:"Heading 6",
+blockquote:"Blockquote",
+code:"Code",
+samp:"Code sample",
+dt:"Definition term ",
+dd:"Definition description",
+bold_desc:"Bold (Ctrl+B)",
+italic_desc:"Italic (Ctrl+I)",
+underline_desc:"Underline (Ctrl+U)",
+striketrough_desc:"Strikethrough",
+justifyleft_desc:"Align left",
+justifycenter_desc:"Align center",
+justifyright_desc:"Align right",
+justifyfull_desc:"Align full",
+bullist_desc:"Unordered list",
+numlist_desc:"Ordered list",
+outdent_desc:"Outdent",
+indent_desc:"Indent",
+undo_desc:"Undo (Ctrl+Z)",
+redo_desc:"Redo (Ctrl+Y)",
+link_desc:"Insert/edit link",
+unlink_desc:"Unlink",
+image_desc:"Insert/edit image",
+cleanup_desc:"Cleanup messy code",
+code_desc:"Edit HTML Source",
+sub_desc:"Subscript",
+sup_desc:"Superscript",
+hr_desc:"Insert horizontal ruler",
+removeformat_desc:"Remove formatting",
+custom1_desc:"Your custom description here",
+forecolor_desc:"Select text color",
+backcolor_desc:"Select background color",
+charmap_desc:"Insert custom character",
+visualaid_desc:"Toggle guidelines/invisible elements",
+anchor_desc:"Insert/edit anchor",
+cut_desc:"Cut",
+copy_desc:"Copy",
+paste_desc:"Paste",
+image_props_desc:"Image properties",
+newdocument_desc:"New document",
+help_desc:"Help",
+blockquote_desc:"Blockquote",
+clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\r\nDo you want more information about this issue?",
+path:"Path",
+newdocument:"Are you sure you want clear all contents?",
+toolbar_focus:"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",
+more_colors:"More colors"
+});

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js
@@ -1,1 +1,51 @@
-
+tinyMCE.addI18n('en.advanced_dlg',{
+about_title:"About TinyMCE",
+about_general:"About",
+about_help:"Help",
+about_license:"License",
+about_plugins:"Plugins",
+about_plugin:"Plugin",
+about_author:"Author",
+about_version:"Version",
+about_loaded:"Loaded plugins",
+anchor_title:"Insert/edit anchor",
+anchor_name:"Anchor name",
+code_title:"HTML Source Editor",
+code_wordwrap:"Word wrap",
+colorpicker_title:"Select a color",
+colorpicker_picker_tab:"Picker",
+colorpicker_picker_title:"Color picker",
+colorpicker_palette_tab:"Palette",
+colorpicker_palette_title:"Palette colors",
+colorpicker_named_tab:"Named",
+colorpicker_named_title:"Named colors",
+colorpicker_color:"Color:",
+colorpicker_name:"Name:",
+charmap_title:"Select custom character",
+image_title:"Insert/edit image",
+image_src:"Image URL",
+image_alt:"Image description",
+image_list:"Image list",
+image_border:"Border",
+image_dimensions:"Dimensions",
+image_vspace:"Vertical space",
+image_hspace:"Horizontal space",
+image_align:"Alignment",
+image_align_baseline:"Baseline",
+image_align_top:"Top",
+image_align_middle:"Middle",
+image_align_bottom:"Bottom",
+image_align_texttop:"Text top",
+image_align_textbottom:"Text bottom",
+image_align_left:"Left",
+image_align_right:"Right",
+link_title:"Insert/edit link",
+link_url:"Link URL",
+link_target:"Target",
+link_target_same:"Open link in the same window",
+link_target_blank:"Open link in a new window",
+link_titlefield:"Title",
+link_is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",
+link_is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",
+link_list:"Link list"
+});

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/es.js
@@ -1,1 +1,65 @@
+// ES lang variables by Alvaro Velasco
 
+tinyMCE.addToLang('',{
+theme_style_select : 'Estilos',
+theme_code_desc : 'Editar codigo HTML',
+theme_code_title : 'Editor codigo HTML',
+theme_code_wordwrap : 'Word wrap',
+theme_sub_desc : 'Subindice',
+theme_sup_desc : 'Superindice',
+theme_hr_desc : 'Insertar un separador horizontal',
+theme_removeformat_desc : 'Quitar formato',
+theme_custom1_desc : 'Tu descricion',
+insert_image_border : 'Borde',
+insert_image_dimensions : 'Dimensiones',
+insert_image_vspace : 'Espacio vertical',
+insert_image_hspace : 'Espacio horizontal',
+insert_image_align : 'Alineamiento',
+insert_image_align_default : 'Por defecto',
+insert_image_align_baseline : 'Baseline',
+insert_image_align_top : 'Superior',
+insert_image_align_middle : 'Centro',
+insert_image_align_bottom : 'Inferior',
+insert_image_align_texttop : 'Alinear texto arriba',
+insert_image_align_absmiddle : 'Centrado horizontal',
+insert_image_align_absbottom : 'Centrado abajo',
+insert_image_align_left : 'Izquierda',
+insert_image_align_right : 'Derecha',
+insert_image_delta_height : 10,
+theme_font_size : '-- Font size --',
+theme_fontdefault : '-- Font family --',
+theme_block : '-- Format --',
+theme_paragraph : 'Paragraph',
+theme_div : 'Div',
+theme_address : 'Address',
+theme_pre : 'Preformatted',
+theme_h1 : 'Heading 1',
+theme_h2 : 'Heading 2',
+theme_h3 : 'Heading 3',
+theme_h4 : 'Heading 4',
+theme_h5 : 'Heading 5',
+theme_h6 : 'Heading 6',
+theme_colorpicker_title : 'Select a color',
+theme_colorpicker_apply : 'Apply',
+theme_forecolor_desc : 'Select forecolor',
+theme_backcolor_desc : 'Select background color',
+theme_charmap_title : 'Select custom character',
+theme_charmap_desc : 'Insert custom character',
+theme_visualaid_desc : 'Toggle guidelines/invisible elements',
+insert_anchor_title : 'Insert/edit anchor',
+insert_anchor_name : 'Anchor name',
+theme_anchor_desc : 'Insert/edit anchor',
+theme_insert_link_titlefield : 'Title',
+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',
+theme_path : 'Path',
+cut_desc : 'Cut',
+copy_desc : 'Copy',
+paste_desc : 'Paste',
+link_list : 'Link list',
+image_list : 'Image list',
+browse : 'Browse',
+image_props_desc : 'Image properties',
+newdocument_desc : 'New document',
+newdocument : 'Are you sure you want clear all contents?'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/fa.js
@@ -1,1 +1,66 @@
+// IR lang variables
+// Persian (Farsi) language pack (for IRAN)
+// By: Morteza Zafari
+// Lost@LostLord.com
+// http://www.LostLord.com
 
+tinyMCE.addToLang('',{
+dir : 'rtl',
+theme_style_select : '????',
+theme_code_desc : '?????? ????',
+theme_code_title : 'HTML ???????? ????',
+theme_code_wordwrap : '?? ???',
+theme_sub_desc : '??? ????',
+theme_sup_desc : '???? ????',
+theme_hr_desc : '??? ?? ????',
+theme_removeformat_desc : '??? ?? ??? ???? ????',
+theme_custom1_desc : 'Your custom description here',
+insert_image_border : '?????',
+insert_image_dimensions : '?????',
+insert_image_vspace : '????? ?????',
+insert_image_hspace : '????? ????',
+insert_image_align : '??? ????????',
+insert_image_align_default : '??? ???',
+insert_image_align_baseline : '?? ????',
+insert_image_align_top : '????',
+insert_image_align_middle : '???',
+insert_image_align_bottom : '?????',
+insert_image_align_texttop : '????? ???',
+insert_image_align_absmiddle : '??? ????',
+insert_image_align_absbottom : '????? ????',
+insert_image_align_left : '??',
+insert_image_align_right : '????',
+theme_font_size : '-- Font size --',
+theme_fontdefault : '-- Font family --',
+theme_block : '-- Format --',
+theme_paragraph : '????????',
+theme_div : 'Div',
+theme_address : '????',
+theme_pre : '?? ??? ????? ???',
+theme_h1 : '???? 1',
+theme_h2 : '???? 2',
+theme_h3 : '???? 3',
+theme_h4 : '???? 4',
+theme_h5 : '???? 5',
+theme_h6 : '???? 6',
+theme_colorpicker_title : '??? ?? ?????? ????',
+theme_colorpicker_apply : '?????',
+theme_forecolor_desc : '?????? ??? ???',
+theme_backcolor_desc : '?????? ??? ?????',
+theme_charmap_title : '?????? ??????? ????',
+theme_charmap_desc : '??? ??????? ????',
+theme_visualaid_desc : '????? ???? ???? ? ????? ??????',
+insert_anchor_title : '??? ? ?????? Anchor',
+insert_anchor_name : '??? Anchor',
+theme_anchor_desc : '??? ? ?????? Anchor',
+theme_insert_link_titlefield : '?????',
+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',
+theme_path : '????',
+cut_desc : 'Cut',
+copy_desc : 'Copy',
+paste_desc : 'Paste',
+image_props_desc : 'Image properties',
+newdocument_desc : 'New document',
+newdocument : 'Are you sure you want clear all contents?'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/fi.js
@@ -1,1 +1,64 @@
+// FI lang variables by Urho Konttori from Absolutions
 
+tinyMCE.addToLang('',{
+theme_style_select : 'Tyylit',
+theme_code_desc : 'Muokkaa HTML l&auml;hdekoodia',
+theme_code_title : 'HTML L&auml;hdekoodin muokkaus',
+theme_code_wordwrap : 'Word wrap',
+theme_sub_desc : 'Alam&auml;&auml;re',
+theme_sup_desc : 'Yl&auml;m&auml;&auml;re',
+theme_hr_desc : 'Lis&auml;&auml; vaakaviiva',
+theme_removeformat_desc : 'Poista muotoilu',
+theme_custom1_desc : 'Kirjoita oma selityksesi t&auml;h&auml;n',
+insert_image_border : 'Reuna',
+insert_image_dimensions : 'Mitat',
+insert_image_vspace : 'Pystyv&auml;li',
+insert_image_hspace : 'Vaakav&auml;li',
+insert_image_align : 'Asettelu',
+insert_image_align_default : 'Oletus',
+insert_image_align_baseline : 'Perustasoon',
+insert_image_align_top : 'Yl&auml;laitaan',
+insert_image_align_middle : 'Keskelle',
+insert_image_align_bottom : 'Alalaitaan',
+insert_image_align_texttop : 'Tekstin yl&auml;laitaan',
+insert_image_align_absmiddle : 'Absoluuttisen keskelle',
+insert_image_align_absbottom : 'Absoluuttisen alas',
+insert_image_align_left : 'Vasemmalle',
+insert_image_align_right : 'Oikealle',
+theme_font_size : '-- Font size --',
+theme_fontdefault : '-- Font family --',
+theme_block : '-- Format --',
+theme_paragraph : 'Kappale',
+theme_div : 'Div',
+theme_address : 'Osoite',
+theme_pre : 'Etuk&auml;teen muotoiltu',
+theme_h1 : 'Otsikko 1',
+theme_h2 : 'Otsikko 2',
+theme_h3 : 'Otsikko 3',
+theme_h4 : 'Otsikko 4',
+theme_h5 : 'Otsikko 5',
+theme_h6 : 'Otsikko 6',
+theme_colorpicker_title : 'Valitse v&auml;ri',
+theme_colorpicker_apply : 'Aseta v&auml;ri',
+theme_forecolor_desc : 'Valitse etuv&auml;ri',
+theme_backcolor_desc : 'Select background color',
+theme_charmap_title : 'Select custom character',
+theme_charmap_desc : 'Insert custom character',
+theme_visualaid_desc : 'Toggle guidelines/invisible elements',
+insert_anchor_title : 'Insert/edit anchor',
+insert_anchor_name : 'Anchor name',
+theme_anchor_desc : 'Insert/edit anchor',
+theme_insert_link_titlefield : 'Title',
+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',
+theme_path : 'Path',
+cut_desc : 'Cut',
+copy_desc : 'Copy',
+paste_desc : 'Paste',
+link_list : 'Link list',
+image_list : 'Image list',
+browse : 'Browse',
+image_props_desc : 'Image properties',
+newdocument_desc : 'New document',
+newdocument : 'Are you sure you want clear all contents?'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/fr.js
@@ -1,1 +1,66 @@
+// Canadian French lang variables by Virtuelcom
+// Modify by Laurent Dran 13-02-2006
 
+tinyMCE.addToLang('',{
+theme_style_select : 'Styles',
+theme_code_desc : 'Modifier le code source HTML',
+theme_code_title : '&Eacute;diteur de code source HTML',
+theme_code_wordwrap : 'Word wrap',
+theme_sub_desc : 'Souscrit',
+theme_sup_desc : 'Indice sup&eacute;rieur',
+theme_hr_desc : 'Ins&eacute;rer un s&eacute;parateur horizontal',
+theme_removeformat_desc : 'Supprimer le formattage',
+theme_custom1_desc : 'Votre description personnalis&eacute;e ici',
+insert_image_border : 'Bordure',
+insert_image_dimensions : 'Dimensions',
+insert_image_vspace : 'VSpace',
+insert_image_hspace : 'HSpace',
+insert_image_align : 'Alignement',
+insert_image_align_default : 'D&eacute;faut',
+insert_image_align_baseline : 'Baseline',
+insert_image_align_top : 'Haut',
+insert_image_align_middle : 'Milieu',
+insert_image_align_bottom : 'Bas',
+insert_image_align_texttop : 'TextTop',
+insert_image_align_absmiddle : 'Milieu absolu',
+insert_image_align_absbottom : 'Bas absolu',
+insert_image_align_left : 'Gauche',
+insert_image_align_right : 'Droit',
+theme_font_size : '-- Font size --',
+theme_fontdefault : '-- Font family --',
+theme_block : '-- Format --',
+theme_paragraph : 'Paragraphe',
+theme_div : 'Div',
+theme_address : 'Addresse',
+theme_pre : 'Pr&eacute;formatt&eacute;',
+theme_h1 : 'Ent&ecirc;te 1',
+theme_h2 : 'Ent&ecirc;te 2',
+theme_h3 : 'Ent&ecirc;te 3',
+theme_h4 : 'Ent&ecirc;te 4',
+theme_h5 : 'Ent&ecirc;te 5',
+theme_h6 : 'Ent&ecirc;te 6',
+theme_colorpicker_title : 'Choisir une couleur',
+theme_colorpicker_apply : 'Appliquer',
+theme_forecolor_desc : 'Choisir la couleur d\'avant plan',
+theme_backcolor_desc : 'Choisir la couleur de fond',
+theme_charmap_title : 'S&eacute;lectionner un charact&egrave;re sp&eacute;cial',
+theme_charmap_desc : 'Ins&eacute;rer un charact&egrave;re sp&eacute;cial',
+theme_visualaid_desc : 'Active/D&eacute;sactive les lignes guides et les &eacute;l&eacute;ments invisibles',
+insert_anchor_title : 'Ins&eacute;rer/Modifier une ancre',
+insert_anchor_name : 'Nom de l\'ancre',
+theme_anchor_desc : 'Ins&eacute;rer/Modifier une ancre',
+theme_insert_link_titlefield : 'Titre',

+theme_path : 'Chemin',
+cut_desc : 'Couper',
+copy_desc : 'Copier',
+paste_desc : 'Coller',
+link_list : 'Lien de la liste',
+image_list : 'Image de la liste',
+browse : 'Naviguer',
+image_props_desc : 'Image properties',
+newdocument_desc : 'New document',
+class_name : 'Classe CSS',
+newdocument : 'Are you sure you want clear all contents?'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/fr_ca.js
@@ -1,1 +1,65 @@
+// Canadian French lang variables by Virtuelcom   last modification: 2005-06-15
 
+tinyMCE.addToLang('',{
+theme_style_select : '-- Styles --',
+theme_code_desc : 'Modifier le code source HTML',

+theme_code_wordwrap : 'Word wrap',
+theme_sub_desc : 'Souscrit',


+theme_removeformat_desc : 'Supprimer le formattage',

+insert_image_border : 'Bordure',
+insert_image_dimensions : 'Dimensions',
+insert_image_vspace : 'VSpace',
+insert_image_hspace : 'HSpace',
+insert_image_align : 'Alignement',

+insert_image_align_baseline : 'Baseline',
+insert_image_align_top : 'Haut',
+insert_image_align_middle : 'Milieu',
+insert_image_align_bottom : 'Bas',
+insert_image_align_texttop : 'TextTop',
+insert_image_align_absmiddle : 'Milieu absolu',
+insert_image_align_absbottom : 'Bas absolu',
+insert_image_align_left : 'Gauche',
+insert_image_align_right : 'Droit',
+theme_font_size : 'Taille',
+theme_fontdefault : '-- Police --',
+theme_block : '-- Format --',
+theme_paragraph : 'Paragraphe',
+theme_div : 'Div',
+theme_address : 'Addresse',







+theme_colorpicker_title : 'Choisir une couleur',
+theme_colorpicker_apply : 'Appliquer',
+theme_forecolor_desc : 'Choisir la couleur d\'avant plan',





+insert_anchor_name : 'Nom de l\'ancre',

+theme_insert_link_titlefield : 'Titre',

+theme_path : 'Chemin',
+cut_desc : 'Couper',
+copy_desc : 'Copier',
+paste_desc : 'Coller',
+link_list : 'Liste de liens',
+image_list : 'Liste d\'images',


+newdocument_desc : 'Nouveau Document',
+class_name : 'Classe',
+newdocument : 'Are you sure you want clear all contents?'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/he.js
@@ -1,1 +1,76 @@
+// HE lang variables by Liron Newman, http://eesh.net
 
+tinyMCE.addToLang('',{







































































+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/hu.js
@@ -1,1 +1,76 @@
+// HU lang variables
 
+tinyMCE.addToLang('',{









+insert_image_border : 'Keret',





+insert_image_align_baseline : 'Baseline',


+insert_image_align_bottom : 'Alul',



+insert_image_align_left : 'Balra',
+insert_image_align_right : 'Jobbra',




+theme_div : 'Div',









+theme_colorpicker_apply : 'Alkalmaz',














+link_list : 'Link lista',








+license : 'Licensz',








+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/it.js
@@ -1,1 +1,65 @@
+// Variabili di lingua IT - fabrix.xm@lombardiacom.it
 
+tinyMCE.addToLang('',{
+theme_style_select : 'Stili',
+theme_code_desc : 'Edita il sorgente HTML',
+theme_code_title : 'Editor Sorgente HTML',
+theme_code_wordwrap : 'Word wrap',
+theme_sub_desc : 'Pedice',
+theme_sup_desc : 'Apice',
+theme_hr_desc : 'Inserisce linea orizzontale',
+theme_removeformat_desc : 'Rimuovi formattazione',
+theme_custom1_desc : 'Scrivi qui la tua descrizione personalizzata',
+insert_image_border : 'Bordo',
+insert_image_dimensions : 'Dimensioni',
+insert_image_vspace : 'Spazio verticale',
+insert_image_hspace : 'Spazio orizzontale',
+insert_image_align : 'Allineamento',
+insert_image_align_default : 'Default',
+insert_image_align_baseline : 'Baseline',
+insert_image_align_top : 'Superiore',
+insert_image_align_middle : 'Centrale',
+insert_image_align_bottom : 'Inferiore',
+insert_image_align_texttop : 'TextTop',
+insert_image_align_absmiddle : 'Centro assoluto',
+insert_image_align_absbottom : 'Inferiore assoluto',
+insert_image_align_left : 'Sinistra',
+insert_image_align_right : 'Destra',
+theme_font_size : '-- Font size --',
+theme_fontdefault : '-- Font family --',
+theme_block : '-- Format --',
+theme_paragraph : 'Paragrafo',
+theme_div : 'Div',
+theme_address : 'Indirizzo',
+theme_pre : 'Preformattato',
+theme_h1 : 'Intestazione 1',
+theme_h2 : 'Intestazione 2',
+theme_h3 : 'Intestazione 3',
+theme_h4 : 'Intestazione 4',
+theme_h5 : 'Intestazione 5',
+theme_h6 : 'Intestazione 6',
+theme_colorpicker_title : 'Seleziona un colore',
+theme_colorpicker_apply : 'Appplica',
+theme_forecolor_desc : 'Seleziona il colore',
+theme_backcolor_desc : 'Select background color',
+theme_charmap_title : 'Seleziona un carattere custom',
+theme_charmap_desc : 'Inserisci un carattere custom',
+theme_visualaid_desc : 'Mostra/nascondi linee guida e elementi invisibili',
+insert_anchor_title : 'Inserisci/modifica &agrave;ncora',
+insert_anchor_name : 'Nome &agrave;ncora',
+theme_anchor_desc : 'Inserisci/modifica &agrave;ncora',
+theme_insert_link_titlefield : 'Titolo',
+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',
+theme_path : 'Path',
+cut_desc : 'Cut',
+copy_desc : 'Copy',
+paste_desc : 'Paste',
+link_list : 'Link list',
+image_list : 'Image list',
+browse : 'Browse',
+image_props_desc : 'Image properties',
+newdocument_desc : 'New document',
+class_name : 'Classe', 
+newdocument : 'Are you sure you want clear all contents?'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/ja.js
@@ -1,1 +1,63 @@
+// JP lang variables
 
+tinyMCE.addToLang('',{
+theme_style_select : '$B%9%?%$%k(B',
+theme_paragraph : '$BJ8L.(B',
+theme_address : '$B%"%I%l%9(B',
+theme_pre : '$B@07A:Q$_(B',
+theme_h1 : 'H1',
+theme_h2 : 'H2',
+theme_h3 : 'H3',
+theme_h4 : 'H4',
+theme_h5 : 'H5',
+theme_h6 : 'H6',
+theme_div : 'Div',
+insert_anchor_title : '$B%"%s%+!<$NA^F~(B/$BJT=8(B',
+insert_anchor_name : '$B%"%s%+!<$NL>A0(B',
+theme_anchor_desc : '$B%"%s%+!<$NA^F~(B/$BJT=8(B',
+theme_code_desc : 'HTML$B$ND>@\JT=8(B',
+theme_code_title : 'HTML$B$NJT=8(B',
+theme_code_wordwrap : 'Word wrap',
+theme_hr_desc : '$B?eJ?@~(B',
+theme_removeformat_desc : '$B@07A>pJs:o=|(B',
+theme_visualaid_desc : '$BJd=u>pJs$N;k3P2=(B($B%H%0%k(B)',
+theme_sub_desc : '$BE:;z2<(B',
+theme_sup_desc : '$BE:;z>e(B',
+theme_charmap_desc : '$BFC<lJ8;z$NF~NO(B',
+theme_charmap_title : '$BFC<lJ8;z$rA*Br$7$F2<$5$$(B',
+insert_image_dimensions : '$BBg$-$5;XDj(B',
+insert_image_border : '$B6-3&I}(B',
+insert_image_vspace : '$B=DM>Gr(B',
+insert_image_hspace : '$B2#M>Gr(B',
+insert_image_align : '$B0LCV9g$o$;(B',
+insert_image_align_default : '$B0EL[(B',
+insert_image_align_baseline : '$B4p=`@~(B',
+insert_image_align_top : '$B>e(B',
+insert_image_align_middle : '$BCf(B',
+insert_image_align_bottom : '$B2<(B',
+insert_image_align_texttop : '$BJ8;z$N>e(B',
+insert_image_align_absmiddle : '$B@dBP$KCf(B',
+insert_image_align_absbottom : '$B@dBP$K2<(B',
+insert_image_align_left : '$B:8(B',
+insert_image_align_right : '$B1&(B',
+theme_font_size : '-- Font size --',
+theme_fontdefault : '-- Font family --',
+theme_block : '-- Format --',
+theme_colorpicker_title : '$B?\'$N;XDj(B',
+theme_colorpicker_apply : '$BE,MQ(B',
+theme_forecolor_desc : '$BA07J?\'(B',
+theme_backcolor_desc : 'Select background color',
+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',
+theme_path : 'Path',
+cut_desc : 'Cut',
+copy_desc : 'Copy',
+paste_desc : 'Paste',
+link_list : 'Link list',
+image_list : 'Image list',
+browse : 'Browse',
+image_props_desc : 'Image properties',
+newdocument_desc : 'New document',
+class_name : '$B%/%i%9(B',
+newdocument : 'Are you sure you want clear all contents?'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/ko.js
@@ -1,1 +1,66 @@
+// KO lang variables
 
+tinyMCE.addToLang('',{



+theme_code_wordwrap : 'Word wrap',





+theme_custom1_desc : 'Your custom description here',






+insert_image_align_baseline : 'Baseline',
+insert_image_align_top : 'Top',
+insert_image_align_middle : 'Middle',
+insert_image_align_bottom : 'Bottom',
+insert_image_align_texttop : 'TextTop',
+insert_image_align_absmiddle : 'Absolute Middle',
+insert_image_align_absbottom : 'Absolute Bottom',
+insert_image_align_left : 'Left',
+insert_image_align_right : 'Right',
+theme_font_size : '-- Font size --',
+theme_fontdefault : '-- Font family --',
+theme_block : '-- Format --',

+theme_div : 'Div',











+theme_backcolor_desc : 'Select background color',
+theme_charmap_title : 'Select custom character',
+theme_charmap_desc : 'Insert custom character',
+theme_visualaid_desc : 'Toggle guidelines/invisible elements',




+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',
+theme_path : 'Path',
+cut_desc : 'Cut',
+copy_desc : 'Copy',
+paste_desc : 'Paste',
+link_list : 'Link list',
+image_list : 'Image list',
+browse : 'Browse',
+image_props_desc : 'Image properties',
+newdocument_desc : 'New document',

+newdocument : 'Are you sure you want clear all contents?'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/nl.js
@@ -1,1 +1,67 @@
+// NL lang variables
 
+tinyMCE.addToLang('',{
+theme_style_select : 'Stijlen',
+theme_code_desc : 'Toon/bewerk HTML broncode',
+theme_code_title : 'HTML broncode editor',
+theme_code_wordwrap : 'Word wrap',
+theme_sub_desc : 'Subscript',
+theme_sup_desc : 'Superscript',
+theme_hr_desc : 'Invoegen horizontale lijn',
+theme_removeformat_desc : 'Verwijder opmaak',
+theme_custom1_desc : 'Uw eigen omschrijving hier',
+insert_image_border : 'Omranding (pixels)',
+insert_image_dimensions : 'Afmetingen (Leeg: Originele afm.)',
+insert_image_vspace : 'Verticale marge (pixels)',
+insert_image_hspace : 'Horizontale marge (pixels)',
+insert_image_align : 'Uitlijning',
+insert_image_align_default : 'Standaard',
+insert_image_align_baseline : 'Basislijn',
+insert_image_align_top : 'Boven',
+insert_image_align_middle : 'Midden',
+insert_image_align_bottom : 'Onder',
+insert_image_align_texttop : 'TextTop',
+insert_image_align_absmiddle : 'Absoluut Midden',
+insert_image_align_absbottom : 'Absoluut Onder',
+insert_image_align_left : 'Links',
+insert_image_align_right : 'Rechts',
+insert_image_delta_height : 0,
+theme_font_size : '-- Font size --',
+theme_fontdefault : '-- Font family --',
+theme_block : '-- Format --',
+theme_paragraph : 'Paragraaf',
+theme_div : 'Div',
+theme_address : 'Adres',
+theme_pre : 'voorgeformatteerd',
+theme_h1 : 'Titel 1',
+theme_h2 : 'Titel 2',
+theme_h3 : 'Titel 3',
+theme_h4 : 'Titel 4',
+theme_h5 : 'Titel 5',
+theme_h6 : 'Titel 6',
+theme_colorpicker_title : 'Kies een kleur',
+theme_colorpicker_apply : 'Toepassen',
+theme_forecolor_desc : 'Selecteer voorgrondkleur',
+theme_backcolor_desc : 'Select background color',
+theme_charmap_title : 'Kies een bijzonder karakter',
+theme_charmap_desc : 'Voeg een bijzonder karakter in',
+theme_preview_desc : 'Toon de pagina in een nieuw venster',
+theme_visualaid_desc : 'Toon/verberg hulplijnen',
+insert_anchor_title : 'Anker toevoegen/wijzigen',
+insert_anchor_name : 'Anker naam',
+theme_anchor_desc : 'Anker toevoegen/wijzigen',
+theme_insert_link_titlefield : 'Titel',
+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',
+theme_path : 'Path',
+cut_desc : 'Cut',
+copy_desc : 'Copy',
+paste_desc : 'Paste',
+link_list : 'Link list',
+image_list : 'Image list',
+browse : 'Browse',
+image_props_desc : 'Image properties',
+newdocument_desc : 'New document',
+class_name : 'CSS-Stijl',
+newdocument : 'Are you sure you want clear all contents?'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/no.js
@@ -1,1 +1,78 @@
+// NO lang variables by Knut B. Jacobsen
 
+tinyMCE.addToLang('',{
+theme_style_select : 'Stiler',
+theme_code_desc : 'Redigere HTML Koden',
+theme_code_title : 'HTML Kildekode Redigering',
+theme_code_wordwrap : 'Word wrap',
+theme_sub_desc : 'Nedsenkt skrift',
+theme_sup_desc : 'Opph&oslash;d skrift',
+theme_hr_desc : 'Sett inn horisontal linje',
+theme_removeformat_desc : 'Fjern formatering',
+theme_custom1_desc : 'Din spesialfunksjons beskrivelse her',
+insert_image_border : 'Ramme',
+insert_image_dimensions : 'Dimensjoner',
+insert_image_vspace : 'Vertikalt tomrom',
+insert_image_hspace : 'Horisontalt tomrom',
+insert_image_align : 'Justering',
+insert_image_align_default : 'Intet',
+insert_image_align_baseline : 'Bunnlinjen',
+insert_image_align_top : 'Lengst opp',
+insert_image_align_middle : 'Midten',
+insert_image_align_bottom : 'Lengst ned',
+insert_image_align_texttop : 'Tekstens topp',
+insert_image_align_absmiddle : 'Absolutt midten',
+insert_image_align_absbottom : 'Absolutt lengst ned',
+insert_image_align_left : 'Venstre',
+insert_image_align_right : 'H&oslash;yre',
+insert_image_delta_width : 30,
+insert_image_delta_height : 10,
+theme_font_size : '-- Font st&oslash;rrelse --',
+theme_fontdefault : '-- Font familie --',
+theme_block : '-- Format --',
+theme_paragraph : 'Paragraf',
+theme_div : 'Div',
+theme_address : 'Addresse',
+theme_pre : 'Pre-formattert',
+theme_h1 : 'Overskrift 1',
+theme_h2 : 'Overskrift 2',
+theme_h3 : 'Overskrift 3',
+theme_h4 : 'Overskrift 4',
+theme_h5 : 'Overskrift 5',
+theme_h6 : 'Overskrift 6',
+theme_colorpicker_title : 'Velg en farge',
+theme_colorpicker_apply : 'Bruk',
+theme_forecolor_desc : 'Velg forgrunnsfarge',
+theme_backcolor_desc : 'Velg bakgrunnsfarge',
+theme_charmap_title : 'Velg spesialtegn',
+theme_charmap_desc : 'Sett inn spesialtegn',
+theme_visualaid_desc : 'Sl&aring; av/p&aring; usynlige elementer',
+insert_anchor_title : 'Opprette/endre anker',
+insert_anchor_name : 'Ankernavn',
+theme_anchor_desc : 'Opprett/endre anker',
+theme_insert_link_titlefield : 'Tittel',
+theme_clipboard_msg : 'Kopier/Klipp ut/Lim inn er ikke tilgjengelig i Mozilla/Firefox.\nVil du ha mere informasjon om dette?',
+theme_path : 'S&oslash;kevei',
+cut_desc : 'Klipp ut',
+copy_desc : 'Kopier',
+paste_desc : 'Lim inn',
+link_list : 'Link liste',
+image_list : 'Image liste',
+browse : 'Bla gjennom',
+image_props_desc : 'Image egenskaper',
+newdocument_desc : 'Nytt dokument',
+class_name : 'Stil',
+newdocument : 'Er du sikker p&aring; at du vil t&oslash;mme hele redigerings omr&aring;det?',
+about_title : 'Om TinyMCE',
+about : 'Om',
+license : 'Lisens',
+plugins : 'Innstikksprogrammer',
+plugin : 'Innstikksprogram',
+author : 'Utviklere',
+version : 'Versjon',
+loaded_plugins : 'Lastet innstikksprogram',
+help : 'Hjelp',
+not_set : '-- Ikke satt --',
+close : 'Stopp'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/pl.js
@@ -1,1 +1,65 @@
+// UK lang variables
 
+tinyMCE.addToLang('',{
+theme_style_select : 'Styl',
+theme_code_desc : 'Edytuj zródlo html',
+theme_code_title : 'Edytor zródla html',
+theme_code_wordwrap : 'Zwijanie wierszy',
+theme_sub_desc : 'Nadpisywanie',
+theme_sup_desc : 'Podpisywanie',
+theme_hr_desc : 'Wstaw pozioma linie',
+theme_removeformat_desc : 'Usun formatowanie',
+theme_custom1_desc : 'Wstaw wlasny opis',
+insert_image_border : 'Ramka',
+insert_image_dimensions : 'Wymiary',
+insert_image_vspace : 'VSpace',
+insert_image_hspace : 'HSpace',
+insert_image_align : 'Otaczanie',
+insert_image_align_default : 'Domyslne',
+insert_image_align_baseline : 'Glówne',
+insert_image_align_top : 'Górne',
+insert_image_align_middle : 'Srodkowe',
+insert_image_align_bottom : 'Dolne',
+insert_image_align_texttop : 'Tekst powyzej',
+insert_image_align_absmiddle : 'Absolutny srodek',
+insert_image_align_absbottom : 'Absolutny dól',
+insert_image_align_left : 'Lewe',
+insert_image_align_right : 'Prawe',
+theme_font_size : '-- Font size --',
+theme_fontdefault : '-- Font family --',
+theme_block : '-- Format --',
+theme_paragraph : '-- Paragraf --',
+theme_div : 'Div',
+theme_address : 'Adres',
+theme_pre : 'Preformatowanie',
+theme_h1 : 'Naglówek 1',
+theme_h2 : 'Naglówek 2',
+theme_h3 : 'Naglówek 3',
+theme_h4 : 'Naglówek 4',
+theme_h5 : 'Naglówek 5',
+theme_h6 : 'Naglówek 6',
+theme_colorpicker_title : 'Wybierz kolor',
+theme_colorpicker_apply : 'Wybierz',
+theme_forecolor_desc : 'Wybierz kolor tekstu',
+theme_backcolor_desc : 'Wybierz kolor tla',
+theme_charmap_title : 'Wybierz znak',
+theme_charmap_desc : 'Wstaw znak',
+theme_visualaid_desc : 'Toggle guidelines/invisible elements',
+insert_anchor_title : 'Kotwica',
+insert_anchor_name : 'Nazwa kotwicy',
+theme_anchor_desc : 'Wstaw/Edytuj kotwice',
+theme_insert_link_titlefield : 'Tytul',
+theme_clipboard_msg : 'Kopiuj/Edytuj/Wklej nie jest dostepne w przegladarkach Mozilla and Firefox.\nPotrzebujesz wiecej informacji na ten temat?',
+theme_path : 'Sciezka',
+cut_desc : 'Wytnij',
+copy_desc : 'Kopiuj',
+paste_desc : 'Wklej',
+link_list : 'Lista linków',
+image_list : 'Lista obrazków',
+browse : 'Przegladaj',
+image_props_desc : 'Wlasciwosci obrazka',
+newdocument_desc : 'New document',
+class_name : 'Klasa',
+newdocument : 'Are you sure you want clear all contents?'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/pt.js
@@ -1,1 +1,66 @@
+// PT lang variables
 
+tinyMCE.addToLang('',{
+theme_style_select : 'Estilos CSS',
+theme_code_desc : 'Editar Fonte HTML',
+theme_code_title : 'Editor de fonte HTML',
+theme_code_save : 'Guardar',
+theme_code_wordwrap : 'Translinear palavras',
+theme_sub_desc : 'Subscrito',
+theme_sup_desc : 'Superscrito',
+theme_hr_desc : 'Inserir linha horizontal',


+insert_image_border : 'Borda',



+insert_image_align : 'Alinhamento',

+insert_image_align_baseline : 'Linha de base',
+insert_image_align_top : 'Topo',
+insert_image_align_middle : 'Centrado',
+insert_image_align_bottom : 'Fundo',
+insert_image_align_texttop : 'Topo do Texto',
+insert_image_align_absmiddle : 'Centrado absoluto',
+insert_image_align_absbottom : 'Fundo absoluto',
+insert_image_align_left : 'Esquerda',
+insert_image_align_right : 'Direita',
+theme_font_size : '-- Font size --',
+theme_fontdefault : '-- Font family --',
+theme_block : '-- Format --',

+theme_div : 'Bloco HTML',
+theme_address : 'Morada',








+theme_colorpicker_apply : 'Aplicar',

+theme_backcolor_desc : 'Select background color',








+theme_path : 'Path',
+cut_desc : 'Cortar',
+copy_desc : 'Copiar',
+paste_desc : 'Colar',
+link_list : 'Link list',
+image_list : 'Image list',
+browse : 'Browse',
+image_props_desc : 'Image properties',
+newdocument_desc : 'New document',
+class_name : 'Classe de CSS',
+newdocument : 'Are you sure you want clear all contents?'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/pt_br.js
@@ -1,1 +1,65 @@
+// pt_BR lang variables
 
+tinyMCE.addToLang('',{
+theme_style_select : 'Estilos',


+theme_code_wordwrap : 'Quebrar Linhas',
+theme_sub_desc : 'Subscrito',
+theme_sup_desc : 'Subrescrito',
+theme_hr_desc : 'Inserir linha horizontal',


+insert_image_border : 'Borda',



+insert_image_align : 'Alinhamento',

+insert_image_align_baseline : 'Linha base',
+insert_image_align_top : 'Topo',
+insert_image_align_middle : 'Centro',
+insert_image_align_bottom : 'Fundo',
+insert_image_align_texttop : 'Texto ao Topo',
+insert_image_align_absmiddle : 'Centro Absoluto',
+insert_image_align_absbottom : 'Fundo Absoluto',
+insert_image_align_left : 'Esquerda',
+insert_image_align_right : 'Direita',
+theme_font_size : '-- Font size --',
+theme_fontdefault : '-- Font family --',
+theme_block : '-- Format --',

+theme_div : 'Div',








+theme_colorpicker_title : 'Selecionar cor',
+theme_colorpicker_apply : 'Aplicar',
+theme_forecolor_desc : 'Selecionar cor do texto',
+theme_backcolor_desc : 'Selecionar cor de fundo',
+theme_charmap_title : 'Selecionar caractere especial',
+theme_charmap_desc : 'Inserir caractere especial',






+theme_path : 'Caminho',
+cut_desc : 'Recortar',
+copy_desc : 'Copiar',
+paste_desc : 'Colar',
+link_list : 'Lista de Links',
+image_list : 'Lista de Imagens',
+browse : 'Navegar',
+image_props_desc : 'Propriedades da Imagem',
+newdocument_desc : 'New document',
+class_name : 'Class',
+newdocument : 'Are you sure you want clear all contents?'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/readme.txt
@@ -1,1 +1,5 @@
+Theme specific language packs.
 
+The language pack codes are based on ISO-639-2
+http://www.loc.gov/standards/iso639-2/englangn.html
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/sv.js
@@ -1,1 +1,78 @@
+// SE lang variables
 
+tinyMCE.addToLang('',{
+theme_style_select : '-- Stilar --',
+theme_code_desc : 'Editera HTML-koden',
+theme_code_title : 'HTML-k&auml;llkodseditor',
+theme_code_wordwrap : 'Automatiskt radbyte',
+theme_sub_desc : 'Neds&auml;nkt text',
+theme_sup_desc : 'Upph&ouml;jd text',
+theme_hr_desc : 'S&auml;tt in horisontell linje',
+theme_removeformat_desc : 'Ta bort formatering',
+theme_custom1_desc : 'Din specialbeskriving h&auml;r',
+insert_image_border : 'Ram',
+insert_image_dimensions : 'Dimensioner',
+insert_image_vspace : 'Vertikalt tomrum',
+insert_image_hspace : 'Horisontellt tomrum',
+insert_image_align : 'Justering',
+insert_image_align_default : 'Ingen',
+insert_image_align_baseline : 'Bottenlinjen',
+insert_image_align_top : 'L&auml;ngst upp',
+insert_image_align_middle : 'Mitten',
+insert_image_align_bottom : 'L&auml;ngst ner',
+insert_image_align_texttop : 'Textens top',
+insert_image_align_absmiddle : 'Absoluta mitten',
+insert_image_align_absbottom : 'Absolut l&auml;ngst ner',
+insert_image_align_left : 'V&auml;nster',
+insert_image_align_right : 'H&ouml;ger',
+insert_image_delta_width : 30,
+insert_image_delta_height : 10,
+theme_font_size : '-- Fontstorlek --',
+theme_fontdefault : '-- Font familj --',
+theme_block : '-- Stycke --',
+theme_paragraph : 'Paragraf',
+theme_div : 'Div',
+theme_address : 'Adress',
+theme_pre : 'F&ouml;rformatterad',
+theme_h1 : 'Rubrik 1',
+theme_h2 : 'Rubrik 2',
+theme_h3 : 'Rubrik 3',
+theme_h4 : 'Rubrik 4',
+theme_h5 : 'Rubrik 5',
+theme_h6 : 'Rubrik 6',
+theme_colorpicker_title : 'V&auml;lj en f&auml;rg',
+theme_colorpicker_apply : 'Verkst&auml;ll',
+theme_forecolor_desc : 'V&auml;lj f&ouml;rgrundsf&auml;rg',
+theme_backcolor_desc : 'V&auml;lj bakgrundsf&auml;rg',
+theme_charmap_title : 'V&auml;lj specialtecken',
+theme_charmap_desc : 'S&auml;tt in specialtecken',
+theme_visualaid_desc : 'Sl&aring; av/p&aring; osynliga element',
+insert_anchor_title : 'Skapa/redigera ankare',
+insert_anchor_name : 'Ankarnamn',
+theme_anchor_desc : 'Skapa/redigera ankare',
+theme_insert_link_titlefield : 'Titel',
+theme_clipboard_msg : 'Klipput/Kopiera/Klistra fungerar inte Mozilla och Firefox. Vill du veta mer om detta?',
+theme_path : 'S&ouml;kv&auml;g',
+cut_desc : 'Klipp ut',
+copy_desc : 'Kopiera',
+paste_desc : 'Klistra in',
+link_list : 'L&auml;nkar',
+image_list : 'Bilder',
+browse : 'Bl&auml;ddra',
+image_props_desc : 'Bild egenskaper',
+newdocument_desc : 'Nytt dokument',
+class_name : 'Stil',
+newdocument : '&Auml;r du s&auml;ker p&aring; att du vill t&ouml;mma hela redigerings ytan?',
+about_title : 'Om TinyMCE',
+about : 'Om',
+license : 'Licens',
+plugins : 'Insticksprogram',
+plugin : 'Insticksprogram',
+author : 'Utvecklare',
+version : 'Version',
+loaded_plugins : 'Laddade insticksprogram',
+help : 'Hj&auml;lp',
+not_set : '-- Inte satt --',
+close : 'St&auml;ng'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/tw.js
@@ -1,1 +1,92 @@
+// TW lang variables contributed by Jim Kou
 
+tinyMCE.addToLang('',{

+bold_img : "bold.gif",

































+italic_img : "italic.gif",














+theme_code_wordwrap : 'Word wrap',



+theme_font_size : '-- Font size --',
+theme_fontdefault : '-- Font family --',
+theme_block : '-- Format --',

+theme_backcolor_desc : 'Select background color',

















+theme_clipboard_msg : 'Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?',
+theme_path : 'Path',
+cut_desc : 'Cut',
+copy_desc : 'Copy',
+paste_desc : 'Paste',
+link_list : 'Link list',
+image_list : 'Image list',
+browse : 'Browse',
+image_props_desc : 'Image properties',
+newdocument_desc : 'New document',
+newdocument : 'Are you sure you want clear all contents?'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/langs/zh_cn.js
@@ -1,1 +1,66 @@
+// Simplified Chinese lang variables contributed by cube316 (cube316@gmail.com)

 
+tinyMCE.addToLang('',{
























+theme_font_size : '-- Font size --',
+theme_fontdefault : '-- Font family --',
+theme_block : '-- Format --',
































+newdocument : 'Are you sure you want clear all contents?'
+});
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/link.htm
@@ -1,1 +1,65 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<title>{#advanced_dlg.link_title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="../../utils/mctabs.js"></script>
+	<script type="text/javascript" src="../../utils/form_utils.js"></script>
+	<script type="text/javascript" src="../../utils/validate.js"></script>
+	<script type="text/javascript" src="js/link.js"></script>
+	<base target="_self" />
+</head>
+<body id="link" style="display: none">
+<form onsubmit="LinkDialog.update();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;">{#advanced_dlg.link_title}</a></span></li>
+		</ul>
+	</div>
 
+	<div class="panel_wrapper">
+		<div id="general_panel" class="panel current">
+
+		<table border="0" cellpadding="4" cellspacing="0">
+          <tr>
+            <td nowrap="nowrap"><label for="href">{#advanced_dlg.link_url}</label></td>
+            <td><table border="0" cellspacing="0" cellpadding="0"> 
+				  <tr> 
+					<td><input id="href" name="href" type="text" class="mceFocus" value="" style="width: 200px" onchange="LinkDialog.checkPrefix(this);" /></td> 
+					<td id="hrefbrowsercontainer">&nbsp;</td>
+				  </tr> 
+				</table></td>
+          </tr>
+		  <tr>
+			<td><label for="link_list">{#advanced_dlg.link_list}</label></td>
+			<td><select id="link_list" name="link_list" onchange="document.getElementById('href').value=this.options[this.selectedIndex].value;"></select></td>
+		  </tr>
+		<tr>
+			<td><label id="targetlistlabel" for="targetlist">{#advanced_dlg.link_target}</label></td>
+			<td><select id="target_list" name="target_list"></select></td>
+		</tr>
+          <tr>
+            <td nowrap="nowrap"><label for="linktitle">{#advanced_dlg.link_titlefield}</label></td>
+            <td><input id="linktitle" name="linktitle" type="text" value="" style="width: 200px" /></td>
+          </tr>
+			<tr>
+				<td><label for="class_list">{#class_name}</label></td>
+				<td><select id="class_list" name="class_list"></select></td>
+			</tr>
+        </table>
+		</div>
+	</div>
+
+	<div class="mceActionPanel">
+		<div style="float: left">
+			<input type="submit" id="insert" name="insert" value="{#insert}" />
+		</div>
+
+		<div style="float: right">
+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />
+		</div>
+	</div>
+</form>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/content.css
@@ -1,1 +1,33 @@
+body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;}
+body {background:#FFF;}
+body.mceForceColors {background:#FFF; color:#000;}
+h1 {font-size: 2em}
+h2 {font-size: 1.5em}
+h3 {font-size: 1.17em}
+h4 {font-size: 1em}
+h5 {font-size: .83em}
+h6 {font-size: .75em}
+.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;}
+a.mceItemAnchor {width:12px; line-height:6px; overflow:hidden; padding-left:12px; background:url(img/items.gif) no-repeat bottom left;}
+img.mceItemAnchor {width:12px; height:12px; background:url(img/items.gif) no-repeat;}
+img {border:0;}
+table {cursor:default}
+table td, table th {cursor:text}
+ins {border-bottom:1px solid green; text-decoration: none; color:green}
+del {color:red; text-decoration:line-through}
+cite {border-bottom:1px dashed blue}
+acronym {border-bottom:1px dotted #CCC; cursor:help}
+abbr, html\:abbr {border-bottom:1px dashed #CCC; cursor:help}
 
+/* IE */
+* html body {
+scrollbar-3dlight-color:#F0F0EE;
+scrollbar-arrow-color:#676662;
+scrollbar-base-color:#F0F0EE;
+scrollbar-darkshadow-color:#DDD;
+scrollbar-face-color:#E0E0DD;
+scrollbar-highlight-color:#F0F0EE;
+scrollbar-shadow-color:#F0F0EE;
+scrollbar-track-color:#F5F5F5;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/dialog.css
@@ -1,1 +1,114 @@
+/* Generic */
+body {
+font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px;
+scrollbar-3dlight-color:#F0F0EE;
+scrollbar-arrow-color:#676662;
+scrollbar-base-color:#F0F0EE;
+scrollbar-darkshadow-color:#DDDDDD;
+scrollbar-face-color:#E0E0DD;
+scrollbar-highlight-color:#F0F0EE;
+scrollbar-shadow-color:#F0F0EE;
+scrollbar-track-color:#F5F5F5;
+background:#F0F0EE;
+padding:0;
+margin:8px 8px 0 8px;
+}
 
+html {background:#F0F0EE;}
+td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
+textarea {resize:none;outline:none;}
+a:link, a:visited {color:black;}
+a:hover {color:#2B6FB6;}
+
+/* Forms */
+fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;}
+legend {color:#2B6FB6; font-weight:bold;}
+label.msg {display:none;}
+label.invalid {color:#EE0000; display:inline;}
+input.invalid {border:1px solid #EE0000;}
+input {background:#FFF; border:1px solid #CCC;}
+input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
+input, select, textarea {border:1px solid #808080;}
+input.radio {border:1px none #000000; background:transparent; vertical-align:middle;}
+input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;}
+.input_noborder {border:0;}
+
+/* Buttons */
+#insert, #cancel, input.button, .updateButton {
+border:0; margin:0; padding:0;
+font-weight:bold;
+width:94px; height:26px;
+background:url(img/buttons.png) 0 -26px;
+cursor:pointer;
+padding-bottom:2px;
+}
+
+#insert {background:url(img/buttons.png) 0 -52px;}
+#cancel {background:url(img/buttons.png) 0 0;}
+
+/* Browse */
+a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;}
+.mceOldBoxModel a.browse span {width:22px; height:20px;}
+a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;}
+a.browse span.disabled {border:1px solid white; -moz-opacity:0.3; opacity:0.3; filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);}
+a.browse:hover span.disabled {border:1px solid white; background-color:transparent;}
+a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;}
+.mceOldBoxModel a.pickcolor span {width:21px; height:17px;}
+a.pickcolor:hover span {background-color:#B2BBD0;}
+a.pickcolor:hover span.disabled {}
+
+/* Charmap */
+table.charmap {border:1px solid #AAA; text-align:center}
+td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;}
+#charmap a {display:block; color:#000; text-decoration:none; border:0}
+#charmap a:hover {background:#CCC;color:#2B6FB6}
+#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center}
+#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center}
+
+/* Source */
+.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;}
+.mceActionPanel {margin-top:5px;}
+
+/* Tabs classes */
+.tabs {width:100%; height:18px; line-height:normal; background:url(img/tabs.gif) repeat-x 0 -72px;}
+.tabs ul {margin:0; padding:0; list-style:none;}
+.tabs li {float:left; background:url(img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;}
+.tabs li.current {background:url(img/tabs.gif) no-repeat 0 -18px; margin-right:2px;}
+.tabs span {float:left; display:block; background:url(img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;}
+.tabs .current span {background:url(img/tabs.gif) no-repeat right -54px;}
+.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;}
+.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;}
+
+/* Panels */
+.panel_wrapper div.panel {display:none;}
+.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;}
+.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;}
+
+/* Columns */
+.column {float:left;}
+.properties {width:100%;}
+.properties .column1 {}
+.properties .column2 {text-align:left;}
+
+/* Titles */
+h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;}
+h3 {font-size:14px;}
+.title {font-size:12px; font-weight:bold; color:#2B6FB6;}
+
+/* Dialog specific */
+#link .panel_wrapper, #link div.current {height:125px;}
+#image .panel_wrapper, #image div.current {height:200px;}
+#plugintable thead {font-weight:bold; background:#DDD;}
+#plugintable, #about #plugintable td {border:1px solid #919B9C;}
+#plugintable {width:96%; margin-top:10px;}
+#pluginscontainer {height:290px; overflow:auto;}
+#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;}
+#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;}
+#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;}
+#colorpicker #light div {overflow:hidden;}
+#colorpicker #previewblock {float:right; padding-left:10px; height:20px;}
+#colorpicker .panel_wrapper div.current {height:175px;}
+#colorpicker #namedcolors {width:150px;}
+#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;}
+#colorpicker #colornamecontainer {margin-top:5px;}
+#colorpicker #picker_panel fieldset {margin:auto;width:325px;}

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/buttons.png differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/items.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/progress.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/ui.css
@@ -1,1 +1,216 @@
-
+/* Reset */
+.defaultSkin table, .defaultSkin tbody, .defaultSkin a, .defaultSkin img, .defaultSkin tr, .defaultSkin div, .defaultSkin td, .defaultSkin iframe, .defaultSkin span, .defaultSkin *, .defaultSkin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left}
+.defaultSkin a:hover, .defaultSkin a:link, .defaultSkin a:visited, .defaultSkin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000}
+.defaultSkin table td {vertical-align:middle}
+
+/* Containers */
+.defaultSkin table {background:#F0F0EE}
+.defaultSkin iframe {display:block; background:#FFF}
+.defaultSkin .mceToolbar {height:26px}
+.defaultSkin .mceLeft {text-align:left}
+.defaultSkin .mceRight {text-align:right}
+
+/* External */
+.defaultSkin .mceExternalToolbar {position:absolute; border:1px solid #CCC; border-bottom:0; display:none;}
+.defaultSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;}
+.defaultSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0}
+
+/* Layout */
+.defaultSkin table.mceLayout {border:0; border-left:1px solid #CCC; border-right:1px solid #CCC}
+.defaultSkin table.mceLayout tr.mceFirst td {border-top:1px solid #CCC}
+.defaultSkin table.mceLayout tr.mceLast td {border-bottom:1px solid #CCC}
+.defaultSkin table.mceToolbar, .defaultSkin tr.mceFirst .mceToolbar tr td, .defaultSkin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0;}
+.defaultSkin td.mceToolbar {padding-top:1px; vertical-align:top}
+.defaultSkin .mceIframeContainer {border-top:1px solid #CCC; border-bottom:1px solid #CCC}
+.defaultSkin .mceStatusbar {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; display:block; height:20px}
+.defaultSkin .mceStatusbar div {float:left; margin:2px}
+.defaultSkin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize}
+.defaultSkin .mceStatusbar a:hover {text-decoration:underline}
+.defaultSkin table.mceToolbar {margin-left:3px}
+.defaultSkin span.mceIcon, .defaultSkin img.mceIcon {display:block; width:20px; height:20px}
+.defaultSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px}
+.defaultSkin td.mceCenter {text-align:center;}
+.defaultSkin td.mceCenter table {margin:0 auto; text-align:left;}
+.defaultSkin td.mceRight table {margin:0 0 0 auto;}
+
+/* Button */
+.defaultSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px; margin-right:1px}
+.defaultSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0}
+.defaultSkin a.mceButtonActive, .defaultSkin a.mceButtonSelected {border:1px solid #0A246A; background-color:#C2CBE0}
+.defaultSkin .mceButtonDisabled .mceIcon {opacity:0.3; filter:alpha(opacity=30)}
+.defaultSkin .mceButtonLabeled {width:auto}
+.defaultSkin .mceButtonLabeled span.mceIcon {float:left}
+.defaultSkin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica}
+.defaultSkin .mceButtonDisabled .mceButtonLabel {color:#888}
+
+/* Separator */
+.defaultSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:2px 2px 0 4px}
+
+/* ListBox */
+.defaultSkin .mceListBox {direction:ltr}
+.defaultSkin .mceListBox, .defaultSkin .mceListBox a {display:block}
+.defaultSkin .mceListBox .mceText {padding-left:4px; width:70px; text-align:left; border:1px solid #CCC; border-right:0; background:#FFF; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden}
+.defaultSkin .mceListBox .mceOpen {width:9px; height:20px; background:url(../../img/icons.gif) -741px 0; margin-right:2px; border:1px solid #CCC;}
+.defaultSkin table.mceListBoxEnabled:hover .mceText, .defaultSkin .mceListBoxHover .mceText, .defaultSkin .mceListBoxSelected .mceText {border:1px solid #A2ABC0; border-right:0; background:#FFF}
+.defaultSkin table.mceListBoxEnabled:hover .mceOpen, .defaultSkin .mceListBoxHover .mceOpen, .defaultSkin .mceListBoxSelected .mceOpen {background-color:#FFF; border:1px solid #A2ABC0}
+.defaultSkin .mceListBoxDisabled a.mceText {color:gray; background-color:transparent;}
+.defaultSkin .mceListBoxMenu {overflow:auto; overflow-x:hidden}
+.defaultSkin .mceOldBoxModel .mceListBox .mceText {height:22px}
+.defaultSkin .mceOldBoxModel .mceListBox .mceOpen {width:11px; height:22px;}
+.defaultSkin select.mceNativeListBox {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:7pt; background:#F0F0EE; border:1px solid gray; margin-right:2px;}
+
+/* SplitButton */
+.defaultSkin .mceSplitButton {width:32px; height:20px; direction:ltr}
+.defaultSkin .mceSplitButton a, .defaultSkin .mceSplitButton span {height:20px; display:block}
+.defaultSkin .mceSplitButton a.mceAction {width:20px; border:1px solid #F0F0EE; border-right:0;}
+.defaultSkin .mceSplitButton span.mceAction {width:20px; background:url(../../img/icons.gif) 20px 20px;}
+.defaultSkin .mceSplitButton a.mceOpen {width:9px; border:1px solid #F0F0EE;}
+.defaultSkin .mceSplitButton span.mceOpen {width:9px; background:url(../../img/icons.gif) -741px 0;}
+.defaultSkin table.mceSplitButtonEnabled:hover a.mceAction, .defaultSkin .mceSplitButtonHover a.mceAction, .defaultSkin .mceSplitButtonSelected a.mceAction {border:1px solid #0A246A; border-right:0; background-color:#B2BBD0}
+.defaultSkin table.mceSplitButtonEnabled:hover a.mceOpen, .defaultSkin .mceSplitButtonHover a.mceOpen, .defaultSkin .mceSplitButtonSelected a.mceOpen {border:1px solid #0A246A;}
+.defaultSkin table.mceSplitButtonEnabled:hover span.mceOpen, .defaultSkin .mceSplitButtonHover span.mceOpen, .defaultSkin .mceSplitButtonSelected span.mceOpen {background-color:#B2BBD0}
+.defaultSkin .mceSplitButtonDisabled .mceAction, .defaultSkin .mceSplitButtonDisabled span.mceOpen {opacity:0.3; filter:alpha(opacity=30)}
+.defaultSkin .mceSplitButtonActive a.mceAction {border:1px solid #0A246A; background-color:#C2CBE0}
+.defaultSkin .mceSplitButtonActive a.mceOpen {border-left:0;}
+
+/* ColorSplitButton */
+.defaultSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray}
+.defaultSkin .mceColorSplitMenu td {padding:2px}
+.defaultSkin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080}
+.defaultSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px}
+.defaultSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF}
+.defaultSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2}
+.defaultSkin a.mceMoreColors:hover {border:1px solid #0A246A}
+.defaultSkin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a}
+.defaultSkin .mce_forecolor span.mceAction, .defaultSkin .mce_backcolor span.mceAction {overflow:hidden; height:16px}
+
+/* Menu */
+.defaultSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #D4D0C8}
+.defaultSkin .mceNoIcons span.mceIcon {width:0;}
+.defaultSkin .mceNoIcons a .mceText {padding-left:10px}
+.defaultSkin .mceMenu table {background:#FFF}
+.defaultSkin .mceMenu a, .defaultSkin .mceMenu span, .defaultSkin .mceMenu {display:block}
+.defaultSkin .mceMenu td {height:20px}
+.defaultSkin .mceMenu a {position:relative;padding:3px 0 4px 0}
+.defaultSkin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block}
+.defaultSkin .mceMenu span.mceText, .defaultSkin .mceMenu .mcePreview {font-size:11px}
+.defaultSkin .mceMenu pre.mceText {font-family:Monospace}
+.defaultSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;}
+.defaultSkin .mceMenu .mceMenuItemEnabled a:hover, .defaultSkin .mceMenu .mceMenuItemActive {background-color:#dbecf3}
+.defaultSkin td.mceMenuItemSeparator {background:#DDD; height:1px}
+.defaultSkin .mceMenuItemTitle a {border:0; background:#EEE; border-bottom:1px solid #DDD}
+.defaultSkin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px}
+.defaultSkin .mceMenuItemDisabled .mceText {color:#888}
+.defaultSkin .mceMenuItemSelected .mceIcon {background:url(img/menu_check.gif)}
+.defaultSkin .mceNoIcons .mceMenuItemSelected a {background:url(img/menu_arrow.gif) no-repeat -6px center}
+.defaultSkin .mceMenu span.mceMenuLine {display:none}
+.defaultSkin .mceMenuItemSub a {background:url(img/menu_arrow.gif) no-repeat top right;}
+
+/* Progress,Resize */
+.defaultSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; filter:alpha(opacity=50); background:#FFF}
+.defaultSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px}
+.defaultSkin .mcePlaceHolder {border:1px dotted gray}
+
+/* Formats */
+.defaultSkin .mce_formatPreview a {font-size:10px}
+.defaultSkin .mce_p span.mceText {}
+.defaultSkin .mce_address span.mceText {font-style:italic}
+.defaultSkin .mce_pre span.mceText {font-family:monospace}
+.defaultSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em}
+.defaultSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em}
+.defaultSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em}
+.defaultSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em}
+.defaultSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em}
+.defaultSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em}
+
+/* Theme */
+.defaultSkin span.mce_bold {background-position:0 0}
+.defaultSkin span.mce_italic {background-position:-60px 0}
+.defaultSkin span.mce_underline {background-position:-140px 0}
+.defaultSkin span.mce_strikethrough {background-position:-120px 0}
+.defaultSkin span.mce_undo {background-position:-160px 0}
+.defaultSkin span.mce_redo {background-position:-100px 0}
+.defaultSkin span.mce_cleanup {background-position:-40px 0}
+.defaultSkin span.mce_bullist {background-position:-20px 0}
+.defaultSkin span.mce_numlist {background-position:-80px 0}
+.defaultSkin span.mce_justifyleft {background-position:-460px 0}
+.defaultSkin span.mce_justifyright {background-position:-480px 0}
+.defaultSkin span.mce_justifycenter {background-position:-420px 0}
+.defaultSkin span.mce_justifyfull {background-position:-440px 0}
+.defaultSkin span.mce_anchor {background-position:-200px 0}
+.defaultSkin span.mce_indent {background-position:-400px 0}
+.defaultSkin span.mce_outdent {background-position:-540px 0}
+.defaultSkin span.mce_link {background-position:-500px 0}
+.defaultSkin span.mce_unlink {background-position:-640px 0}
+.defaultSkin span.mce_sub {background-position:-600px 0}
+.defaultSkin span.mce_sup {background-position:-620px 0}
+.defaultSkin span.mce_removeformat {background-position:-580px 0}
+.defaultSkin span.mce_newdocument {background-position:-520px 0}
+.defaultSkin span.mce_image {background-position:-380px 0}
+.defaultSkin span.mce_help {background-position:-340px 0}
+.defaultSkin span.mce_code {background-position:-260px 0}
+.defaultSkin span.mce_hr {background-position:-360px 0}
+.defaultSkin span.mce_visualaid {background-position:-660px 0}
+.defaultSkin span.mce_charmap {background-position:-240px 0}
+.defaultSkin span.mce_paste {background-position:-560px 0}
+.defaultSkin span.mce_copy {background-position:-700px 0}
+.defaultSkin span.mce_cut {background-position:-680px 0}
+.defaultSkin span.mce_blockquote {background-position:-220px 0}
+.defaultSkin .mce_forecolor span.mceAction {background-position:-720px 0}
+.defaultSkin .mce_backcolor span.mceAction {background-position:-760px 0}
+.defaultSkin span.mce_forecolorpicker {background-position:-720px 0}
+.defaultSkin span.mce_backcolorpicker {background-position:-760px 0}
+
+/* Plugins */
+.defaultSkin span.mce_advhr {background-position:-0px -20px}
+.defaultSkin span.mce_ltr {background-position:-20px -20px}
+.defaultSkin span.mce_rtl {background-position:-40px -20px}
+.defaultSkin span.mce_emotions {background-position:-60px -20px}
+.defaultSkin span.mce_fullpage {background-position:-80px -20px}
+.defaultSkin span.mce_fullscreen {background-position:-100px -20px}
+.defaultSkin span.mce_iespell {background-position:-120px -20px}
+.defaultSkin span.mce_insertdate {background-position:-140px -20px}
+.defaultSkin span.mce_inserttime {background-position:-160px -20px}
+.defaultSkin span.mce_absolute {background-position:-180px -20px}
+.defaultSkin span.mce_backward {background-position:-200px -20px}
+.defaultSkin span.mce_forward {background-position:-220px -20px}
+.defaultSkin span.mce_insert_layer {background-position:-240px -20px}
+.defaultSkin span.mce_insertlayer {background-position:-260px -20px}
+.defaultSkin span.mce_movebackward {background-position:-280px -20px}
+.defaultSkin span.mce_moveforward {background-position:-300px -20px}
+.defaultSkin span.mce_media {background-position:-320px -20px}
+.defaultSkin span.mce_nonbreaking {background-position:-340px -20px}
+.defaultSkin span.mce_pastetext {background-position:-360px -20px}
+.defaultSkin span.mce_pasteword {background-position:-380px -20px}
+.defaultSkin span.mce_selectall {background-position:-400px -20px}
+.defaultSkin span.mce_preview {background-position:-420px -20px}
+.defaultSkin span.mce_print {background-position:-440px -20px}
+.defaultSkin span.mce_cancel {background-position:-460px -20px}
+.defaultSkin span.mce_save {background-position:-480px -20px}
+.defaultSkin span.mce_replace {background-position:-500px -20px}
+.defaultSkin span.mce_search {background-position:-520px -20px}
+.defaultSkin span.mce_styleprops {background-position:-560px -20px}
+.defaultSkin span.mce_table {background-position:-580px -20px}
+.defaultSkin span.mce_cell_props {background-position:-600px -20px}
+.defaultSkin span.mce_delete_table {background-position:-620px -20px}
+.defaultSkin span.mce_delete_col {background-position:-640px -20px}
+.defaultSkin span.mce_delete_row {background-position:-660px -20px}
+.defaultSkin span.mce_col_after {background-position:-680px -20px}
+.defaultSkin span.mce_col_before {background-position:-700px -20px}
+.defaultSkin span.mce_row_after {background-position:-720px -20px}
+.defaultSkin span.mce_row_before {background-position:-740px -20px}
+.defaultSkin span.mce_merge_cells {background-position:-760px -20px}
+.defaultSkin span.mce_table_props {background-position:-980px -20px}
+.defaultSkin span.mce_row_props {background-position:-780px -20px}
+.defaultSkin span.mce_split_cells {background-position:-800px -20px}
+.defaultSkin span.mce_template {background-position:-820px -20px}
+.defaultSkin span.mce_visualchars {background-position:-840px -20px}
+.defaultSkin span.mce_abbr {background-position:-860px -20px}
+.defaultSkin span.mce_acronym {background-position:-880px -20px}
+.defaultSkin span.mce_attribs {background-position:-900px -20px}
+.defaultSkin span.mce_cite {background-position:-920px -20px}
+.defaultSkin span.mce_del {background-position:-940px -20px}
+.defaultSkin span.mce_ins {background-position:-960px -20px}
+.defaultSkin span.mce_pagebreak {background-position:0 -40px}
+.defaultSkin .mce_spellchecker span.mceAction {background-position:-540px -20px}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css
@@ -1,1 +1,33 @@
+body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;}
+body {background:#FFF;}
+body.mceForceColors {background:#FFF; color:#000;}
+h1 {font-size: 2em}
+h2 {font-size: 1.5em}
+h3 {font-size: 1.17em}
+h4 {font-size: 1em}
+h5 {font-size: .83em}
+h6 {font-size: .75em}
+.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;}
+a.mceItemAnchor {width:12px; line-height:6px; overflow:hidden; padding-left:12px; background:url(../default/img/items.gif) no-repeat bottom left;}
+img.mceItemAnchor {width:12px; height:12px; background:url(../default/img/items.gif) no-repeat;}
+img {border:0;}
+table {cursor:default}
+table td, table th {cursor:text}
+ins {border-bottom:1px solid green; text-decoration: none; color:green}
+del {color:red; text-decoration:line-through}
+cite {border-bottom:1px dashed blue}
+acronym {border-bottom:1px dotted #CCC; cursor:help}
+abbr, html\:abbr {border-bottom:1px dashed #CCC; cursor:help}
 
+/* IE */
+* html body {
+scrollbar-3dlight-color:#F0F0EE;
+scrollbar-arrow-color:#676662;
+scrollbar-base-color:#F0F0EE;
+scrollbar-darkshadow-color:#DDD;
+scrollbar-face-color:#E0E0DD;
+scrollbar-highlight-color:#F0F0EE;
+scrollbar-shadow-color:#F0F0EE;
+scrollbar-track-color:#F5F5F5;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css
@@ -1,1 +1,114 @@
+/* Generic */
+body {
+font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px;
+scrollbar-3dlight-color:#F0F0EE;
+scrollbar-arrow-color:#676662;
+scrollbar-base-color:#F0F0EE;
+scrollbar-darkshadow-color:#DDDDDD;
+scrollbar-face-color:#E0E0DD;
+scrollbar-highlight-color:#F0F0EE;
+scrollbar-shadow-color:#F0F0EE;
+scrollbar-track-color:#F5F5F5;
+background:#F0F0EE;
+padding:0;
+margin:8px 8px 0 8px;
+}
 
+html {background:#F0F0EE;}
+td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
+textarea {resize:none;outline:none;}
+a:link, a:visited {color:black;}
+a:hover {color:#2B6FB6;}
+
+/* Forms */
+fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;}
+legend {color:#2B6FB6; font-weight:bold;}
+label.msg {display:none;}
+label.invalid {color:#EE0000; display:inline;}
+input.invalid {border:1px solid #EE0000;}
+input {background:#FFF; border:1px solid #CCC;}
+input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
+input, select, textarea {border:1px solid #808080;}
+input.radio {border:1px none #000000; background:transparent; vertical-align:middle;}
+input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;}
+.input_noborder {border:0;}
+
+/* Buttons */
+#insert, #cancel, input.button, .updateButton {
+border:0; margin:0; padding:0;
+font-weight:bold;
+width:94px; height:26px;
+background:url(../default/img/buttons.png) 0 -26px;
+cursor:pointer;
+padding-bottom:2px;
+}
+
+#insert {background:url(../default/img/buttons.png) 0 -52px;}
+#cancel {background:url(../default/img/buttons.png) 0 0;}
+
+/* Browse */
+a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;}
+.mceOldBoxModel a.browse span {width:22px; height:20px;}
+a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;}
+a.browse span.disabled {border:1px solid white; -moz-opacity:0.3; opacity:0.3; filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);}
+a.browse:hover span.disabled {border:1px solid white; background-color:transparent;}
+a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;}
+.mceOldBoxModel a.pickcolor span {width:21px; height:17px;}
+a.pickcolor:hover span {background-color:#B2BBD0;}
+a.pickcolor:hover span.disabled {}
+
+/* Charmap */
+table.charmap {border:1px solid #AAA; text-align:center}
+td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;}
+#charmap a {display:block; color:#000; text-decoration:none; border:0}
+#charmap a:hover {background:#CCC;color:#2B6FB6}
+#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center}
+#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center}
+
+/* Source */
+.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;}
+.mceActionPanel {margin-top:5px;}
+
+/* Tabs classes */
+.tabs {width:100%; height:18px; line-height:normal; background:url(../default/img/tabs.gif) repeat-x 0 -72px;}
+.tabs ul {margin:0; padding:0; list-style:none;}
+.tabs li {float:left; background:url(../default/img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;}
+.tabs li.current {background:url(../default/img/tabs.gif) no-repeat 0 -18px; margin-right:2px;}
+.tabs span {float:left; display:block; background:url(../default/img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;}
+.tabs .current span {background:url(../default/img/tabs.gif) no-repeat right -54px;}
+.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;}
+.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;}
+
+/* Panels */
+.panel_wrapper div.panel {display:none;}
+.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;}
+.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;}
+
+/* Columns */
+.column {float:left;}
+.properties {width:100%;}
+.properties .column1 {}
+.properties .column2 {text-align:left;}
+
+/* Titles */
+h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;}
+h3 {font-size:14px;}
+.title {font-size:12px; font-weight:bold; color:#2B6FB6;}
+
+/* Dialog specific */
+#link .panel_wrapper, #link div.current {height:125px;}
+#image .panel_wrapper, #image div.current {height:200px;}
+#plugintable thead {font-weight:bold; background:#DDD;}
+#plugintable, #about #plugintable td {border:1px solid #919B9C;}
+#plugintable {width:96%; margin-top:10px;}
+#pluginscontainer {height:290px; overflow:auto;}
+#colorpicker #preview {float:right; width:50px; height:14px;line-height:1px; border:1px solid black; margin-left:5px;}
+#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;}
+#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;}
+#colorpicker #light div {overflow:hidden;}
+#colorpicker #previewblock {float:right; padding-left:10px; height:20px;}
+#colorpicker .panel_wrapper div.current {height:175px;}
+#colorpicker #namedcolors {width:150px;}
+#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;}
+#colorpicker #colornamecontainer {margin-top:5px;}
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui.css
@@ -1,1 +1,216 @@
-
+/* Reset */
+.o2k7Skin table, .o2k7Skin tbody, .o2k7Skin a, .o2k7Skin img, .o2k7Skin tr, .o2k7Skin div, .o2k7Skin td, .o2k7Skin iframe, .o2k7Skin span, .o2k7Skin *, .o2k7Skin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left}
+.o2k7Skin a:hover, .o2k7Skin a:link, .o2k7Skin a:visited, .o2k7Skin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000}
+.o2k7Skin table td {vertical-align:middle}
+
+/* Containers */
+.o2k7Skin table {background:#E5EFFD}
+.o2k7Skin iframe {display:block; background:#FFF}
+.o2k7Skin .mceToolbar {height:26px}
+
+/* External */
+.o2k7Skin .mceExternalToolbar {position:absolute; border:1px solid #ABC6DD; border-bottom:0; display:none}
+.o2k7Skin .mceExternalToolbar td.mceToolbar {padding-right:13px;}
+.o2k7Skin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0}
+
+/* Layout */
+.o2k7Skin table.mceLayout {border:0; border-left:1px solid #ABC6DD; border-right:1px solid #ABC6DD}
+.o2k7Skin table.mceLayout tr.mceFirst td {border-top:1px solid #ABC6DD}
+.o2k7Skin table.mceLayout tr.mceLast td {border-bottom:1px solid #ABC6DD}
+.o2k7Skin table.mceToolbar, .o2k7Skin tr.mceFirst .mceToolbar tr td, .o2k7Skin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0}
+.o2k7Skin .mceIframeContainer {border-top:1px solid #ABC6DD; border-bottom:1px solid #ABC6DD}
+.o2k7Skin .mceStatusbar {display:block; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; height:20px}
+.o2k7Skin .mceStatusbar div {float:left; padding:2px}
+.o2k7Skin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize}
+.o2k7Skin .mceStatusbar a:hover {text-decoration:underline}
+.o2k7Skin table.mceToolbar {margin-left:3px}
+.o2k7Skin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; margin-left:3px;}
+.o2k7Skin .mceToolbar td.mceFirst span {margin:0}
+.o2k7Skin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px}
+.o2k7Skin .mceToolbar .mceToolbarEndListBox span, .o2k7Skin .mceToolbar .mceToolbarStartListBox span {display:none}
+.o2k7Skin span.mceIcon, .o2k7Skin img.mceIcon {display:block; width:20px; height:20px}
+.o2k7Skin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px}
+.o2k7Skin td.mceCenter {text-align:center;}
+.o2k7Skin td.mceCenter table {margin:0 auto; text-align:left;}
+.o2k7Skin td.mceRight table {margin:0 0 0 auto;}
+
+/* Button */
+.o2k7Skin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px}
+.o2k7Skin a.mceButton span, .o2k7Skin a.mceButton img {margin-left:1px}
+.o2k7Skin .mceOldBoxModel a.mceButton span, .o2k7Skin .mceOldBoxModel a.mceButton img {margin:0 0 0 1px}
+.o2k7Skin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px}
+.o2k7Skin a.mceButtonActive, .o2k7Skin a.mceButtonSelected {background-position:0 -44px}
+.o2k7Skin .mceButtonDisabled .mceIcon {opacity:0.3; filter:alpha(opacity=30)}
+.o2k7Skin .mceButtonLabeled {width:auto}
+.o2k7Skin .mceButtonLabeled span.mceIcon {float:left}
+.o2k7Skin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica}
+.o2k7Skin .mceButtonDisabled .mceButtonLabel {color:#888}
+
+/* Separator */
+.o2k7Skin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px}
+
+/* ListBox */
+.o2k7Skin .mceListBox {margin-left:3px}
+.o2k7Skin .mceListBox, .o2k7Skin .mceListBox a {display:block}
+.o2k7Skin .mceListBox .mceText {padding-left:4px; text-align:left; width:70px; border:1px solid #b3c7e1; border-right:0; background:#eaf2fb; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden}
+.o2k7Skin .mceListBox .mceOpen {width:14px; height:22px; background:url(img/button_bg.png) -66px 0}
+.o2k7Skin table.mceListBoxEnabled:hover .mceText, .o2k7Skin .mceListBoxHover .mceText, .o2k7Skin .mceListBoxSelected .mceText {background:#FFF}
+.o2k7Skin table.mceListBoxEnabled:hover .mceOpen, .o2k7Skin .mceListBoxHover .mceOpen, .o2k7Skin .mceListBoxSelected .mceOpen {background-position:-66px -22px}
+.o2k7Skin .mceListBoxDisabled .mceText {color:gray}
+.o2k7Skin .mceListBoxMenu {overflow:auto; overflow-x:hidden}
+.o2k7Skin .mceOldBoxModel .mceListBox .mceText {height:22px}
+.o2k7Skin select.mceListBox {font-family:Tahoma,Verdana,Arial,Helvetica; font-size:12px; border:1px solid #b3c7e1; background:#FFF;}
+
+/* SplitButton */
+.o2k7Skin .mceSplitButton, .o2k7Skin .mceSplitButton a, .o2k7Skin .mceSplitButton span {display:block; height:22px}
+.o2k7Skin .mceSplitButton {background:url(img/button_bg.png)}
+.o2k7Skin .mceSplitButton a.mceAction {width:22px}
+.o2k7Skin .mceSplitButton span.mceAction {width:22px; background:url(../../img/icons.gif) 20px 20px}
+.o2k7Skin .mceSplitButton a.mceOpen {width:10px}
+.o2k7Skin .mceSplitButton span.mceOpen {width:10px; background:url(img/button_bg.png) -44px 0}
+.o2k7Skin table.mceSplitButtonEnabled:hover a.mceAction, .o2k7Skin .mceSplitButtonHover a.mceAction, .o2k7Skin .mceSplitButtonSelected {background:url(img/button_bg.png) 0 -22px}
+.o2k7Skin table.mceSplitButtonEnabled:hover span.mceOpen, .o2k7Skin .mceSplitButtonHover span.mceOpen, .o2k7Skin .mceSplitButtonSelected span.mceOpen {background-position:-44px -44px}
+.o2k7Skin .mceSplitButtonDisabled .mceAction {opacity:0.3; filter:alpha(opacity=30)}
+.o2k7Skin .mceSplitButtonActive {background-position:0 -44px}
+
+/* ColorSplitButton */
+.o2k7Skin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray}
+.o2k7Skin .mceColorSplitMenu td {padding:2px}
+.o2k7Skin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080}
+.o2k7Skin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px}
+.o2k7Skin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF}
+.o2k7Skin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2}
+.o2k7Skin a.mceMoreColors:hover {border:1px solid #0A246A}
+.o2k7Skin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a;overflow:hidden}
+.o2k7Skin .mce_forecolor span.mceAction, .o2k7Skin .mce_backcolor span.mceAction {height:15px;overflow:hidden}
+
+/* Menu */
+.o2k7Skin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #ABC6DD}
+.o2k7Skin .mceNoIcons span.mceIcon {width:0;}
+.o2k7Skin .mceNoIcons a .mceText {padding-left:10px}
+.o2k7Skin .mceMenu table {background:#FFF}
+.o2k7Skin .mceMenu a, .o2k7Skin .mceMenu span, .o2k7Skin .mceMenu {display:block}
+.o2k7Skin .mceMenu td {height:20px}
+.o2k7Skin .mceMenu a {position:relative;padding:3px 0 4px 0}
+.o2k7Skin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block}
+.o2k7Skin .mceMenu span.mceText, .o2k7Skin .mceMenu .mcePreview {font-size:11px}
+.o2k7Skin .mceMenu pre.mceText {font-family:Monospace}
+.o2k7Skin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;}
+.o2k7Skin .mceMenu .mceMenuItemEnabled a:hover, .o2k7Skin .mceMenu .mceMenuItemActive {background-color:#dbecf3}
+.o2k7Skin td.mceMenuItemSeparator {background:#DDD; height:1px}
+.o2k7Skin .mceMenuItemTitle a {border:0; background:#E5EFFD; border-bottom:1px solid #ABC6DD}
+.o2k7Skin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px}
+.o2k7Skin .mceMenuItemDisabled .mceText {color:#888}
+.o2k7Skin .mceMenuItemSelected .mceIcon {background:url(../default/img/menu_check.gif)}
+.o2k7Skin .mceNoIcons .mceMenuItemSelected a {background:url(../default/img/menu_arrow.gif) no-repeat -6px center}
+.o2k7Skin .mceMenu span.mceMenuLine {display:none}
+.o2k7Skin .mceMenuItemSub a {background:url(../default/img/menu_arrow.gif) no-repeat top right;}
+
+/* Progress,Resize */
+.o2k7Skin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; filter:alpha(opacity=50); background:#FFF}
+.o2k7Skin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(../default/img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px}
+.o2k7Skin .mcePlaceHolder {border:1px dotted gray}
+
+/* Formats */
+.o2k7Skin .mce_formatPreview a {font-size:10px}
+.o2k7Skin .mce_p span.mceText {}
+.o2k7Skin .mce_address span.mceText {font-style:italic}
+.o2k7Skin .mce_pre span.mceText {font-family:monospace}
+.o2k7Skin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em}
+.o2k7Skin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em}
+.o2k7Skin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em}
+.o2k7Skin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em}
+.o2k7Skin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em}
+.o2k7Skin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em}
+
+/* Theme */
+.o2k7Skin span.mce_bold {background-position:0 0}
+.o2k7Skin span.mce_italic {background-position:-60px 0}
+.o2k7Skin span.mce_underline {background-position:-140px 0}
+.o2k7Skin span.mce_strikethrough {background-position:-120px 0}
+.o2k7Skin span.mce_undo {background-position:-160px 0}
+.o2k7Skin span.mce_redo {background-position:-100px 0}
+.o2k7Skin span.mce_cleanup {background-position:-40px 0}
+.o2k7Skin span.mce_bullist {background-position:-20px 0}
+.o2k7Skin span.mce_numlist {background-position:-80px 0}
+.o2k7Skin span.mce_justifyleft {background-position:-460px 0}
+.o2k7Skin span.mce_justifyright {background-position:-480px 0}
+.o2k7Skin span.mce_justifycenter {background-position:-420px 0}
+.o2k7Skin span.mce_justifyfull {background-position:-440px 0}
+.o2k7Skin span.mce_anchor {background-position:-200px 0}
+.o2k7Skin span.mce_indent {background-position:-400px 0}
+.o2k7Skin span.mce_outdent {background-position:-540px 0}
+.o2k7Skin span.mce_link {background-position:-500px 0}
+.o2k7Skin span.mce_unlink {background-position:-640px 0}
+.o2k7Skin span.mce_sub {background-position:-600px 0}
+.o2k7Skin span.mce_sup {background-position:-620px 0}
+.o2k7Skin span.mce_removeformat {background-position:-580px 0}
+.o2k7Skin span.mce_newdocument {background-position:-520px 0}
+.o2k7Skin span.mce_image {background-position:-380px 0}
+.o2k7Skin span.mce_help {background-position:-340px 0}
+.o2k7Skin span.mce_code {background-position:-260px 0}
+.o2k7Skin span.mce_hr {background-position:-360px 0}
+.o2k7Skin span.mce_visualaid {background-position:-660px 0}
+.o2k7Skin span.mce_charmap {background-position:-240px 0}
+.o2k7Skin span.mce_paste {background-position:-560px 0}
+.o2k7Skin span.mce_copy {background-position:-700px 0}
+.o2k7Skin span.mce_cut {background-position:-680px 0}
+.o2k7Skin span.mce_blockquote {background-position:-220px 0}
+.o2k7Skin .mce_forecolor span.mceAction {background-position:-720px 0}
+.o2k7Skin .mce_backcolor span.mceAction {background-position:-760px 0}
+.o2k7Skin span.mce_forecolorpicker {background-position:-720px 0}
+.o2k7Skin span.mce_backcolorpicker {background-position:-760px 0}
+
+/* Plugins */
+.o2k7Skin span.mce_advhr {background-position:-0px -20px}
+.o2k7Skin span.mce_ltr {background-position:-20px -20px}
+.o2k7Skin span.mce_rtl {background-position:-40px -20px}
+.o2k7Skin span.mce_emotions {background-position:-60px -20px}
+.o2k7Skin span.mce_fullpage {background-position:-80px -20px}
+.o2k7Skin span.mce_fullscreen {background-position:-100px -20px}
+.o2k7Skin span.mce_iespell {background-position:-120px -20px}
+.o2k7Skin span.mce_insertdate {background-position:-140px -20px}
+.o2k7Skin span.mce_inserttime {background-position:-160px -20px}
+.o2k7Skin span.mce_absolute {background-position:-180px -20px}
+.o2k7Skin span.mce_backward {background-position:-200px -20px}
+.o2k7Skin span.mce_forward {background-position:-220px -20px}
+.o2k7Skin span.mce_insert_layer {background-position:-240px -20px}
+.o2k7Skin span.mce_insertlayer {background-position:-260px -20px}
+.o2k7Skin span.mce_movebackward {background-position:-280px -20px}
+.o2k7Skin span.mce_moveforward {background-position:-300px -20px}
+.o2k7Skin span.mce_media {background-position:-320px -20px}
+.o2k7Skin span.mce_nonbreaking {background-position:-340px -20px}
+.o2k7Skin span.mce_pastetext {background-position:-360px -20px}
+.o2k7Skin span.mce_pasteword {background-position:-380px -20px}
+.o2k7Skin span.mce_selectall {background-position:-400px -20px}
+.o2k7Skin span.mce_preview {background-position:-420px -20px}
+.o2k7Skin span.mce_print {background-position:-440px -20px}
+.o2k7Skin span.mce_cancel {background-position:-460px -20px}
+.o2k7Skin span.mce_save {background-position:-480px -20px}
+.o2k7Skin span.mce_replace {background-position:-500px -20px}
+.o2k7Skin span.mce_search {background-position:-520px -20px}
+.o2k7Skin span.mce_styleprops {background-position:-560px -20px}
+.o2k7Skin span.mce_table {background-position:-580px -20px}
+.o2k7Skin span.mce_cell_props {background-position:-600px -20px}
+.o2k7Skin span.mce_delete_table {background-position:-620px -20px}
+.o2k7Skin span.mce_delete_col {background-position:-640px -20px}
+.o2k7Skin span.mce_delete_row {background-position:-660px -20px}
+.o2k7Skin span.mce_col_after {background-position:-680px -20px}
+.o2k7Skin span.mce_col_before {background-position:-700px -20px}
+.o2k7Skin span.mce_row_after {background-position:-720px -20px}
+.o2k7Skin span.mce_row_before {background-position:-740px -20px}
+.o2k7Skin span.mce_merge_cells {background-position:-760px -20px}
+.o2k7Skin span.mce_table_props {background-position:-980px -20px}
+.o2k7Skin span.mce_row_props {background-position:-780px -20px}
+.o2k7Skin span.mce_split_cells {background-position:-800px -20px}
+.o2k7Skin span.mce_template {background-position:-820px -20px}
+.o2k7Skin span.mce_visualchars {background-position:-840px -20px}
+.o2k7Skin span.mce_abbr {background-position:-860px -20px}
+.o2k7Skin span.mce_acronym {background-position:-880px -20px}
+.o2k7Skin span.mce_attribs {background-position:-900px -20px}
+.o2k7Skin span.mce_cite {background-position:-920px -20px}
+.o2k7Skin span.mce_del {background-position:-940px -20px}
+.o2k7Skin span.mce_ins {background-position:-960px -20px}
+.o2k7Skin span.mce_pagebreak {background-position:0 -40px}
+.o2k7Skin .mce_spellchecker span.mceAction {background-position:-540px -20px}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css
@@ -1,1 +1,8 @@
-
+/* Black */
+.o2k7SkinBlack .mceToolbar .mceToolbarStart span, .o2k7SkinBlack .mceToolbar .mceToolbarEnd span, .o2k7SkinBlack .mceButton, .o2k7SkinBlack .mceSplitButton, .o2k7SkinBlack .mceSeparator, .o2k7SkinBlack .mceSplitButton span.mceOpen, .o2k7SkinBlack .mceListBox .mceOpen {background-image:url(img/button_bg_black.png)}
+.o2k7SkinBlack table, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack .mceMenuItemTitle span.mceText, .o2k7SkinBlack .mceStatusbar div, .o2k7SkinBlack .mceStatusbar span, .o2k7SkinBlack .mceStatusbar a {background:#535353; color:#FFF}
+.o2k7SkinBlack table.mceListBoxEnabled .mceText, o2k7SkinBlack .mceListBox .mceText {background:#FFF; border:1px solid #CBCFD4; border-bottom-color:#989FA9; border-right:0}
+.o2k7SkinBlack table.mceListBoxEnabled:hover .mceText, .o2k7Skin .mceListBoxHover .mceText, .o2k7Skin .mceListBoxSelected .mceText {background:#FFF; border:1px solid #FFBD69; border-right:0}
+.o2k7SkinBlack .mceExternalToolbar, .o2k7SkinBlack .mceListBox .mceText, .o2k7SkinBlack div.mceMenu, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceFirst td, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceLast td, .o2k7SkinBlack .mceIframeContainer {border-color: #535353;}
+.o2k7SkinBlack table.mceSplitButtonEnabled:hover a.mceAction, .o2k7Skin .mceSplitButtonHover a.mceAction, .o2k7Skin .mceSplitButtonSelected {background-image:url(img/button_bg_black.png)}
+.o2k7SkinBlack .mceMenu .mceMenuItemEnabled a:hover, .o2k7Skin .mceMenu .mceMenuItemActive {background-color:#FFE7A1}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css
@@ -1,1 +1,6 @@
+/* Silver */
+.o2k7SkinSilver .mceToolbar .mceToolbarStart span, .o2k7SkinSilver .mceButton, .o2k7SkinSilver .mceSplitButton, .o2k7SkinSilver .mceSeparator, .o2k7SkinSilver .mceSplitButton span.mceOpen, .o2k7SkinSilver .mceListBox .mceOpen {background-image:url(img/button_bg_silver.png)}
+.o2k7SkinSilver table, .o2k7SkinSilver .mceMenuItemTitle a {background:#eee}
+.o2k7SkinSilver .mceListBox .mceText {background:#FFF}
+.o2k7SkinSilver .mceExternalToolbar, .o2k7SkinSilver .mceListBox .mceText, .o2k7SkinSilver div.mceMenu, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceFirst td, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceLast td, .o2k7SkinSilver .mceIframeContainer {border-color: #bbb}
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/advanced/source_editor.htm
@@ -1,1 +1,33 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
+	<title>{#advanced_dlg.code_title}</title>
+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>
+	<script type="text/javascript" src="js/source_editor.js"></script>
+	<base target="_self" />
+</head>
+<body onresize="resizeInputs();" style="display:none; overflow:hidden;">
+	<form name="source" onsubmit="saveContent();return false;" action="#">
+		<div style="float: left" class="title">{#advanced_dlg.code_title}</div>
 
+		<div id="wrapline" style="float: right">
+			<input type="checkbox" name="wraped" id="wraped" onclick="toggleWordWrap(this);" class="wordWrapCode" /><label for="wraped">{#advanced_dlg.code_wordwrap}</label>
+		</div>
+
+		<br style="clear: both" />
+
+		<textarea name="htmlSource" id="htmlSource" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,monospace; font-size: 12px;" dir="ltr" wrap="off" class="mceFocus"></textarea>
+
+		<div class="mceActionPanel">
+			<div style="float: left">
+				<input type="submit" name="insert" value="{#update}" id="insert" />
+			</div>
+
+			<div style="float: right">
+				<input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" />
+			</div>
+		</div>
+	</form>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/cs/about.htm
@@ -1,1 +1,33 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>O TinyMCE</TITLE>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">O TinyMCE</span></td>
+    <td align="right"><a href="index.htm">Obsah</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>



+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Jdi na: <a href="index.htm">Obsah</a></td>
+    <td align="right"><a href="#">Nahoru</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/cs/common_buttons.htm
@@ -1,1 +1,124 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>

+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 

+    <td align="right"><a href="index.htm">Obsah</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<img src="../../images/spacer.gif" width="1" height="1"> 
+<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/cut.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/copy.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/paste.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/bold.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>
+    <td>Podtrhne text.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>


+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>

+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Jdi na: <a href="index.htm">Obsah</a></td>
+    <td align="right"><a href="#">Nahoru</a></td>
+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/cs/images/insert_image_window.png differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/cs/images/insert_link_window.png differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/cs/index.htm
@@ -1,1 +1,27 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>

+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Obsah</span></td>
+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">O TinyMCE</a></li>



+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/cs/insert_image_button.htm
@@ -1,1 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>

+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 

+    <td align="right"><a href="index.htm">Obsah</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<img src="images/insert_image_window.png" width="348" height="160"><br>
+<br>


+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Jdi na: <a href="index.htm">Obsah</a></td>
+    <td align="right"><a href="#">Nahoru</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/cs/insert_link_button.htm
@@ -1,1 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>

+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 

+    <td align="right"><a href="index.htm">Obsah</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<img src="images/insert_link_window.png" width="328" height="160"><br>
+<br>


+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Jdi na: <a href="index.htm">Obsah</a></td>
+    <td align="right"><a href="#">Nahoru</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/cs/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: 0; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/de/about.htm
@@ -1,1 +1,33 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>&Uuml;ber TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">&Uuml;ber TinyMCE</span></td>
+    <td align="right"><a href="index.htm">Inhalt</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+TinyMCE ist ein kompakter WYSIWYG-Editor f&uuml;r Webbrowser wie MSIE oder Mozilla
+der es Ihnen erm&ouml;glicht HTML-Inhalte auf eine benutzerfreundliche Weise zu

+Textverarbeitungen vorkommen und sollte einfach zu benutzen sein.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Gehe zu: <a href="index.htm">Inhaltsverzeichnis</a></td>
+    <td align="right"><a href="#">nach oben</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/de/common_buttons.htm
@@ -1,1 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Allgemeine Schaltfl&auml;chen</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Allgemeine Schaltfl&auml;chen</span></td>
+    <td align="right"><a href="index.htm">Inhalt</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Untenstehend eine kurze Beschreibung jeder Schaltfl&auml;che.<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bold_de_se.gif" width="20" height="20"></td>
+    <td>Fetter Text.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/italic_de_se.gif" width="20" height="20"></td>
+    <td>Kursiver Text.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>
+    <td>Unterstrichener Text.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>
+    <td>Durchgestrichener Text.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>
+    <td>Linksb&uuml;ndig.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>
+    <td>Zentriert.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>
+    <td>Rechtsb&uuml;ndig.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>
+    <td>Blocksatz.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>
+    <td>Unsortierte Liste / Punktierte Liste.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>
+    <td>Sortierte Liste / Nummerierte Liste.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>
+    <td>Einzug verkleinern.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>
+    <td>Einzug vergr&ouml;ssern.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>
+    <td>Letzte Aktion r&uuml;ckg&auml;ngig machen.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>
+    <td>Letzte Aktion wiederholen.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>
+    <td>Einen neuen Hyperlink einf&uuml;gen, lesen Sie mehr &uuml;ber diese Funktion im Kapitel <a href="insert_link_button.htm">Hyperlink einf&uuml;gen</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>
+    <td>Den gegenw&auml;rtige markierten Hyperlink entfernen / Alle gegenw&auml;rtig markierten Hyperlinks entfernen.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>
+    <td>Ein neues Bild einf&uuml;gen, lesen Sie mehr &uuml;ber diese Funktion im Kapitel <a href="insert_image_button.htm">Bild einf&uuml;gen</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>
+    <td>unsauberen Code aufr&auml;umen / Entfernt ungewollte Formatierungen. Diese Funktion ist n&uuml;tzlich,
+		wenn Sie beispielsweise Inhalte aus einem Office Produkt kopieren.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>
+    <td>Zeigt diese Hilfe an.</td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Gehe zu: <a href="index.htm">Inhaltsverzeichnis</a></td>
+    <td align="right"><a href="#">nach oben</a></td>
+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/de/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/de/images/insert_link_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/de/index.htm
@@ -1,1 +1,26 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Inhaltsverzeichnis der Hilfe</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Inhaltsverzeichnis</span></td>
+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Klicken Sie auf die untenstehenden Links um die verschiedenen Bereiche der Hilfe zu betrachten. 
+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">&Uuml;ber TinyMCE</a></li>
+  <li class="toc_li"><a href="common_buttons.htm">Allgemeine Schaltfl&auml;chen</a></li>
+  <li class="toc_li"><a href="insert_image_button.htm">Schaltfl&auml;che Bild einf&uuml;gen</a></li>
+  <li class="toc_li"><a href="insert_link_button.htm">Schaltfl&auml;che Hyperlink einf&uuml;gen</a></li>
+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/de/insert_image_button.htm
@@ -1,1 +1,35 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Schaltfl&auml;che Bild einf&uuml;gen</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Schaltfl&auml;che Bild einf&uuml;gen</span></td>
+    <td align="right"><a href="index.htm">Inhalt</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Die Schaltfl&auml;che &quot;Bild einf&uuml;gen&quot; &ouml;ffnet das unten gezeigte Fenster.<br>
+<br>
+<img src="images/insert_image_window.gif" width="350" height="166"><br>
+<br>

+Beschreibung des Bildes, welche dann als alternative Textbeschreibung verwendet wird.
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Gehe zu: <a href="index.htm">Inhaltsverzeichnis</a></td>
+    <td align="right"><a href="#">nach oben</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/de/insert_link_button.htm
@@ -1,1 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Schaltfl&auml;che Hyperlink einf&uuml;gen</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Schaltfl&auml;che Hyperlink einf&uuml;gen</span></td>
+    <td align="right"><a href="index.htm">Inhalt</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Diese Schaltfl&auml;che &ouml;ffnet das Fenster f&uuml;r die &quot;Hyperlink einf&uuml;gen / bearbeiten&quot;-Funktion.<br>
+<br>
+<img src="images/insert_link_window.gif" width="330" height="166"><br>
+<br>


+ge&ouml;ffnet werden soll.
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Gehe zu: <a href="index.htm">Inhaltsverzeichnis</a></td>
+    <td align="right"><a href="#">nach oben</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/de/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/en/about.htm
@@ -1,1 +1,33 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>About TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">About TinyMCE</span></td>
+    <td align="right"><a href="index.htm">TOC</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+TinyMCE is a small WYSIWYG editor control for web browsers such as MSIE or Mozilla 
+that enables you to edit HTML contents in a more user friendly way. It has common 
+features that are found in most word processors and should not be difficult to 
+use.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Go to: <a href="index.htm">Table of contents</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/en/common_buttons.htm
@@ -1,1 +1,112 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Common buttons</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Common buttons</span></td>
+    <td align="right"><a href="index.htm">TOC</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Below is a short description about each button.<img src="../../images/spacer.gif" width="1" height="1"> 
+<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bold.gif" width="20" height="20"></td>
+    <td>Bold text style.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>
+    <td>Italic text style.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>
+    <td>Underline text style.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>
+    <td>Strikethrough text style.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>
+    <td>Align left.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>
+    <td>Align center.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>
+    <td>Align right.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>
+    <td>Align full.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>
+    <td>Unordered list/bullet list.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>
+    <td>Ordered list/numbered list</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>
+    <td>Outdent/decrease indentation.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>
+    <td>Indent/incread indentation.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>
+    <td>Undo the last operation.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>
+    <td>Redo the last operation.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>
+    <td>Insert a new link, read more about this function in the <a href="insert_link_button.htm">Insert 
+      link section</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>
+    <td>Unlinks the current selection/removes all selected links.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>
+    <td>Insert a new image, read more about this function in the <a href="insert_image_button.htm">Insert 
+      image section</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>
+    <td>Cleanup code/Removes unwanted formating. This function is useful when 
+      you copy contents from for example a office product.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>
+    <td>Shows this help window.</td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Go to: <a href="index.htm">Table of contents</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/en/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/en/images/insert_link_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/en/index.htm
@@ -1,1 +1,26 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Help Index</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Table of contents</span></td>
+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Click the links below to go to the different help sections. 
+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">About TinyMCE</a></li>
+  <li class="toc_li"><a href="common_buttons.htm">Common buttons</a></li>
+  <li class="toc_li"><a href="insert_image_button.htm">Insert image button</a></li>
+  <li class="toc_li"><a href="insert_link_button.htm">Insert link button</a></li>
+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/en/insert_image_button.htm
@@ -1,1 +1,35 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Insert image button</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Insert image button</span></td>
+    <td align="right"><a href="index.htm">TOC</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+The insert image button opens the window shown below.<br>
+<br>
+<img src="images/insert_image_window.gif" width="350" height="159"><br>
+<br>
+You simply enter a URL to the image you want to link to and enter a image description, 
+this is then displayed as an alternative text descripton of the image on the page.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Go to: <a href="index.htm">Table of contents</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/en/insert_link_button.htm
@@ -1,1 +1,35 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Insert link button</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Insert link button</span></td>
+    <td align="right"><a href="index.htm">TOC</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+This button opens a new window with the insert/edit link function.<br>
+<br>
+<img src="images/insert_link_window.gif" width="330" height="159"><br>
+<br>
+There are two fields in this window the first one &quot;Link URL&quot; is the 
+URL of the link. The target enables you to select how the link is to be opened.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Go to: <a href="index.htm">Table of contents</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/en/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/es/about.htm
@@ -1,1 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Acerca de TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Acerca de  TinyMCE</span></td>
+    <td align="right"><a href="index.htm">TOC</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+TinyMCE es un editor WYSIWYG para navegadores como  MSIE o Mozilla que te permite editar el contenido HTML de una manera m&aacute;s amigable. Tiene la mayor&iacute;a de las opciones de un procesador de texto y no deber&iacute;a ser dificil de usar.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Ir a: <a href="index.htm">Lista de contenidos</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/es/common_buttons.htm
@@ -1,1 +1,109 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Botones de uso com&uacute;n</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Botones de uso com&uacute;n</span></td>
+    <td align="right"><a href="index.htm">TOC</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Peque&ntilde;a descripci&oacute;n de cada bot&oacute;n.<img src="../../images/spacer.gif" width="1" height="1"> 
+<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bold.gif" width="20" height="20"></td>
+    <td>Texto en negrita.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>
+    <td>Texto en cursiva.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>
+    <td>Texto subrayado.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>
+    <td>Texto tachado.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>
+    <td>Alinear a la izquierda.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>
+    <td>Alinear al centro.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>
+    <td>Alinear a la derecha.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>
+    <td>Alinear justificado.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>
+    <td>Lista desordenada/lista por puntos.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>
+    <td>Lista ordenada/lista numerada</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>
+    <td>Disminuir la sangr&iacute;a.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>
+    <td>Aumentar la sangr&iacute;a.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>
+    <td>Deshacer la &uacute;ltima operaci&oacute;n.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>
+    <td>Rehacer la &uacute;ltima operaci&oacute;n.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>
+    <td>Insertar un enlace, m&aacute;s informaci&oacute;n en <a href="insert_link_button.htm">insertar enlace</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>
+    <td>Quita el enlace al texto seleccionado.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>
+    <td>Inserta una nueva imagen, m&aacute;s informaci&oacute;n en <a href="insert_image_button.htm">insertar imagen</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>
+    <td>Limpiar c&oacute;digo. Esta funci&oacute;n es &uacute;til cuando copias el c&oacute;digo de otra p&aacute;gina.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>
+    <td>Muestra esta ventana de ayuda.</td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Ir a: <a href="index.htm">Lista de contenidos</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/es/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/es/images/insert_link_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/es/index.htm
@@ -1,1 +1,26 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Indice de la ayuda</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Lista de contenidos</span></td>
+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Selecciona una secci&oacute;n para ver la ayuda. 
+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">Acerca de  TinyMCE</a></li>
+  <li class="toc_li"><a href="common_buttons.htm">Botones</a></li>
+  <li class="toc_li"><a href="insert_image_button.htm">Insertar imagen</a></li>
+  <li class="toc_li"><a href="insert_link_button.htm">Insertar enlaces</a></li>
+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/es/insert_image_button.htm
@@ -1,1 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Insertar imagen</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Insertar imagen</span></td>
+    <td align="right"><a href="index.htm">TOC</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+El bot&oacute;n insertar imagen abre la siguiente ventana.<br>
+<br>
+<img src="images/insert_image_window.gif" width="350" height="159"><br>
+<br>
+Tu s&oacute;lo tienes que escribir la URL de la imagen que quieres que aparezca y escribir una descripci&oacute;n de esta, esta descripci&oacute;n aparecera como un texto alternativo que describa la imagen.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Ir a: <a href="index.htm">Lista de contenidos</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/es/insert_link_button.htm
@@ -1,1 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Insertar enlaces</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Insertar enlaces</span></td>
+    <td align="right"><a href="index.htm">TOC</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Este bot&oacute;n abre una nueva ventana con la funci&oacute;n insertar/editar enlace.<br>
+<br>
+<img src="images/insert_link_window.gif" width="330" height="159"><br>
+<br>
+Hay dos campos en esta ventana, el primero &quot;Link URL&quot; es donde hay que escribir la direcci&oacute;n del enlace. El segundo &quot;Target&quot; indica c&oacute;mo se abrir&aacute; el enlace.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Ir a: <a href="index.htm">Lista de contenidos</a></td>
+    <td align="right"><a href="#">Top</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/es/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/fr/about.htm
@@ -1,1 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>&Agrave; propos de TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">&Agrave; propos de TinyMCE</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+TinyMCE est un petit &eacute;diteur "WYSIWYG" pour page Web comme MSIE ou Mozilla qui
+vous permet de manipuler du contenu HTML d'une fa&ccedil;on plus intuitive.
+Il est simple d'utilisation et poss&egrave;de les fonctionalit&eacute;s ls plus r&eacute;pendues que l'on peut retrouver dans
+les traitements de texte.
+<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/fr/common_buttons.htm
@@ -1,1 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Outils communs</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Outils communs</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Ci-dessous une courte description de chacuns des outils.<img src="../../images/spacer.gif" width="1" height="1"> 
+<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bold_fr.gif" width="20" height="20"></td>
+    <td>Met le texte s&eacute;lectionn&eacute; en gras.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>
+    <td>Met le texte s&eacute;lectionn&eacute; en italique.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>
+    <td>Souligne le texte s&eacute;lectionn&eacute;.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>
+    <td>Barre le texte s&eacute;lectionn&eacute;.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>
+    <td>Alignement &agrave; gauche.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>
+    <td>Alignement au centr&eacute;.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>
+    <td>Alignement &agrave; droite.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>
+    <td>Texte justifi&eacute;.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>
+    <td>Liste &agrave; puces.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>
+    <td>Liste num&eacute;rot&eacute;e</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>
+    <td>R&eacute;duit l'indentation.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>
+    <td>Augmente l'indentation.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>
+    <td>Annule la derni&egrave;re op&eacute;ration.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>
+    <td>Refait la derni&egrave;re op&eacute;ration annul&eacute;e.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>
+    <td>Ins&egrave;re ou modifie un hyperlien. Allez &agrave; la page <a href="insert_link_button.htm">
+        Outil d'ajout d'hyperliens</a> pour plus de d&eacute;tails.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>
+    <td>Efface les hyperliens qui sont s&eacute;lection&eacute;es.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>
+    <td>Ins&egrave;re ou modifie une image. Allez &agrave; la page <a href="insert_image_button.htm">
+        Outil d'ajout d'images</a> pour plus de d&eacute;tails.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>
+    <td>Nettoie le code et retire les param&egrave;tres non d&eacute;sir&eacute;s.  Cet outil
+    est tr&egrave;s utile lorsque vous copiez du contenu provenant de logiciels
+    de bureatique.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>
+    <td>Affiche cette page d'aide.</td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/fr/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/fr/images/insert_link_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/fr/index.htm
@@ -1,1 +1,26 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Table des mati&egrave;res de l'aide</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Table des mati&egrave;res</span></td>
+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Faites votre s&eacute;lection parmis les th&egrave;mes suivants:
+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">&Agrave; propos de TinyMCE</a></li>
+  <li class="toc_li"><a href="common_buttons.htm">Outils communs</a></li>
+  <li class="toc_li"><a href="insert_image_button.htm">Outil d'ajout d'images</a></li>
+  <li class="toc_li"><a href="insert_link_button.htm">Outil d'ajout d'hyperliens</a></li>
+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/fr/insert_image_button.htm
@@ -1,1 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Outil d'ajout d'images</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Outil d'ajout d'images</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+L'outil d'ajout d'images ouvre la fen&ecirc;tre ci-dessous.<br>
+<br>
+<img src="images/insert_image_window.gif"><br>
+<br>
+Vous entrez tout simplement l'adresse de l'image que vous d&eacute;sirez ajouter et
+entrez une description facultative.  La description sera affich&eacute;e en texte alternatif
+sur l'image lorsqu'elle sera publi&eacute;e.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/fr/insert_link_button.htm
@@ -1,1 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Outil d'ajout d'hyperliens</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Outil d'ajout d'hyperliens</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+L'outil d'ajout d'hyperlien ouvre la fen&ecirc;tre ci-dessous.<br>
+<br>
+<img src="images/insert_link_window.gif"><br>
+<br>
+Il y a deux champs dans cette fen&ecirc;tre. L'Adresse URL est l'adresse
+de l'hyperlien.  La destination vous permet de choisir de quelle fa&ccedil;on
+l'hyperlien sera ouvert.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/fr/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/fr_ca/about.htm
@@ -1,1 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>&Agrave; propos de TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">&Agrave; propos de TinyMCE</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+TinyMCE est un petit &eacute;diteur "WYSIWYG" pour page Web comme MSIE ou Mozilla qui
+vous permet de manipuler du contenu HTML d'une fa&ccedil;on plus intuitive.
+Il est simple d'utilisation et poss&egrave;de les fonctionalit&eacute;s ls plus r&eacute;pendues que l'on peut retrouver dans
+les traitements de texte.
+<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/fr_ca/common_buttons.htm
@@ -1,1 +1,113 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Outils communs</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Outils communs</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Ci-dessous une courte description de chacuns des outils.<img src="../../images/spacer.gif" width="1" height="1"> 
+<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bold_fr.gif" width="20" height="20"></td>
+    <td>Met le texte s&eacute;lectionn&eacute; en gras.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>
+    <td>Met le texte s&eacute;lectionn&eacute; en italique.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>
+    <td>Souligne le texte s&eacute;lectionn&eacute;.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>
+    <td>Barre le texte s&eacute;lectionn&eacute;.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>
+    <td>Alignement &agrave; gauche.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>
+    <td>Alignement au centr&eacute;.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>
+    <td>Alignement &agrave; droite.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>
+    <td>Texte justifi&eacute;.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>
+    <td>Liste &agrave; puces.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>
+    <td>Liste num&eacute;rot&eacute;e</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>
+    <td>R&eacute;duit l'indentation.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>
+    <td>Augmente l'indentation.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>
+    <td>Annule la derni&egrave;re op&eacute;ration.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>
+    <td>Refait la derni&egrave;re op&eacute;ration annul&eacute;e.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>
+    <td>Ins&egrave;re ou modifie un hyperlien. Allez &agrave; la page <a href="insert_link_button.htm">
+        Outil d'ajout d'hyperliens</a> pour plus de d&eacute;tails.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>
+    <td>Efface les hyperliens qui sont s&eacute;lection&eacute;es.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>
+    <td>Ins&egrave;re ou modifie une image. Allez &agrave; la page <a href="insert_image_button.htm">
+        Outil d'ajout d'images</a> pour plus de d&eacute;tails.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>
+    <td>Nettoie le code et retire les param&egrave;tres non d&eacute;sir&eacute;s.  Cet outil
+    est tr&egrave;s utile lorsque vous copiez du contenu provenant de logiciels
+    de bureatique.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>
+    <td>Affiche cette page d'aide.</td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/fr_ca/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/fr_ca/images/insert_link_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/fr_ca/index.htm
@@ -1,1 +1,26 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Table des mati&egrave;res de l'aide</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Table des mati&egrave;res</span></td>
+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Faites votre s&eacute;lection parmis les th&egrave;mes suivants:
+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">&Agrave; propos de TinyMCE</a></li>
+  <li class="toc_li"><a href="common_buttons.htm">Outils communs</a></li>
+  <li class="toc_li"><a href="insert_image_button.htm">Outil d'ajout d'images</a></li>
+  <li class="toc_li"><a href="insert_link_button.htm">Outil d'ajout d'hyperliens</a></li>
+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/fr_ca/insert_image_button.htm
@@ -1,1 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Outil d'ajout d'images</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Outil d'ajout d'images</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+L'outil d'ajout d'images ouvre la fen&ecirc;tre ci-dessous.<br>
+<br>
+<img src="images/insert_image_window.gif"><br>
+<br>
+Vous entrez tout simplement l'adresse de l'image que vous d&eacute;sirez ajouter et
+entrez une description facultative.  La description sera affich&eacute;e en texte alternatif
+sur l'image lorsqu'elle sera publi&eacute;e.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/fr_ca/insert_link_button.htm
@@ -1,1 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Outil d'ajout d'hyperliens</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Outil d'ajout d'hyperliens</span></td>
+    <td align="right"><a href="index.htm">Table des mati&egrave;res</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+L'outil d'ajout d'hyperlien ouvre la fen&ecirc;tre ci-dessous.<br>
+<br>
+<img src="images/insert_link_window.gif"><br>
+<br>
+Il y a deux champs dans cette fen&ecirc;tre. L'Adresse URL est l'adresse
+de l'hyperlien.  La destination vous permet de choisir de quelle fa&ccedil;on
+l'hyperlien sera ouvert.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Aller &agrave;: <a href="index.htm">Table des mati&egrave;res</a></td>
+    <td align="right"><a href="#">Haut de page</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/fr_ca/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/hu/about.htm
@@ -1,1 +1,30 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>&Uuml;ber TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">A TinyMCE-r&#337;l</span></td>
+    <td align="right"><a href="index.htm">Tartalom</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+A TinyMCE egy kompakt WYSIWYG-szerkeszt&#337; az MSIE-hoz &eacute;s a Mozill&aacute;hoz hasonl&oacute; webb&ouml;ng&eacute;sz&#337;k sz&aacute;m&aacute;ra, mely lehet&#337;s&eacute;get ny&uacute;jt &ouml;nnek a HTML tartalmak egyszer&#369; szerkeszt&eacute;s&eacute;re. A legt&ouml;bb sz&ouml;vegszerkeszt&#337;ben el&eacute;rhet&#337; funkci&oacute;kat ny&uacute;jtja egyszer&#369;en kezelhet&#337; form&aacute;ban.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Ugr&aacute;s a <a href="index.htm">Tartalomjegyz&eacute;kre</a></td>
+    <td align="right"><a href="#">ugr&aacute;s a lap tetej&eacute;re </a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/hu/common_buttons.htm
@@ -1,1 +1,108 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Allgemeine Schaltfl&auml;chen</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Allgemeine Schaltfl&auml;chen</span></td>
+    <td align="right"><a href="index.htm">Tartalom</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Untenstehend eine kurze Beschreibung jeder Schaltfl&auml;che.<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bold.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>

+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/hu/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/hu/images/insert_link_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/hu/index.htm
@@ -1,1 +1,26 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Inhaltsverzeichnis der Hilfe</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 

+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<ul class="toc_ul">




+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/hu/insert_image_button.htm
@@ -1,1 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Schaltfl&auml;che Bild einf&uuml;gen</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">K&eacute;p beilleszt&eacute;se gomb </span></td>
+    <td align="right"><a href="index.htm">Tartalom</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br> 
+A K&eacute;p beilleszt&eacute;se gomb az al&aacute;bbi ablakot nyitja meg.
+<br>
+<br>
+<img src="images/insert_image_window.gif" width="350" height="166"><br>
+<br>
+Egyszer&#369;en meg kell adni a beilleszteni k&iacute;v&aacute;nt k&eacute;p el&eacute;r&eacute;s&eacute;nek URL-j&eacute;t, valamint egy r&ouml;vd le&iacute;r&aacute;st, mely alternat&iacute;v sz&ouml;vegk&eacute;nt ker&uuml;l megjelen&iacute;t&eacute;sre (pl. nem grafikus b&ouml;ng&eacute;sz&#337;kben).<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Ugr&aacute;s a <a href="index.htm">Tartalomjegyz&eacute;kre</a></td>
+    <td align="right"><a href="#">ugr&aacute;s a lap tetej&eacute;re </a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/hu/insert_link_button.htm
@@ -1,1 +1,33 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Schaltfl&auml;che Hyperlink einf&uuml;gen</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Link beilleszt&eacute;se gomb </span></td>
+    <td align="right"><a href="index.htm">Tartalom</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+A Link beilleszt&eacute;se gomb az al&aacute;bbi ablakot nyitja meg.<br>
+<br>
+<img src="images/insert_link_window.gif" width="330" height="166"><br>
+<br>
+K&eacute;t mez&#337;t kell kit&ouml;ltenie ebben az ablakban. Az els&#337; - &quot;Link URL&quot; - a hivatkoz&aacute;s URL-je. A m&aacute;sodik lehet&#337;s&eacute;get ad &Ouml;nnek a hivatkozt&aacute;s megjelen&iacute;t&eacute;s&eacute;nek kiv&aacute;laszt&aacute;s&aacute;hoz.<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>Ugr&aacute;s a <a href="index.htm">Tartalomjegyz&eacute;kre</a></td>
+    <td align="right"><a href="#">ugr&aacute;s a lap tetej&eacute;re </a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/hu/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/it/about.htm
@@ -1,1 +1,39 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+  <title>Informazioni su TinyMCE</title>
+  <link href="style.css" rel="stylesheet" type="text/css">
+</head>
+<body>
+<table class="pageheader" border="0" cellpadding="1" cellspacing="3"
+ width="100%">
+  <tbody>
+    <tr>
+      <td><span class="title">Informazioni su TinyMCE</span></td>
+      <td align="right"><a href="index.htm">TOC</a></td>
+    </tr>
+  </tbody>
+</table>
+<hr noshade="noshade">
+<br>
+TinyMCE &egrave; un piccolo WYSIWYG (What You See Is What You Get,
+quello che vedi &egrave; quello che ottieni) editor per i web browser
+come MSIE o Mozilla che permette di editare HTML in modo comodo. Ha le
+funzionalit&agrave; comuni di molti word processor e non dovrebbe
+essere difficile da usare.<br>
+<br>
+<hr noshade="noshade">
+<table class="pagefooter" border="0" cellpadding="1" cellspacing="3"
+ width="100%">
+  <tbody>
+    <tr>
+      <td>Vai a: <a href="index.htm">Tavola dei contenuti</a></td>
+      <td align="right"><a href="#">Su</a></td>
+    </tr>
+  </tbody>
+</table>
+<br>
+<br>
+</body>
+</html>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/it/common_buttons.htm
@@ -1,1 +1,127 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+  <title>Pulsanti comuni</title>
+  <link href="style.css" rel="stylesheet" type="text/css">
+</head>
+<body>
+<table class="pageheader" border="0" cellpadding="1" cellspacing="3"
+ width="100%">
+  <tbody>
+    <tr>
+      <td><span class="title">Pulsanti comuni<br>
+      </span></td>
+      <td align="right"><a href="index.htm">TOC</a></td>
+    </tr>
+  </tbody>
+</table>
+<hr noshade="noshade">
+<br>
+Di seguito una breve descrizione di ogni pulsante.<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tbody>
+    <tr>
+      <td><img src="../../images/bold.gif" height="20" width="20"></td>
+      <td>Testo <span style="font-weight: bold;">grassetto</span>.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/italic.gif" height="20" width="20"></td>
+      <td>Testo <span style="font-style: italic;">corsivo</span>.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/underline.gif" height="20" width="20"></td>
+      <td>Testo <span style="text-decoration: underline;">sottolineato</span>.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/strikethrough.gif" height="20"
+ width="20"></td>
+      <td>Testo <span style="text-decoration: line-through;">barrato</span>.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/left.gif" height="20" width="20"></td>
+      <td>Allinea a sinistra.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/center.gif" height="20" width="20"></td>
+      <td>Allinea al centro.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/right.gif" height="20" width="20"></td>
+      <td>Allinea a destra.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/full.gif" height="20" width="20"></td>
+      <td>Giustifica.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/bullist.gif" height="20" width="20"></td>
+      <td>Lista non ordinata.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/numlist.gif" height="20" width="20"></td>
+      <td>Lista ordianta.<br>
+      </td>
+    </tr>
+    <tr>
+      <td><img src="../../images/outdent.gif" height="20" width="20"></td>
+      <td>Diminuisci l'indentazione.<br>
+      </td>
+    </tr>
+    <tr>
+      <td><img src="../../images/indent.gif" height="20" width="20"></td>
+      <td>Aumenta l'indentazione.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/undo.gif" height="20" width="20"></td>
+      <td>Annulla l'ultima operazione.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/redo.gif" height="20" width="20"></td>
+      <td>Ripeti l'ultima operazione.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/link.gif" height="20" width="20"></td>
+      <td>Inserieci un nuovo collegamento, maggiori informazioni su
+questa funzione nella <a href="insert_link_button.htm">Sezione
+'Inserisci un collegamento'</a></td>
+    </tr>
+    <tr>
+      <td><img src="../../images/unlink.gif" height="20" width="20"></td>
+      <td>Rimuovi tutti i collegamenti selezionati<br>
+      </td>
+    </tr>
+    <tr>
+      <td><img src="../../images/image.gif" height="20" width="20"></td>
+      <td>Inserieci una nuova immagine, maggiori informazioni su questa
+funzione nella <a href="insert_image_button.htm">Sezione 'Inserisci
+una immagine'</a>.</td>
+    </tr>
+    <tr>
+      <td><img src="../../images/cleanup.gif" height="20" width="20"></td>
+      <td>Ripulisci il codice/rimuovi la formattazione non voluta.
+Questa funzione &egrave; utile quando si copia per esempio da un
+programma office<br>
+      </td>
+    </tr>
+    <tr>
+      <td><img src="../../images/help.gif" height="20" width="20"></td>
+      <td>Mostra questa guida<br>
+      </td>
+    </tr>
+  </tbody>
+</table>
+<br>
+<hr noshade="noshade">
+<table class="pagefooter" border="0" cellpadding="1" cellspacing="3"
+ width="100%">
+  <tbody>
+    <tr>
+      <td>Vai a: <a href="index.htm">Tavola dei contenuti</a></td>
+      <td align="right"><a href="#">Su</a></td>
+    </tr>
+  </tbody>
+</table>
+</body>
+</html>
 

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/it/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/it/images/insert_link_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/it/index.htm
@@ -1,1 +1,33 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+  <title>Indice della guida</title>
+  <link href="style.css" rel="stylesheet" type="text/css">
+</head>
+<body onload="window.focus();">
+<table class="pageheader" border="0" cellpadding="1" cellspacing="3"
+ width="100%">
+  <tbody>
+    <tr>
+      <td><span class="title">Tavola dei contenuti<br>
+      </span></td>
+      <td align="right">&nbsp;</td>
+    </tr>
+  </tbody>
+</table>
+<hr noshade="noshade">
+<br>
+Seleziona un argomento:<br>
+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">Informazioni su TinyMCE</a></li>
+  <li class="toc_li"><a href="common_buttons.htm">Pulsanti comuni</a></li>
+  <li class="toc_li"><a href="insert_image_button.htm">Pulsante
+'Inserisci immagine'<br>
+    </a></li>
+  <li class="toc_li"><a href="insert_link_button.htm">Pulsante
+'Inserisci collegamento'</a></li>
+</ul>
+<hr noshade="noshade">
+</body>
+</html>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/it/insert_image_button.htm
@@ -1,1 +1,42 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+  <title>Pulsante 'Inserisci immagine'</title>
+  <link href="style.css" rel="stylesheet" type="text/css">
+</head>
+<body>
+<table class="pageheader" border="0" cellpadding="1" cellspacing="3"
+ width="100%">
+  <tbody>
+    <tr>
+      <td><span class="title">Pulsante 'Inserisci immagine'<br>
+      </span></td>
+      <td align="right"><a href="index.htm">TOC</a></td>
+    </tr>
+  </tbody>
+</table>
+<hr noshade="noshade">
+<br>
+Il pulsante 'inserisci immagine' apre questa finestra.<br>
+<br>
+<img src="images/insert_image_window.gif" height="156" width="346"><br>
+<br>
+Semplicemente, inserite l'inidirzzo all'immagine che volete collegare e
+datene una descrizione, che sar&agrave; poi visualizzata come testo
+alternativo all'immagine nella pagina.<br>
+<br>
+<hr noshade="noshade">
+<table class="pagefooter" border="0" cellpadding="1" cellspacing="3"
+ width="100%">
+  <tbody>
+    <tr>
+      <td>Vai a: <a href="index.htm">Tavola dei contenuti</a></td>
+      <td align="right"><a href="#">Su</a></td>
+    </tr>
+  </tbody>
+</table>
+<br>
+<br>
+</body>
+</html>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/it/insert_link_button.htm
@@ -1,1 +1,43 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<html>
+<head>
+  <title>Pulsante 'Inserisci collegamento'</title>
+  <link href="style.css" rel="stylesheet" type="text/css">
+</head>
+<body>
+<table class="pageheader" border="0" cellpadding="1" cellspacing="3"
+ width="100%">
+  <tbody>
+    <tr>
+      <td><span class="title">Pulsante 'Inserisci collegamento'<br>
+      </span></td>
+      <td align="right"><a href="index.htm">TOC</a></td>
+    </tr>
+  </tbody>
+</table>
+<hr noshade="noshade">
+<br>
+Questo pulsante apre una nuova finstra con le funzioni di
+inserimento/modifica del collegamento.<br>
+<br>
+<img src="images/insert_link_window.gif" height="156" width="326"><br>
+<br>
+Ci sono due campi in questa finestra: il primo, "Link URL" &egrave;
+l'indirizzo del collegamento. Il 'target' permette di selezionare come
+il collegamento deve essere aperto.<br>
+<br>
+<hr noshade="noshade">
+<table class="pagefooter" border="0" cellpadding="1" cellspacing="3"
+ width="100%">
+  <tbody>
+    <tr>
+      <td>Vai a: <a href="index.htm">Tavola dei contenuti</a></td>
+      <td align="right"><a href="#">Su</a></td>
+    </tr>
+  </tbody>
+</table>
+<br>
+<br>
+</body>
+</html>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/it/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/pl/about.htm
@@ -1,1 +1,35 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<meta name="generator" content="WebSite PRO 4.3" />
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
+<TITLE>O TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">O TinyMCE</span></td>

+  </tr>
+</table>
+<hr noshade>
+<br>




+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/pl/common_buttons.htm
@@ -1,1 +1,114 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<meta name="generator" content="WebSite PRO 4.3" />
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">

+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bold.gif" width="20" height="20"></td>
+    <td>Pogrubienie tekstu.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/italic.gif" width="20" height="20"></td>
+    <td>Pochylenie tekstu.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>
+    <td>Wyjustowanie.</td>
+  </tr>
+   <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>


+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>


+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>


+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>
+    <td>Pokazanie tego okna pomocy.</td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/pl/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/pl/images/insert_link_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/pl/index.htm
@@ -1,1 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<meta name="generator" content="WebSite PRO 4.3" />
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">
+<TITLE>Spis pomocy</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 

+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">O TinyMCE</a></li>



+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/pl/insert_image_button.htm
@@ -1,1 +1,35 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<meta name="generator" content="WebSite PRO 4.3" />
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">

+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<img src="images/insert_image_window.gif"><br>
+<br>


+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/pl/insert_link_button.htm
@@ -1,1 +1,37 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<meta name="generator" content="WebSite PRO 4.3" />
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-2">

+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<img src="images/insert_link_window.gif" width="330" height="159"><br>
+<br>


+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/pl/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/sv/about.htm
@@ -1,1 +1,34 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>About TinyMCE</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Om TinyMCE</span></td>
+    <td align="right"><a href="index.htm">IF</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+TinyMCE &auml;r en liten WYSIWYG-editor f&ouml;r webl&auml;sare som
+MSIE och Mozilla vilken m&ouml;jligg&ouml;r f&ouml;r anv&auml;ndare att redigera 
+HTML-inneh&aring;ll p&aring; ett mer anv&auml;ndarv&auml;nligt s&auml;tt.
+Applikationen har funktioner som liknar dem man finner i vanliga ordbehandlare
+och borde inte vara speciellt sv&aring;rt att anv&auml;nda.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>G&aring; till: <a href="index.htm">Inneh&aring;llsf&ouml;rteckning</a></td>
+    <td align="right"><a href="#">Toppen</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/sv/common_buttons.htm
@@ -1,1 +1,112 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Common buttons</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Grundl&auml;ggande knappar</span></td>
+    <td align="right"><a href="index.htm">IF</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Nedan finner du en kort beskrivning av varje knapp/funktion.<br>
+<br>
+<table border="1" cellpadding="3" cellspacing="0">
+  <tr>
+    <td><img src="../../images/bold_de_se.gif" width="20" height="20"></td>
+    <td>Fet text.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/italic_de_se.gif" width="20" height="20"></td>
+    <td>Kursiv text.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/underline.gif" width="20" height="20"></td>
+    <td>Understruken text.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/strikethrough.gif" width="20" height="20"></td>
+    <td>Genomstruken text.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/left.gif" width="20" height="20"></td>
+    <td>Rak v&auml;nstermarginal.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/center.gif" width="20" height="20"></td>
+    <td>Centrera.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/right.gif" width="20" height="20"></td>
+    <td>Rak h&ouml;germarginal.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/full.gif" width="20" height="20"></td>
+    <td>Raka marginaler.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/bullist.gif" width="20" height="20"></td>
+    <td>Punktlista.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/numlist.gif" width="20" height="20"></td>
+    <td>Numrerad lista</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/outdent.gif" width="20" height="20"></td>
+    <td>Minska indrag.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/indent.gif" width="20" height="20"></td>
+    <td>&Ouml;ka utdrag.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/undo.gif" width="20" height="20"></td>
+    <td>&Aring;ngra senaste &auml;ndringen.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/redo.gif" width="20" height="20"></td>
+    <td>G&ouml;r om senaste &auml;ndringen.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/link.gif" width="20" height="20"></td>
+    <td>Skapa/Redigera l&auml;nk, l&auml;s mer om denna funktion i
+	kapitlet <a href="insert_link_button.htm">Skapa/Redigera l&auml;nk</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/unlink.gif" width="20" height="20"></td>
+    <td>Ta bort l&auml;nkar fr&aring;n markerade l&auml;nkar.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/image.gif" width="20" height="20"></td>
+    <td>Skapa/Redigera bild, l&auml;r mer om denna funktion i
+      kapitlet <a href="insert_image_button.htm">Skapa/Redigera bild</a>.</td>
+  </tr>
+  <tr>
+    <td><img src="../../images/cleanup.gif" width="20" height="20"></td>
+    <td>Rensa/St&auml;da k&aring;den. Denna funktion tar bort on&ouml;dig
+      formatering. B&ouml;r anv&auml;ndas n&auml;r man t.ex. kopierar text
+      fr&aring;n Office-program. </td>
+  </tr>
+  <tr>
+    <td><img src="../../images/help.gif" width="20" height="20"></td>
+    <td>Visad denna hj&auml;lp</td>
+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>G&aring; till: <a href="index.htm">Inneh&aring;llsf&ouml;rteckning</a></td>
+    <td align="right"><a href="#">Toppen</a></td>
+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/sv/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/sv/images/insert_link_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/sv/index.htm
@@ -1,1 +1,28 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Help Index</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Inneh&aring;llsf&ouml;rteckning</span></td>
+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Klicka p&aring; l&auml;nkarna nedan f&ouml;r att g&aring; till olika
+hj&auml;lpkapitel.
 
+<ul class="toc_ul">
+  <li class="toc_li"><a href="about.htm">Om TinyMCE</a></li>
+  <li class="toc_li"><a href="common_buttons.htm">Grundl&auml;ggande funktioner</a></li>
+  <li class="toc_li"><a href="insert_image_button.htm">Skapa/Redigera bild</a></li>
+  <li class="toc_li"><a href="insert_link_button.htm">Skapa/Redigera l&auml;nk</a></li>
+</ul>
+<hr noshade>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/sv/insert_image_button.htm
@@ -1,1 +1,36 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Insert image button</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Skapa/Redigera bild</span></td>
+    <td align="right"><a href="index.htm">IF</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Skapa/Redigera bild-funktionen &ouml;ppnar ett nytt f&ouml;nster som ser ut som 
+bilden nedan.<br>
+<br>
+<img src="images/insert_image_window.gif" width="330" height="159"><br>
+<br>
+I detta f&ouml;nster skriver du in URL:en till bilden du vill l&auml;nka till 
+samt en bildbeskrivning, denna beskrivning kommer att visas som en alternativ 
+text till bilden.<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>G&aring; till: <a href="index.htm">Inneh&aring;llsf&ouml;rteckning</a></td>
+    <td align="right"><a href="#">Toppen</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/sv/insert_link_button.htm
@@ -1,1 +1,35 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+<HTML>
+<HEAD>
+<TITLE>Insert link button</TITLE>
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 
+    <td><span class="title">Skapa/Redigera l&auml;nk</span></td>
+    <td align="right"><a href="index.htm">IF</a></td>
+  </tr>
+</table>
+<hr noshade>
+<br>
+Denna funktion &ouml;ppnar ett nytt f&ouml;nster liknande det nedan.<br>
+<br>
+<img src="images/insert_link_window.gif" width="330" height="159"><br>
+<br>
+Detta f&ouml;nster har tv&aring; f&auml;lt l&auml;nkens URL/adress samt hur l&auml;nken 
+skall &ouml;ppnas.<br>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 
+    <td>G&aring; till: <a href="index.htm">Inneh&aring;llsf&ouml;rteckning</a></td>
+    <td align="right"><a href="#">Toppen</a></td>
+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/sv/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/zh_cn/about.htm
@@ -1,1 +1,30 @@
+<HTML>
+<HEAD>

+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/zh_cn/common_buttons.htm
@@ -1,1 +1,109 @@
+<HTML>
+<HEAD>

+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>
+<br>

+<br>
+<br>
+<table cellpadding="3" cellspacing="1" bgcolor="#111111">
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/bold.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/italic.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/underline.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/strikethrough.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/left.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/center.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/right.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/full.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/bullist.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/numlist.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/outdent.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/indent.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/undo.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/redo.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/link.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/unlink.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/image.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/cleanup.gif" width="20" height="20"></td>

+  </tr>
+  <tr>
+    <td bgcolor="#FFFFFF"><img src="../../images/help.gif" width="20" height="20"></td>

+  </tr>
+</table>
+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+</BODY>
+</HTML>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/zh_cn/images/insert_image_window.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/docs/zh_cn/images/insert_link_window.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/zh_cn/index.htm
@@ -1,1 +1,26 @@
+<HTML>
+<HEAD>

+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
+<BODY onload="window.focus();">
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 

+    <td align="right">&nbsp;</td>
+  </tr>
+</table>
+<hr noshade>
+<br>

+<ul class="toc_ul">




+</ul>
+<hr noshade>
+</BODY>
+</HTML>
 

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/zh_cn/insert_image_button.htm
@@ -1,1 +1,32 @@
+<HTML>
+<HEAD>

+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>

+<br>
+<img src="images/insert_image_window.gif" width="360" height="155" border="0"><br>

+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/zh_cn/insert_link_button.htm
@@ -1,1 +1,32 @@
+<HTML>
+<HEAD>

+<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
+<link href="style.css" rel="stylesheet" type="text/css">
+</HEAD>
 
+<BODY>
+
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pageheader">
+  <tr> 


+  </tr>
+</table>
+<hr noshade>

+<br>
+<img src="images/insert_link_window.gif" width="320" height="155" border="0"><br>

+<br>
+<hr noshade>
+<table width="100%" border="0" cellpadding="1" cellspacing="3" class="pagefooter">
+  <tr> 


+  </tr>
+</table>
+<br>
+</BODY>
+</HTML>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/docs/zh_cn/style.css
@@ -1,1 +1,29 @@
+body { background-color: #FFFFFF; }
+body, td, .content { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 12px; }
+.title { font-family: Verdana, Arial, helvetica, sans-serif; font-size: 16px; font-weight: bold; }
+.subtitle { font-size: 12px; font-weight: bold; }
 
+.toc_ul, .toc_li { margin-left: 8 px; line-height: 16px; }
+.step_ol, .step_li { margin-left: 11 px; line-height: 16px; }
+img { border: #000000 solid 1px; }
+
+a:visited { color: #666666; text-decoration: underline; }
+a:active { color: #666666; text-decoration: underline; }
+a:hover { color: #666666; text-decoration: underline; }
+a { color: #666666; text-decoration: underline; }
+
+.pageheader { border: #E0E0E0 solid 1px; }
+.pagefooter { border: #E0E0E0 solid 1px; }
+.sample { background-color: #FFFFFF; border: #000000 solid 1px; }
+.samplecontent { font-size: 10px; }
+
+.code { background-color: #FFFFFF; border: #000000 solid 1px; }
+.codecontent { font-size: 10px; }
+.codecontent a:visited { color: #666666; text-decoration: none; font-weight: bold }
+.codecontent a:active { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a:hover { color: #666666; text-decoration: none; font-weight: bold  }
+.codecontent a { color: #666666; text-decoration: none; font-weight: bold  }
+
+hr { height: 1px; }
+
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/editor_content.css
@@ -1,1 +1,28 @@
+body {
+	background-color: #FFFFFF;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+	scrollbar-3dlight-color: #F0F0EE;
+	scrollbar-arrow-color: #676662;
+	scrollbar-base-color: #F0F0EE;
+	scrollbar-darkshadow-color: #DDDDDD;
+	scrollbar-face-color: #E0E0DD;
+	scrollbar-highlight-color: #F0F0EE;
+	scrollbar-shadow-color: #F0F0EE;
+	scrollbar-track-color: #F5F5F5;
+}
 
+td {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+}
+
+pre {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+}
+
+.mceVisualAid {
+	border: 1px dashed #BBBBBB;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/editor_popup.css
@@ -1,1 +1,41 @@
+body {
+	background-color: #F0F0EE;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 11px;
+	scrollbar-3dlight-color: #F0F0EE;
+	scrollbar-arrow-color: #676662;
+	scrollbar-base-color: #F0F0EE;
+	scrollbar-darkshadow-color: #DDDDDD;
+	scrollbar-face-color: #E0E0DD;
+	scrollbar-highlight-color: #F0F0EE;
+	scrollbar-shadow-color: #F0F0EE;
+	scrollbar-track-color: #F5F5F5;
+}
 
+td {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 11px;
+}
+
+input {
+	background: #FFFFFF;
+	border: 1px solid #cccccc;
+}
+
+td, input, select, textarea {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+}
+
+input, select, textarea {
+	border: 1px solid #808080;
+}
+
+.input_noborder {
+	border: 0px solid #808080;
+}
+
+.title {
+	font-size: 12px;
+	font-weight: bold;
+}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/editor_template.js
@@ -1,1 +1,32 @@
-
+function TinyMCE_default_getEditorTemplate(){var template=new Array();template['html']='\
+<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}">\
+<tr><td align="center">\
+<span id="{$editor_id}">IFRAME</span>\
+</td></tr>\
+<tr><td class="mceToolbar" align="center" height="1">\
+<img id="{$editor_id}_bold" src="{$themeurl}/images/{$lang_bold_img}" title="{$lang_bold_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Bold\')">\
+<img id="{$editor_id}_italic" src="{$themeurl}/images/{$lang_italic_img}" title="{$lang_italic_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Italic\')">\
+<img id="{$editor_id}_underline" src="{$themeurl}/images/{$lang_underline_img}" title="{$lang_underline_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Underline\')">\
+<img id="{$editor_id}_strikethrough" src="{$themeurl}/images/strikethrough.gif" title="{$lang_striketrough_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Strikethrough\')">\
+<img src="{$themeurl}/images/spacer.gif" width="1" height="15" class="mceSeparatorLine">\
+<img id="{$editor_id}_left" src="{$themeurl}/images/left.gif" title="{$lang_justifyleft_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyLeft\')">\
+<img id="{$editor_id}_center" src="{$themeurl}/images/center.gif" title="{$lang_justifycenter_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyCenter\')">\
+<img id="{$editor_id}_right" src="{$themeurl}/images/right.gif" title="{$lang_justifyright_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyRight\')">\
+<img id="{$editor_id}_full" src="{$themeurl}/images/full.gif" title="{$lang_justifyfull_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyFull\')">\
+<img src="{$themeurl}/images/spacer.gif" width="1" height="15" class="mceSeparatorLine">\
+<img src="{$themeurl}/images/outdent.gif" title="{$lang_outdent_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Outdent\')">\
+<img src="{$themeurl}/images/indent.gif" title="{$lang_indent_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Indent\')">\
+<br>\
+<img id="{$editor_id}_bullist" src="{$themeurl}/images/bullist.gif" title="{$lang_bullist_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'InsertUnorderedList\')">\
+<img id="{$editor_id}_numlist" src="{$themeurl}/images/numlist.gif" title="{$lang_numlist_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'InsertOrderedList\')">\
+<img src="{$themeurl}/images/spacer.gif" width="1" height="15" width="20" height="20" class="mceSeparatorLine">\
+<img src="{$themeurl}/images/undo.gif" title="{$lang_undo_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Undo\')">\
+<img src="{$themeurl}/images/redo.gif" title="{$lang_redo_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Redo\')">\
+<img src="{$themeurl}/images/spacer.gif" width="1" height="15" class="mceSeparatorLine">\
+<img id="{$editor_id}_link" src="{$themeurl}/images/link.gif" title="{$lang_link_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceLink\', true)">\
+<img src="{$themeurl}/images/unlink.gif" title="{$lang_unlink_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'unlink\')">\
+<img id="{$editor_id}_image" src="{$themeurl}/images/image.gif" title="{$lang_image_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceImage\', true)">\
+<img src="{$themeurl}/images/cleanup.gif" title="{$lang_cleanup_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceCleanup\')">\
+<img src="{$themeurl}/images/help.gif" title="{$lang_help_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceHelp\')">\
+</td></tr>\
+</table>';template['delta_width']=0;template['delta_height']=-40;return template;}function TinyMCE_default_getInsertLinkTemplate(){var template=new Array();template['file']='link.htm';template['width']=320;template['height']=200;template['width']+=tinyMCE.getLang('lang_insert_link_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_link_delta_height',0);return template;}function TinyMCE_default_getInsertImageTemplate(){var template=new Array();template['file']='image.htm';template['width']=360;template['height']=200;template['width']+=tinyMCE.getLang('lang_insert_image_delta_width',0);template['height']+=tinyMCE.getLang('lang_insert_image_delta_height',0);return template;}function TinyMCE_default_handleNodeChange(editor_id,node){tinyMCE.switchClassSticky(editor_id+'_left','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_right','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_center','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_full','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_bold','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_italic','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_underline','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_strikethrough','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_bullist','mceButtonNormal');tinyMCE.switchClassSticky(editor_id+'_numlist','mceButtonNormal');alignNode=node;breakOut=false;do{if(!alignNode.getAttribute||!alignNode.getAttribute('align'))continue;switch(alignNode.getAttribute('align').toLowerCase()){case "left":tinyMCE.switchClassSticky(editor_id+'_left','mceButtonSelected');breakOut=true;break;case "right":tinyMCE.switchClassSticky(editor_id+'_right','mceButtonSelected');breakOut=true;break;case "middle":case "center":tinyMCE.switchClassSticky(editor_id+'_center','mceButtonSelected');breakOut=true;break;case "justify":tinyMCE.switchClassSticky(editor_id+'_full','mceButtonSelected');breakOut=true;break;}}while(!breakOut&&(alignNode=alignNode.parentNode));do{switch(node.nodeName.toLowerCase()){case "b":case "strong":tinyMCE.switchClassSticky(editor_id+'_bold','mceButtonSelected');break;case "i":case "em":tinyMCE.switchClassSticky(editor_id+'_italic','mceButtonSelected');break;case "u":tinyMCE.switchClassSticky(editor_id+'_underline','mceButtonSelected');break;case "strike":tinyMCE.switchClassSticky(editor_id+'_strikethrough','mceButtonSelected');break;case "ul":tinyMCE.switchClassSticky(editor_id+'_bullist','mceButtonSelected');break;case "ol":tinyMCE.switchClassSticky(editor_id+'_numlist','mceButtonSelected');break;}}while((node=node.parentNode));}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/editor_template_src.js
@@ -1,1 +1,152 @@
+function TinyMCE_default_getEditorTemplate() {
+	var template = new Array();
 
+	template['html'] = '\
+<table class="mceEditor" border="0" cellpadding="0" cellspacing="0" width="{$width}" height="{$height}">\
+<tr><td align="center">\
+<span id="{$editor_id}">IFRAME</span>\
+</td></tr>\
+<tr><td class="mceToolbar" align="center" height="1">\
+<img id="{$editor_id}_bold" src="{$themeurl}/images/{$lang_bold_img}" title="{$lang_bold_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Bold\')">\
+<img id="{$editor_id}_italic" src="{$themeurl}/images/{$lang_italic_img}" title="{$lang_italic_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Italic\')">\
+<img id="{$editor_id}_underline" src="{$themeurl}/images/{$lang_underline_img}" title="{$lang_underline_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Underline\')">\
+<img id="{$editor_id}_strikethrough" src="{$themeurl}/images/strikethrough.gif" title="{$lang_striketrough_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Strikethrough\')">\
+<img src="{$themeurl}/images/spacer.gif" width="1" height="15" class="mceSeparatorLine">\
+<img id="{$editor_id}_left" src="{$themeurl}/images/left.gif" title="{$lang_justifyleft_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyLeft\')">\
+<img id="{$editor_id}_center" src="{$themeurl}/images/center.gif" title="{$lang_justifycenter_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyCenter\')">\
+<img id="{$editor_id}_right" src="{$themeurl}/images/right.gif" title="{$lang_justifyright_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyRight\')">\
+<img id="{$editor_id}_full" src="{$themeurl}/images/full.gif" title="{$lang_justifyfull_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'JustifyFull\')">\
+<img src="{$themeurl}/images/spacer.gif" width="1" height="15" class="mceSeparatorLine">\
+<img src="{$themeurl}/images/outdent.gif" title="{$lang_outdent_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Outdent\')">\
+<img src="{$themeurl}/images/indent.gif" title="{$lang_indent_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Indent\')">\
+<br>\
+<img id="{$editor_id}_bullist" src="{$themeurl}/images/bullist.gif" title="{$lang_bullist_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'InsertUnorderedList\')">\
+<img id="{$editor_id}_numlist" src="{$themeurl}/images/numlist.gif" title="{$lang_numlist_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'InsertOrderedList\')">\
+<img src="{$themeurl}/images/spacer.gif" width="1" height="15" width="20" height="20" class="mceSeparatorLine">\
+<img src="{$themeurl}/images/undo.gif" title="{$lang_undo_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Undo\')">\
+<img src="{$themeurl}/images/redo.gif" title="{$lang_redo_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'Redo\')">\
+<img src="{$themeurl}/images/spacer.gif" width="1" height="15" class="mceSeparatorLine">\
+<img id="{$editor_id}_link" src="{$themeurl}/images/link.gif" title="{$lang_link_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceLink\', true)">\
+<img src="{$themeurl}/images/unlink.gif" title="{$lang_unlink_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'unlink\')">\
+<img id="{$editor_id}_image" src="{$themeurl}/images/image.gif" title="{$lang_image_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceImage\', true)">\
+<img src="{$themeurl}/images/cleanup.gif" title="{$lang_cleanup_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceCleanup\')">\
+<img src="{$themeurl}/images/help.gif" title="{$lang_help_desc}" width="20" height="20" class="mceButtonNormal" onmouseover="tinyMCE.switchClass(this,\'mceButtonOver\');" onmouseout="tinyMCE.restoreClass(this);" onmousedown="tinyMCE.restoreAndSwitchClass(this,\'mceButtonDown\');tinyMCE.execInstanceCommand(\'{$editor_id}\',\'mceHelp\')">\
+</td></tr>\
+</table>';
+
+	template['delta_width'] = 0;
+	template['delta_height'] = -40;
+
+	return template;
+}
+
+/**
+ * Insert link template function.
+ */
+function TinyMCE_default_getInsertLinkTemplate() {
+	var template = new Array();
+
+	template['file'] = 'link.htm';
+	template['width'] = 320;
+	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);
+
+	return template;
+}
+
+/**
+ * Insert image template function.
+ */
+function TinyMCE_default_getInsertImageTemplate() {
+	var template = new Array();
+
+	template['file'] = 'image.htm';
+	template['width'] = 360;
+	template['height'] = 200;
+
+	// 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);
+
+	return template;
+}
+
+function TinyMCE_default_handleNodeChange(editor_id, node) {
+	// Reset old states
+	tinyMCE.switchClassSticky(editor_id + '_left', 'mceButtonNormal');
+	tinyMCE.switchClassSticky(editor_id + '_right', 'mceButtonNormal');
+	tinyMCE.switchClassSticky(editor_id + '_center', 'mceButtonNormal');
+	tinyMCE.switchClassSticky(editor_id + '_full', 'mceButtonNormal');
+	tinyMCE.switchClassSticky(editor_id + '_bold', 'mceButtonNormal');
+	tinyMCE.switchClassSticky(editor_id + '_italic', 'mceButtonNormal');
+	tinyMCE.switchClassSticky(editor_id + '_underline', 'mceButtonNormal');
+	tinyMCE.switchClassSticky(editor_id + '_strikethrough', 'mceButtonNormal');
+	tinyMCE.switchClassSticky(editor_id + '_bullist', 'mceButtonNormal');
+	tinyMCE.switchClassSticky(editor_id + '_numlist', 'mceButtonNormal');
+
+	// Handle align attributes
+	alignNode = node;
+	breakOut = false;
+	do {
+		if (!alignNode.getAttribute || !alignNode.getAttribute('align'))
+			continue;
+
+		switch (alignNode.getAttribute('align').toLowerCase()) {
+			case "left":
+				tinyMCE.switchClassSticky(editor_id + '_left', 'mceButtonSelected');
+				breakOut = true;
+			break;
+
+			case "right":
+				tinyMCE.switchClassSticky(editor_id + '_right', 'mceButtonSelected');
+				breakOut = true;
+			break;
+
+			case "middle":
+			case "center":
+				tinyMCE.switchClassSticky(editor_id + '_center', 'mceButtonSelected');
+				breakOut = true;
+			break;
+
+			case "justify":
+				tinyMCE.switchClassSticky(editor_id + '_full', 'mceButtonSelected');
+				breakOut = true;
+			break;
+		}
+	} while (!breakOut && (alignNode = alignNode.parentNode));
+
+	// Handle elements
+	do {
+		switch (node.nodeName.toLowerCase()) {
+			case "b":
+			case "strong":
+				tinyMCE.switchClassSticky(editor_id + '_bold', 'mceButtonSelected');
+			break;
+
+			case "i":
+			case "em":
+				tinyMCE.switchClassSticky(editor_id + '_italic', 'mceButtonSelected');
+			break;
+
+			case "u":
+				tinyMCE.switchClassSticky(editor_id + '_underline', 'mceButtonSelected');
+			break;
+
+			case "strike":
+				tinyMCE.switchClassSticky(editor_id + '_strikethrough', 'mceButtonSelected');
+			break;
+			
+			case "ul":
+				tinyMCE.switchClassSticky(editor_id + '_bullist', 'mceButtonSelected');
+			break;
+
+			case "ol":
+				tinyMCE.switchClassSticky(editor_id + '_numlist', 'mceButtonSelected');
+			break;
+		}
+	} while ((node = node.parentNode));
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/editor_ui.css
@@ -1,1 +1,100 @@
+.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected {
+	margin-top: 1px;
+	margin-left: 1px;
+}
 
+.mceButtonNormal {
+	border-top: 1px solid;
+	border-left: 1px solid;
+	border-bottom: 1px solid;
+	border-right: 1px solid;
+	border-color: #F0F0EE;
+	cursor: arrow;
+}
+
+.mceButtonOver {
+/*	border-top: 1px solid buttonhighlight;
+	border-left: 1px solid buttonhighlight;
+	border-bottom: 1px solid buttonshadow;
+	border-right: 1px solid buttonshadow;*/
+	border: 1px solid #0A246A;
+	cursor: arrow;
+	background-color: #B6BDD2;
+}
+
+.mceButtonDown {
+/*	border-bottom: 1px solid buttonhighlight;
+	border-right: 1px solid buttonhighlight;
+	border-top: 1px solid buttonshadow;
+	border-left: 1px solid buttonshadow;*/
+	cursor: arrow;
+	border: 1px solid #0A246A;
+	background-color: #8592B5;
+}
+
+.mceButtonDisabled {
+	filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);
+	border-top: 1px solid;
+	border-left: 1px solid;
+	border-bottom: 1px solid;
+	border-right: 1px solid;
+	border-color: #F0F0EE;
+	cursor: arrow;
+}
+
+.mceSeparator {
+	border-top: 1px solid buttonhighlight;
+	border-left: 1px solid buttonhighlight;
+	border-bottom: 1px solid buttonshadow;
+	border-right: 1px solid buttonshadow;
+	margin-right: 2px;
+	margin-left: 2px;
+}
+
+.mceSeparatorLine {
+	margin:2px;
+	margin-left: 4px;
+	background-color: #F0F0EE;
+	border-top: 1px solid buttonshadow;
+	border-left: 1px solid buttonshadow;
+	border-bottom: 1px solid buttonhighlight;
+	border-right: 1px solid buttonhighlight;
+	width: 0px;
+	height: 15px;
+}
+
+.mceSelectList {
+	font-family: "MS Sans Serif";
+	font-size: 7pt;
+	font-weight: normal;
+	margin-top: 2px;
+}
+
+.mceLabel, .mceLabelDisabled {
+	font-family: "MS Sans Serif";
+	font-size: 9pt;
+}
+
+.mceLabel {
+	color: #000000;
+}
+
+.mceLabelDisabled {
+	cursor: text;
+	color: #999999;
+}
+
+.mceEditor {
+	background: #F0F0EE;
+	border: 1px solid #cccccc;
+}
+
+.mceEditorArea {
+	font-family: "MS Sans Serif";
+	background: #FFFFFF;
+}
+
+.mceToolbar {
+	background: #F0F0EE;
+	border-top: 1px solid #cccccc;
+}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/image.htm
@@ -1,1 +1,58 @@
+<html>
+<head>
+<title>{$lang_insert_image_title}</title>
+<script language="javascript" src="../../tiny_mce_popup.js"></script>
+<script language="javascript">
+	function insertImage() {
+		if (window.opener) {
+			var src = document.forms[0].src.value;
+			var alt = document.forms[0].alt.value;
 
+			window.opener.tinyMCE.insertImage(src, alt);
+			top.close();
+		}
+	}
+
+	function init() {
+		var formObj = document.forms[0];
+
+		formObj.src.value = tinyMCE.getWindowArg('src');
+		formObj.alt.value = tinyMCE.getWindowArg('alt');
+		formObj.insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true); 
+
+		window.focus();
+	}
+
+	function cancelAction() {
+		top.close();
+	}
+</script>
+</head>
+<body onload="window.focus();init();">
+<form onsubmit="insertImage();return false;">
+  <table border="0" cellpadding="0" cellspacing="0" width="100%">
+    <tr>
+      <td align="center" valign="middle"><table border="0" cellpadding="4" cellspacing="0">
+          <tr>
+            <td colspan="2" class="title">{$lang_insert_image_title}</td>
+          </tr>
+          <tr>
+            <td>{$lang_insert_image_src}:</td>
+            <td><input name="src" type="text" id="src" value="" style="width: 200px"></td>
+          </tr>
+          <tr>
+            <td>{$lang_insert_image_alt}:</td>
+            <td><input name="alt" type="text" id="alt" value="" style="width: 200px"></td>
+          </tr>
+          <tr>
+            <td><input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertImage();">
+            </td>
+            <td align="right"><input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="cancelAction();"></td>
+          </tr>
+        </table></td>
+    </tr>
+  </table>
+</form>
+</body>
+</html>
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/bold.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/bold_de_se.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/bold_fr.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/bold_ru.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/bullist.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/center.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/cleanup.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/copy.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/cut.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/full.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/help.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/image.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/indent.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/italic.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/italic_de_se.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/italic_ru.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/left.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/link.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/numlist.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/outdent.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/paste.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/redo.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/right.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/spacer.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/strikethrough.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/underline.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/underline_ru.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/undo.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/default/images/unlink.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/default/link.htm
@@ -1,1 +1,65 @@
+<html>
+<head>
+<title>{$lang_insert_link_title}</title>
+<script language="javascript" src="../../tiny_mce_popup.js"></script>
+<script language="javascript">
+	function init() {
+		for (var i=0; i<document.forms[0].target.options.length; i++) {
+			var option = document.forms[0].target.options[i];
 
+			if (option.value == tinyMCE.getWindowArg('target'))
+				option.selected = true;
+		}
+
+		document.forms[0].href.value = tinyMCE.getWindowArg('href');
+		document.forms[0].insert.value = tinyMCE.getLang('lang_' + tinyMCE.getWindowArg('action'), 'Insert', true); 
+
+		window.focus();
+	}
+
+	function insertLink() {
+		if (window.opener) {
+			var href = document.forms[0].href.value;
+			var target = document.forms[0].target.options[document.forms[0].target.selectedIndex].value;
+
+			window.opener.tinyMCE.insertLink(href, target);
+			top.close();
+		}
+	}
+
+	function cancelAction() {
+		top.close();
+	}
+</script>
+</head>
+<body onload="init();">
+<form onsubmit="insertLink();return false;">
+  <table border="0" cellpadding="0" cellspacing="0" width="100%">
+    <tr>
+      <td align="center" valign="middle"><table border="0" cellpadding="4" cellspacing="0">
+          <tr>
+            <td colspan="2" class="title">{$lang_insert_link_title}</td>
+          </tr>
+          <tr>
+            <td>{$lang_insert_link_url}:</td>
+            <td><input name="href" type="text" id="href" value="" style="width: 200px"></td>
+          </tr>
+          <tr>
+            <td>{$lang_insert_link_target}:</td>
+            <td><select name="target" style="width: 200px">
+                <option value="_self">{$lang_insert_link_target_same}</option>
+                <option value="_blank">{$lang_insert_link_target_blank}</option>
+            </select></td>
+          </tr>
+          <tr>
+            <td><input type="button" id="insert" name="insert" value="{$lang_insert}" onclick="insertLink();">
+            </td>
+            <td align="right"><input type="button" id="cancel" name="cancel" value="{$lang_cancel}" onclick="cancelAction();"></td>
+          </tr>
+        </table></td>
+    </tr>
+  </table>
+</form>
+</body>
+</html>
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/simple/css/editor_content.css
@@ -1,1 +1,26 @@
+body, td, pre {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+}
 
+body {
+	background-color: #FFFFFF;
+}
+
+.mceVisualAid {
+	border: 1px dashed #BBBBBB;
+}
+
+/* MSIE specific */
+
+* html body {
+	scrollbar-3dlight-color: #F0F0EE;
+	scrollbar-arrow-color: #676662;
+	scrollbar-base-color: #F0F0EE;
+	scrollbar-darkshadow-color: #DDDDDD;
+	scrollbar-face-color: #E0E0DD;
+	scrollbar-highlight-color: #F0F0EE;
+	scrollbar-shadow-color: #F0F0EE;
+	scrollbar-track-color: #F5F5F5;	
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/simple/css/editor_popup.css
@@ -1,1 +1,41 @@
+body {
+	background-color: #F0F0EE;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 11px;
+	scrollbar-3dlight-color: #F0F0EE;
+	scrollbar-arrow-color: #676662;
+	scrollbar-base-color: #F0F0EE;
+	scrollbar-darkshadow-color: #DDDDDD;
+	scrollbar-face-color: #E0E0DD;
+	scrollbar-highlight-color: #F0F0EE;
+	scrollbar-shadow-color: #F0F0EE;
+	scrollbar-track-color: #F5F5F5;
+}
 
+td {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 11px;
+}
+
+input {
+	background: #FFFFFF;
+	border: 1px solid #cccccc;
+}
+
+td, input, select, textarea {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+}
+
+input, select, textarea {
+	border: 1px solid #808080;
+}
+
+.input_noborder {
+	border: 0;
+}
+
+.title {
+	font-size: 12px;
+	font-weight: bold;
+}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/simple/css/editor_ui.css
@@ -1,1 +1,126 @@
+.mceSeparatorLine {
+	border: 0;
+	padding: 0;
+	margin-left: 4px;
+	margin-right: 2px;
+}
 
+.mceSelectList {
+	font-family: "MS Sans Serif";
+	font-size: 7pt;
+	font-weight: normal;
+	margin-top: 2px;
+}
+
+.mceLabel, .mceLabelDisabled {
+	font-family: "MS Sans Serif";
+	font-size: 9pt;
+}
+
+.mceLabel {
+	color: #000000;
+}
+
+.mceLabelDisabled {
+	cursor: text;
+	color: #999999;
+}
+
+.mceEditor {
+	background: #F0F0EE;
+	border: 1px solid #cccccc;
+}
+
+.mceEditorArea {
+	font-family: "MS Sans Serif";
+	background: #FFFFFF;
+}
+
+.mceToolbar {
+	background: #F0F0EE;
+	border-top: 1px solid #cccccc;
+	line-height: 1px;
+	font-size: 1px;
+	padding-bottom: 1px;
+}
+
+.mceEditorIframe {
+	border: 0;
+}
+
+/* Button CSS rules */
+
+a.mceButtonDisabled img, a.mceButtonNormal img, a.mceButtonSelected img {
+	width: 20px;
+	height: 20px;
+	cursor: default;
+	margin-top: 1px;
+	margin-left: 1px;
+}
+
+a.mceButtonDisabled img {
+	border: 0 !important;
+}
+
+a.mceButtonNormal img, a.mceButtonSelected img {
+	border: 1px solid #F0F0EE !important;
+}
+
+a.mceButtonSelected img {
+	border: 1px solid #C0C0BB !important;
+}
+
+a.mceButtonNormal img:hover, a.mceButtonSelected img:hover {
+	border: 1px solid #0A246A !important;
+	cursor: default;
+	background-color: #B6BDD2;
+}
+
+a.mceButtonDisabled img {
+	-moz-opacity:0.3;
+	opacity: 0.3;
+	border: 1px solid #F0F0EE !important;
+	cursor: default;
+}
+
+a.mceTiledButton img {
+	background-image: url('../images/buttons.gif');
+	background-repeat: no-repeat;
+}
+
+/* MSIE specific rules */
+
+* html a.mceButtonNormal img, * html a.mceButtonSelected img, * html a.mceButtonDisabled img {
+	border: 0px !important;
+	margin-top: 2px;
+	margin-bottom: 1px;
+}
+
+* html a.mceButtonDisabled img {
+	filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);
+	border: 0px !important;
+}
+
+* html a.mceButtonDisabled {
+	border: 1px solid #F0F0EE !important;
+}
+
+* html a.mceButtonNormal, * html a.mceButtonSelected {
+	border: 1px solid #F0F0EE;
+	cursor: default;
+}
+
+* html a.mceButtonSelected {
+	border: 1px solid #C0C0BB;
+}
+
+* html a.mceButtonNormal:hover, * html a.mceButtonSelected:hover {
+	border: 1px solid #0A246A;
+	cursor: default;
+	background-color: #B6BDD2;
+}
+
+* html .mceSelectList {
+	margin-top: 2px;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/simple/editor_content.css
@@ -1,1 +1,28 @@
+body {
+	background-color: #FFFFFF;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+	scrollbar-3dlight-color: #F0F0EE;
+	scrollbar-arrow-color: #676662;
+	scrollbar-base-color: #F0F0EE;
+	scrollbar-darkshadow-color: #DDDDDD;
+	scrollbar-face-color: #E0E0DD;
+	scrollbar-highlight-color: #F0F0EE;
+	scrollbar-shadow-color: #F0F0EE;
+	scrollbar-track-color: #F5F5F5;
+}
 
+td {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+}
+
+pre {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+}
+
+.mceVisualAid {
+	border: 1px dashed #BBBBBB;
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/simple/editor_popup.css
@@ -1,1 +1,41 @@
+body {
+	background-color: #F0F0EE;
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 11px;
+	scrollbar-3dlight-color: #F0F0EE;
+	scrollbar-arrow-color: #676662;
+	scrollbar-base-color: #F0F0EE;
+	scrollbar-darkshadow-color: #DDDDDD;
+	scrollbar-face-color: #E0E0DD;
+	scrollbar-highlight-color: #F0F0EE;
+	scrollbar-shadow-color: #F0F0EE;
+	scrollbar-track-color: #F5F5F5;
+}
 
+td {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 11px;
+}
+
+input {
+	background: #FFFFFF;
+	border: 1px solid #cccccc;
+}
+
+td, input, select, textarea {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+}
+
+input, select, textarea {
+	border: 1px solid #808080;
+}
+
+.input_noborder {
+	border: 0px solid #808080;
+}
+
+.title {
+	font-size: 12px;
+	font-weight: bold;
+}

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/simple/editor_template.js
@@ -1,1 +1,1 @@
-
+(function(){var DOM=tinymce.DOM;tinymce.ThemeManager.requireLangPack('simple');tinymce.create('tinymce.themes.SimpleTheme',{init:function(ed,url){var t=this,states=['Bold','Italic','Underline','Strikethrough','InsertUnorderedList','InsertOrderedList'],s=ed.settings;t.editor=ed;ed.onInit.add(function(){ed.onNodeChange.add(function(ed,cm){tinymce.each(states,function(c){cm.get(c.toLowerCase()).setActive(ed.queryCommandState(c));});});ed.dom.loadCSS(url+"/skins/"+s.skin+"/content.css");});DOM.loadCSS((s.editor_css?ed.baseURI.toAbsolute(s.editor_css):'')||url+"/skins/"+s.skin+"/ui.css");},renderUI:function(o){var t=this,n=o.targetNode,ic,tb,ed=t.editor,cf=ed.controlManager,sc;n=DOM.insertAfter(DOM.create('span',{id:ed.id+'_container','class':'mceEditor '+ed.settings.skin+'SimpleSkin'}),n);n=sc=DOM.add(n,'table',{cellPadding:0,cellSpacing:0,'class':'mceLayout'});n=tb=DOM.add(n,'tbody');n=DOM.add(tb,'tr');n=ic=DOM.add(DOM.add(n,'td'),'div',{'class':'mceIframeContainer'});n=DOM.add(DOM.add(tb,'tr',{'class':'last'}),'td',{'class':'mceToolbar mceLast',align:'center'});tb=t.toolbar=cf.createToolbar("tools1");tb.add(cf.createButton('bold',{title:'simple.bold_desc',cmd:'Bold'}));tb.add(cf.createButton('italic',{title:'simple.italic_desc',cmd:'Italic'}));tb.add(cf.createButton('underline',{title:'simple.underline_desc',cmd:'Underline'}));tb.add(cf.createButton('strikethrough',{title:'simple.striketrough_desc',cmd:'Strikethrough'}));tb.add(cf.createSeparator());tb.add(cf.createButton('undo',{title:'simple.undo_desc',cmd:'Undo'}));tb.add(cf.createButton('redo',{title:'simple.redo_desc',cmd:'Redo'}));tb.add(cf.createSeparator());tb.add(cf.createButton('cleanup',{title:'simple.cleanup_desc',cmd:'mceCleanup'}));tb.add(cf.createSeparator());tb.add(cf.createButton('insertunorderedlist',{title:'simple.bullist_desc',cmd:'InsertUnorderedList'}));tb.add(cf.createButton('insertorderedlist',{title:'simple.numlist_desc',cmd:'InsertOrderedList'}));tb.renderTo(n);return{iframeContainer:ic,editorContainer:ed.id+'_container',sizeContainer:sc,deltaHeight:-20};},getInfo:function(){return{longname:'Simple theme',author:'Moxiecode Systems AB',authorurl:'http://tinymce.moxiecode.com',version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.ThemeManager.add('simple',tinymce.themes.SimpleTheme);})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/simple/editor_template_src.js
@@ -1,1 +1,85 @@
+/**
+ * $Id: editor_template_src.js 752 2008-03-27 21:51:25Z spocke $
+ *
+ * This file is meant to showcase how to create a simple theme. The advanced
+ * theme is more suitable for production use.
+ *
+ * @author Moxiecode

+ */
 
+(function() {
+	var DOM = tinymce.DOM;
+
+	// Tell it to load theme specific language pack(s)
+	tinymce.ThemeManager.requireLangPack('simple');
+
+	tinymce.create('tinymce.themes.SimpleTheme', {
+		init : function(ed, url) {
+			var t = this, states = ['Bold', 'Italic', 'Underline', 'Strikethrough', 'InsertUnorderedList', 'InsertOrderedList'], s = ed.settings;
+
+			t.editor = ed;
+
+			ed.onInit.add(function() {
+				ed.onNodeChange.add(function(ed, cm) {
+					tinymce.each(states, function(c) {
+						cm.get(c.toLowerCase()).setActive(ed.queryCommandState(c));
+					});
+				});
+
+				ed.dom.loadCSS(url + "/skins/" + s.skin + "/content.css");
+			});
+
+			DOM.loadCSS((s.editor_css ? ed.baseURI.toAbsolute(s.editor_css) : '') || url + "/skins/" + s.skin + "/ui.css");
+		},
+
+		renderUI : function(o) {
+			var t = this, n = o.targetNode, ic, tb, ed = t.editor, cf = ed.controlManager, sc;
+
+			n = DOM.insertAfter(DOM.create('span', {id : ed.id + '_container', 'class' : 'mceEditor ' + ed.settings.skin + 'SimpleSkin'}), n);
+			n = sc = DOM.add(n, 'table', {cellPadding : 0, cellSpacing : 0, 'class' : 'mceLayout'});
+			n = tb = DOM.add(n, 'tbody');
+
+			// Create iframe container
+			n = DOM.add(tb, 'tr');
+			n = ic = DOM.add(DOM.add(n, 'td'), 'div', {'class' : 'mceIframeContainer'});
+
+			// Create toolbar container
+			n = DOM.add(DOM.add(tb, 'tr', {'class' : 'last'}), 'td', {'class' : 'mceToolbar mceLast', align : 'center'});
+
+			// Create toolbar
+			tb = t.toolbar = cf.createToolbar("tools1");
+			tb.add(cf.createButton('bold', {title : 'simple.bold_desc', cmd : 'Bold'}));
+			tb.add(cf.createButton('italic', {title : 'simple.italic_desc', cmd : 'Italic'}));
+			tb.add(cf.createButton('underline', {title : 'simple.underline_desc', cmd : 'Underline'}));
+			tb.add(cf.createButton('strikethrough', {title : 'simple.striketrough_desc', cmd : 'Strikethrough'}));
+			tb.add(cf.createSeparator());
+			tb.add(cf.createButton('undo', {title : 'simple.undo_desc', cmd : 'Undo'}));
+			tb.add(cf.createButton('redo', {title : 'simple.redo_desc', cmd : 'Redo'}));
+			tb.add(cf.createSeparator());
+			tb.add(cf.createButton('cleanup', {title : 'simple.cleanup_desc', cmd : 'mceCleanup'}));
+			tb.add(cf.createSeparator());
+			tb.add(cf.createButton('insertunorderedlist', {title : 'simple.bullist_desc', cmd : 'InsertUnorderedList'}));
+			tb.add(cf.createButton('insertorderedlist', {title : 'simple.numlist_desc', cmd : 'InsertOrderedList'}));
+			tb.renderTo(n);
+
+			return {
+				iframeContainer : ic,
+				editorContainer : ed.id + '_container',
+				sizeContainer : sc,
+				deltaHeight : -20
+			};
+		},
+
+		getInfo : function() {
+			return {
+				longname : 'Simple theme',
+				author : 'Moxiecode Systems AB',
+				authorurl : 'http://tinymce.moxiecode.com',
+				version : tinymce.majorVersion + "." + tinymce.minorVersion
+			}
+		}
+	});
+
+	tinymce.ThemeManager.add('simple', tinymce.themes.SimpleTheme);
+})();

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/simple/editor_ui.css
@@ -1,1 +1,100 @@
+.mceButtonNormal, .mceButtonOver, .mceButtonDown, .mceSeparator, .mceButtonDisabled, .mceButtonSelected {
+	margin-top: 1px;
+	margin-left: 1px;
+}
 
+.mceButtonNormal {
+	border-top: 1px solid;
+	border-left: 1px solid;
+	border-bottom: 1px solid;
+	border-right: 1px solid;
+	border-color: #F0F0EE;
+	cursor: arrow;
+}
+
+.mceButtonOver {
+	border: 1px solid #0A246A;
+	cursor: arrow;
+	background-color: #B6BDD2;
+}
+
+.mceButtonDown {
+	cursor: arrow;
+	border: 1px solid #0A246A;
+	background-color: #8592B5;
+}
+
+.mceButtonSelected {
+	border: 1px solid;
+	border-color: #C0C0BB;
+	cursor: arrow;
+}
+
+.mceButtonDisabled {
+	filter:progid:DXImageTransform.Microsoft.Alpha(opacity=30);
+	-moz-opacity:0.3;
+	opacity: 0.3;
+	border-top: 1px solid;
+	border-left: 1px solid;
+	border-bottom: 1px solid;
+	border-right: 1px solid;
+	border-color: #F0F0EE;
+	cursor: arrow;
+}
+
+.mceSeparator {
+	border-top: 1px solid buttonhighlight;
+	border-left: 1px solid buttonhighlight;
+	border-bottom: 1px solid buttonshadow;
+	border-right: 1px solid buttonshadow;
+	margin-right: 2px;
+	margin-left: 2px;
+}
+
+.mceSeparatorLine {
+	margin:2px;
+	margin-left: 4px;
+	background-color: #F0F0EE;
+	border-top: 1px solid buttonshadow;
+	border-left: 1px solid buttonshadow;
+	border-bottom: 1px solid buttonhighlight;
+	border-right: 1px solid buttonhighlight;
+	width: 0px;
+	height: 15px;
+}
+
+.mceSelectList {
+	font-family: "MS Sans Serif";
+	font-size: 7pt;
+	font-weight: normal;
+	margin-top: 2px;
+}
+
+.mceLabel, .mceLabelDisabled {
+	font-family: "MS Sans Serif";
+	font-size: 9pt;
+}
+
+.mceLabel {
+	color: #000000;
+}
+
+.mceLabelDisabled {
+	cursor: text;
+	color: #999999;
+}
+
+.mceEditor {
+	background: #F0F0EE;
+	border: 1px solid #cccccc;
+}
+
+.mceEditorArea {
+	font-family: "MS Sans Serif";
+	background: #FFFFFF;
+}
+
+.mceToolbar {
+	background: #F0F0EE;
+	border-top: 1px solid #cccccc;
+}

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/bold.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/bold_de_se.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/bold_fr.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/bold_ru.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/bold_tw.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/bullist.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/buttons.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/cleanup.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/italic.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/italic_de_se.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/italic_ru.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/italic_tw.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/numlist.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/redo.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/separator.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/spacer.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/strikethrough.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/underline.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/underline_fr.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/underline_ru.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/underline_tw.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/images/undo.gif differ
 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/img/icons.gif differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/simple/langs/en.js
@@ -1,1 +1,11 @@
-
+tinyMCE.addI18n('en.simple',{
+bold_desc:"Bold (Ctrl+B)",
+italic_desc:"Italic (Ctrl+I)",
+underline_desc:"Underline (Ctrl+U)",
+striketrough_desc:"Strikethrough",
+bullist_desc:"Unordered list",
+numlist_desc:"Ordered list",
+undo_desc:"Undo (Ctrl+Z)",
+redo_desc:"Redo (Ctrl+Y)",
+cleanup_desc:"Cleanup messy code"
+});

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/simple/skins/default/content.css
@@ -1,1 +1,26 @@
+body, td, pre {
+	font-family: Verdana, Arial, Helvetica, sans-serif;
+	font-size: 10px;
+}
 
+body {
+	background-color: #FFFFFF;
+}
+
+.mceVisualAid {
+	border: 1px dashed #BBBBBB;
+}
+
+/* MSIE specific */
+
+* html body {
+	scrollbar-3dlight-color: #F0F0EE;
+	scrollbar-arrow-color: #676662;
+	scrollbar-base-color: #F0F0EE;
+	scrollbar-darkshadow-color: #DDDDDD;
+	scrollbar-face-color: #E0E0DD;
+	scrollbar-highlight-color: #F0F0EE;
+	scrollbar-shadow-color: #F0F0EE;
+	scrollbar-track-color: #F5F5F5;	
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/simple/skins/default/ui.css
@@ -1,1 +1,33 @@
+/* Reset */
+.defaultSimpleSkin table, .defaultSimpleSkin tbody, .defaultSimpleSkin a, .defaultSimpleSkin img, .defaultSimpleSkin tr, .defaultSimpleSkin div, .defaultSimpleSkin td, .defaultSimpleSkin iframe, .defaultSimpleSkin span, .defaultSimpleSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000}
 
+/* Containers */
+.defaultSimpleSkin {position:relative}
+.defaultSimpleSkin table.mceLayout {background:#F0F0EE; border:1px solid #CCC;}
+.defaultSimpleSkin iframe {display:block; background:#FFF; border-bottom:1px solid #CCC;}
+.defaultSimpleSkin .mceToolbar {height:24px;}
+
+/* Layout */
+.defaultSimpleSkin span.mceIcon, .defaultSimpleSkin img.mceIcon {display:block; width:20px; height:20px}
+.defaultSimpleSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px}
+
+/* Button */
+.defaultSimpleSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px}
+.defaultSimpleSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0}
+.defaultSimpleSkin a.mceButtonActive {border:1px solid #0A246A; background-color:#C2CBE0}
+.defaultSimpleSkin .mceButtonDisabled span {opacity:0.3; filter:alpha(opacity=30)}
+
+/* Separator */
+.defaultSimpleSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:0 2px 0 4px}
+
+/* Theme */
+.defaultSimpleSkin span.mce_bold {background-position:0 0}
+.defaultSimpleSkin span.mce_italic {background-position:-60px 0}
+.defaultSimpleSkin span.mce_underline {background-position:-140px 0}
+.defaultSimpleSkin span.mce_strikethrough {background-position:-120px 0}
+.defaultSimpleSkin span.mce_undo {background-position:-160px 0}
+.defaultSimpleSkin span.mce_redo {background-position:-100px 0}
+.defaultSimpleSkin span.mce_cleanup {background-position:-40px 0}
+.defaultSimpleSkin span.mce_insertunorderedlist {background-position:-20px 0}
+.defaultSimpleSkin span.mce_insertorderedlist {background-position:-80px 0}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/content.css
@@ -1,1 +1,18 @@
+body, td, pre {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
 
+body {background: #FFF;}
+.mceVisualAid {border: 1px dashed #BBB;}
+
+/* IE */
+
+* html body {
+scrollbar-3dlight-color: #F0F0EE;
+scrollbar-arrow-color: #676662;
+scrollbar-base-color: #F0F0EE;
+scrollbar-darkshadow-color: #DDDDDD;
+scrollbar-face-color: #E0E0DD;
+scrollbar-highlight-color: #F0F0EE;
+scrollbar-shadow-color: #F0F0EE;
+scrollbar-track-color: #F5F5F5;	
+}
+

 Binary files /dev/null and b/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png differ
--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/ui.css
@@ -1,1 +1,36 @@
+/* Reset */
+.o2k7SimpleSkin table, .o2k7SimpleSkin tbody, .o2k7SimpleSkin a, .o2k7SimpleSkin img, .o2k7SimpleSkin tr, .o2k7SimpleSkin div, .o2k7SimpleSkin td, .o2k7SimpleSkin iframe, .o2k7SimpleSkin span, .o2k7SimpleSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000}
 
+/* Containers */
+.o2k7SimpleSkin {position:relative}
+.o2k7SimpleSkin table.mceLayout {background:#E5EFFD; border:1px solid #ABC6DD;}
+.o2k7SimpleSkin iframe {display:block; background:#FFF; border-bottom:1px solid #ABC6DD;}
+.o2k7SimpleSkin .mceToolbar {height:26px;}
+
+/* Layout */
+.o2k7SimpleSkin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; }
+.o2k7SimpleSkin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px}
+.o2k7SimpleSkin span.mceIcon, .o2k7SimpleSkin img.mceIcon {display:block; width:20px; height:20px}
+.o2k7SimpleSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px}
+
+/* Button */
+.o2k7SimpleSkin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px}
+.o2k7SimpleSkin a.mceButton span, .o2k7SimpleSkin a.mceButton img {margin:1px 0 0 1px}
+.o2k7SimpleSkin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px}
+.o2k7SimpleSkin a.mceButtonActive {background-position:0 -44px}
+.o2k7SimpleSkin .mceButtonDisabled span {opacity:0.3; filter:alpha(opacity=30)}
+
+/* Separator */
+.o2k7SimpleSkin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px}
+
+/* Theme */
+.o2k7SimpleSkin span.mce_bold {background-position:0 0}
+.o2k7SimpleSkin span.mce_italic {background-position:-60px 0}
+.o2k7SimpleSkin span.mce_underline {background-position:-140px 0}
+.o2k7SimpleSkin span.mce_strikethrough {background-position:-120px 0}
+.o2k7SimpleSkin span.mce_undo {background-position:-160px 0}
+.o2k7SimpleSkin span.mce_redo {background-position:-100px 0}
+.o2k7SimpleSkin span.mce_cleanup {background-position:-40px 0}
+.o2k7SimpleSkin span.mce_insertunorderedlist {background-position:-20px 0}
+.o2k7SimpleSkin span.mce_insertorderedlist {background-position:-80px 0}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/tiny_mce.js
@@ -1,1 +1,1 @@
-
+var tinymce={majorVersion:'3',minorVersion:'0.9',releaseDate:'2008-06-02',_init:function(){var t=this,d=document,w=window,na=navigator,ua=na.userAgent,i,nl,n,base,p,v;t.isOpera=w.opera&&opera.buildNumber;t.isWebKit=/WebKit/.test(ua);t.isOldWebKit=t.isWebKit&&!w.getSelection().getRangeAt;t.isIE=!t.isWebKit&&!t.isOpera&&(/MSIE/gi).test(ua)&&(/Explorer/gi).test(na.appName);t.isIE6=t.isIE&&/MSIE [56]/.test(ua);t.isGecko=!t.isWebKit&&/Gecko/.test(ua);t.isMac=ua.indexOf('Mac')!=-1;if(w.tinyMCEPreInit){t.suffix=tinyMCEPreInit.suffix;t.baseURL=tinyMCEPreInit.base;t.query=tinyMCEPreInit.query;return;}t.suffix='';nl=d.getElementsByTagName('base');for(i=0;i<nl.length;i++){if(v=nl[i].href){if(/^https?:\/\/[^\/]+$/.test(v))v+='/';base=v?v.match(/.*\//)[0]:'';}}function getBase(n){if(n.src&&/tiny_mce(|_dev|_src|_gzip|_jquery|_prototype).js/.test(n.src)){if(/_(src|dev)\.js/g.test(n.src))t.suffix='_src';if((p=n.src.indexOf('?'))!=-1)t.query=n.src.substring(p+1);t.baseURL=n.src.substring(0,n.src.lastIndexOf('/'));if(base&&t.baseURL.indexOf('://')==-1)t.baseURL=base+t.baseURL;return t.baseURL;}return null;};nl=d.getElementsByTagName('script');for(i=0;i<nl.length;i++){if(getBase(nl[i]))return;}n=d.getElementsByTagName('head')[0];if(n){nl=n.getElementsByTagName('script');for(i=0;i<nl.length;i++){if(getBase(nl[i]))return;}}return;},is:function(o,t){var n=typeof(o);if(!t)return n!='undefined';if(t=='array'&&(o instanceof Array))return true;return n==t;},each:function(o,cb,s){var n,l;if(!o)return 0;s=s||o;if(typeof(o.length)!='undefined'){for(n=0,l=o.length;n<l;n++){if(cb.call(s,o[n],n,o)===false)return 0;}}else{for(n in o){if(o.hasOwnProperty(n)){if(cb.call(s,o[n],n,o)===false)return 0;}}}return 1;},map:function(a,f){var o=[];tinymce.each(a,function(v){o.push(f(v));});return o;},grep:function(a,f){var o=[];tinymce.each(a,function(v){if(!f||f(v))o.push(v);});return o;},inArray:function(a,v){var i,l;if(a){for(i=0,l=a.length;i<l;i++){if(a[i]===v)return i;}}return-1;},extend:function(o,e){var i,a=arguments;for(i=1;i<a.length;i++){e=a[i];tinymce.each(e,function(v,n){if(typeof(v)!=='undefined')o[n]=v;});}return o;},trim:function(s){return(s?''+s:'').replace(/^\s*|\s*$/g,'');},create:function(s,p){var t=this,sp,ns,cn,scn,c,de=0;s=/^((static) )?([\w.]+)(:([\w.]+))?/.exec(s);cn=s[3].match(/(^|\.)(\w+)$/i)[2];ns=t.createNS(s[3].replace(/\.\w+$/,''));if(ns[cn])return;if(s[2]=='static'){ns[cn]=p;if(this.onCreate)this.onCreate(s[2],s[3],ns[cn]);return;}if(!p[cn]){p[cn]=function(){};de=1;}ns[cn]=p[cn];t.extend(ns[cn].prototype,p);if(s[5]){sp=t.resolve(s[5]).prototype;scn=s[5].match(/\.(\w+)$/i)[1];c=ns[cn];if(de){ns[cn]=function(){return sp[scn].apply(this,arguments);};}else{ns[cn]=function(){this.parent=sp[scn];return c.apply(this,arguments);};}ns[cn].prototype[cn]=ns[cn];t.each(sp,function(f,n){ns[cn].prototype[n]=sp[n];});t.each(p,function(f,n){if(sp[n]){ns[cn].prototype[n]=function(){this.parent=sp[n];return f.apply(this,arguments);};}else{if(n!=cn)ns[cn].prototype[n]=f;}});}t.each(p['static'],function(f,n){ns[cn][n]=f;});if(this.onCreate)this.onCreate(s[2],s[3],ns[cn].prototype);},walk:function(o,f,n,s){s=s||this;if(o){if(n)o=o[n];tinymce.each(o,function(o,i){if(f.call(s,o,i,n)===false)return false;tinymce.walk(o,f,n,s);});}},createNS:function(n,o){var i,v;o=o||window;n=n.split('.');for(i=0;i<n.length;i++){v=n[i];if(!o[v])o[v]={};o=o[v];}return o;},resolve:function(n,o){var i,l;o=o||window;n=n.split('.');for(i=0,l=n.length;i<l;i++){o=o[n[i]];if(!o)break;}return o;},addUnload:function(f,s){var t=this,w=window;f={func:f,scope:s||this};if(!t.unloads){function unload(){var li=t.unloads,o,n;if(li){for(n in li){o=li[n];if(o&&o.func)o.func.call(o.scope,1);}if(w.detachEvent){w.detachEvent('onbeforeunload',fakeUnload);w.detachEvent('onunload',unload);}else if(w.removeEventListener)w.removeEventListener('unload',unload,false);t.unloads=o=li=w=unload=null;if(window.CollectGarbage)window.CollectGarbage();}};function fakeUnload(){var d=document;if(d.readyState=='interactive'){function stop(){d.detachEvent('onstop',stop);unload();d=null;};d.attachEvent('onstop',stop);window.setTimeout(function(){d.detachEvent('onstop',stop);},0);}};if(w.attachEvent){w.attachEvent('onunload',unload);w.attachEvent('onbeforeunload',fakeUnload);}else if(w.addEventListener)w.addEventListener('unload',unload,false);t.unloads=[f];}else t.unloads.push(f);return f;},removeUnload:function(f){var u=this.unloads,r=null;tinymce.each(u,function(o,i){if(o&&o.func==f){u.splice(i,1);r=f;return false;}});return r;},explode:function(s,d){return s?tinymce.map(s.split(d||','),tinymce.trim):s;},_addVer:function(u){var v;if(!this.query)return u;v=(u.indexOf('?')==-1?'?':'&')+this.query;if(u.indexOf('#')==-1)return u+v;return u.replace('#',v+'#');}};window.tinymce=tinymce;tinymce._init();tinymce.create('tinymce.util.Dispatcher',{scope:null,listeners:null,Dispatcher:function(s){this.scope=s||this;this.listeners=[];},add:function(cb,s){this.listeners.push({cb:cb,scope:s||this.scope});return cb;},addToTop:function(cb,s){this.listeners.unshift({cb:cb,scope:s||this.scope});return cb;},remove:function(cb){var l=this.listeners,o=null;tinymce.each(l,function(c,i){if(cb==c.cb){o=cb;l.splice(i,1);return false;}});return o;},dispatch:function(){var s,a=arguments,i,li=this.listeners,c;for(i=0;i<li.length;i++){c=li[i];s=c.cb.apply(c.scope,a);if(s===false)break;}return s;}});(function(){var each=tinymce.each;tinymce.create('tinymce.util.URI',{URI:function(u,s){var t=this,o,a,b;s=t.settings=s||{};if(/^(mailto|news|javascript|about):/i.test(u)||/^\s*#/.test(u)){t.source=u;return;}if(u.indexOf('/')===0&&u.indexOf('//')!==0)u=(s.base_uri?s.base_uri.protocol||'http':'http')+'://mce_host'+u;if(u.indexOf('://')===-1&&u.indexOf('//')!==0)u=(s.base_uri.protocol||'http')+'://mce_host'+t.toAbsPath(s.base_uri.path,u);u=u.replace(/@@/g,'(mce_at)');u=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(u);each(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],function(v,i){var s=u[i];if(s)s=s.replace(/\(mce_at\)/g,'@@');t[v]=s;});if(b=s.base_uri){if(!t.protocol)t.protocol=b.protocol;if(!t.userInfo)t.userInfo=b.userInfo;if(!t.port&&t.host=='mce_host')t.port=b.port;if(!t.host||t.host=='mce_host')t.host=b.host;t.source='';}},setPath:function(p){var t=this;p=/^(.*?)\/?(\w+)?$/.exec(p);t.path=p[0];t.directory=p[1];t.file=p[2];t.source='';t.getURI();},toRelative:function(u){var t=this,o;u=new tinymce.util.URI(u,{base_uri:t});if((u.host!='mce_host'&&t.host!=u.host&&u.host)||t.port!=u.port||t.protocol!=u.protocol)return u.getURI();o=t.toRelPath(t.path,u.path);if(u.query)o+='?'+u.query;if(u.anchor)o+='#'+u.anchor;return o;},toAbsolute:function(u,nh){var u=new tinymce.util.URI(u,{base_uri:this});return u.getURI(this.host==u.host?nh:0);},toRelPath:function(base,path){var items,bp=0,out='',i;base=base.substring(0,base.lastIndexOf('/'));base=base.split('/');items=path.split('/');if(base.length>=items.length){for(i=0;i<base.length;i++){if(i>=items.length||base[i]!=items[i]){bp=i+1;break;}}}if(base.length<items.length){for(i=0;i<items.length;i++){if(i>=base.length||base[i]!=items[i]){bp=i+1;break;}}}if(bp==1)return path;for(i=0;i<base.length-(bp-1);i++)out+="../";for(i=bp-1;i<items.length;i++){if(i!=bp-1)out+="/"+items[i];else out+=items[i];}return out;},toAbsPath:function(base,path){var i,nb=0,o=[];base=base.split('/');path=path.split('/');each(base,function(k){if(k)o.push(k);});base=o;for(i=path.length-1,o=[];i>=0;i--){if(path[i].length==0||path[i]==".")continue;if(path[i]=='..'){nb++;continue;}if(nb>0){nb--;continue;}o.push(path[i]);}i=base.length-nb;if(i<=0)return'/'+o.reverse().join('/');return'/'+base.slice(0,i).join('/')+'/'+o.reverse().join('/');},getURI:function(nh){var s,t=this;if(!t.source||nh){s='';if(!nh){if(t.protocol)s+=t.protocol+'://';if(t.userInfo)s+=t.userInfo+'@';if(t.host)s+=t.host;if(t.port)s+=':'+t.port;}if(t.path)s+=t.path;if(t.query)s+='?'+t.query;if(t.anchor)s+='#'+t.anchor;t.source=s;}return t.source;}});})();(function(){var each=tinymce.each;tinymce.create('static tinymce.util.Cookie',{getHash:function(n){var v=this.get(n),h;if(v){each(v.split('&'),function(v){v=v.split('=');h=h||{};h[unescape(v[0])]=unescape(v[1]);});}return h;},setHash:function(n,v,e,p,d,s){var o='';each(v,function(v,k){o+=(!o?'':'&')+escape(k)+'='+escape(v);});this.set(n,o,e,p,d,s);},get:function(n){var c=document.cookie,e,p=n+"=",b;if(!c)return;b=c.indexOf("; "+p);if(b==-1){b=c.indexOf(p);if(b!=0)return null;}else b+=2;e=c.indexOf(";",b);if(e==-1)e=c.length;return unescape(c.substring(b+p.length,e));},set:function(n,v,e,p,d,s){document.cookie=n+"="+escape(v)+((e)?"; expires="+e.toGMTString():"")+((p)?"; path="+escape(p):"")+((d)?"; domain="+d:"")+((s)?"; secure":"");},remove:function(n,p){var d=new Date();d.setTime(d.getTime()-1000);this.set(n,'',d,p,d);}});})();tinymce.create('static tinymce.util.JSON',{serialize:function(o){var i,v,s=tinymce.util.JSON.serialize,t;if(o==null)return'null';t=typeof o;if(t=='string'){v='\bb\tt\nn\ff\rr\""\'\'\\\\';return'"'+o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'])/g,function(a,b){i=v.indexOf(b);if(i+1)return'\\'+v.charAt(i+1);a=b.charCodeAt().toString(16);return'\\u'+'0000'.substring(a.length)+a;})+'"';}if(t=='object'){if(o instanceof Array){for(i=0,v='[';i<o.length;i++)v+=(i>0?',':'')+s(o[i]);return v+']';}v='{';for(i in o)v+=typeof o[i]!='function'?(v.length>1?',"':'"')+i+'":'+s(o[i]):'';return v+'}';}return''+o;},parse:function(s){try{return eval('('+s+')');}catch(ex){}}});tinymce.create('static tinymce.util.XHR',{send:function(o){var x,t,w=window,c=0;o.scope=o.scope||this;o.success_scope=o.success_scope||o.scope;o.error_scope=o.error_scope||o.scope;o.async=o.async===false?false:true;o.data=o.data||'';function get(s){x=0;try{x=new ActiveXObject(s);}catch(ex){}return x;};x=w.XMLHttpRequest?new XMLHttpRequest():get('Microsoft.XMLHTTP')||get('Msxml2.XMLHTTP');if(x){if(x.overrideMimeType)x.overrideMimeType(o.content_type);x.open(o.type||(o.data?'POST':'GET'),o.url,o.async);if(o.content_type)x.setRequestHeader('Content-Type',o.content_type);x.send(o.data);function ready(){if(!o.async||x.readyState==4||c++>10000){if(o.success&&c<10000&&x.status==200)o.success.call(o.success_scope,''+x.responseText,x,o);else if(o.error)o.error.call(o.error_scope,c>10000?'TIMED_OUT':'GENERAL',x,o);x=null;}else w.setTimeout(ready,10);};if(!o.async)return ready();t=w.setTimeout(ready,10);}}});(function(){var extend=tinymce.extend,JSON=tinymce.util.JSON,XHR=tinymce.util.XHR;tinymce.create('tinymce.util.JSONRequest',{JSONRequest:function(s){this.settings=extend({},s);this.count=0;},send:function(o){var ecb=o.error,scb=o.success;o=extend(this.settings,o);o.success=function(c,x){c=JSON.parse(c);if(typeof(c)=='undefined'){c={error:'JSON Parse error.'};}if(c.error)ecb.call(o.error_scope||o.scope,c.error,x);else scb.call(o.success_scope||o.scope,c.result);};o.error=function(ty,x){ecb.call(o.error_scope||o.scope,ty,x);};o.data=JSON.serialize({id:o.id||'c'+(this.count++),method:o.method,params:o.params});o.content_type='application/json';XHR.send(o);},'static':{sendRPC:function(o){return new tinymce.util.JSONRequest().send(o);}}});}());(function(){var each=tinymce.each,is=tinymce.is;var isWebKit=tinymce.isWebKit,isIE=tinymce.isIE;tinymce.create('tinymce.dom.DOMUtils',{doc:null,root:null,files:null,listeners:{},pixelStyles:/^(top|left|bottom|right|width|height|borderWidth)$/,cache:{},idPattern:/^#[\w]+$/,elmPattern:/^[\w_*]+$/,elmClassPattern:/^([\w_]*)\.([\w_]+)$/,DOMUtils:function(d,s){var t=this;t.doc=d;t.win=window;t.files={};t.cssFlicker=false;t.counter=0;t.boxModel=!tinymce.isIE||d.compatMode=="CSS1Compat";t.stdMode=d.documentMode===8;this.settings=s=tinymce.extend({keep_values:false,hex_colors:1,process_html:1},s);if(tinymce.isIE6){try{d.execCommand('BackgroundImageCache',false,true);}catch(e){t.cssFlicker=true;}}tinymce.addUnload(t.destroy,t);},getRoot:function(){var t=this,s=t.settings;return(s&&t.get(s.root_element))||t.doc.body;},getViewPort:function(w){var d,b;w=!w?this.win:w;d=w.document;b=this.boxModel?d.documentElement:d.body;return{x:w.pageXOffset||b.scrollLeft,y:w.pageYOffset||b.scrollTop,w:w.innerWidth||b.clientWidth,h:w.innerHeight||b.clientHeight};},getRect:function(e){var p,t=this,w,h;e=t.get(e);p=t.getPos(e);w=t.getStyle(e,'width');h=t.getStyle(e,'height');if(w.indexOf('px')===-1)w=0;if(h.indexOf('px')===-1)h=0;return{x:p.x,y:p.y,w:parseInt(w)||e.offsetWidth||e.clientWidth,h:parseInt(h)||e.offsetHeight||e.clientHeight};},getParent:function(n,f,r){var na,se=this.settings;n=this.get(n);if(se.strict_root)r=r||this.getRoot();if(is(f,'string')){na=f.toUpperCase();f=function(n){var s=false;if(n.nodeType==1&&na==='*'){s=true;return false;}each(na.split(','),function(v){if(n.nodeType==1&&((se.strict&&n.nodeName.toUpperCase()==v)||n.nodeName.toUpperCase()==v)){s=true;return false;}});return s;};}while(n){if(n==r)return null;if(f(n))return n;n=n.parentNode;}return null;},get:function(e){var n;if(e&&this.doc&&typeof(e)=='string'){n=e;e=this.doc.getElementById(e);if(e&&e.id!==n)return this.doc.getElementsByName(n)[1];}return e;},select:function(pa,s){var t=this,cs,c,pl,o=[],x,i,l,n;s=t.get(s)||t.doc;if(s.querySelectorAll){if(s!=t.doc){i=s.id;s.id='_mc_tmp';pa='#_mc_tmp '+pa;}l=tinymce.grep(s.querySelectorAll(pa));s.id=i;return l;}if(t.settings.strict){function get(s,n){return s.getElementsByTagName(n.toLowerCase());};}else{function get(s,n){return s.getElementsByTagName(n);};}if(t.elmPattern.test(pa)){x=get(s,pa);for(i=0,l=x.length;i<l;i++)o.push(x[i]);return o;}if(t.elmClassPattern.test(pa)){pl=t.elmClassPattern.exec(pa);x=get(s,pl[1]||'*');c=' '+pl[2]+' ';for(i=0,l=x.length;i<l;i++){n=x[i];if(n.className&&(' '+n.className+' ').indexOf(c)!==-1)o.push(n);}return o;}function collect(n){if(!n.mce_save){n.mce_save=1;o.push(n);}};function collectIE(n){if(!n.getAttribute('mce_save')){n.setAttribute('mce_save','1');o.push(n);}};function find(n,f,r){var i,l,nl=get(r,n);for(i=0,l=nl.length;i<l;i++)f(nl[i]);};each(pa.split(','),function(v,i){v=tinymce.trim(v);if(t.elmPattern.test(v)){each(get(s,v),function(n){collect(n);});return;}if(t.elmClassPattern.test(v)){x=t.elmClassPattern.exec(v);each(get(s,x[1]),function(n){if(t.hasClass(n,x[2]))collect(n);});return;}if(!(cs=t.cache[pa])){cs='x=(function(cf, s) {';pl=v.split(' ');each(pl,function(v){var p=/^([\w\\*]+)?(?:#([\w\\]+))?(?:\.([\w\\\.]+))?(?:\[\@([\w\\]+)([\^\$\*!]?=)([\w\\]+)\])?(?:\:([\w\\]+))?/i.exec(v);p[1]=p[1]||'*';cs+='find("'+p[1]+'", function(n) {';if(p[2])cs+='if (n.id !== "'+p[2]+'") return;';if(p[3]){cs+='var c = " " + n.className + " ";';cs+='if (';c='';each(p[3].split('.'),function(v){if(v)c+=(c?'||':'')+'c.indexOf(" '+v+' ") === -1';});cs+=c+') return;';}});cs+='cf(n);';for(i=pl.length-1;i>=0;i--)cs+='}, '+(i?'n':'s')+');';cs+='})';t.cache[pa]=cs=eval(cs);}cs(isIE?collectIE:collect,s);});each(o,function(n){if(isIE)n.removeAttribute('mce_save');else delete n.mce_save;});return o;},add:function(p,n,a,h,c){var t=this;return this.run(p,function(p){var e,k;e=is(n,'string')?t.doc.createElement(n):n;if(a){for(k in a){if(a.hasOwnProperty(k)&&!is(a[k],'object'))t.setAttrib(e,k,''+a[k]);}if(a.style&&!is(a.style,'string')){each(a.style,function(v,n){t.setStyle(e,n,v);});}}if(h){if(h.nodeType)e.appendChild(h);else t.setHTML(e,h);}return!c?p.appendChild(e):e;});},create:function(n,a,h){return this.add(this.doc.createElement(n),n,a,h,1);},createHTML:function(n,a,h){var o='',t=this,k;o+='<'+n;for(k in a){if(a.hasOwnProperty(k))o+=' '+k+'="'+t.encode(a[k])+'"';}if(tinymce.is(h))return o+'>'+h+'</'+n+'>';return o+' />';},remove:function(n,k){return this.run(n,function(n){var p,g;p=n.parentNode;if(!p)return null;if(k){each(n.childNodes,function(c){p.insertBefore(c.cloneNode(true),n);});}return p.removeChild(n);});},setStyle:function(n,na,v){var t=this;return t.run(n,function(e){var s,i;s=e.style;na=na.replace(/-(\D)/g,function(a,b){return b.toUpperCase();});if(t.pixelStyles.test(na)&&(tinymce.is(v,'number')||/^[\-0-9\.]+$/.test(v)))v+='px';switch(na){case'opacity':if(isIE){s.filter=v===''?'':"alpha(opacity="+(v*100)+")";if(!n.currentStyle||!n.currentStyle.hasLayout)s.display='inline-block';}s[na]=s['-moz-opacity']=s['-khtml-opacity']=v||'';break;case'float':isIE?s.styleFloat=v:s.cssFloat=v;break;default:s[na]=v||'';}if(t.settings.update_styles)t.setAttrib(e,'mce_style');});},getStyle:function(n,na,c){n=this.get(n);if(!n)return false;if(this.doc.defaultView&&c){na=na.replace(/[A-Z]/g,function(a){return'-'+a;});try{return this.doc.defaultView.getComputedStyle(n,null).getPropertyValue(na);}catch(ex){return null;}}na=na.replace(/-(\D)/g,function(a,b){return b.toUpperCase();});if(na=='float')na=isIE?'styleFloat':'cssFloat';if(n.currentStyle&&c)return n.currentStyle[na];return n.style[na];},setStyles:function(e,o){var t=this,s=t.settings,ol;ol=s.update_styles;s.update_styles=0;each(o,function(v,n){t.setStyle(e,n,v);});s.update_styles=ol;if(s.update_styles)t.setAttrib(e,s.cssText);},setAttrib:function(e,n,v){var t=this;if(t.settings.strict)n=n.toLowerCase();return this.run(e,function(e){var s=t.settings;switch(n){case"style":if(s.keep_values){if(v&&!t._isRes(v))e.setAttribute('mce_style',v,2);else e.removeAttribute('mce_style',2);}e.style.cssText=v;break;case"class":e.className=v||'';break;case"src":case"href":if(s.keep_values){if(s.url_converter)v=s.url_converter.call(s.url_converter_scope||t,v,n,e);t.setAttrib(e,'mce_'+n,v,2);}break;}if(is(v)&&v!==null&&v.length!==0)e.setAttribute(n,''+v,2);else e.removeAttribute(n,2);});},setAttribs:function(e,o){var t=this;return this.run(e,function(e){each(o,function(v,n){t.setAttrib(e,n,v);});});},getAttrib:function(e,n,dv){var v,t=this;e=t.get(e);if(!e||e.nodeType!==1)return false;if(!is(dv))dv="";if(/^(src|href|style|coords)$/.test(n)){v=e.getAttribute("mce_"+n);if(v)return v;}v=e.getAttribute(n,2);if(!v){switch(n){case'class':v=e.className;break;default:if(isIE&&n==='name'&&e.nodeName==='A'){v=e.name;break;}v=e.attributes[n];v=v&&is(v.nodeValue)?v.nodeValue:v;}}switch(n){case'style':v=v||e.style.cssText;if(v){v=t.serializeStyle(t.parseStyle(v));if(t.settings.keep_values&&!t._isRes(v))e.setAttribute('mce_style',v);}break;}if(isWebKit&&n==="class"&&v)v=v.replace(/(apple|webkit)\-[a-z\-]+/gi,'');if(isIE){switch(n){case'rowspan':case'colspan':if(v===1)v='';break;case'size':if(v==='+0')v='';break;case'hspace':if(v===-1)v='';break;case'tabindex':if(v===32768)v='';break;case'shape':v=v.toLowerCase();break;default:if(n.indexOf('on')===0&&v)v=(''+v).replace(/^function\s+anonymous\(\)\s+\{\s+(.*)\s+\}$/,'$1');}}return(v&&v!='')?''+v:dv;},getPos:function(n){var t=this,x=0,y=0,e,d=t.doc,r;n=t.get(n);if(n&&isIE){n=n.getBoundingClientRect();e=t.boxModel?d.documentElement:d.body;x=t.getStyle(t.select('html')[0],'borderWidth');x=(x=='medium'||t.boxModel&&!t.isIE6)&&2||x;n.top+=t.win.self!=t.win.top?2:0;return{x:n.left+e.scrollLeft-x,y:n.top+e.scrollTop-x};}r=n;while(r){x+=r.offsetLeft||0;y+=r.offsetTop||0;r=r.offsetParent;}r=n;while(r){if(!/^table-row|inline.*/i.test(t.getStyle(r,"display",1))){x-=r.scrollLeft||0;y-=r.scrollTop||0;}r=r.parentNode;if(r==d.body)break;}return{x:x,y:y};},parseStyle:function(st){var t=this,s=t.settings,o={};if(!st)return o;function compress(p,s,ot){var t,r,b,l;t=o[p+'-top'+s];if(!t)return;r=o[p+'-right'+s];if(t!=r)return;b=o[p+'-bottom'+s];if(r!=b)return;l=o[p+'-left'+s];if(b!=l)return;o[ot]=l;delete o[p+'-top'+s];delete o[p+'-right'+s];delete o[p+'-bottom'+s];delete o[p+'-left'+s];};function compress2(ta,a,b,c){var t;t=o[a];if(!t)return;t=o[b];if(!t)return;t=o[c];if(!t)return;o[ta]=o[a]+' '+o[b]+' '+o[c];delete o[a];delete o[b];delete o[c];};each(st.split(';'),function(v){var sv,ur=[];if(v){v=v.replace(/url\([^\)]+\)/g,function(v){ur.push(v);return'url('+ur.length+')';});v=v.split(':');sv=tinymce.trim(v[1]);sv=sv.replace(/url\(([^\)]+)\)/g,function(a,b){return ur[parseInt(b)-1];});sv=sv.replace(/rgb\([^\)]+\)/g,function(v){return t.toHex(v);});if(s.url_converter){sv=sv.replace(/url\([\'\"]?([^\)\'\"]+)[\'\"]?\)/g,function(x,c){return'url('+t.encode(s.url_converter.call(s.url_converter_scope||t,t.decode(c),'style',null))+')';});}o[tinymce.trim(v[0]).toLowerCase()]=sv;}});compress("border","","border");compress("border","-width","border-width");compress("border","-color","border-color");compress("border","-style","border-style");compress("padding","","padding");compress("margin","","margin");compress2('border','border-width','border-style','border-color');if(isIE){if(o.border=='medium none')o.border='';}return o;},serializeStyle:function(o){var s='';each(o,function(v,k){if(k&&v){switch(k){case'color':case'background-color':v=v.toLowerCase();break;}s+=(s?' ':'')+k+': '+v+';';}});return s;},loadCSS:function(u){var t=this,d=t.doc;if(!u)u='';each(u.split(','),function(u){if(t.files[u])return;t.files[u]=true;t.add(t.select('head')[0],'link',{rel:'stylesheet',href:tinymce._addVer(u)});});},addClass:function(e,c){return this.run(e,function(e){var o;if(!c)return 0;if(this.hasClass(e,c))return e.className;o=this.removeClass(e,c);return e.className=(o!=''?(o+' '):'')+c;});},removeClass:function(e,c){var t=this,re;return t.run(e,function(e){var v;if(t.hasClass(e,c)){if(!re)re=new RegExp("(^|\\s+)"+c+"(\\s+|$)","g");v=e.className.replace(re,' ');return e.className=tinymce.trim(v!=' '?v:'');}return e.className;});},hasClass:function(n,c){n=this.get(n);if(!n||!c)return false;return(' '+n.className+' ').indexOf(' '+c+' ')!==-1;},show:function(e){return this.setStyle(e,'display','block');},hide:function(e){return this.setStyle(e,'display','none');},isHidden:function(e){e=this.get(e);return e.style.display=='none'||this.getStyle(e,'display')=='none';},uniqueId:function(p){return(!p?'mce_':p)+(this.counter++);},setHTML:function(e,h){var t=this;return this.run(e,function(e){var x,i,nl,n,p,x;h=t.processHTML(h);if(isIE){function set(){try{e.innerHTML='<br />'+h;e.removeChild(e.firstChild);}catch(ex){while(e.firstChild)e.firstChild.removeNode();x=t.create('div');x.innerHTML='<br />'+h;each(x.childNodes,function(n,i){if(i)e.appendChild(n);});}};if(t.settings.fix_ie_paragraphs)h=h.replace(/<p><\/p>|<p([^>]+)><\/p>|<p[^\/+]\/>/gi,'<p$1 mce_keep="true">&nbsp;</p>');set();if(t.settings.fix_ie_paragraphs){nl=e.getElementsByTagName("p");for(i=nl.length-1,x=0;i>=0;i--){n=nl[i];if(!n.hasChildNodes()){if(!n.mce_keep){x=1;break;}n.removeAttribute('mce_keep');}}}if(x){h=h.replace(/<p([^>]+)>|<p>/g,'<div$1 mce_tmp="1">');h=h.replace(/<\/p>/g,'</div>');set();if(t.settings.fix_ie_paragraphs){nl=e.getElementsByTagName("DIV");for(i=nl.length-1;i>=0;i--){n=nl[i];if(n.mce_tmp){p=t.doc.createElement('p');n.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi,function(a,b){var v;if(b!=='mce_tmp'){v=n.getAttribute(b);if(!v&&b==='class')v=n.className;p.setAttribute(b,v);}});for(x=0;x<n.childNodes.length;x++)p.appendChild(n.childNodes[x].cloneNode(true));n.swapNode(p);}}}}}else e.innerHTML=h;return h;});},processHTML:function(h){var t=this,s=t.settings;if(!s.process_html)return h;if(tinymce.isGecko){h=h.replace(/<(\/?)strong>|<strong( [^>]+)>/gi,'<$1b$2>');h=h.replace(/<(\/?)em>|<em( [^>]+)>/gi,'<$1i$2>');}else if(isIE)h=h.replace(/&apos;/g,'&#39;');h=h.replace(/<a( )([^>]+)\/>|<a\/>/gi,'<a$1$2></a>');if(s.keep_values){if(h.indexOf('<script')!==-1){h=h.replace(/<script>/g,'<script type="text/javascript">');h=h.replace(/<script(|[^>]+)>(\s*<!--|\/\/\s*<\[CDATA\[)?[\r\n]*/g,'<mce:script$1><!--\n');h=h.replace(/\s*(\/\/\s*-->|\/\/\s*]]>)?<\/script>/g,'\n// --></mce:script>');h=h.replace(/<mce:script(|[^>]+)><!--\n\/\/ --><\/mce:script>/g,'<mce:script$1></mce:script>');}h=h.replace(/<([\w:]+) [^>]*(src|href|style|coords)[^>]*>/gi,function(a,n){function handle(m,b,c){var u=c;if(a.indexOf('mce_'+b)!=-1)return m;if(b=='style'){if(t._isRes(c))return m;if(s.hex_colors){u=u.replace(/rgb\([^\)]+\)/g,function(v){return t.toHex(v);});}if(s.url_converter){u=u.replace(/url\([\'\"]?([^\)\'\"]+)\)/g,function(x,c){return'url('+t.encode(s.url_converter.call(s.url_converter_scope||t,t.decode(c),b,n))+')';});}}else if(b!='coords'){if(s.url_converter)u=t.encode(s.url_converter.call(s.url_converter_scope||t,t.decode(c),b,n));}return' '+b+'="'+c+'" mce_'+b+'="'+u+'"';};a=a.replace(/ (src|href|style|coords)=[\"]([^\"]+)[\"]/gi,handle);a=a.replace(/ (src|href|style|coords)=[\']([^\']+)[\']/gi,handle);return a.replace(/ (src|href|style|coords)=([^\s\"\'>]+)/gi,handle);});}return h;},getOuterHTML:function(e){var d;e=this.get(e);if(!e)return null;if(isIE)return e.outerHTML;d=(e.ownerDocument||this.doc).createElement("body");d.appendChild(e.cloneNode(true));return d.innerHTML;},setOuterHTML:function(e,h,d){var t=this;return this.run(e,function(e){var n,tp;e=t.get(e);d=d||e.ownerDocument||t.doc;if(isIE&&e.nodeType==1)e.outerHTML=h;else{tp=d.createElement("body");tp.innerHTML=h;n=tp.lastChild;while(n){t.insertAfter(n.cloneNode(true),e);n=n.previousSibling;}t.remove(e);}});},decode:function(s){var e;if(/&[^;]+;/.test(s)){e=this.doc.createElement("div");e.innerHTML=s;return!e.firstChild?s:e.firstChild.nodeValue;}return s;},encode:function(s){return s?(''+s).replace(/[<>&\"]/g,function(c,b){switch(c){case'&':return'&amp;';case'"':return'&quot;';case'<':return'&lt;';case'>':return'&gt;';}return c;}):s;},insertAfter:function(n,r){var t=this;r=t.get(r);return this.run(n,function(n){var p,ns;p=r.parentNode;ns=r.nextSibling;if(ns)p.insertBefore(n,ns);else p.appendChild(n);return n;});},isBlock:function(n){if(n.nodeType&&n.nodeType!==1)return false;n=n.nodeName||n;return/^(H[1-6]|HR|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP)$/.test(n);},replace:function(n,o,k){if(is(o,'array'))n=n.cloneNode(true);return this.run(o,function(o){if(k){each(o.childNodes,function(c){n.appendChild(c.cloneNode(true));});}return o.parentNode.replaceChild(n,o);});},toHex:function(s){var c=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(s);function hex(s){s=parseInt(s).toString(16);return s.length>1?s:'0'+s;};if(c){s='#'+hex(c[1])+hex(c[2])+hex(c[3]);return s;}return s;},getClasses:function(){var t=this,cl=[],i,lo={},f=t.settings.class_filter,ov;if(t.classes)return t.classes;function addClasses(s){each(s.imports,function(r){addClasses(r);});each(s.cssRules||s.rules,function(r){switch(r.type||1){case 1:if(r.selectorText){each(r.selectorText.split(','),function(v){v=v.replace(/^\s*|\s*$|^\s\./g,"");if(/\.mce/.test(v)||!/\.[\w\-]+$/.test(v))return;ov=v;v=v.replace(/.*\.([a-z0-9_\-]+).*/i,'$1');if(f&&!(v=f(v,ov)))return;if(!lo[v]){cl.push({'class':v});lo[v]=1;}});}break;case 3:addClasses(r.styleSheet);break;}});};try{each(t.doc.styleSheets,addClasses);}catch(ex){}if(cl.length>0)t.classes=cl;return cl;},run:function(e,f,s){var t=this,o;if(t.doc&&typeof(e)==='string')e=t.doc.getElementById(e);if(!e)return false;s=s||this;if(!e.nodeType&&(e.length||e.length===0)){o=[];each(e,function(e,i){if(e){if(typeof(e)=='string')e=t.doc.getElementById(e);o.push(f.call(s,e,i));}});return o;}return f.call(s,e);},getAttribs:function(n){var o;n=this.get(n);if(!n)return[];if(isIE){o=[];if(n.nodeName=='OBJECT')return n.attributes;n.cloneNode(false).outerHTML.replace(/([a-z0-9\:\-_]+)=/gi,function(a,b){o.push({specified:1,nodeName:b});});return o;}return n.attributes;},destroy:function(s){var t=this;t.win=t.doc=t.root=null;if(!s)tinymce.removeUnload(t.destroy);},_isRes:function(c){return/^(top|left|bottom|right|width|height)/i.test(c)||/;\s*(top|left|bottom|right|width|height)/i.test(c);}});tinymce.DOM=new tinymce.dom.DOMUtils(document,{process_html:0});})();(function(){var each=tinymce.each,DOM=tinymce.DOM,isIE=tinymce.isIE,isWebKit=tinymce.isWebKit,Event;tinymce.create('static tinymce.dom.Event',{inits:[],events:[],add:function(o,n,f,s){var cb,t=this,el=t.events,r;if(o&&o instanceof Array){r=[];each(o,function(o){o=DOM.get(o);r.push(t.add(o,n,f,s));});return r;}o=DOM.get(o);if(!o)return;cb=function(e){e=e||window.event;if(e&&!e.target&&isIE)e.target=e.srcElement;if(!s)return f(e);return f.call(s,e);};if(n=='unload'){tinymce.unloads.unshift({func:cb});return cb;}if(n=='init'){if(t.domLoaded)cb();else t.inits.push(cb);return cb;}el.push({obj:o,name:n,func:f,cfunc:cb,scope:s});t._add(o,n,cb);return f;},remove:function(o,n,f){var t=this,a=t.events,s=false,r;if(o&&o instanceof Array){r=[];each(o,function(o){o=DOM.get(o);r.push(t.remove(o,n,f));});return r;}o=DOM.get(o);each(a,function(e,i){if(e.obj==o&&e.name==n&&(!f||(e.func==f||e.cfunc==f))){a.splice(i,1);t._remove(o,n,e.cfunc);s=true;return false;}});return s;},clear:function(o){var t=this,a=t.events,i,e;if(o){o=DOM.get(o);for(i=a.length-1;i>=0;i--){e=a[i];if(e.obj===o){t._remove(e.obj,e.name,e.cfunc);e.obj=e.cfunc=null;a.splice(i,1);}}}},cancel:function(e){if(!e)return false;this.stop(e);return this.prevent(e);},stop:function(e){if(e.stopPropagation)e.stopPropagation();else e.cancelBubble=true;return false;},prevent:function(e){if(e.preventDefault)e.preventDefault();else e.returnValue=false;return false;},_unload:function(){var t=Event;each(t.events,function(e,i){t._remove(e.obj,e.name,e.cfunc);e.obj=e.cfunc=null;});t.events=[];t=null;},_add:function(o,n,f){if(o.attachEvent)o.attachEvent('on'+n,f);else if(o.addEventListener)o.addEventListener(n,f,false);else o['on'+n]=f;},_remove:function(o,n,f){if(o){try{if(o.detachEvent)o.detachEvent('on'+n,f);else if(o.removeEventListener)o.removeEventListener(n,f,false);else o['on'+n]=null;}catch(ex){}}},_pageInit:function(){var e=Event;e._remove(window,'DOMContentLoaded',e._pageInit);e.domLoaded=true;each(e.inits,function(c){c();});e.inits=[];},_wait:function(){var t;if(window.tinyMCE_GZ&&tinyMCE_GZ.loaded){Event.domLoaded=1;return;}if(isIE&&document.location.protocol!='https:'){document.write('<script id=__ie_onload defer src=\'javascript:""\';><\/script>');DOM.get("__ie_onload").onreadystatechange=function(){if(this.readyState=="complete"){Event._pageInit();DOM.get("__ie_onload").onreadystatechange=null;}};}else{Event._add(window,'DOMContentLoaded',Event._pageInit,Event);if(isIE||isWebKit){t=setInterval(function(){if(/loaded|complete/.test(document.readyState)){clearInterval(t);Event._pageInit();}},10);}}}});Event=tinymce.dom.Event;Event._wait();tinymce.addUnload(Event._unload);})();(function(){var each=tinymce.each;tinymce.create('tinymce.dom.Element',{Element:function(id,s){var t=this,dom,el;s=s||{};t.id=id;t.dom=dom=s.dom||tinymce.DOM;t.settings=s;if(!tinymce.isIE)el=t.dom.get(t.id);each(['getPos','getRect','getParent','add','setStyle','getStyle','setStyles','setAttrib','setAttribs','getAttrib','addClass','removeClass','hasClass','getOuterHTML','setOuterHTML','remove','show','hide','isHidden','setHTML','get'],function(k){t[k]=function(){var a=arguments,o;if(tinymce.isOpera){a=[id];each(arguments,function(v){a.push(v);});}else Array.prototype.unshift.call(a,el||id);o=dom[k].apply(dom,a);t.update(k);return o;};});},on:function(n,f,s){return tinymce.dom.Event.add(this.id,n,f,s);},getXY:function(){return{x:parseInt(this.getStyle('left')),y:parseInt(this.getStyle('top'))};},getSize:function(){var n=this.dom.get(this.id);return{w:parseInt(this.getStyle('width')||n.clientWidth),h:parseInt(this.getStyle('height')||n.clientHeight)};},moveTo:function(x,y){this.setStyles({left:x,top:y});},moveBy:function(x,y){var p=this.getXY();this.moveTo(p.x+x,p.y+y);},resizeTo:function(w,h){this.setStyles({width:w,height:h});},resizeBy:function(w,h){var s=this.getSize();this.resizeTo(s.w+w,s.h+h);},update:function(k){var t=this,b,dom=t.dom;if(tinymce.isIE6&&t.settings.blocker){k=k||'';if(k.indexOf('get')===0||k.indexOf('has')===0||k.indexOf('is')===0)return;if(k=='remove'){dom.remove(t.blocker);return;}if(!t.blocker){t.blocker=dom.uniqueId();b=dom.add(t.settings.container||dom.getRoot(),'iframe',{id:t.blocker,style:'position:absolute;',frameBorder:0,src:'javascript:""'});dom.setStyle(b,'opacity',0);}else b=dom.get(t.blocker);dom.setStyle(b,'left',t.getStyle('left',1));dom.setStyle(b,'top',t.getStyle('top',1));dom.setStyle(b,'width',t.getStyle('width',1));dom.setStyle(b,'height',t.getStyle('height',1));dom.setStyle(b,'display',t.getStyle('display',1));dom.setStyle(b,'zIndex',parseInt(t.getStyle('zIndex',1)||0)-1);}}});})();(function(){function trimNl(s){return s.replace(/[\n\r]+/g,'');};var is=tinymce.is,isIE=tinymce.isIE,each=tinymce.each;tinymce.create('tinymce.dom.Selection',{Selection:function(dom,win,serializer){var t=this;t.dom=dom;t.win=win;t.serializer=serializer;tinymce.addUnload(t.destroy,t);},getContent:function(s){var t=this,r=t.getRng(),e=t.dom.create("body"),se=t.getSel(),wb,wa,n;s=s||{};wb=wa='';s.get=true;s.format=s.format||'html';if(s.format=='text')return t.isCollapsed()?'':(r.text||(se.toString?se.toString():''));if(r.cloneContents){n=r.cloneContents();if(n)e.appendChild(n);}else if(is(r.item)||is(r.htmlText))e.innerHTML=r.item?r.item(0).outerHTML:r.htmlText;else e.innerHTML=r.toString();if(/^\s/.test(e.innerHTML))wb=' ';if(/\s+$/.test(e.innerHTML))wa=' ';s.getInner=true;return t.isCollapsed()?'':wb+t.serializer.serialize(e,s)+wa;},setContent:function(h,s){var t=this,r=t.getRng(),d=t.win.document;s=s||{format:'html'};s.set=true;h=t.dom.processHTML(h);if(r.insertNode){if(tinymce.isGecko&&h.indexOf('<')==-1){r.deleteContents();r.insertNode(t.getRng().createContextualFragment(h+'<span id="__caret">_</span>'));t.select(t.dom.get('__caret'));t.getRng().deleteContents();return;}try{if(d.queryCommandEnabled('InsertHTML'))return d.execCommand('InsertHTML',false,h);}catch(ex){r.deleteContents();r.insertNode(t.getRng().createContextualFragment(h));}}else{if(r.item){d.execCommand('Delete',false,null);r=t.getRng();}r.pasteHTML(h);}},getStart:function(){var t=this,r=t.getRng(),e;if(isIE){if(r.item)return r.item(0);r=r.duplicate();r.collapse(1);e=r.parentElement();if(e&&e.nodeName=='BODY')return e.firstChild;return e;}else{e=r.startContainer;if(e.nodeName=='BODY')return e.firstChild;return t.dom.getParent(e,function(n){return n.nodeType==1;});}},getEnd:function(){var t=this,r=t.getRng(),e;if(isIE){if(r.item)return r.item(0);r=r.duplicate();r.collapse(0);e=r.parentElement();if(e&&e.nodeName=='BODY')return e.lastChild;return e;}else{e=r.endContainer;if(e.nodeName=='BODY')return e.lastChild;return t.dom.getParent(e,function(n){return n.nodeType==1;});}},getBookmark:function(si){var t=this,r=t.getRng(),tr,sx,sy,vp=t.dom.getViewPort(t.win),e,sp,bp,le,c=-0xFFFFFF,s,ro=t.dom.getRoot(),wb=0,wa=0,nv;sx=vp.x;sy=vp.y;if(si=='simple')return{rng:r,scrollX:sx,scrollY:sy};if(isIE){if(r.item){e=r.item(0);each(t.dom.select(e.nodeName),function(n,i){if(e==n){sp=i;return false;}});return{tag:e.nodeName,index:sp,scrollX:sx,scrollY:sy};}tr=t.dom.doc.body.createTextRange();tr.moveToElementText(ro);tr.collapse(true);bp=Math.abs(tr.move('character',c));tr=r.duplicate();tr.collapse(true);sp=Math.abs(tr.move('character',c));tr=r.duplicate();tr.collapse(false);le=Math.abs(tr.move('character',c))-sp;return{start:sp-bp,length:le,scrollX:sx,scrollY:sy};}e=t.getNode();s=t.getSel();if(!s)return null;if(e&&e.nodeName=='IMG'){return{scrollX:sx,scrollY:sy};}function getPos(r,sn,en){var w=t.dom.doc.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+=trimNl(n.nodeValue||'').length;}return null;};if(s.anchorNode==s.focusNode&&s.anchorOffset==s.focusOffset){e=getPos(ro,s.anchorNode,s.focusNode);if(!e)return{scrollX:sx,scrollY:sy};trimNl(s.anchorNode.nodeValue||'').replace(/^\s+/,function(a){wb=a.length;});return{start:Math.max(e.start+s.anchorOffset-wb,0),end:Math.max(e.end+s.focusOffset-wb,0),scrollX:sx,scrollY:sy,beg:s.anchorOffset-wb==0};}else{e=getPos(ro,r.startContainer,r.endContainer);if(!e)return{scrollX:sx,scrollY:sy};return{start:Math.max(e.start+r.startOffset-wb,0),end:Math.max(e.end+r.endOffset-wa,0),scrollX:sx,scrollY:sy,beg:r.startOffset-wb==0};}},moveToBookmark:function(b){var t=this,r=t.getRng(),s=t.getSel(),ro=t.dom.getRoot(),sd,nvl,nv;function getPos(r,sp,ep){var w=t.dom.doc.createTreeWalker(r,NodeFilter.SHOW_TEXT,null,false),n,p=0,d={},o,v,wa,wb;while((n=w.nextNode())!=null){wa=wb=0;nv=n.nodeValue||'';nvl=trimNl(nv).length;p+=nvl;if(p>=sp&&!d.startNode){o=sp-(p-nvl);if(b.beg&&o>=nvl)continue;d.startNode=n;d.startOffset=o+wb;}if(p>=ep){d.endNode=n;d.endOffset=ep-(p-nvl)+wb;return d;}}return null;};if(!b)return false;t.win.scrollTo(b.scrollX,b.scrollY);if(isIE){if(r=b.rng){try{r.select();}catch(ex){}return true;}t.win.focus();if(b.tag){r=ro.createControlRange();each(t.dom.select(b.tag),function(n,i){if(i==b.index)r.addElement(n);});}else{try{if(b.start<0)return true;r=s.createRange();r.moveToElementText(ro);r.collapse(true);r.moveStart('character',b.start);r.moveEnd('character',b.length);}catch(ex2){return true;}}try{r.select();}catch(ex){}return true;}if(!s)return false;if(b.rng){s.removeAllRanges();s.addRange(b.rng);}else{if(is(b.start)&&is(b.end)){try{sd=getPos(ro,b.start,b.end);if(sd){r=t.dom.doc.createRange();r.setStart(sd.startNode,sd.startOffset);r.setEnd(sd.endNode,sd.endOffset);s.removeAllRanges();s.addRange(r);}if(!tinymce.isOpera)t.win.focus();}catch(ex){}}}},select:function(n,c){var t=this,r=t.getRng(),s=t.getSel(),b,fn,ln,d=t.win.document;function first(n){return n?d.createTreeWalker(n,NodeFilter.SHOW_TEXT,null,false).nextNode():null;};function last(n){var c,o,w;if(!n)return null;w=d.createTreeWalker(n,NodeFilter.SHOW_TEXT,null,false);while(c=w.nextNode())o=c;return o;};if(isIE){try{b=d.body;if(/^(IMG|TABLE)$/.test(n.nodeName)){r=b.createControlRange();r.addElement(n);}else{r=b.createTextRange();r.moveToElementText(n);}r.select();}catch(ex){}}else{if(c){fn=first(n);ln=last(n);if(fn&&ln){r=d.createRange();r.setStart(fn,0);r.setEnd(ln,ln.nodeValue.length);}else r.selectNode(n);}else r.selectNode(n);t.setRng(r);}return n;},isCollapsed:function(){var t=this,r=t.getRng(),s=t.getSel();if(!r||r.item)return false;return!s||r.boundingWidth==0||s.isCollapsed;},collapse:function(b){var t=this,r=t.getRng(),n;if(r.item){n=r.item(0);r=this.win.document.body.createTextRange();r.moveToElementText(n);}r.collapse(!!b);t.setRng(r);},getSel:function(){var t=this,w=this.win;return w.getSelection?w.getSelection():w.document.selection;},getRng:function(){var t=this,s=t.getSel(),r;try{if(s)r=s.rangeCount>0?s.getRangeAt(0):(s.createRange?s.createRange():t.win.document.createRange());}catch(ex){}if(!r)r=isIE?t.win.document.body.createTextRange():t.win.document.createRange();return r;},setRng:function(r){var s;if(!isIE){s=this.getSel();if(s){s.removeAllRanges();s.addRange(r);}}else{try{r.select();}catch(ex){}}},setNode:function(n){var t=this;t.setContent(t.dom.getOuterHTML(n));return n;},getNode:function(){var t=this,r=t.getRng(),s=t.getSel(),e;if(!isIE){if(!r)return t.dom.getRoot();e=r.commonAncestorContainer;if(!r.collapsed){if(r.startContainer==r.endContainer||(tinymce.isWebKit&&r.startContainer==r.endContainer.parentNode)){if(r.startOffset-r.endOffset<2||tinymce.isWebKit){if(r.startContainer.hasChildNodes())e=r.startContainer.childNodes[r.startOffset];}}}return t.dom.getParent(e,function(n){return n.nodeType==1;});}return r.item?r.item(0):r.parentElement();},destroy:function(s){var t=this;t.win=null;if(!s)tinymce.removeUnload(t.destroy);}});})();(function(){tinymce.create('tinymce.dom.XMLWriter',{node:null,XMLWriter:function(s){function getXML(){var i=document.implementation;if(!i||!i.createDocument){try{return new ActiveXObject('MSXML2.DOMDocument');}catch(ex){}try{return new ActiveXObject('Microsoft.XmlDom');}catch(ex){}}else return i.createDocument('','',null);};this.doc=getXML();this.valid=tinymce.isOpera||tinymce.isWebKit;this.reset();},reset:function(){var t=this,d=t.doc;if(d.firstChild)d.removeChild(d.firstChild);t.node=d.appendChild(d.createElement("html"));},writeStartElement:function(n){var t=this;t.node=t.node.appendChild(t.doc.createElement(n));},writeAttribute:function(n,v){if(this.valid)v=v.replace(/>/g,'%MCGT%');this.node.setAttribute(n,v);},writeEndElement:function(){this.node=this.node.parentNode;},writeFullEndElement:function(){var t=this,n=t.node;n.appendChild(t.doc.createTextNode(""));t.node=n.parentNode;},writeText:function(v){if(this.valid)v=v.replace(/>/g,'%MCGT%');this.node.appendChild(this.doc.createTextNode(v));},writeCDATA:function(v){this.node.appendChild(this.doc.createCDATA(v));},writeComment:function(v){this.node.appendChild(this.doc.createComment(v.replace(/\-\-/g,' ')));},getContent:function(){var h;h=this.doc.xml||new XMLSerializer().serializeToString(this.doc);h=h.replace(/<\?[^?]+\?>|<html>|<\/html>|<html\/>|<!DOCTYPE[^>]+>/g,'');h=h.replace(/ ?\/>/g,' />');if(this.valid)h=h.replace(/\%MCGT%/g,'&gt;');return h;}});})();(function(){tinymce.create('tinymce.dom.StringWriter',{str:null,tags:null,count:0,settings:null,indent:null,StringWriter:function(s){this.settings=tinymce.extend({indent_char:' ',indentation:1},s);this.reset();},reset:function(){this.indent='';this.str="";this.tags=[];this.count=0;},writeStartElement:function(n){this._writeAttributesEnd();this.writeRaw('<'+n);this.tags.push(n);this.inAttr=true;this.count++;this.elementCount=this.count;},writeAttribute:function(n,v){var t=this;t.writeRaw(" "+t.encode(n)+'="'+t.encode(v)+'"');},writeEndElement:function(){var n;if(this.tags.length>0){n=this.tags.pop();if(this._writeAttributesEnd(1))this.writeRaw('</'+n+'>');if(this.settings.indentation>0)this.writeRaw('\n');}},writeFullEndElement:function(){if(this.tags.length>0){this._writeAttributesEnd();this.writeRaw('</'+this.tags.pop()+'>');if(this.settings.indentation>0)this.writeRaw('\n');}},writeText:function(v){this._writeAttributesEnd();this.writeRaw(this.encode(v));this.count++;},writeCDATA:function(v){this._writeAttributesEnd();this.writeRaw('<![CDATA['+v+']]>');this.count++;},writeComment:function(v){this._writeAttributesEnd();this.writeRaw('<!-- '+v+'-->');this.count++;},writeRaw:function(v){this.str+=v;},encode:function(s){return s.replace(/[<>&"]/g,function(v){switch(v){case'<':return'&lt;';case'>':return'&gt;';case'&':return'&amp;';case'"':return'&quot;';}return v;});},getContent:function(){return this.str;},_writeAttributesEnd:function(s){if(!this.inAttr)return;this.inAttr=false;if(s&&this.elementCount==this.count){this.writeRaw(' />');return false;}this.writeRaw('>');return true;}});})();(function(){var extend=tinymce.extend,each=tinymce.each,Dispatcher=tinymce.util.Dispatcher,isIE=tinymce.isIE,isGecko=tinymce.isGecko;function getIEAtts(n){var o=[];if(n.nodeName=='OBJECT')return n.attributes;n.cloneNode(false).outerHTML.replace(/([a-z0-9\:\-_]+)=/gi,function(a,b){o.push({specified:1,nodeName:b});});return o;};function wildcardToRE(s){return s.replace(/([?+*])/g,'.$1');};tinymce.create('tinymce.dom.Serializer',{Serializer:function(s){var t=this;t.key=0;t.onPreProcess=new Dispatcher(t);t.onPostProcess=new Dispatcher(t);if(tinymce.relaxedDomain&&tinymce.isGecko){t.writer=new tinymce.dom.StringWriter();}else{try{t.writer=new tinymce.dom.XMLWriter();}catch(ex){t.writer=new tinymce.dom.StringWriter();}}t.settings=s=extend({dom:tinymce.DOM,valid_nodes:0,node_filter:0,attr_filter:0,invalid_attrs:/^(mce_|_moz_)/,closed:/(br|hr|input|meta|img|link|param)/,entity_encoding:'named',entities:'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,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',valid_elements:'*[*]',extended_valid_elements:0,valid_child_elements:0,invalid_elements:0,fix_table_elements:0,fix_list_elements:true,fix_content_duplication:true,convert_fonts_to_spans:false,font_size_classes:0,font_size_style_values:0,apply_source_formatting:0,indent_mode:'simple',indent_char:'\t',indent_levels:1,remove_linebreaks:1},s);t.dom=s.dom;if(s.fix_list_elements){t.onPreProcess.add(function(se,o){var nl,x,a=['ol','ul'],i,n,p,r=/^(OL|UL)$/,np;function prevNode(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;};for(x=0;x<a.length;x++){nl=t.dom.select(a[x],o.node);for(i=0;i<nl.length;i++){n=nl[i];p=n.parentNode;if(r.test(p.nodeName)){np=prevNode(n,'LI');if(!np){np=t.dom.create('li');np.innerHTML='&nbsp;';np.appendChild(n);p.insertBefore(np,p.firstChild);}else np.appendChild(n);}}}});}if(s.fix_table_elements){t.onPreProcess.add(function(se,o){each(t.dom.select('table',o.node),function(e){var pa=t.dom.getParent(e,'H1,H2,H3,H4,H5,H6,P'),pa2,n,tm,pl=[],i,ns;if(pa){pa2=pa.cloneNode(false);pl.push(e);for(n=e;n=n.parentNode;){pl.push(n);if(n==pa)break;}tm=pa2;for(i=pl.length-1;i>=0;i--){if(i==pl.length-1){while(ns=pl[i-1].nextSibling)tm.appendChild(ns.parentNode.removeChild(ns));}else{n=pl[i].cloneNode(false);if(i!=0){while(ns=pl[i-1].nextSibling)n.appendChild(ns.parentNode.removeChild(ns));}tm=tm.appendChild(n);}}e=t.dom.insertAfter(e.parentNode.removeChild(e),pa);t.dom.insertAfter(e,pa);t.dom.insertAfter(pa2,e);}});});}},setEntities:function(s){var t=this,a,i,l={},re='',v;if(t.entityLookup)return;a=s.split(',');for(i=0;i<a.length;i+=2){v=a[i];if(v==34||v==38||v==60||v==62)continue;l[String.fromCharCode(a[i])]=a[i+1];v=parseInt(a[i]).toString(16);re+='\\u'+'0000'.substring(v.length)+v;}if(!re){t.settings.entity_encoding='raw';return;}t.entitiesRE=new RegExp('['+re+']','g');t.entityLookup=l;},setValidChildRules:function(s){this.childRules=null;this.addValidChildRules(s);},addValidChildRules:function(s){var t=this,inst,intr,bloc;if(!s)return;inst='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';intr='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';bloc='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';each(s.split(','),function(s){var p=s.split(/\[|\]/),re;s='';each(p[1].split('|'),function(v){if(s)s+='|';switch(v){case'%itrans':v=intr;break;case'%itrans_na':v=intr.substring(2);break;case'%istrict':v=inst;break;case'%istrict_na':v=inst.substring(2);break;case'%btrans':v=bloc;break;case'%bstrict':v=bloc;break;}s+=v;});re=new RegExp('^('+s.toLowerCase()+')$','i');each(p[0].split('/'),function(s){t.childRules=t.childRules||{};t.childRules[s]=re;});});s='';each(t.childRules,function(v,k){if(s)s+='|';s+=k;});t.parentElementsRE=new RegExp('^('+s.toLowerCase()+')$','i');},setRules:function(s){var t=this;t._setup();t.rules={};t.wildRules=[];t.validElements={};return t.addRules(s);},addRules:function(s){var t=this,dr;if(!s)return;t._setup();each(s.split(','),function(s){var p=s.split(/\[|\]/),tn=p[0].split('/'),ra,at,wat,va=[];if(dr)at=tinymce.extend([],dr.attribs);if(p.length>1){each(p[1].split('|'),function(s){var ar={},i;at=at||[];s=s.replace(/::/g,'~');s=/^([!\-])?([\w*.?~_\-]+|)([=:<])?(.+)?$/.exec(s);s[2]=s[2].replace(/~/g,':');if(s[1]=='!'){ra=ra||[];ra.push(s[2]);}if(s[1]=='-'){for(i=0;i<at.length;i++){if(at[i].name==s[2]){at.splice(i,1);return;}}}switch(s[3]){case'=':ar.defaultVal=s[4]||'';break;case':':ar.forcedVal=s[4];break;case'<':ar.validVals=s[4].split('?');break;}if(/[*.?]/.test(s[2])){wat=wat||[];ar.nameRE=new RegExp('^'+wildcardToRE(s[2])+'$');wat.push(ar);}else{ar.name=s[2];at.push(ar);}va.push(s[2]);});}each(tn,function(s,i){var pr=s.charAt(0),x=1,ru={};if(dr){if(dr.noEmpty)ru.noEmpty=dr.noEmpty;if(dr.fullEnd)ru.fullEnd=dr.fullEnd;if(dr.padd)ru.padd=dr.padd;}switch(pr){case'-':ru.noEmpty=true;break;case'+':ru.fullEnd=true;break;case'#':ru.padd=true;break;default:x=0;}tn[i]=s=s.substring(x);t.validElements[s]=1;if(/[*.?]/.test(tn[0])){ru.nameRE=new RegExp('^'+wildcardToRE(tn[0])+'$');t.wildRules=t.wildRules||{};t.wildRules.push(ru);}else{ru.name=tn[0];if(tn[0]=='@')dr=ru;t.rules[s]=ru;}ru.attribs=at;if(ra)ru.requiredAttribs=ra;if(wat){s='';each(va,function(v){if(s)s+='|';s+='('+wildcardToRE(v)+')';});ru.validAttribsRE=new RegExp('^'+s.toLowerCase()+'$');ru.wildAttribs=wat;}});});s='';each(t.validElements,function(v,k){if(s)s+='|';if(k!='@')s+=k;});t.validElementsRE=new RegExp('^('+wildcardToRE(s.toLowerCase())+')$');},findRule:function(n){var t=this,rl=t.rules,i,r;t._setup();r=rl[n];if(r)return r;rl=t.wildRules;for(i=0;i<rl.length;i++){if(rl[i].nameRE.test(n))return rl[i];}return null;},findAttribRule:function(ru,n){var i,wa=ru.wildAttribs;for(i=0;i<wa.length;i++){if(wa[i].nameRE.test(n))return wa[i];}return null;},serialize:function(n,o){var h,t=this;t._setup();o=o||{};o.format=o.format||'html';t.processObj=o;n=n.cloneNode(true);t.key=''+(parseInt(t.key)+1);if(!o.no_events){o.node=n;t.onPreProcess.dispatch(t,o);}t.writer.reset();t._serializeNode(n,o.getInner);o.content=t.writer.getContent();if(!o.no_events)t.onPostProcess.dispatch(t,o);t._postProcess(o);o.node=null;return tinymce.trim(o.content);},_postProcess:function(o){var t=this,s=t.settings,h=o.content,sc=[],p;if(o.format=='html'){p=t._protect({content:h,patterns:[{pattern:/(<script[^>]*>)(.*?)(<\/script>)/g},{pattern:/(<style[^>]*>)(.*?)(<\/style>)/g},{pattern:/(<pre[^>]*>)(.*?)(<\/pre>)/g,encode:1}]});h=p.content;if(s.entity_encoding!=='raw')h=t._encode(h);if(!o.set){h=h.replace(/<p>\s+<\/p>|<p([^>]+)>\s+<\/p>/g,s.entity_encoding=='numeric'?'<p$1>&#160;</p>':'<p$1>&nbsp;</p>');if(s.remove_linebreaks){h=h.replace(/\r?\n|\r/g,' ');h=h.replace(/(<[^>]+>)\s+/g,'$1 ');h=h.replace(/\s+(<\/[^>]+>)/g,' $1');h=h.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object) ([^>]+)>\s+/g,'<$1 $2>');h=h.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>\s+/g,'<$1>');h=h.replace(/\s+<\/(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>/g,'</$1>');}if(s.apply_source_formatting&&s.indent_mode=='simple'){h=h.replace(/<(\/?)(ul|hr|table|meta|link|tbody|tr|object|body|head|html|map)(|[^>]+)>\s*/g,'\n<$1$2$3>\n');h=h.replace(/\s*<(p|h[1-6]|blockquote|div|title|style|pre|script|td|li|area)(|[^>]+)>/g,'\n<$1$2>');h=h.replace(/<\/(p|h[1-6]|blockquote|div|title|style|pre|script|td|li)>\s*/g,'</$1>\n');h=h.replace(/\n\n/g,'\n');}}h=t._unprotect(h,p);if(s.entity_encoding=='raw')h=h.replace(/<p>&nbsp;<\/p>|<p([^>]+)>&nbsp;<\/p>/g,'<p$1>\u00a0</p>');}o.content=h;},_serializeNode:function(n,inn){var t=this,s=t.settings,w=t.writer,hc,el,cn,i,l,a,at,no,v,nn,ru,ar,iv;if(!s.node_filter||s.node_filter(n)){switch(n.nodeType){case 1:if(n.hasAttribute?n.hasAttribute('mce_bogus'):n.getAttribute('mce_bogus'))return;iv=false;hc=n.hasChildNodes();nn=n.getAttribute('mce_name')||n.nodeName.toLowerCase();if(isIE){if(n.scopeName!=='HTML'&&n.scopeName!=='html')nn=n.scopeName+':'+nn;}if(nn.indexOf('mce:')===0)nn=nn.substring(4);if(!t.validElementsRE.test(nn)||(t.invalidElementsRE&&t.invalidElementsRE.test(nn))||inn){iv=true;break;}if(isIE){if(s.fix_content_duplication){if(n.mce_serialized==t.key)return;n.mce_serialized=t.key;}if(nn.charAt(0)=='/')nn=nn.substring(1);}else if(isGecko){if(n.nodeName==='BR'&&n.getAttribute('type')=='_moz')return;}if(t.childRules){if(t.parentElementsRE.test(t.elementName)){if(!t.childRules[t.elementName].test(nn)){iv=true;break;}}t.elementName=nn;}ru=t.findRule(nn);nn=ru.name||nn;if((!hc&&ru.noEmpty)||(isIE&&!nn)){iv=true;break;}if(ru.requiredAttribs){a=ru.requiredAttribs;for(i=a.length-1;i>=0;i--){if(this.dom.getAttrib(n,a[i])!=='')break;}if(i==-1){iv=true;break;}}w.writeStartElement(nn);if(ru.attribs){for(i=0,at=ru.attribs,l=at.length;i<l;i++){a=at[i];v=t._getAttrib(n,a);if(v!==null)w.writeAttribute(a.name,v);}}if(ru.validAttribsRE){at=isIE?getIEAtts(n):n.attributes;for(i=at.length-1;i>-1;i--){no=at[i];if(no.specified){a=no.nodeName.toLowerCase();if(s.invalid_attrs.test(a)||!ru.validAttribsRE.test(a))continue;ar=t.findAttribRule(ru,a);v=t._getAttrib(n,ar,a);if(v!==null)w.writeAttribute(a,v);}}}if(!hc&&ru.padd)w.writeText('\u00a0');break;case 3:if(t.childRules&&t.parentElementsRE.test(t.elementName)){if(!t.childRules[t.elementName].test(n.nodeName))return;}return w.writeText(n.nodeValue);case 4:return w.writeCDATA(n.nodeValue);case 8:return w.writeComment(n.nodeValue);}}else if(n.nodeType==1)hc=n.hasChildNodes();if(hc){cn=n.firstChild;while(cn){t._serializeNode(cn);t.elementName=nn;cn=cn.nextSibling;}}if(!iv){if(hc||!s.closed.test(nn))w.writeFullEndElement();else w.writeEndElement();}},_protect:function(o){var t=this;o.items=o.items||[];function enc(s){return s.replace(/[\r\n\\]/g,function(c){if(c==='\n')return'\\n';else if(c==='\\')return'\\\\';return'\\r';});};function dec(s){return s.replace(/\\[\\rn]/g,function(c){if(c==='\\n')return'\n';else if(c==='\\\\')return'\\';return'\r';});};each(o.patterns,function(p){o.content=dec(enc(o.content).replace(p.pattern,function(x,a,b,c){b=dec(b);if(p.encode)b=t._encode(b);o.items.push(b);return a+'<!--mce:'+(o.items.length-1)+'-->'+c;}));});return o;},_unprotect:function(h,o){h=h.replace(/\<!--mce:([0-9]+)--\>/g,function(a,b){return o.items[parseInt(b)];});o.items=[];return h;},_encode:function(h){var t=this,s=t.settings,l;if(s.entity_encoding!=='raw'){if(s.entity_encoding.indexOf('named')!=-1){t.setEntities(s.entities);l=t.entityLookup;h=h.replace(t.entitiesRE,function(a){var v;if(v=l[a])a='&'+v+';';return a;});}if(s.entity_encoding.indexOf('numeric')!=-1){h=h.replace(/[\u007E-\uFFFF]/g,function(a){return'&#'+a.charCodeAt(0)+';';});}}return h;},_setup:function(){var t=this,s=this.settings;if(t.done)return;t.done=1;t.setRules(s.valid_elements);t.addRules(s.extended_valid_elements);t.addValidChildRules(s.valid_child_elements);if(s.invalid_elements)t.invalidElementsRE=new RegExp('^('+wildcardToRE(s.invalid_elements.replace(/,/g,'|').toLowerCase())+')$');if(s.attrib_value_filter)t.attribValueFilter=s.attribValueFilter;},_getAttrib:function(n,a,na){var i,v;na=na||a.name;if(a.forcedVal&&(v=a.forcedVal)){if(v==='{$uid}')return this.dom.uniqueId();return v;}v=this.dom.getAttrib(n,na);switch(na){case'rowspan':case'colspan':if(v=='1')v='';break;}if(this.attribValueFilter)v=this.attribValueFilter(na,v,n);if(a.validVals){for(i=a.validVals.length-1;i>=0;i--){if(v==a.validVals[i])break;}if(i==-1)return null;}if(v===''&&typeof(a.defaultVal)!='undefined'){v=a.defaultVal;if(v==='{$uid}')return this.dom.uniqueId();return v;}else{if(na=='class'&&this.processObj.get)v=v.replace(/\s?mceItem\w+\s?/g,'');}if(v==='')return null;return v;}});})();(function(){var each=tinymce.each;tinymce.create('tinymce.dom.ScriptLoader',{ScriptLoader:function(s){this.settings=s||{};this.queue=[];this.lookup={};},isDone:function(u){return this.lookup[u]?this.lookup[u].state==2:0;},markDone:function(u){this.lookup[u]={state:2,url:u};},add:function(u,cb,s,pr){var t=this,lo=t.lookup,o;if(o=lo[u]){if(cb&&o.state==2)cb.call(s||this);return o;}o={state:0,url:u,func:cb,scope:s||this};if(pr)t.queue.unshift(o);else t.queue.push(o);lo[u]=o;return o;},load:function(u,cb,s){var t=this,o;if(o=t.lookup[u]){if(cb&&o.state==2)cb.call(s||t);return o;}function loadScript(u){if(tinymce.dom.Event.domLoaded||t.settings.strict_mode){tinymce.util.XHR.send({url:tinymce._addVer(u),error:t.settings.error,async:false,success:function(co){t.eval(co);}});}else document.write('<script type="text/javascript" src="'+tinymce._addVer(u)+'"></script>');};if(!tinymce.is(u,'string')){each(u,function(u){loadScript(u);});if(cb)cb.call(s||t);}else{loadScript(u);if(cb)cb.call(s||t);}},loadQueue:function(cb,s){var t=this;if(!t.queueLoading){t.queueLoading=1;t.queueCallbacks=[];t.loadScripts(t.queue,function(){t.queueLoading=0;if(cb)cb.call(s||t);each(t.queueCallbacks,function(o){o.func.call(o.scope);});});}else if(cb)t.queueCallbacks.push({func:cb,scope:s||t});},eval:function(co){var w=window;if(!w.execScript){try{eval.call(w,co);}catch(ex){eval(co,w);}}else w.execScript(co);},loadScripts:function(sc,cb,s){var t=this,lo=t.lookup;function done(o){o.state=2;if(o.func)o.func.call(o.scope||t);};function allDone(){var l;l=sc.length;each(sc,function(o){o=lo[o.url];if(o.state===2){done(o);l--;}else load(o);});if(l===0&&cb){cb.call(s||t);cb=0;}};function load(o){if(o.state>0)return;o.state=1;tinymce.util.XHR.send({url:o.url,error:t.settings.error,success:function(co){t.eval(co);done(o);allDone();}});};each(sc,function(o){var u=o.url;if(!lo[u]){lo[u]=o;t.queue.push(o);}else o=lo[u];if(o.state>0)return;if(!tinymce.dom.Event.domLoaded&&!t.settings.strict_mode){var ix,ol='';if(cb||o.func){o.state=1;ix=tinymce.dom.ScriptLoader._addOnLoad(function(){done(o);allDone();});if(tinymce.isIE)ol=' onreadystatechange="';else ol=' onload="';ol+='tinymce.dom.ScriptLoader._onLoad(this,\''+u+'\','+ix+');"';}document.write('<script type="text/javascript" src="'+tinymce._addVer(u)+'"'+ol+'></script>');if(!o.func)done(o);}else load(o);});allDone();},'static':{_addOnLoad:function(f){var t=this;t._funcs=t._funcs||[];t._funcs.push(f);return t._funcs.length-1;},_onLoad:function(e,u,ix){if(!tinymce.isIE||e.readyState=='complete')this._funcs[ix].call(this);}}});tinymce.ScriptLoader=new tinymce.dom.ScriptLoader();})();(function(){var DOM=tinymce.DOM,is=tinymce.is;tinymce.create('tinymce.ui.Control',{Control:function(id,s){this.id=id;this.settings=s=s||{};this.rendered=false;this.onRender=new tinymce.util.Dispatcher(this);this.classPrefix='';this.scope=s.scope||this;this.disabled=0;this.active=0;},setDisabled:function(s){var e;if(s!=this.disabled){e=DOM.get(this.id);if(e&&this.settings.unavailable_prefix){if(s){this.prevTitle=e.title;e.title=this.settings.unavailable_prefix+": "+e.title;}else e.title=this.prevTitle;}this.setState('Disabled',s);this.setState('Enabled',!s);this.disabled=s;}},isDisabled:function(){return this.disabled;},setActive:function(s){if(s!=this.active){this.setState('Active',s);this.active=s;}},isActive:function(){return this.active;},setState:function(c,s){var n=DOM.get(this.id);c=this.classPrefix+c;if(s)DOM.addClass(n,c);else DOM.removeClass(n,c);},isRendered:function(){return this.rendered;},renderHTML:function(){},renderTo:function(n){DOM.setHTML(n,this.renderHTML());},postRender:function(){var t=this,b;if(is(t.disabled)){b=t.disabled;t.disabled=-1;t.setDisabled(b);}if(is(t.active)){b=t.active;t.active=-1;t.setActive(b);}},remove:function(){DOM.remove(this.id);this.destroy();},destroy:function(){tinymce.dom.Event.clear(this.id);}});})();tinymce.create('tinymce.ui.Container:tinymce.ui.Control',{Container:function(id,s){this.parent(id,s);this.controls=[];this.lookup={};},add:function(c){this.lookup[c.id]=c;this.controls.push(c);return c;},get:function(n){return this.lookup[n];}});tinymce.create('tinymce.ui.Separator:tinymce.ui.Control',{Separator:function(id,s){this.parent(id,s);this.classPrefix='mceSeparator';},renderHTML:function(){return tinymce.DOM.createHTML('span',{'class':this.classPrefix});}});(function(){var is=tinymce.is,DOM=tinymce.DOM,each=tinymce.each,walk=tinymce.walk;tinymce.create('tinymce.ui.MenuItem:tinymce.ui.Control',{MenuItem:function(id,s){this.parent(id,s);this.classPrefix='mceMenuItem';},setSelected:function(s){this.setState('Selected',s);this.selected=s;},isSelected:function(){return this.selected;},postRender:function(){var t=this;t.parent();if(is(t.selected))t.setSelected(t.selected);}});})();(function(){var is=tinymce.is,DOM=tinymce.DOM,each=tinymce.each,walk=tinymce.walk;tinymce.create('tinymce.ui.Menu:tinymce.ui.MenuItem',{Menu:function(id,s){var t=this;t.parent(id,s);t.items={};t.collapsed=false;t.menuCount=0;t.onAddItem=new tinymce.util.Dispatcher(this);},expand:function(d){var t=this;if(d){walk(t,function(o){if(o.expand)o.expand();},'items',t);}t.collapsed=false;},collapse:function(d){var t=this;if(d){walk(t,function(o){if(o.collapse)o.collapse();},'items',t);}t.collapsed=true;},isCollapsed:function(){return this.collapsed;},add:function(o){if(!o.settings)o=new tinymce.ui.MenuItem(o.id||DOM.uniqueId(),o);this.onAddItem.dispatch(this,o);return this.items[o.id]=o;},addSeparator:function(){return this.add({separator:true});},addMenu:function(o){if(!o.collapse)o=this.createMenu(o);this.menuCount++;return this.add(o);},hasMenus:function(){return this.menuCount!==0;},remove:function(o){delete this.items[o.id];},removeAll:function(){var t=this;walk(t,function(o){if(o.removeAll)o.removeAll();else o.remove();o.destroy();},'items',t);t.items={};},createMenu:function(o){var m=new tinymce.ui.Menu(o.id||DOM.uniqueId(),o);m.onAddItem.add(this.onAddItem.dispatch,this.onAddItem);return m;}});})();(function(){var is=tinymce.is,DOM=tinymce.DOM,each=tinymce.each,Event=tinymce.dom.Event,Element=tinymce.dom.Element;tinymce.create('tinymce.ui.DropMenu:tinymce.ui.Menu',{DropMenu:function(id,s){s=s||{};s.container=s.container||DOM.doc.body;s.offset_x=s.offset_x||0;s.offset_y=s.offset_y||0;s.vp_offset_x=s.vp_offset_x||0;s.vp_offset_y=s.vp_offset_y||0;if(is(s.icons)&&!s.icons)s['class']+=' mceNoIcons';this.parent(id,s);this.onShowMenu=new tinymce.util.Dispatcher(this);this.onHideMenu=new tinymce.util.Dispatcher(this);this.classPrefix='mceMenu';},createMenu:function(s){var t=this,cs=t.settings,m;s.container=s.container||cs.container;s.parent=t;s.constrain=s.constrain||cs.constrain;s['class']=s['class']||cs['class'];s.vp_offset_x=s.vp_offset_x||cs.vp_offset_x;s.vp_offset_y=s.vp_offset_y||cs.vp_offset_y;m=new tinymce.ui.DropMenu(s.id||DOM.uniqueId(),s);m.onAddItem.add(t.onAddItem.dispatch,t.onAddItem);return m;},update:function(){var t=this,s=t.settings,tb=DOM.get('menu_'+t.id+'_tbl'),co=DOM.get('menu_'+t.id+'_co'),tw,th;tw=s.max_width?Math.min(tb.clientWidth,s.max_width):tb.clientWidth;th=s.max_height?Math.min(tb.clientHeight,s.max_height):tb.clientHeight;if(!DOM.boxModel)t.element.setStyles({width:tw+2,height:th+2});else t.element.setStyles({width:tw,height:th});if(s.max_width)DOM.setStyle(co,'width',tw);if(s.max_height){DOM.setStyle(co,'height',th);if(tb.clientHeight<s.max_height)DOM.setStyle(co,'overflow','hidden');}},showMenu:function(x,y,px){var t=this,s=t.settings,co,vp=DOM.getViewPort(),w,h,mx,my,ot=2,dm,tb,cp=t.classPrefix;t.collapse(1);if(t.isMenuVisible)return;if(!t.rendered){co=DOM.add(t.settings.container,t.renderNode());each(t.items,function(o){o.postRender();});t.element=new Element('menu_'+t.id,{blocker:1,container:s.container});}else co=DOM.get('menu_'+t.id);if(!tinymce.isOpera)DOM.setStyles(co,{left:-0xFFFF,top:-0xFFFF});DOM.show(co);t.update();x+=s.offset_x||0;y+=s.offset_y||0;vp.w-=4;vp.h-=4;if(s.constrain){w=co.clientWidth-ot;h=co.clientHeight-ot;mx=vp.x+vp.w;my=vp.y+vp.h;if((x+s.vp_offset_x+w)>mx)x=px?px-w:Math.max(0,(mx-s.vp_offset_x)-w);if((y+s.vp_offset_y+h)>my)y=Math.max(0,(my-s.vp_offset_y)-h);}DOM.setStyles(co,{left:x,top:y});t.element.update();t.isMenuVisible=1;t.mouseClickFunc=Event.add(co,'click',function(e){var m;e=e.target;if(e&&(e=DOM.getParent(e,'TR'))&&!DOM.hasClass(e,cp+'ItemSub')){m=t.items[e.id];if(m.isDisabled())return;dm=t;while(dm){if(dm.hideMenu)dm.hideMenu();dm=dm.settings.parent;}if(m.settings.onclick)m.settings.onclick(e);return Event.cancel(e);}});if(t.hasMenus()){t.mouseOverFunc=Event.add(co,'mouseover',function(e){var m,r,mi;e=e.target;if(e&&(e=DOM.getParent(e,'TR'))){m=t.items[e.id];if(t.lastMenu)t.lastMenu.collapse(1);if(m.isDisabled())return;if(e&&DOM.hasClass(e,cp+'ItemSub')){r=DOM.getRect(e);m.showMenu((r.x+r.w-ot),r.y-ot,r.x);t.lastMenu=m;DOM.addClass(DOM.get(m.id).firstChild,cp+'ItemActive');}}});}t.onShowMenu.dispatch(t);if(s.keyboard_focus){Event.add(co,'keydown',t._keyHandler,t);DOM.select('a','menu_'+t.id)[0].focus();t._focusIdx=0;}},hideMenu:function(c){var t=this,co=DOM.get('menu_'+t.id),e;if(!t.isMenuVisible)return;Event.remove(co,'mouseover',t.mouseOverFunc);Event.remove(co,'click',t.mouseClickFunc);Event.remove(co,'keydown',t._keyHandler);DOM.hide(co);t.isMenuVisible=0;if(!c)t.collapse(1);if(t.element)t.element.hide();if(e=DOM.get(t.id))DOM.removeClass(e.firstChild,t.classPrefix+'ItemActive');t.onHideMenu.dispatch(t);},add:function(o){var t=this,co;o=t.parent(o);if(t.isRendered&&(co=DOM.get('menu_'+t.id)))t._add(DOM.select('tbody',co)[0],o);return o;},collapse:function(d){this.parent(d);this.hideMenu(1);},remove:function(o){DOM.remove(o.id);this.destroy();return this.parent(o);},destroy:function(){var t=this,co=DOM.get('menu_'+t.id);Event.remove(co,'mouseover',t.mouseOverFunc);Event.remove(co,'click',t.mouseClickFunc);if(t.element)t.element.remove();DOM.remove(co);},renderNode:function(){var t=this,s=t.settings,n,tb,co,w;w=DOM.create('div',{id:'menu_'+t.id,'class':s['class'],'style':'position:absolute;left:0;top:0;z-index:200000'});co=DOM.add(w,'div',{id:'menu_'+t.id+'_co','class':t.classPrefix+(s['class']?' '+s['class']:'')});t.element=new Element('menu_'+t.id,{blocker:1,container:s.container});if(s.menu_line)DOM.add(co,'span',{'class':t.classPrefix+'Line'});n=DOM.add(co,'table',{id:'menu_'+t.id+'_tbl',border:0,cellPadding:0,cellSpacing:0});tb=DOM.add(n,'tbody');each(t.items,function(o){t._add(tb,o);});t.rendered=true;return w;},_keyHandler:function(e){var t=this,kc=e.keyCode;function focus(d){var i=t._focusIdx+d,e=DOM.select('a','menu_'+t.id)[i];if(e){t._focusIdx=i;e.focus();}};switch(kc){case 38:focus(-1);return;case 40:focus(1);return;case 13:return;case 27:return this.hideMenu();}},_add:function(tb,o){var n,s=o.settings,a,ro,it,cp=this.classPrefix;if(s.separator){ro=DOM.add(tb,'tr',{id:o.id,'class':cp+'ItemSeparator'});DOM.add(ro,'td',{'class':cp+'ItemSeparator'});if(n=ro.previousSibling)DOM.addClass(n,'mceLast');return;}n=ro=DOM.add(tb,'tr',{id:o.id,'class':cp+'Item '+cp+'ItemEnabled'});n=it=DOM.add(n,'td');n=a=DOM.add(n,'a',{href:'javascript:;',onclick:"return false;",onmousedown:'return false;'});DOM.addClass(it,s['class']);DOM.add(n,'span',{'class':'mceIcon'+(s.icon?' mce_'+s.icon:'')});n=DOM.add(n,s.element||'span',{'class':'mceText',title:o.settings.title},o.settings.title);if(o.settings.style)DOM.setAttrib(n,'style',o.settings.style);if(tb.childNodes.length==1)DOM.addClass(ro,'mceFirst');if((n=ro.previousSibling)&&DOM.hasClass(n,cp+'ItemSeparator'))DOM.addClass(ro,'mceFirst');if(o.collapse)DOM.addClass(ro,cp+'ItemSub');if(n=ro.previousSibling)DOM.removeClass(n,'mceLast');DOM.addClass(ro,'mceLast');}});})();(function(){var DOM=tinymce.DOM;tinymce.create('tinymce.ui.Button:tinymce.ui.Control',{Button:function(id,s){this.parent(id,s);this.classPrefix='mceButton';},renderHTML:function(){var cp=this.classPrefix,s=this.settings,h,l;l=DOM.encode(s.label||'');h='<a id="'+this.id+'" href="javascript:;" class="'+cp+' '+cp+'Enabled '+s['class']+(l?' '+cp+'Labeled':'')+'" onmousedown="return false;" onclick="return false;" title="'+DOM.encode(s.title)+'">';if(s.image)h+='<img class="mceIcon" src="'+s.image+'" />'+l+'</a>';else h+='<span class="mceIcon '+s['class']+'"></span>'+(l?'<span class="'+cp+'Label">'+l+'</span>':'')+'</a>';return h;},postRender:function(){var t=this,s=t.settings;tinymce.dom.Event.add(t.id,'click',function(e){if(!t.isDisabled())return s.onclick.call(s.scope,e);});}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each,Dispatcher=tinymce.util.Dispatcher;tinymce.create('tinymce.ui.ListBox:tinymce.ui.Control',{ListBox:function(id,s){var t=this;t.parent(id,s);t.items=[];t.onChange=new Dispatcher(t);t.onPostRender=new Dispatcher(t);t.onAdd=new Dispatcher(t);t.onRenderMenu=new tinymce.util.Dispatcher(this);t.classPrefix='mceListBox';},select:function(v){var t=this,e,fv;if(v!=t.selectedValue){e=DOM.get(t.id+'_text');t.selectedValue=v;each(t.items,function(o){if(o.value==v){DOM.setHTML(e,DOM.encode(o.title));fv=1;return false;}});if(!fv){DOM.setHTML(e,DOM.encode(t.settings.title));DOM.addClass(e,'mceTitle');e=0;return;}else DOM.removeClass(e,'mceTitle');}e=0;},add:function(n,v,o){var t=this;o=o||{};o=tinymce.extend(o,{title:n,value:v});t.items.push(o);t.onAdd.dispatch(t,o);},getLength:function(){return this.items.length;},renderHTML:function(){var h='',t=this,s=t.settings,cp=t.classPrefix;h='<table id="'+t.id+'" cellpadding="0" cellspacing="0" class="'+cp+' '+cp+'Enabled'+(s['class']?(' '+s['class']):'')+'"><tbody><tr>';h+='<td>'+DOM.createHTML('a',{id:t.id+'_text',href:'javascript:;','class':'mceText',onclick:"return false;",onmousedown:'return false;'},DOM.encode(t.settings.title))+'</td>';h+='<td>'+DOM.createHTML('a',{id:t.id+'_open',tabindex:-1,href:'javascript:;','class':'mceOpen',onclick:"return false;",onmousedown:'return false;'},'<span></span>')+'</td>';h+='</tr></tbody></table>';return h;},showMenu:function(){var t=this,p1,p2,e=DOM.get(this.id),m;if(t.isDisabled()||t.items.length==0)return;if(t.menu&&t.menu.isMenuVisible)return t.hideMenu();if(!t.isMenuRendered){t.renderMenu();t.isMenuRendered=true;}p1=DOM.getPos(this.settings.menu_container);p2=DOM.getPos(e);m=t.menu;m.settings.offset_x=p2.x;m.settings.offset_y=p2.y;m.settings.keyboard_focus=!tinymce.isOpera;if(t.oldID)m.items[t.oldID].setSelected(0);each(t.items,function(o){if(o.value===t.selectedValue){m.items[o.id].setSelected(1);t.oldID=o.id;}});m.showMenu(0,e.clientHeight);Event.add(DOM.doc,'mousedown',t.hideMenu,t);DOM.addClass(t.id,t.classPrefix+'Selected');},hideMenu:function(e){var t=this;if(e&&e.type=="mousedown"&&(e.target.id==t.id+'_text'||e.target.id==t.id+'_open'))return;if(!e||!DOM.getParent(e.target,function(n){return DOM.hasClass(n,'mceMenu');})){DOM.removeClass(t.id,t.classPrefix+'Selected');Event.remove(DOM.doc,'mousedown',t.hideMenu,t);if(t.menu)t.menu.hideMenu();}},renderMenu:function(){var t=this,m;m=t.settings.control_manager.createDropMenu(t.id+'_menu',{menu_line:1,'class':t.classPrefix+'Menu mceNoIcons',max_width:150,max_height:150});m.onHideMenu.add(t.hideMenu,t);m.add({title:t.settings.title,'class':'mceMenuItemTitle'}).setDisabled(1);each(t.items,function(o){o.id=DOM.uniqueId();o.onclick=function(){if(t.settings.onselect(o.value)!==false)t.select(o.value);};m.add(o);});t.onRenderMenu.dispatch(t,m);t.menu=m;},postRender:function(){var t=this,cp=t.classPrefix;Event.add(t.id,'click',t.showMenu,t);Event.add(t.id+'_text','focus',function(e){if(!t._focused){t.keyDownHandler=Event.add(t.id+'_text','keydown',function(e){var idx=-1,v,kc=e.keyCode;each(t.items,function(v,i){if(t.selectedValue==v.value)idx=i;});if(kc==38)v=t.items[idx-1];else if(kc==40)v=t.items[idx+1];else if(kc==13){v=t.selectedValue;t.selectedValue=null;t.settings.onselect(v);return Event.cancel(e);}if(v){t.hideMenu();t.select(v.value);}});}t._focused=1;});Event.add(t.id+'_text','blur',function(){Event.remove(t.id+'_text','keydown',t.keyDownHandler);t._focused=0;});if(tinymce.isIE6||!DOM.boxModel){Event.add(t.id,'mouseover',function(){if(!DOM.hasClass(t.id,cp+'Disabled'))DOM.addClass(t.id,cp+'Hover');});Event.add(t.id,'mouseout',function(){if(!DOM.hasClass(t.id,cp+'Disabled'))DOM.removeClass(t.id,cp+'Hover');});}t.onPostRender.dispatch(t,DOM.get(t.id));},destroy:function(){this.parent();Event.clear(this.id+'_text');}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each,Dispatcher=tinymce.util.Dispatcher;tinymce.create('tinymce.ui.NativeListBox:tinymce.ui.ListBox',{NativeListBox:function(id,s){this.parent(id,s);this.classPrefix='mceNativeListBox';},setDisabled:function(s){DOM.get(this.id).disabled=s;},isDisabled:function(){return DOM.get(this.id).disabled;},select:function(v){var e=DOM.get(this.id),ol=e.options;v=''+(v||'');e.selectedIndex=0;each(ol,function(o,i){if(o.value==v){e.selectedIndex=i;return false;}});},add:function(n,v,a){var o,t=this;a=a||{};a.value=v;if(t.isRendered())DOM.add(DOM.get(this.id),'option',a,n);o={title:n,value:v,attribs:a};t.items.push(o);t.onAdd.dispatch(t,o);},getLength:function(){return DOM.get(this.id).options.length-1;},renderHTML:function(){var h,t=this;h=DOM.createHTML('option',{value:''},'-- '+t.settings.title+' --');each(t.items,function(it){h+=DOM.createHTML('option',{value:it.value},it.title);});h=DOM.createHTML('select',{id:t.id,'class':'mceNativeListBox'},h);return h;},postRender:function(){var t=this,ch;t.rendered=true;function onChange(e){var v=e.target.options[e.target.selectedIndex].value;t.onChange.dispatch(t,v);if(t.settings.onselect)t.settings.onselect(v);};Event.add(t.id,'change',onChange);Event.add(t.id,'keydown',function(e){var bf;Event.remove(t.id,'change',ch);bf=Event.add(t.id,'blur',function(){Event.add(t.id,'change',onChange);Event.remove(t.id,'blur',bf);});if(e.keyCode==13||e.keyCode==32){onChange(e);return Event.cancel(e);}});t.onPostRender.dispatch(t,DOM.get(t.id));}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each;tinymce.create('tinymce.ui.MenuButton:tinymce.ui.Button',{MenuButton:function(id,s){this.parent(id,s);this.onRenderMenu=new tinymce.util.Dispatcher(this);s.menu_container=s.menu_container||DOM.doc.body;},showMenu:function(){var t=this,p1,p2,e=DOM.get(t.id),m;if(t.isDisabled())return;if(!t.isMenuRendered){t.renderMenu();t.isMenuRendered=true;}if(t.isMenuVisible)return t.hideMenu();p1=DOM.getPos(t.settings.menu_container);p2=DOM.getPos(e);m=t.menu;m.settings.offset_x=p2.x;m.settings.offset_y=p2.y;m.settings.vp_offset_x=p2.x;m.settings.vp_offset_y=p2.y;m.settings.keyboard_focus=t._focused;m.showMenu(0,e.clientHeight);Event.add(DOM.doc,'mousedown',t.hideMenu,t);t.setState('Selected',1);t.isMenuVisible=1;},renderMenu:function(){var t=this,m;m=t.settings.control_manager.createDropMenu(t.id+'_menu',{menu_line:1,'class':this.classPrefix+'Menu',icons:t.settings.icons});m.onHideMenu.add(t.hideMenu,t);t.onRenderMenu.dispatch(t,m);t.menu=m;},hideMenu:function(e){var t=this;if(e&&e.type=="mousedown"&&DOM.getParent(e.target,function(e){return e.id===t.id||e.id===t.id+'_open';}))return;if(!e||!DOM.getParent(e.target,function(n){return DOM.hasClass(n,'mceMenu');})){t.setState('Selected',0);Event.remove(DOM.doc,'mousedown',t.hideMenu,t);if(t.menu)t.menu.hideMenu();}t.isMenuVisible=0;},postRender:function(){var t=this,s=t.settings;Event.add(t.id,'click',function(){if(!t.isDisabled()){if(s.onclick)s.onclick(t.value);t.showMenu();}});}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each;tinymce.create('tinymce.ui.SplitButton:tinymce.ui.MenuButton',{SplitButton:function(id,s){this.parent(id,s);this.classPrefix='mceSplitButton';},renderHTML:function(){var h,t=this,s=t.settings,h1;h='<tbody><tr>';if(s.image)h1=DOM.createHTML('img ',{src:s.image,'class':'mceAction '+s['class']});else h1=DOM.createHTML('span',{'class':'mceAction '+s['class']},'');h+='<td>'+DOM.createHTML('a',{id:t.id+'_action',href:'javascript:;','class':'mceAction '+s['class'],onclick:"return false;",onmousedown:'return false;',title:s.title},h1)+'</td>';h1=DOM.createHTML('span',{'class':'mceOpen '+s['class']});h+='<td>'+DOM.createHTML('a',{id:t.id+'_open',href:'javascript:;','class':'mceOpen '+s['class'],onclick:"return false;",onmousedown:'return false;',title:s.title},h1)+'</td>';h+='</tr></tbody>';return DOM.createHTML('table',{id:t.id,'class':'mceSplitButton mceSplitButtonEnabled '+s['class'],cellpadding:'0',cellspacing:'0',onmousedown:'return false;',title:s.title},h);},postRender:function(){var t=this,s=t.settings;if(s.onclick){Event.add(t.id+'_action','click',function(){if(!t.isDisabled())s.onclick(t.value);});}Event.add(t.id+'_open','click',t.showMenu,t);Event.add(t.id+'_open','focus',function(){t._focused=1;});Event.add(t.id+'_open','blur',function(){t._focused=0;});if(tinymce.isIE6||!DOM.boxModel){Event.add(t.id,'mouseover',function(){if(!DOM.hasClass(t.id,'mceSplitButtonDisabled'))DOM.addClass(t.id,'mceSplitButtonHover');});Event.add(t.id,'mouseout',function(){if(!DOM.hasClass(t.id,'mceSplitButtonDisabled'))DOM.removeClass(t.id,'mceSplitButtonHover');});}},destroy:function(){this.parent();Event.clear(this.id+'_action');Event.clear(this.id+'_open');}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,is=tinymce.is,each=tinymce.each;tinymce.create('tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton',{ColorSplitButton:function(id,s){var t=this;t.parent(id,s);t.settings=s=tinymce.extend({colors:'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',grid_width:8,default_color:'#888888'},t.settings);t.onShowMenu=new tinymce.util.Dispatcher(t);t.onHideMenu=new tinymce.util.Dispatcher(t);t.value=s.default_color;},showMenu:function(){var t=this,r,p,e,p2;if(t.isDisabled())return;if(!t.isMenuRendered){t.renderMenu();t.isMenuRendered=true;}if(t.isMenuVisible)return t.hideMenu();e=DOM.get(t.id);DOM.show(t.id+'_menu');DOM.addClass(e,'mceSplitButtonSelected');p2=DOM.getPos(e);DOM.setStyles(t.id+'_menu',{left:p2.x,top:p2.y+e.clientHeight,zIndex:200000});e=0;Event.add(DOM.doc,'mousedown',t.hideMenu,t);if(t._focused){t._keyHandler=Event.add(t.id+'_menu','keydown',function(e){if(e.keyCode==27)t.hideMenu();});DOM.select('a',t.id+'_menu')[0].focus();}t.onShowMenu.dispatch(t);t.isMenuVisible=1;},hideMenu:function(e){var t=this;if(e&&e.type=="mousedown"&&DOM.getParent(e.target,function(e){return e.id===t.id+'_open';}))return;if(!e||!DOM.getParent(e.target,function(n){return DOM.hasClass(n,'mceSplitButtonMenu');})){DOM.removeClass(t.id,'mceSplitButtonSelected');Event.remove(DOM.doc,'mousedown',t.hideMenu,t);Event.remove(t.id+'_menu','keydown',t._keyHandler);DOM.hide(t.id+'_menu');}t.onHideMenu.dispatch(t);t.isMenuVisible=0;},renderMenu:function(){var t=this,m,i=0,s=t.settings,n,tb,tr,w;w=DOM.add(s.menu_container,'div',{id:t.id+'_menu','class':s['menu_class']+' '+s['class'],style:'position:absolute;left:0;top:-1000px;'});m=DOM.add(w,'div',{'class':s['class']+' mceSplitButtonMenu'});DOM.add(m,'span',{'class':'mceMenuLine'});n=DOM.add(m,'table',{'class':'mceColorSplitMenu'});tb=DOM.add(n,'tbody');i=0;each(is(s.colors,'array')?s.colors:s.colors.split(','),function(c){c=c.replace(/^#/,'');if(!i--){tr=DOM.add(tb,'tr');i=s.grid_width-1;}n=DOM.add(tr,'td');n=DOM.add(n,'a',{href:'javascript:;',style:{backgroundColor:'#'+c},mce_color:'#'+c});});if(s.more_colors_func){n=DOM.add(tb,'tr');n=DOM.add(n,'td',{colspan:s.grid_width,'class':'mceMoreColors'});n=DOM.add(n,'a',{id:t.id+'_more',href:'javascript:;',onclick:'return false;','class':'mceMoreColors'},s.more_colors_title);Event.add(n,'click',function(e){s.more_colors_func.call(s.more_colors_scope||this);return Event.cancel(e);});}DOM.addClass(m,'mceColorSplitMenu');Event.add(t.id+'_menu','click',function(e){var c;e=e.target;if(e.nodeName=='A'&&(c=e.getAttribute('mce_color')))t.setColor(c);return Event.cancel(e);});return w;},setColor:function(c){var t=this;DOM.setStyle(t.id+'_preview','backgroundColor',c);t.value=c;t.hideMenu();t.settings.onselect(c);},postRender:function(){var t=this,id=t.id;t.parent();DOM.add(id+'_action','div',{id:id+'_preview','class':'mceColorPreview'});},destroy:function(){this.parent();Event.clear(this.id+'_menu');Event.clear(this.id+'_more');DOM.remove(this.id+'_menu');}});})();tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container',{renderHTML:function(){var t=this,h='',c,co,dom=tinymce.DOM,s=t.settings,i,pr,nx,cl;cl=t.controls;for(i=0;i<cl.length;i++){co=cl[i];pr=cl[i-1];nx=cl[i+1];if(i===0){c='mceToolbarStart';if(co.Button)c+=' mceToolbarStartButton';else if(co.SplitButton)c+=' mceToolbarStartSplitButton';else if(co.ListBox)c+=' mceToolbarStartListBox';h+=dom.createHTML('td',{'class':c},dom.createHTML('span',null,'<!-- IE -->'));}if(pr&&co.ListBox){if(pr.Button||pr.SplitButton)h+=dom.createHTML('td',{'class':'mceToolbarEnd'},dom.createHTML('span',null,'<!-- IE -->'));}if(dom.stdMode)h+='<td style="position: relative">'+co.renderHTML()+'</td>';else h+='<td>'+co.renderHTML()+'</td>';if(nx&&co.ListBox){if(nx.Button||nx.SplitButton)h+=dom.createHTML('td',{'class':'mceToolbarStart'},dom.createHTML('span',null,'<!-- IE -->'));}}c='mceToolbarEnd';if(co.Button)c+=' mceToolbarEndButton';else if(co.SplitButton)c+=' mceToolbarEndSplitButton';else if(co.ListBox)c+=' mceToolbarEndListBox';h+=dom.createHTML('td',{'class':c},dom.createHTML('span',null,'<!-- IE -->'));return dom.createHTML('table',{id:t.id,'class':'mceToolbar'+(s['class']?' '+s['class']:''),cellpadding:'0',cellspacing:'0',align:t.settings.align||''},'<tbody><tr>'+h+'</tr></tbody>');}});(function(){var Dispatcher=tinymce.util.Dispatcher,each=tinymce.each;tinymce.create('tinymce.AddOnManager',{items:[],urls:{},lookup:{},onAdd:new Dispatcher(this),get:function(n){return this.lookup[n];},requireLangPack:function(n){var u,s;if(tinymce.EditorManager.settings){u=this.urls[n]+'/langs/'+tinymce.EditorManager.settings.language+'.js';s=tinymce.EditorManager.settings;if(s){if(!tinymce.dom.Event.domLoaded&&!s.strict_mode)tinymce.ScriptLoader.load(u);else tinymce.ScriptLoader.add(u);}}},add:function(id,o){this.items.push(o);this.lookup[id]=o;this.onAdd.dispatch(this,id,o);return o;},load:function(n,u,cb,s){var t=this;if(t.urls[n])return;if(u.indexOf('/')!=0&&u.indexOf('://')==-1)u=tinymce.baseURL+'/'+u;t.urls[n]=u.substring(0,u.lastIndexOf('/'));tinymce.ScriptLoader.add(u,cb,s);}});tinymce.PluginManager=new tinymce.AddOnManager();tinymce.ThemeManager=new tinymce.AddOnManager();}());(function(){var each=tinymce.each,extend=tinymce.extend,DOM=tinymce.DOM,Event=tinymce.dom.Event,ThemeManager=tinymce.ThemeManager,PluginManager=tinymce.PluginManager,explode=tinymce.explode;tinymce.create('static tinymce.EditorManager',{editors:{},i18n:{},activeEditor:null,preInit:function(){var t=this,lo=window.location;tinymce.documentBaseURL=lo.href.replace(/[\?#].*$/,'').replace(/[\/\\][^\/]+$/,'');if(!/[\/\\]$/.test(tinymce.documentBaseURL))tinymce.documentBaseURL+='/';tinymce.baseURL=new tinymce.util.URI(tinymce.documentBaseURL).toAbsolute(tinymce.baseURL);tinymce.EditorManager.baseURI=new tinymce.util.URI(tinymce.baseURL);if(tinymce.EditorManager.baseURI.host!=lo.hostname&&lo.hostname)document.domain=tinymce.relaxedDomain=lo.hostname.replace(/.*\.(.+\..+)$/,'$1');t.onBeforeUnload=new tinymce.util.Dispatcher(t);Event.add(window,'beforeunload',function(e){t.onBeforeUnload.dispatch(t,e);});},init:function(s){var t=this,pl,sl=tinymce.ScriptLoader,c,e;function execCallback(se,n,s){var f=se[n];if(!f)return;if(tinymce.is(f,'string')){s=f.replace(/\.\w+$/,'');s=s?tinymce.resolve(s):0;f=tinymce.resolve(f);}return f.apply(s||this,Array.prototype.slice.call(arguments,2));};s=extend({theme:"simple",language:"en",strict_loading_mode:document.contentType=='application/xhtml+xml'},s);t.settings=s;if(!Event.domLoaded&&!s.strict_loading_mode){if(s.language)sl.add(tinymce.baseURL+'/langs/'+s.language+'.js');if(s.theme&&s.theme.charAt(0)!='-'&&!ThemeManager.urls[s.theme])ThemeManager.load(s.theme,'themes/'+s.theme+'/editor_template'+tinymce.suffix+'.js');if(s.plugins){pl=explode(s.plugins);if(tinymce.inArray(pl,'compat2x')!=-1)PluginManager.load('compat2x','plugins/compat2x/editor_plugin'+tinymce.suffix+'.js');each(pl,function(v){if(v&&v.charAt(0)!='-'&&!PluginManager.urls[v]){if(!tinymce.isWebKit&&v=='safari')return;PluginManager.load(v,'plugins/'+v+'/editor_plugin'+tinymce.suffix+'.js');}});}sl.loadQueue();}Event.add(document,'init',function(){var l,co;execCallback(s,'onpageload');if(s.browsers){l=false;each(explode(s.browsers),function(v){switch(v){case'ie':case'msie':if(tinymce.isIE)l=true;break;case'gecko':if(tinymce.isGecko)l=true;break;case'safari':case'webkit':if(tinymce.isWebKit)l=true;break;case'opera':if(tinymce.isOpera)l=true;break;}});if(!l)return;}switch(s.mode){case"exact":l=s.elements||'';if(l.length>0){each(explode(l),function(v){if(DOM.get(v))new tinymce.Editor(v,s).render(1);else{c=0;each(document.forms,function(f){each(f.elements,function(e){if(e.name===v){v='mce_editor_'+c;DOM.setAttrib(e,'id',v);new tinymce.Editor(v,s).render(1);}});});}});}break;case"textareas":case"specific_textareas":function hasClass(n,c){return c.constructor===RegExp?c.test(n.className):DOM.hasClass(n,c);};each(DOM.select('textarea'),function(v){if(s.editor_deselector&&hasClass(v,s.editor_deselector))return;if(!s.editor_selector||hasClass(v,s.editor_selector)){e=DOM.get(v.name);if(!v.id&&!e)v.id=v.name;if(!v.id||t.get(v.id))v.id=DOM.uniqueId();new tinymce.Editor(v.id,s).render(1);}});break;}if(s.oninit){l=co=0;each(t.editors,function(ed){co++;if(!ed.initialized){ed.onInit.add(function(){l++;if(l==co)execCallback(s,'oninit');});}else l++;if(l==co)execCallback(s,'oninit');});}});},get:function(id){return this.editors[id];},getInstanceById:function(id){return this.get(id);},add:function(e){this.editors[e.id]=e;this._setActive(e);return e;},remove:function(e){var t=this;if(!t.editors[e.id])return null;delete t.editors[e.id];if(t.activeEditor==e){each(t.editors,function(e){t._setActive(e);return false;});}e.destroy();return e;},execCommand:function(c,u,v){var t=this,ed=t.get(v),w;switch(c){case"mceFocus":ed.focus();return true;case"mceAddEditor":case"mceAddControl":if(!t.get(v))new tinymce.Editor(v,t.settings).render();return true;case"mceAddFrameControl":w=v.window;w.tinyMCE=tinyMCE;w.tinymce=tinymce;tinymce.DOM.doc=w.document;tinymce.DOM.win=w;ed=new tinymce.Editor(v.element_id,v);ed.render();if(tinymce.isIE){function clr(){ed.destroy();w.detachEvent('onunload',clr);w=w.tinyMCE=w.tinymce=null;};w.attachEvent('onunload',clr);}v.page_window=null;return true;case"mceRemoveEditor":case"mceRemoveControl":ed.remove();return true;case'mceToggleEditor':if(!ed){t.execCommand('mceAddControl',0,v);return true;}if(ed.isHidden())ed.show();else ed.hide();return true;}if(t.activeEditor)return t.activeEditor.execCommand(c,u,v);return false;},execInstanceCommand:function(id,c,u,v){var ed=this.get(id);if(ed)return ed.execCommand(c,u,v);return false;},triggerSave:function(){each(this.editors,function(e){e.save();});},addI18n:function(p,o){var lo,i18n=this.i18n;if(!tinymce.is(p,'string')){each(p,function(o,lc){each(o,function(o,g){each(o,function(o,k){if(g==='common')i18n[lc+'.'+k]=o;else i18n[lc+'.'+g+'.'+k]=o;});});});}else{each(o,function(o,k){i18n[p+'.'+k]=o;});}},_setActive:function(e){this.selectedInstance=this.activeEditor=e;}});tinymce.EditorManager.preInit();})();var tinyMCE=window.tinyMCE=tinymce.EditorManager;(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,extend=tinymce.extend,Dispatcher=tinymce.util.Dispatcher;var each=tinymce.each,isGecko=tinymce.isGecko,isIE=tinymce.isIE,isWebKit=tinymce.isWebKit;var is=tinymce.is,ThemeManager=tinymce.ThemeManager,PluginManager=tinymce.PluginManager,EditorManager=tinymce.EditorManager;var inArray=tinymce.inArray,grep=tinymce.grep,explode=tinymce.explode;tinymce.create('tinymce.Editor',{Editor:function(id,s){var t=this;t.id=t.editorId=id;t.execCommands={};t.queryStateCommands={};t.queryValueCommands={};t.plugins={};each(['onPreInit','onBeforeRenderUI','onPostRender','onInit','onRemove','onActivate','onDeactivate','onClick','onEvent','onMouseUp','onMouseDown','onDblClick','onKeyDown','onKeyUp','onKeyPress','onContextMenu','onSubmit','onReset','onPaste','onPreProcess','onPostProcess','onBeforeSetContent','onBeforeGetContent','onSetContent','onGetContent','onLoadContent','onSaveContent','onNodeChange','onChange','onBeforeExecCommand','onExecCommand','onUndo','onRedo','onVisualAid','onSetProgressState'],function(e){t[e]=new Dispatcher(t);});t.settings=s=extend({id:id,language:'en',docs_language:'en',theme:'simple',skin:'default',delta_width:0,delta_height:0,popup_css:'',plugins:'',document_base_url:tinymce.documentBaseURL,add_form_submit_trigger:1,submit_patch:1,add_unload_trigger:1,convert_urls:1,relative_urls:1,remove_script_host:1,table_inline_editing:0,object_resizing:1,cleanup:1,accessibility_focus:1,custom_shortcuts:1,custom_undo_redo_keyboard_shortcuts:1,custom_undo_redo_restore_selection:1,custom_undo_redo:1,doctype:'<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">',visual_table_class:'mceItemTable',visual:1,inline_styles:true,convert_fonts_to_spans:true,font_size_style_values:'xx-small,x-small,small,medium,large,x-large,xx-large',apply_source_formatting:1,directionality:'ltr',forced_root_block:'p',valid_elements:'@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u,#p[align],-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|src|border|alt=|title|hspace|vspace|width|height|align],-sub,-sup,-blockquote[cite],-table[border=0|cellspacing|cellpadding|width|frame|rules|height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot,#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div,-span,-code,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite],object[classid|width|height|codebase|*],param[name|value|_value],embed[type|width|height|src|*],script[src|type],map[name],area[shape|coords|href|alt|target],bdo,button,col[align|char|charoff|span|valign|width],colgroup[align|char|charoff|span|valign|width],dfn,fieldset,form[action|accept|accept-charset|enctype|method],input[accept|alt|checked|disabled|maxlength|name|readonly|size|src|type|value],kbd,label[for],legend,noscript,optgroup[label|disabled],option[disabled|label|selected|value],q[cite],samp,select[disabled|multiple|name|size],small,textarea[cols|rows|disabled|name|readonly],tt,var,big',hidden_input:1,padd_empty_editor:1,render_ui:1,init_theme:1,force_p_newlines:1,indentation:'30px'},s);t.documentBaseURI=new tinymce.util.URI(s.document_base_url||tinymce.documentBaseURL,{base_uri:tinyMCE.baseURI});t.baseURI=EditorManager.baseURI;t.execCallback('setup',t);},render:function(nst){var t=this,s=t.settings,id=t.id,sl=tinymce.ScriptLoader;if(!Event.domLoaded){Event.add(document,'init',function(){t.render();});return;}if(!nst){s.strict_loading_mode=1;tinyMCE.settings=s;}if(!t.getElement())return;if(s.strict_loading_mode){sl.settings.strict_mode=s.strict_loading_mode;tinymce.DOM.settings.strict=1;}if(!/TEXTAREA|INPUT/i.test(t.getElement().nodeName)&&s.hidden_input&&DOM.getParent(id,'form'))DOM.insertAfter(DOM.create('input',{type:'hidden',name:id}),id);t.windowManager=new tinymce.WindowManager(t);if(s.encoding=='xml'){t.onGetContent.add(function(ed,o){if(o.save)o.content=DOM.encode(o.content);});}if(s.add_form_submit_trigger){t.onSubmit.addToTop(function(){if(t.initialized){t.save();t.isNotDirty=1;}});}if(s.add_unload_trigger&&!s.ask){t._beforeUnload=tinyMCE.onBeforeUnload.add(function(){if(t.initialized&&!t.destroyed&&!t.isHidden())t.save({format:'raw',no_events:true});});}tinymce.addUnload(t.destroy,t);if(s.submit_patch){t.onBeforeRenderUI.add(function(){var n=t.getElement().form;if(!n)return;if(n._mceOldSubmit)return;if(!n.submit.nodeType&&!n.submit.length){t.formElement=n;n._mceOldSubmit=n.submit;n.submit=function(){EditorManager.triggerSave();t.isNotDirty=1;return this._mceOldSubmit(this);};}n=null;});}function loadScripts(){if(s.language)sl.add(tinymce.baseURL+'/langs/'+s.language+'.js');if(s.theme.charAt(0)!='-'&&!ThemeManager.urls[s.theme])ThemeManager.load(s.theme,'themes/'+s.theme+'/editor_template'+tinymce.suffix+'.js');each(explode(s.plugins),function(p){if(p&&p.charAt(0)!='-'&&!PluginManager.urls[p]){if(!isWebKit&&p=='safari')return;PluginManager.load(p,'plugins/'+p+'/editor_plugin'+tinymce.suffix+'.js');}});sl.loadQueue(function(){if(s.ask){function ask(){window.setTimeout(function(){Event.remove(t.id,'focus',ask);t.windowManager.confirm(t.getLang('edit_confirm'),function(s){if(s)t.init();});},0);};Event.add(t.id,'focus',ask);return;}if(!t.removed)t.init();});};if(s.plugins.indexOf('compat2x')!=-1){PluginManager.load('compat2x','plugins/compat2x/editor_plugin'+tinymce.suffix+'.js');sl.loadQueue(loadScripts);}else loadScripts();},init:function(){var n,t=this,s=t.settings,w,h,e=t.getElement(),o,ti,u,bi,bc,re;EditorManager.add(t);s.theme=s.theme.replace(/-/,'');o=ThemeManager.get(s.theme);t.theme=new o();if(t.theme.init&&s.init_theme)t.theme.init(t,ThemeManager.urls[s.theme]||tinymce.documentBaseURL.replace(/\/$/,''));each(explode(s.plugins.replace(/\-/g,'')),function(p){var c=PluginManager.get(p),u=PluginManager.urls[p]||tinymce.documentBaseURL.replace(/\/$/,''),po;if(c){po=new c(t,u);t.plugins[p]=po;if(po.init)po.init(t,u);}});if(s.popup_css)s.popup_css=t.documentBaseURI.toAbsolute(s.popup_css);else s.popup_css=t.baseURI.toAbsolute("themes/"+s.theme+"/skins/"+s.skin+"/dialog.css");if(s.popup_css_add)s.popup_css+=','+t.documentBaseURI.toAbsolute(s.popup_css_add);t.controlManager=new tinymce.ControlManager(t);t.undoManager=new tinymce.UndoManager(t);t.undoManager.onAdd.add(function(um,l){if(!l.initial)return t.onChange.dispatch(t,l,um);});t.undoManager.onUndo.add(function(um,l){return t.onUndo.dispatch(t,l,um);});t.undoManager.onRedo.add(function(um,l){return t.onRedo.dispatch(t,l,um);});if(s.custom_undo_redo){t.onExecCommand.add(function(ed,cmd,ui,val,a){if(cmd!='Undo'&&cmd!='Redo'&&cmd!='mceRepaint'&&(!a||!a.skip_undo))t.undoManager.add();});}t.onExecCommand.add(function(ed,c){if(!/^(FontName|FontSize)$/.test(c))t.nodeChanged();});if(isGecko){function repaint(a,o){if(!o||!o.initial)t.execCommand('mceRepaint');};t.onUndo.add(repaint);t.onRedo.add(repaint);t.onSetContent.add(repaint);}t.onBeforeRenderUI.dispatch(t,t.controlManager);if(s.render_ui){w=s.width||e.style.width||e.offsetWidth;h=s.height||e.style.height||e.offsetHeight;t.orgDisplay=e.style.display;re=/^[0-9\.]+(|px)$/i;if(re.test(''+w))w=Math.max(parseInt(w)+(o.deltaWidth||0),100);if(re.test(''+h))h=Math.max(parseInt(h)+(o.deltaHeight||0),100);o=t.theme.renderUI({targetNode:e,width:w,height:h,deltaWidth:s.delta_width,deltaHeight:s.delta_height});t.editorContainer=o.editorContainer;}DOM.setStyles(o.sizeContainer||o.editorContainer,{width:w,height:h});h=(o.iframeHeight||h)+((h+'').indexOf('%')==-1?(o.deltaHeight||0):'');if(h<100)h=100;t.iframeHTML=s.doctype+'<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="'+t.documentBaseURI.getURI()+'"></base>';t.iframeHTML+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';if(tinymce.relaxedDomain)t.iframeHTML+='<script type="text/javascript">document.domain = "'+tinymce.relaxedDomain+'";</script>';bi=s.body_id||'tinymce';if(bi.indexOf('=')!=-1){bi=t.getParam('body_id','','hash');bi=bi[t.id]||bi;}bc=s.body_class||'';if(bc.indexOf('=')!=-1){bc=t.getParam('body_class','','hash');bc=bc[t.id]||'';}t.iframeHTML+='</head><body id="'+bi+'" class="mceContentBody '+bc+'"></body></html>';if(tinymce.relaxedDomain){if(isIE)u='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinyMCE.get("'+t.id+'");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()';else if(tinymce.isOpera)u='javascript:(function(){document.open();document.domain="'+document.domain+'";document.close();ed.setupIframe();})()';}n=DOM.add(o.iframeContainer,'iframe',{id:t.id+"_ifr",src:u||'javascript:""',frameBorder:'0',style:{width:'100%',height:h}});t.contentAreaContainer=o.iframeContainer;DOM.get(o.editorContainer).style.display=t.orgDisplay;DOM.get(t.id).style.display='none';if(tinymce.isOldWebKit){Event.add(n,'load',t.setupIframe,t);n.src=tinymce.baseURL+'/plugins/safari/blank.htm';}else{if(!isIE||!tinymce.relaxedDomain)t.setupIframe();e=n=o=null;}},setupIframe:function(){var t=this,s=t.settings,e=DOM.get(t.id),d=t.getDoc(),h,b;if(!isIE||!tinymce.relaxedDomain){d.open();d.write(t.iframeHTML);d.close();}if(!isIE){try{d.designMode='On';}catch(ex){}}if(isIE){b=t.getBody();DOM.hide(b);b.contentEditable=true;DOM.show(b);}t.dom=new tinymce.DOM.DOMUtils(t.getDoc(),{keep_values:true,url_converter:t.convertURL,url_converter_scope:t,hex_colors:s.force_hex_style_colors,class_filter:s.class_filter,update_styles:1,fix_ie_paragraphs:1});t.serializer=new tinymce.dom.Serializer({entity_encoding:s.entity_encoding,entities:s.entities,valid_elements:s.verify_html===false?'*[*]':s.valid_elements,extended_valid_elements:s.extended_valid_elements,valid_child_elements:s.valid_child_elements,invalid_elements:s.invalid_elements,fix_table_elements:s.fix_table_elements,fix_list_elements:s.fix_list_elements,fix_content_duplication:s.fix_content_duplication,convert_fonts_to_spans:s.convert_fonts_to_spans,font_size_classes:s.font_size_classes,font_size_style_values:s.font_size_style_values,apply_source_formatting:s.apply_source_formatting,remove_linebreaks:s.remove_linebreaks,dom:t.dom});t.selection=new tinymce.dom.Selection(t.dom,t.getWin(),t.serializer);t.forceBlocks=new tinymce.ForceBlocks(t,{forced_root_block:s.forced_root_block});t.editorCommands=new tinymce.EditorCommands(t);t.serializer.onPreProcess.add(function(se,o){return t.onPreProcess.dispatch(t,o,se);});t.serializer.onPostProcess.add(function(se,o){return t.onPostProcess.dispatch(t,o,se);});t.onPreInit.dispatch(t);if(!s.gecko_spellcheck)t.getBody().spellcheck=0;t._addEvents();t.controlManager.onPostRender.dispatch(t,t.controlManager);t.onPostRender.dispatch(t);if(s.directionality)t.getBody().dir=s.directionality;if(s.nowrap)t.getBody().style.whiteSpace="nowrap";if(s.auto_resize)t.onNodeChange.add(t.resizeToContent,t);if(s.custom_elements){function handleCustom(ed,o){each(explode(s.custom_elements),function(v){var n;if(v.indexOf('~')===0){v=v.substring(1);n='span';}else n='div';o.content=o.content.replace(new RegExp('<('+v+')([^>]*)>','g'),'<'+n+' mce_name="$1"$2>');o.content=o.content.replace(new RegExp('</('+v+')>','g'),'</'+n+'>');});};t.onBeforeSetContent.add(handleCustom);t.onPostProcess.add(function(ed,o){if(o.set)handleCustom(ed,o)});}if(s.handle_node_change_callback){t.onNodeChange.add(function(ed,cm,n){t.execCallback('handle_node_change_callback',t.id,n,-1,-1,true,t.selection.isCollapsed());});}if(s.save_callback){t.onSaveContent.add(function(ed,o){var h=t.execCallback('save_callback',t.id,o.content,t.getBody());if(h)o.content=h;});}if(s.onchange_callback){t.onChange.add(function(ed,l){t.execCallback('onchange_callback',t,l);});}if(s.convert_newlines_to_brs){t.onBeforeSetContent.add(function(ed,o){if(o.initial)o.content=o.content.replace(/\r?\n/g,'<br />');});}if(s.fix_nesting&&isIE){t.onBeforeSetContent.add(function(ed,o){o.content=t._fixNesting(o.content);});}if(s.preformatted){t.onPostProcess.add(function(ed,o){o.content=o.content.replace(/^\s*<pre.*?>/,'');o.content=o.content.replace(/<\/pre>\s*$/,'');if(o.set)o.content='<pre class="mceItemHidden">'+o.content+'</pre>';});}if(s.verify_css_classes){t.serializer.attribValueFilter=function(n,v){var s,cl;if(n=='class'){if(!t.classesRE){cl=t.dom.getClasses();if(cl.length>0){s='';each(cl,function(o){s+=(s?'|':'')+o['class'];});t.classesRE=new RegExp('('+s+')','gi');}}return!t.classesRE||/(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(v)||t.classesRE.test(v)?v:'';}return v;};}if(s.convert_fonts_to_spans)t._convertFonts();if(s.inline_styles)t._convertInlineElements();if(s.cleanup_callback){t.onBeforeSetContent.add(function(ed,o){o.content=t.execCallback('cleanup_callback','insert_to_editor',o.content,o);});t.onPreProcess.add(function(ed,o){if(o.set)t.execCallback('cleanup_callback','insert_to_editor_dom',o.node,o);if(o.get)t.execCallback('cleanup_callback','get_from_editor_dom',o.node,o);});t.onPostProcess.add(function(ed,o){if(o.set)o.content=t.execCallback('cleanup_callback','insert_to_editor',o.content,o);if(o.get)o.content=t.execCallback('cleanup_callback','get_from_editor',o.content,o);});}if(s.save_callback){t.onGetContent.add(function(ed,o){if(o.save)o.content=t.execCallback('save_callback',t.id,o.content,t.getBody());});}if(s.handle_event_callback){t.onEvent.add(function(ed,e,o){if(t.execCallback('handle_event_callback',e,ed,o)===false)Event.cancel(e);});}t.onSetContent.add(function(){t.addVisual(t.getBody());});if(s.padd_empty_editor){t.onPostProcess.add(function(ed,o){o.content=o.content.replace(/^(<p>(&nbsp;|&#160;|\s|\u00a0|)<\/p>[\r\n]*|<br \/>[\r\n]*)$/,'');});}if(isGecko){try{d.designMode='Off';d.designMode='On';}catch(ex){}}setTimeout(function(){if(t.removed)return;t.load({initial:true,format:(s.cleanup_on_startup?'html':'raw')});t.startContent=t.getContent({format:'raw'});t.undoManager.add({initial:true});t.initialized=true;t.onInit.dispatch(t);t.execCallback('setupcontent_callback',t.id,t.getBody(),t.getDoc());t.execCallback('init_instance_callback',t);t.focus(true);t.nodeChanged({initial:1});if(s.content_css){tinymce.each(explode(s.content_css),function(u){t.dom.loadCSS(t.documentBaseURI.toAbsolute(u));});}if(s.auto_focus){setTimeout(function(){var ed=EditorManager.get(s.auto_focus);ed.selection.select(ed.getBody(),1);ed.selection.collapse(1);ed.getWin().focus();},100);}},1);e=null;},focus:function(sf){var oed,t=this,ce=t.settings.content_editable;if(!sf){if(!ce)t.getWin().focus();}if(EditorManager.activeEditor!=t){if((oed=EditorManager.activeEditor)!=null)oed.onDeactivate.dispatch(oed,t);t.onActivate.dispatch(t,oed);}EditorManager._setActive(t);},execCallback:function(n){var t=this,f=t.settings[n],s;if(!f)return;if(t.callbackLookup&&(s=t.callbackLookup[n])){f=s.func;s=s.scope;}if(is(f,'string')){s=f.replace(/\.\w+$/,'');s=s?tinymce.resolve(s):0;f=tinymce.resolve(f);t.callbackLookup=t.callbackLookup||{};t.callbackLookup[n]={func:f,scope:s};}return f.apply(s||t,Array.prototype.slice.call(arguments,1));},translate:function(s){var c=this.settings.language,i18n=EditorManager.i18n;if(!s)return'';return i18n[c+'.'+s]||s.replace(/{\#([^}]+)\}/g,function(a,b){return i18n[c+'.'+b]||'{#'+b+'}';});},getLang:function(n,dv){return EditorManager.i18n[this.settings.language+'.'+n]||(is(dv)?dv:'{#'+n+'}');},getParam:function(n,dv,ty){var tr=tinymce.trim,v=is(this.settings[n])?this.settings[n]:dv,o;if(ty==='hash'){o={};if(is(v,'string')){each(v.indexOf('=')>0?v.split(/[;,](?![^=;,]*(?:[;,]|$))/):v.split(','),function(v){v=v.split('=');if(v.length>1)o[tr(v[0])]=tr(v[1]);else o[tr(v[0])]=tr(v);});}else o=v;return o;}return v;},nodeChanged:function(o){var t=this,s=t.selection,n=s.getNode()||t.getBody();if(t.initialized){t.onNodeChange.dispatch(t,o?o.controlManager||t.controlManager:t.controlManager,isIE&&n.ownerDocument!=t.getDoc()?t.getBody():n,s.isCollapsed(),o);}},addButton:function(n,s){var t=this;t.buttons=t.buttons||{};t.buttons[n]=s;},addCommand:function(n,f,s){this.execCommands[n]={func:f,scope:s||this};},addQueryStateHandler:function(n,f,s){this.queryStateCommands[n]={func:f,scope:s||this};},addQueryValueHandler:function(n,f,s){this.queryValueCommands[n]={func:f,scope:s||this};},addShortcut:function(pa,desc,cmd_func,sc){var t=this,c;if(!t.settings.custom_shortcuts)return false;t.shortcuts=t.shortcuts||{};if(is(cmd_func,'string')){c=cmd_func;cmd_func=function(){t.execCommand(c,false,null);};}if(is(cmd_func,'object')){c=cmd_func;cmd_func=function(){t.execCommand(c[0],c[1],c[2]);};}each(explode(pa),function(pa){var o={func:cmd_func,scope:sc||this,desc:desc,alt:false,ctrl:false,shift:false};each(explode(pa,'+'),function(v){switch(v){case'alt':case'ctrl':case'shift':o[v]=true;break;default:o.charCode=v.charCodeAt(0);o.keyCode=v.toUpperCase().charCodeAt(0);}});t.shortcuts[(o.ctrl?'ctrl':'')+','+(o.alt?'alt':'')+','+(o.shift?'shift':'')+','+o.keyCode]=o;});return true;},execCommand:function(cmd,ui,val,a){var t=this,s=0,o,st;if(!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(cmd)&&(!a||!a.skip_focus))t.focus();o={};t.onBeforeExecCommand.dispatch(t,cmd,ui,val,o);if(o.terminate)return false;if(t.execCallback('execcommand_callback',t.id,t.selection.getNode(),cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val,a);return true;}if(o=t.execCommands[cmd]){st=o.func.call(o.scope,ui,val);if(st!==true){t.onExecCommand.dispatch(t,cmd,ui,val,a);return st;}}each(t.plugins,function(p){if(p.execCommand&&p.execCommand(cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val,a);s=1;return false;}});if(s)return true;if(t.theme.execCommand&&t.theme.execCommand(cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val,a);return true;}if(t.editorCommands.execCommand(cmd,ui,val)){t.onExecCommand.dispatch(t,cmd,ui,val,a);return true;}t.getDoc().execCommand(cmd,ui,val);t.onExecCommand.dispatch(t,cmd,ui,val,a);},queryCommandState:function(c){var t=this,o,s;if(t._isHidden())return;if(o=t.queryStateCommands[c]){s=o.func.call(o.scope);if(s!==true)return s;}o=t.editorCommands.queryCommandState(c);if(o!==-1)return o;try{return this.getDoc().queryCommandState(c);}catch(ex){}},queryCommandValue:function(c){var t=this,o,s;if(t._isHidden())return;if(o=t.queryValueCommands[c]){s=o.func.call(o.scope);if(s!==true)return s;}o=t.editorCommands.queryCommandValue(c);if(is(o))return o;try{return this.getDoc().queryCommandValue(c);}catch(ex){}},show:function(){var t=this;DOM.show(t.getContainer());DOM.hide(t.id);t.load();},hide:function(){var t=this,d=t.getDoc();if(isIE&&d)d.execCommand('SelectAll');t.save();DOM.hide(t.getContainer());DOM.setStyle(t.id,'display',t.orgDisplay);},isHidden:function(){return!DOM.isHidden(this.id);},setProgressState:function(b,ti,o){this.onSetProgressState.dispatch(this,b,ti,o);return b;},resizeToContent:function(){var t=this;DOM.setStyle(t.id+"_ifr",'height',t.getBody().scrollHeight);},load:function(o){var t=this,e=t.getElement(),h;o=o||{};o.load=true;h=t.setContent(is(e.value)?e.value:e.innerHTML,o);o.element=e;if(!o.no_events)t.onLoadContent.dispatch(t,o);o.element=e=null;return h;},save:function(o){var t=this,e=t.getElement(),h,f;if(!t.initialized)return;o=o||{};o.save=true;if(!o.no_events){t.undoManager.typing=0;t.undoManager.add();}o.element=e;h=o.content=t.getContent(o);if(!o.no_events)t.onSaveContent.dispatch(t,o);h=o.content;if(!/TEXTAREA|INPUT/i.test(e.nodeName)){e.innerHTML=h;if(f=DOM.getParent(t.id,'form')){each(f.elements,function(e){if(e.name==t.id){e.value=h;return false;}});}}else e.value=h;o.element=e=null;return h;},setContent:function(h,o){var t=this;o=o||{};o.format=o.format||'html';o.set=true;o.content=h;if(!o.no_events)t.onBeforeSetContent.dispatch(t,o);if(!tinymce.isIE&&(h.length===0||/^\s+$/.test(h))){o.content=t.dom.setHTML(t.getBody(),'<br mce_bogus="1" />');o.format='raw';}o.content=t.dom.setHTML(t.getBody(),tinymce.trim(o.content));if(o.format!='raw'&&t.settings.cleanup){o.getInner=true;o.content=t.dom.setHTML(t.getBody(),t.serializer.serialize(t.getBody(),o));}if(!o.no_events)t.onSetContent.dispatch(t,o);return o.content;},getContent:function(o){var t=this,h;o=o||{};o.format=o.format||'html';o.get=true;if(!o.no_events)t.onBeforeGetContent.dispatch(t,o);if(o.format!='raw'&&t.settings.cleanup){o.getInner=true;h=t.serializer.serialize(t.getBody(),o);}else h=t.getBody().innerHTML;h=h.replace(/^\s*|\s*$/g,'');o.content=h;if(!o.no_events)t.onGetContent.dispatch(t,o);return o.content;},isDirty:function(){var t=this;return tinymce.trim(t.startContent)!=tinymce.trim(t.getContent({format:'raw',no_events:1}))&&!t.isNotDirty;},getContainer:function(){var t=this;if(!t.container)t.container=DOM.get(t.editorContainer||t.id+'_parent');return t.container;},getContentAreaContainer:function(){return this.contentAreaContainer;},getElement:function(){return DOM.get(this.settings.content_element||this.id);},getWin:function(){var t=this,e;if(!t.contentWindow){e=DOM.get(t.id+"_ifr");if(e)t.contentWindow=e.contentWindow;}return t.contentWindow;},getDoc:function(){var t=this,w;if(!t.contentDocument){w=t.getWin();if(w)t.contentDocument=w.document;}return t.contentDocument;},getBody:function(){return this.bodyElement||this.getDoc().body;},convertURL:function(u,n,e){var t=this,s=t.settings;if(s.urlconverter_callback)return t.execCallback('urlconverter_callback',u,e,true,n);if(!s.convert_urls||(e&&e.nodeName=='LINK')||u.indexOf('file:')===0)return u;if(s.relative_urls)return t.documentBaseURI.toRelative(u);u=t.documentBaseURI.toAbsolute(u,s.remove_script_host);return u;},addVisual:function(e){var t=this,s=t.settings;e=e||t.getBody();if(!is(t.hasVisual))t.hasVisual=s.visual;each(t.dom.select('table,a',e),function(e){var v;switch(e.nodeName){case'TABLE':v=t.dom.getAttrib(e,'border');if(!v||v=='0'){if(t.hasVisual)t.dom.addClass(e,s.visual_table_class);else t.dom.removeClass(e,s.visual_table_class);}return;case'A':v=t.dom.getAttrib(e,'name');if(v){if(t.hasVisual)t.dom.addClass(e,'mceItemAnchor');else t.dom.removeClass(e,'mceItemAnchor');}return;}});t.onVisualAid.dispatch(t,e,t.hasVisual);},remove:function(){var t=this,e=t.getContainer();t.removed=1;t.hide();t.execCallback('remove_instance_callback',t);t.onRemove.dispatch(t);t.onExecCommand.listeners=[];EditorManager.remove(t);DOM.remove(e);},destroy:function(s){var t=this;if(t.destroyed)return;if(!s){tinymce.removeUnload(t.destroy);tinyMCE.onBeforeUnload.remove(t._beforeUnload);if(t.theme.destroy)t.theme.destroy();t.controlManager.destroy();t.selection.destroy();t.dom.destroy();if(!t.settings.content_editable){Event.clear(t.getWin());Event.clear(t.getDoc());}Event.clear(t.getBody());Event.clear(t.formElement);}if(t.formElement){t.formElement.submit=t.formElement._mceOldSubmit;t.formElement._mceOldSubmit=null;}t.contentAreaContainer=t.formElement=t.container=t.settings.content_element=t.bodyElement=t.contentDocument=t.contentWindow=null;if(t.selection)t.selection=t.selection.win=t.selection.dom=t.selection.dom.doc=null;t.destroyed=1;},_addEvents:function(){var t=this,i,s=t.settings,lo={mouseup:'onMouseUp',mousedown:'onMouseDown',click:'onClick',keyup:'onKeyUp',keydown:'onKeyDown',keypress:'onKeyPress',submit:'onSubmit',reset:'onReset',contextmenu:'onContextMenu',dblclick:'onDblClick',paste:'onPaste'};function eventHandler(e,o){var ty=e.type;if(t.removed)return;if(t.onEvent.dispatch(t,e,o)!==false){t[lo[e.fakeType||e.type]].dispatch(t,e,o);}};each(lo,function(v,k){switch(k){case'contextmenu':if(tinymce.isOpera){Event.add(t.getBody(),'mousedown',function(e){if(e.ctrlKey){e.fakeType='contextmenu';eventHandler(e);}});}else Event.add(t.getBody(),k,eventHandler);break;case'paste':Event.add(t.getBody(),k,function(e){var tx,h,el,r;if(e.clipboardData)tx=e.clipboardData.getData('text/plain');else if(tinymce.isIE)tx=t.getWin().clipboardData.getData('Text');eventHandler(e,{text:tx,html:h});});break;case'submit':case'reset':Event.add(t.getElement().form||DOM.getParent(t.id,'form'),k,eventHandler);break;default:Event.add(s.content_editable?t.getBody():t.getDoc(),k,eventHandler);}});Event.add(s.content_editable?t.getBody():(isGecko?t.getDoc():t.getWin()),'focus',function(e){t.focus(true);});if(tinymce.isGecko){Event.add(t.getDoc(),'DOMNodeInserted',function(e){var v;e=e.target;if(e.nodeType===1&&e.nodeName==='IMG'&&(v=e.getAttribute('mce_src')))e.src=t.documentBaseURI.toAbsolute(v);});}if(isGecko){function setOpts(){var t=this,d=t.getDoc(),s=t.settings;if(isGecko){if(t._isHidden()){try{if(!s.content_editable)d.designMode='On';}catch(ex){}}try{d.execCommand("styleWithCSS",0,false);}catch(ex){if(!t._isHidden())try{d.execCommand("useCSS",0,true);}catch(ex){}}if(!s.table_inline_editing)try{d.execCommand('enableInlineTableEditing',false,false);}catch(ex){}if(!s.object_resizing)try{d.execCommand('enableObjectResizing',false,false);}catch(ex){}}};t.onBeforeExecCommand.add(setOpts);t.onMouseDown.add(setOpts);}t.onMouseUp.add(t.nodeChanged);t.onClick.add(t.nodeChanged);t.onKeyUp.add(function(ed,e){if((e.keyCode>=33&&e.keyCode<=36)||(e.keyCode>=37&&e.keyCode<=40)||e.keyCode==13||e.keyCode==45||e.keyCode==46||e.keyCode==8||e.ctrlKey)t.nodeChanged();});t.onReset.add(function(){t.setContent(t.startContent,{format:'raw'});});if(t.getParam('tab_focus')){function tabCancel(ed,e){if(e.keyCode===9)return Event.cancel(e);};function tabHandler(ed,e){var x,i,f,el,v;function find(d){f=DOM.getParent(ed.id,'form');el=f.elements;if(f){each(el,function(e,i){if(e.id==ed.id){x=i;return false;}});if(d>0){for(i=x+1;i<el.length;i++){if(el[i].type!='hidden')return el[i];}}else{for(i=x-1;i>=0;i--){if(el[i].type!='hidden')return el[i];}}}return null;};if(e.keyCode===9){v=explode(ed.getParam('tab_focus'));if(v.length==1){v[1]=v[0];v[0]=':prev';}if(e.shiftKey){if(v[0]==':prev')el=find(-1);else el=DOM.get(v[0]);}else{if(v[1]==':next')el=find(1);else el=DOM.get(v[1]);}if(el){if(ed=EditorManager.get(el.id||el.name))ed.focus();else window.setTimeout(function(){window.focus();el.focus();},10);return Event.cancel(e);}}};t.onKeyUp.add(tabCancel);if(isGecko){t.onKeyPress.add(tabHandler);t.onKeyDown.add(tabCancel);}else t.onKeyDown.add(tabHandler);}if(s.custom_shortcuts){if(s.custom_undo_redo_keyboard_shortcuts){t.addShortcut('ctrl+z',t.getLang('undo_desc'),'Undo');t.addShortcut('ctrl+y',t.getLang('redo_desc'),'Redo');}if(isGecko){t.addShortcut('ctrl+b',t.getLang('bold_desc'),'Bold');t.addShortcut('ctrl+i',t.getLang('italic_desc'),'Italic');t.addShortcut('ctrl+u',t.getLang('underline_desc'),'Underline');}for(i=1;i<=6;i++)t.addShortcut('ctrl+'+i,'',['FormatBlock',false,'<h'+i+'>']);t.addShortcut('ctrl+7','',['FormatBlock',false,'<p>']);t.addShortcut('ctrl+8','',['FormatBlock',false,'<div>']);t.addShortcut('ctrl+9','',['FormatBlock',false,'<address>']);function find(e){var v=null;if(!e.altKey&&!e.ctrlKey&&!e.metaKey)return v;each(t.shortcuts,function(o){if(o.ctrl!=e.ctrlKey&&(!tinymce.isMac||o.ctrl==e.metaKey))return;if(o.alt!=e.altKey)return;if(o.shift!=e.shiftKey)return;if(e.keyCode==o.keyCode||(e.charCode&&e.charCode==o.charCode)){v=o;return false;}});return v;};t.onKeyUp.add(function(ed,e){var o=find(e);if(o)return Event.cancel(e);});t.onKeyPress.add(function(ed,e){var o=find(e);if(o)return Event.cancel(e);});t.onKeyDown.add(function(ed,e){var o=find(e);if(o){o.func.call(o.scope);return Event.cancel(e);}});}if(tinymce.isIE){Event.add(t.getDoc(),'controlselect',function(e){var re=t.resizeInfo,cb;e=e.target;if(e.nodeName!=='IMG')return;if(re)Event.remove(re.node,re.ev,re.cb);if(!t.dom.hasClass(e,'mceItemNoResize')){ev='resizeend';cb=Event.add(e,ev,function(e){var v;e=e.target;if(v=t.dom.getStyle(e,'width')){t.dom.setAttrib(e,'width',v.replace(/[^0-9%]+/g,''));t.dom.setStyle(e,'width','');}if(v=t.dom.getStyle(e,'height')){t.dom.setAttrib(e,'height',v.replace(/[^0-9%]+/g,''));t.dom.setStyle(e,'height','');}});}else{ev='resizestart';cb=Event.add(e,'resizestart',Event.cancel,Event);}re=t.resizeInfo={node:e,ev:ev,cb:cb};});t.onKeyDown.add(function(ed,e){switch(e.keyCode){case 8:if(t.selection.getRng().item){t.selection.getRng().item(0).removeNode();return Event.cancel(e);}}});}if(tinymce.isOpera){t.onClick.add(function(ed,e){Event.prevent(e);});}if(s.custom_undo_redo){function addUndo(){t.undoManager.typing=0;t.undoManager.add();};if(tinymce.isIE){Event.add(t.getWin(),'blur',function(e){var n;if(t.selection){n=t.selection.getNode();if(!t.removed&&n.ownerDocument&&n.ownerDocument!=t.getDoc())addUndo();}});}else{Event.add(t.getDoc(),'blur',function(){if(t.selection&&!t.removed)addUndo();});}t.onMouseDown.add(addUndo);t.onKeyUp.add(function(ed,e){if((e.keyCode>=33&&e.keyCode<=36)||(e.keyCode>=37&&e.keyCode<=40)||e.keyCode==13||e.keyCode==45||e.ctrlKey){t.undoManager.typing=0;t.undoManager.add();}});t.onKeyDown.add(function(ed,e){if((e.keyCode>=33&&e.keyCode<=36)||(e.keyCode>=37&&e.keyCode<=40)||e.keyCode==13||e.keyCode==45){if(t.undoManager.typing){t.undoManager.add();t.undoManager.typing=0;}return;}if(!t.undoManager.typing){t.undoManager.add();t.undoManager.typing=1;}});}},_convertInlineElements:function(){var t=this,s=t.settings,dom=t.dom,v,e,na,st,sp;function convert(ed,o){if(!s.inline_styles)return;if(o.get){each(t.dom.select('table,u,strike',o.node),function(n){switch(n.nodeName){case'TABLE':if(v=dom.getAttrib(n,'height')){dom.setStyle(n,'height',v);dom.setAttrib(n,'height','');}break;case'U':case'STRIKE':n.style.textDecoration=n.nodeName=='U'?'underline':'line-through';dom.setAttrib(n,'mce_style','');dom.setAttrib(n,'mce_name','span');break;}});}else if(o.set){each(t.dom.select('table,span',o.node).reverse(),function(n){if(n.nodeName=='TABLE'){if(v=dom.getStyle(n,'height'))dom.setAttrib(n,'height',v.replace(/[^0-9%]+/g,''));}else{if(n.style.textDecoration=='underline')na='u';else if(n.style.textDecoration=='line-through')na='strike';else na='';if(na){n.style.textDecoration='';dom.setAttrib(n,'mce_style','');e=dom.create(na,{style:dom.getAttrib(n,'style')});dom.replace(e,n,1);}}});}};t.onPreProcess.add(convert);if(!s.cleanup_on_startup){t.onSetContent.add(function(ed,o){if(o.initial)convert(t,{node:t.getBody(),set:1});});}},_convertFonts:function(){var t=this,s=t.settings,dom=t.dom,fz,fzn,sl,cl;if(!s.inline_styles)return;fz=[8,10,12,14,18,24,36];fzn=['xx-small','x-small','small','medium','large','x-large','xx-large'];if(sl=s.font_size_style_values)sl=explode(sl);if(cl=s.font_size_classes)cl=explode(cl);function convertToFonts(no){var n,f,nl,x,i,v,st;if(tinymce.isWebKit||!s.inline_styles)return;nl=t.dom.select('span',no);for(x=nl.length-1;x>=0;x--){n=nl[x];f=dom.create('font',{color:dom.toHex(dom.getStyle(n,'color')),face:dom.getStyle(n,'fontFamily'),style:dom.getAttrib(n,'style'),'class':dom.getAttrib(n,'class')});st=f.style;if(st.color||st.fontFamily){st.color=st.fontFamily='';dom.setAttrib(f,'mce_style','');}if(sl){i=inArray(sl,dom.getStyle(n,'fontSize'));if(i!=-1){dom.setAttrib(f,'size',''+(i+1||1));}}else if(cl){i=inArray(cl,dom.getAttrib(n,'class'));v=dom.getStyle(n,'fontSize');if(i==-1&&v.indexOf('pt')>0)i=inArray(fz,parseInt(v));if(i==-1)i=inArray(fzn,v);if(i!=-1){dom.setAttrib(f,'size',''+(i+1||1));f.style.fontSize='';}}if(f.color||f.face||f.size){f.style.fontFamily='';dom.setAttrib(f,'mce_style','');dom.replace(f,n,1);}f=n=null;}};t.onSetContent.add(function(ed,o){convertToFonts(ed.getBody());});t.onPreProcess.add(function(ed,o){var n,sp,nl,x;if(!s.inline_styles)return;if(o.get){nl=t.dom.select('font',o.node);for(x=nl.length-1;x>=0;x--){n=nl[x];sp=dom.create('span',{style:dom.getAttrib(n,'style'),'class':dom.getAttrib(n,'class')});dom.setStyles(sp,{fontFamily:dom.getAttrib(n,'face'),color:dom.getAttrib(n,'color'),backgroundColor:n.style.backgroundColor});if(n.size){if(sl)dom.setStyle(sp,'fontSize',sl[parseInt(n.size)-1]);else dom.setAttrib(sp,'class',cl[parseInt(n.size)-1]);}dom.setAttrib(sp,'mce_style','');dom.replace(sp,n,1);}}});},_isHidden:function(){var s;if(!isGecko)return 0;s=this.selection.getSel();return(!s||!s.rangeCount||s.rangeCount==0);},_fixNesting:function(s){var d=[],i;s=s.replace(/<(\/)?([^\s>]+)[^>]*?>/g,function(a,b,c){var e;if(b==='/'){if(!d.length)return'';if(c!==d[d.length-1].tag){for(i=d.length-1;i>=0;i--){if(d[i].tag===c){d[i].close=1;break;}}return'';}else{d.pop();if(d.length&&d[d.length-1].close){a=a+'</'+d[d.length-1].tag+'>';d.pop();}}}else{if(/^(br|hr|input|meta|img|link|param)$/i.test(c))return a;if(/\/>$/.test(a))return a;d.push({tag:c});}return a;});for(i=d.length-1;i>=0;i--)s+='</'+d[i].tag+'>';return s;}});})();(function(){var each=tinymce.each,isIE=tinymce.isIE,isGecko=tinymce.isGecko,isOpera=tinymce.isOpera,isWebKit=tinymce.isWebKit;tinymce.create('tinymce.EditorCommands',{EditorCommands:function(ed){this.editor=ed;},execCommand:function(cmd,ui,val){var t=this,ed=t.editor,f;switch(cmd){case'Cut':case'Copy':case'Paste':try{ed.getDoc().execCommand(cmd,ui,val);}catch(ex){if(isGecko){ed.windowManager.confirm(ed.getLang('clipboard_msg'),function(s){if(s)window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html','mceExternal');});}else ed.windowManager.alert(ed.getLang('clipboard_no_support'));}return true;case'mceResetDesignMode':case'mceBeginUndoLevel':return true;case'unlink':t.UnLink();return true;case'JustifyLeft':case'JustifyCenter':case'JustifyRight':case'JustifyFull':t.mceJustify(cmd,cmd.substring(7).toLowerCase());return true;case'mceEndUndoLevel':case'mceAddUndoLevel':ed.undoManager.add();return true;default:f=this[cmd];if(f){f.call(this,ui,val);return true;}}return false;},Indent:function(){var ed=this.editor,d=ed.dom,s=ed.selection,e,iv,iu;iv=ed.settings.indentation;iu=/[a-z%]+$/i.exec(iv);iv=parseInt(iv);if(ed.settings.inline_styles&&(!this.queryStateInsertUnorderedList()&&!this.queryStateInsertOrderedList())){each(this._getSelectedBlocks(),function(e){d.setStyle(e,'paddingLeft',(parseInt(e.style.paddingLeft||0)+iv)+iu);});return;}ed.getDoc().execCommand('Indent',false,null);if(isIE){d.getParent(s.getNode(),function(n){if(n.nodeName=='BLOCKQUOTE'){n.dir=n.style.cssText='';}});}},Outdent:function(){var ed=this.editor,d=ed.dom,s=ed.selection,e,v,iv,iu;iv=ed.settings.indentation;iu=/[a-z%]+$/i.exec(iv);iv=parseInt(iv);if(ed.settings.inline_styles&&(!this.queryStateInsertUnorderedList()&&!this.queryStateInsertOrderedList())){each(this._getSelectedBlocks(),function(e){v=Math.max(0,parseInt(e.style.paddingLeft||0)-iv);d.setStyle(e,'paddingLeft',v?v+iu:'');});return;}ed.getDoc().execCommand('Outdent',false,null);},mceSetAttribute:function(u,v){var ed=this.editor,d=ed.dom,e;if(e=d.getParent(ed.selection.getNode(),d.isBlock))d.setAttrib(e,v.name,v.value);},mceSetContent:function(u,v){this.editor.setContent(v);},mceToggleVisualAid:function(){var ed=this.editor;ed.hasVisual=!ed.hasVisual;ed.addVisual();},mceReplaceContent:function(u,v){var s=this.editor.selection;s.setContent(v.replace(/\{\$selection\}/g,s.getContent({format:'text'})));},mceInsertLink:function(u,v){var ed=this.editor,s=ed.selection,e=ed.dom.getParent(s.getNode(),'A');if(tinymce.is(v,'string'))v={href:v};function set(e){each(v,function(v,k){ed.dom.setAttrib(e,k,v);});};if(!e){ed.execCommand('CreateLink',false,'javascript:mctmp(0);');each(ed.dom.select('a'),function(e){if(e.href=='javascript:mctmp(0);')set(e);});}else{if(v.href)set(e);else ed.dom.remove(e,1);}},UnLink:function(){var ed=this.editor,s=ed.selection;if(s.isCollapsed())s.select(s.getNode());ed.getDoc().execCommand('unlink',false,null);s.collapse(0);},FontName:function(u,v){var t=this,ed=t.editor,s=ed.selection,e;if(!v){if(s.isCollapsed())s.select(s.getNode());t.RemoveFormat();}else ed.getDoc().execCommand('FontName',false,v);},FontSize:function(u,v){var ed=this.editor,s=ed.settings,fz=tinymce.explode(s.font_size_style_values),fzc=tinymce.explode(s.font_size_classes),h,bm;each(ed.dom.select('font'),function(e){e.style.fontSize='';});ed.getDoc().execCommand('FontSize',false,v);if(s.inline_styles){each(ed.dom.select('font'),function(e){if(!e.size||e.parentNode.nodeName=='FONT'&&e.size==e.parentNode.size){if(!bm)bm=ed.selection.getBookmark();ed.dom.remove(e,1);return;}if(v=e.size){if(fzc&&fzc.length>0)ed.dom.setAttrib(e,'class',fzc[parseInt(v)-1]);else ed.dom.setStyle(e,'fontSize',fz[parseInt(v)-1]);}});}ed.selection.moveToBookmark(bm);},queryCommandValue:function(c){var f=this['queryValue'+c];if(f)return f.call(this,c);return false;},queryCommandState:function(cmd){var f;switch(cmd){case'JustifyLeft':case'JustifyCenter':case'JustifyRight':case'JustifyFull':return this.queryStateJustify(cmd,cmd.substring(7).toLowerCase());default:if(f=this['queryState'+cmd])return f.call(this,cmd);}return-1;},_queryState:function(c){try{return this.editor.getDoc().queryCommandState(c);}catch(ex){}},_queryVal:function(c){try{return this.editor.getDoc().queryCommandValue(c);}catch(ex){}},queryValueFontSize:function(){var ed=this.editor,v=0,p;if(isOpera||isWebKit){if(p=ed.dom.getParent(ed.selection.getNode(),'FONT'))v=p.size;return v;}return this._queryVal('FontSize');},queryValueFontName:function(){var ed=this.editor,v=0,p;if(p=ed.dom.getParent(ed.selection.getNode(),'FONT'))v=p.face;if(!v)v=this._queryVal('FontName');return v;},mceJustify:function(c,v){var ed=this.editor,se=ed.selection,n=se.getNode(),nn=n.nodeName,bl,nb,dom=ed.dom,rm;if(ed.settings.inline_styles&&this.queryStateJustify(c,v))rm=1;bl=dom.getParent(n,ed.dom.isBlock);if(nn=='IMG'){if(v=='full')return;if(rm){if(v=='center')dom.setStyle(n.parentNode,'textAlign','');dom.setStyle(n,'float','');this.mceRepaint();return;}if(v=='center'){if(/^(TD|TH)$/.test(bl.nodeName))bl=0;if(!bl||bl.childNodes.length>1){nb=dom.create('p');nb.appendChild(n.cloneNode(false));if(bl)dom.insertAfter(nb,bl);else dom.insertAfter(nb,n);dom.remove(n);n=nb.firstChild;bl=nb;}dom.setStyle(bl,'textAlign',v);dom.setStyle(n,'float','');}else{dom.setStyle(n,'float',v);dom.setStyle(n.parentNode,'textAlign','');}this.mceRepaint();return;}if(ed.settings.inline_styles&&ed.settings.forced_root_block){if(rm)v='';each(this._getSelectedBlocks(dom.getParent(se.getStart(),dom.isBlock),dom.getParent(se.getEnd(),dom.isBlock)),function(e){dom.setAttrib(e,'align','');dom.setStyle(e,'textAlign',v=='full'?'justify':v);});return;}else if(!rm)ed.getDoc().execCommand(c,false,null);if(ed.settings.inline_styles){if(rm){dom.getParent(ed.selection.getNode(),function(n){if(n.style&&n.style.textAlign)dom.setStyle(n,'textAlign','');});return;}each(dom.select('*'),function(n){var v=n.align;if(v){if(v=='full')v='justify';dom.setStyle(n,'textAlign',v);dom.setAttrib(n,'align','');}});}},mceSetCSSClass:function(u,v){this.mceSetStyleInfo(0,{command:'setattrib',name:'class',value:v});},getSelectedElement:function(){var t=this,ed=t.editor,dom=ed.dom,se=ed.selection,r=se.getRng(),r1,r2,sc,ec,so,eo,e,sp,ep,re;if(se.isCollapsed()||r.item)return se.getNode();re=ed.settings.merge_styles_invalid_parents;if(tinymce.is(re,'string'))re=new RegExp(re,'i');if(isIE){r1=r.duplicate();r1.collapse(true);sc=r1.parentElement();r2=r.duplicate();r2.collapse(false);ec=r2.parentElement();if(sc!=ec){r1.move('character',1);sc=r1.parentElement();}if(sc==ec){r1=r.duplicate();r1.moveToElementText(sc);if(r1.compareEndPoints('StartToStart',r)==0&&r1.compareEndPoints('EndToEnd',r)==0)return re&&re.test(sc.nodeName)?null:sc;}}else{function getParent(n){return dom.getParent(n,function(n){return n.nodeType==1;});};sc=r.startContainer;ec=r.endContainer;so=r.startOffset;eo=r.endOffset;if(!r.collapsed){if(sc==ec){if(so-eo<2){if(sc.hasChildNodes()){sp=sc.childNodes[so];return re&&re.test(sp.nodeName)?null:sp;}}}}if(sc.nodeType!=3||ec.nodeType!=3)return null;if(so==0){sp=getParent(sc);if(sp&&sp.firstChild!=sc)sp=null;}if(so==sc.nodeValue.length){e=sc.nextSibling;if(e&&e.nodeType==1)sp=sc.nextSibling;}if(eo==0){e=ec.previousSibling;if(e&&e.nodeType==1)ep=e;}if(eo==ec.nodeValue.length){ep=getParent(ec);if(ep&&ep.lastChild!=ec)ep=null;}if(sp==ep)return re&&sp&&re.test(sp.nodeName)?null:sp;}return null;},InsertHorizontalRule:function(){if(isGecko||isIE)this.editor.selection.setContent('<hr />');else this.editor.getDoc().execCommand('InsertHorizontalRule',false,'');},RemoveFormat:function(){var t=this,ed=t.editor,s=ed.selection,b;if(isWebKit)s.setContent(s.getContent({format:'raw'}).replace(/(<(span|b|i|strong|em|strike) [^>]+>|<(span|b|i|strong|em|strike)>|<\/(span|b|i|strong|em|strike)>|)/g,''),{format:'raw'});else ed.getDoc().execCommand('RemoveFormat',false,null);t.mceSetStyleInfo(0,{command:'removeformat'});ed.addVisual();},mceSetStyleInfo:function(u,v){var t=this,ed=t.editor,d=ed.getDoc(),dom=ed.dom,e,b,s=ed.selection,nn=v.wrapper||'span',b=s.getBookmark(),re;function set(n,e){if(n.nodeType==1){switch(v.command){case'setattrib':return dom.setAttrib(n,v.name,v.value);case'setstyle':return dom.setStyle(n,v.name,v.value);case'removeformat':return dom.setAttrib(n,'class','');}}};re=ed.settings.merge_styles_invalid_parents;if(tinymce.is(re,'string'))re=new RegExp(re,'i');if(e=t.getSelectedElement())set(e,1);else{d.execCommand('FontName',false,'__');each(isWebKit?dom.select('span'):dom.select('font'),function(n){var sp,e;if(dom.getAttrib(n,'face')=='__'||n.style.fontFamily==='__'){sp=dom.create(nn,{mce_new:'1'});set(sp);each(n.childNodes,function(n){sp.appendChild(n.cloneNode(true));});dom.replace(sp,n);}});}each(dom.select(nn).reverse(),function(n){var p=n.parentNode;if(!dom.getAttrib(n,'mce_new')){p=dom.getParent(n,function(n){return n.nodeType==1&&dom.getAttrib(n,'mce_new');});if(p)dom.remove(n,1);}});each(dom.select(nn).reverse(),function(n){var p=n.parentNode;if(!p||!dom.getAttrib(n,'mce_new'))return;if(p.nodeName==nn.toUpperCase()&&p.childNodes.length==1)return dom.remove(p,1);if(n.nodeType==1&&(!re||!re.test(p.nodeName))&&p.childNodes.length==1){set(p);dom.setAttrib(n,'class','');}});each(dom.select(nn).reverse(),function(n){if(dom.getAttrib(n,'mce_new')||(dom.getAttribs(n).length<=1&&n.className==='')){if(!dom.getAttrib(n,'class')&&!dom.getAttrib(n,'style'))return dom.remove(n,1);dom.setAttrib(n,'mce_new','');}});s.moveToBookmark(b);},queryStateJustify:function(c,v){var ed=this.editor,n=ed.selection.getNode(),dom=ed.dom;if(n&&n.nodeName=='IMG'){if(dom.getStyle(n,'float')==v)return 1;return n.parentNode.style.textAlign==v;}n=dom.getParent(ed.selection.getStart(),function(n){return n.nodeType==1&&n.style.textAlign;});if(v=='full')v='justify';if(ed.settings.inline_styles)return(n&&n.style.textAlign==v);return this._queryState(c);},HiliteColor:function(ui,val){var t=this,ed=t.editor,d=ed.getDoc();function set(s){if(!isGecko)return;try{d.execCommand("styleWithCSS",0,s);}catch(ex){d.execCommand("useCSS",0,!s);}};if(isGecko||isOpera){set(true);d.execCommand('hilitecolor',false,val);set(false);}else d.execCommand('BackColor',false,val);},Undo:function(){var ed=this.editor;if(ed.settings.custom_undo_redo){ed.undoManager.undo();ed.nodeChanged();}else ed.getDoc().execCommand('Undo',false,null);},Redo:function(){var ed=this.editor;if(ed.settings.custom_undo_redo){ed.undoManager.redo();ed.nodeChanged();}else ed.getDoc().execCommand('Redo',false,null);},FormatBlock:function(ui,val){var t=this,ed=t.editor,s=ed.selection,dom=ed.dom,bl,nb,b;function isBlock(n){return/^(P|DIV|H[1-6]|ADDRESS|BLOCKQUOTE|PRE)$/.test(n.nodeName);};bl=dom.getParent(s.getNode(),function(n){return isBlock(n);});if(bl){if((isIE&&isBlock(bl.parentNode))||bl.nodeName=='DIV'){nb=ed.dom.create(val);each(dom.getAttribs(bl),function(v){dom.setAttrib(nb,v.nodeName,dom.getAttrib(bl,v.nodeName));});b=s.getBookmark();dom.replace(nb,bl,1);s.moveToBookmark(b);ed.nodeChanged();return;}}val=ed.settings.forced_root_block?(val||'<p>'):val;if(val.indexOf('<')==-1)val='<'+val+'>';if(tinymce.isGecko)val=val.replace(/<(div|blockquote|code|dt|dd|dl|samp)>/gi,'$1');ed.getDoc().execCommand('FormatBlock',false,val);},mceCleanup:function(){var ed=this.editor,s=ed.selection,b=s.getBookmark();ed.setContent(ed.getContent());s.moveToBookmark(b);},mceRemoveNode:function(ui,val){var ed=this.editor,s=ed.selection,b,n=val||s.getNode();if(n==ed.getBody())return;b=s.getBookmark();ed.dom.remove(n,1);s.moveToBookmark(b);ed.nodeChanged();},mceSelectNodeDepth:function(ui,val){var ed=this.editor,s=ed.selection,c=0;ed.dom.getParent(s.getNode(),function(n){if(n.nodeType==1&&c++==val){s.select(n);ed.nodeChanged();return false;}},ed.getBody());},mceSelectNode:function(u,v){this.editor.selection.select(v);},mceInsertContent:function(ui,val){this.editor.selection.setContent(val);},mceInsertRawHTML:function(ui,val){var ed=this.editor;ed.selection.setContent('tiny_mce_marker');ed.setContent(ed.getContent().replace(/tiny_mce_marker/g,val));},mceRepaint:function(){var s,b,e=this.editor;if(tinymce.isGecko){try{s=e.selection;b=s.getBookmark(true);if(s.getSel())s.getSel().selectAllChildren(e.getBody());s.collapse(true);s.moveToBookmark(b);}catch(ex){}}},queryStateUnderline:function(){var ed=this.editor,n=ed.selection.getNode();if(n&&n.nodeName=='A')return false;return this._queryState('Underline');},queryStateOutdent:function(){var ed=this.editor,n;if(ed.settings.inline_styles){if((n=ed.dom.getParent(ed.selection.getStart(),ed.dom.isBlock))&&parseInt(n.style.paddingLeft)>0)return true;if((n=ed.dom.getParent(ed.selection.getEnd(),ed.dom.isBlock))&&parseInt(n.style.paddingLeft)>0)return true;}else return!!ed.dom.getParent(ed.selection.getNode(),'BLOCKQUOTE');return this.queryStateInsertUnorderedList()||this.queryStateInsertOrderedList();},queryStateInsertUnorderedList:function(){return this.editor.dom.getParent(this.editor.selection.getNode(),'UL');},queryStateInsertOrderedList:function(){return this.editor.dom.getParent(this.editor.selection.getNode(),'OL');},queryStatemceBlockQuote:function(){return!!this.editor.dom.getParent(this.editor.selection.getStart(),function(n){return n.nodeName==='BLOCKQUOTE';});},mceBlockQuote:function(){var t=this,ed=t.editor,s=ed.selection,dom=ed.dom,sb,eb,n,bm,bq,r,bq2,i,nl;function getBQ(e){return dom.getParent(e,function(n){return n.nodeName==='BLOCKQUOTE';});};sb=dom.getParent(s.getStart(),dom.isBlock);eb=dom.getParent(s.getEnd(),dom.isBlock);if(bq=getBQ(sb)){if(sb!=eb||sb.childNodes.length>1||(sb.childNodes.length==1&&sb.firstChild.nodeName!='BR'))bm=s.getBookmark();if(getBQ(eb)){bq2=bq.cloneNode(false);while(n=eb.nextSibling)bq2.appendChild(n.parentNode.removeChild(n));}if(bq2)dom.insertAfter(bq2,bq);nl=t._getSelectedBlocks(sb,eb);for(i=nl.length-1;i>=0;i--){dom.insertAfter(nl[i],bq);}if(/^\s*$/.test(bq.innerHTML))dom.remove(bq,1);if(bq2&&/^\s*$/.test(bq2.innerHTML))dom.remove(bq2,1);if(!bm){if(!isIE){r=ed.getDoc().createRange();r.setStart(sb,0);r.setEnd(sb,0);s.setRng(r);}else{s.select(sb);s.collapse(0);if(dom.getParent(s.getStart(),dom.isBlock)!=sb){r=s.getRng();r.move('character',-1);r.select();}}}else t.editor.selection.moveToBookmark(bm);return;}if(isIE&&!sb&&!eb){t.editor.getDoc().execCommand('Indent');n=getBQ(s.getNode());n.style.margin=n.dir='';return;}if(!sb||!eb)return;if(sb!=eb||sb.childNodes.length>1||(sb.childNodes.length==1&&sb.firstChild.nodeName!='BR'))bm=s.getBookmark();each(t._getSelectedBlocks(getBQ(s.getStart()),getBQ(s.getEnd())),function(e){if(e.nodeName=='BLOCKQUOTE'&&!bq){bq=e;return;}if(!bq){bq=dom.create('blockquote');e.parentNode.insertBefore(bq,e);}if(e.nodeName=='BLOCKQUOTE'&&bq){n=e.firstChild;while(n){bq.appendChild(n.cloneNode(true));n=n.nextSibling;}dom.remove(e);return;}bq.appendChild(dom.remove(e));});if(!bm){if(!isIE){r=ed.getDoc().createRange();r.setStart(sb,0);r.setEnd(sb,0);s.setRng(r);}else{s.select(sb);s.collapse(1);}}else s.moveToBookmark(bm);},_getSelectedBlocks:function(st,en){var ed=this.editor,dom=ed.dom,s=ed.selection,sb,eb,n,bl=[];sb=dom.getParent(st||s.getStart(),dom.isBlock);eb=dom.getParent(en||s.getEnd(),dom.isBlock);if(sb)bl.push(sb);if(sb&&eb&&sb!=eb){n=sb;while((n=n.nextSibling)&&n!=eb){if(dom.isBlock(n))bl.push(n);}}if(eb&&sb!=eb)bl.push(eb);return bl;}});})();tinymce.create('tinymce.UndoManager',{index:0,data:null,typing:0,UndoManager:function(ed){var t=this,Dispatcher=tinymce.util.Dispatcher;t.editor=ed;t.data=[];t.onAdd=new Dispatcher(this);t.onUndo=new Dispatcher(this);t.onRedo=new Dispatcher(this);},add:function(l){var t=this,i,ed=t.editor,b,s=ed.settings,la;l=l||{};l.content=l.content||ed.getContent({format:'raw',no_events:1});l.content=l.content.replace(/^\s*|\s*$/g,'');la=t.data[t.index>0&&(t.index==0||t.index==t.data.length)?t.index-1:t.index];if(!l.initial&&la&&l.content==la.content)return null;if(s.custom_undo_redo_levels){if(t.data.length>s.custom_undo_redo_levels){for(i=0;i<t.data.length-1;i++)t.data[i]=t.data[i+1];t.data.length--;t.index=t.data.length;}}if(s.custom_undo_redo_restore_selection&&!l.initial)l.bookmark=b=l.bookmark||ed.selection.getBookmark();if(t.index<t.data.length)t.index++;if(t.data.length===0&&!l.initial)return null;t.data.length=t.index+1;t.data[t.index++]=l;if(l.initial)t.index=0;if(t.data.length==2&&t.data[0].initial)t.data[0].bookmark=b;t.onAdd.dispatch(t,l);ed.isNotDirty=0;return l;},undo:function(){var t=this,ed=t.editor,l=l,i;if(t.typing){t.add();t.typing=0;}if(t.index>0){if(t.index==t.data.length&&t.index>1){i=t.index;t.typing=0;if(!t.add())t.index=i;--t.index;}l=t.data[--t.index];ed.setContent(l.content,{format:'raw'});ed.selection.moveToBookmark(l.bookmark);t.onUndo.dispatch(t,l);}return l;},redo:function(){var t=this,ed=t.editor,l=null;if(t.index<t.data.length-1){l=t.data[++t.index];ed.setContent(l.content,{format:'raw'});ed.selection.moveToBookmark(l.bookmark);t.onRedo.dispatch(t,l);}return l;},clear:function(){var t=this;t.data=[];t.index=0;t.typing=0;t.add({initial:true});},hasUndo:function(){return this.index!=0||this.typing;},hasRedo:function(){return this.index<this.data.length-1;}});(function(){var Event,isIE,isGecko,isOpera,each,extend;Event=tinymce.dom.Event;isIE=tinymce.isIE;isGecko=tinymce.isGecko;isOpera=tinymce.isOpera;each=tinymce.each;extend=tinymce.extend;tinymce.create('tinymce.ForceBlocks',{ForceBlocks:function(ed){var t=this,s=ed.settings,elm;t.editor=ed;t.dom=ed.dom;elm=(s.forced_root_block||'p').toLowerCase();s.element=elm.toUpperCase();ed.onPreInit.add(t.setup,t);t.reOpera=new RegExp('(\\u00a0|&#160;|&nbsp;)<\/'+elm+'>','gi');t.rePadd=new RegExp('<p( )([^>]+)><\\\/p>|<p( )([^>]+)\\\/>|<p( )([^>]+)>\\s+<\\\/p>|<p><\\\/p>|<p\\\/>|<p>\\s+<\\\/p>'.replace(/p/g,elm),'gi');t.reNbsp2BR1=new RegExp('<p( )([^>]+)>[\\s\\u00a0]+<\\\/p>|<p>[\\s\\u00a0]+<\\\/p>'.replace(/p/g,elm),'gi');t.reNbsp2BR2=new RegExp('<p( )([^>]+)>(&nbsp;|&#160;)<\\\/p>|<p>(&nbsp;|&#160;)<\\\/p>'.replace(/p/g,elm),'gi');t.reBR2Nbsp=new RegExp('<p( )([^>]+)>\\s*<br \\\/>\\s*<\\\/p>|<p>\\s*<br \\\/>\\s*<\\\/p>'.replace(/p/g,elm),'gi');t.reTrailBr=new RegExp('\\s*<br \\/>\\s*<\\\/p>'.replace(/p/g,elm),'gi');function padd(ed,o){if(isOpera)o.content=o.content.replace(t.reOpera,'</'+elm+'>');o.content=o.content.replace(t.rePadd,'<'+elm+'$1$2$3$4$5$6>\u00a0</'+elm+'>');if(!isIE&&!isOpera&&o.set){o.content=o.content.replace(t.reNbsp2BR1,'<'+elm+'$1$2><br /></'+elm+'>');o.content=o.content.replace(t.reNbsp2BR2,'<'+elm+'$1$2><br /></'+elm+'>');}else{o.content=o.content.replace(t.reBR2Nbsp,'<'+elm+'$1$2>\u00a0</'+elm+'>');o.content=o.content.replace(t.reTrailBr,'</'+elm+'>');}};ed.onBeforeSetContent.add(padd);ed.onPostProcess.add(padd);if(s.forced_root_block){ed.onInit.add(t.forceRoots,t);ed.onSetContent.add(t.forceRoots,t);ed.onBeforeGetContent.add(t.forceRoots,t);}},setup:function(){var t=this,ed=t.editor,s=ed.settings;if(s.forced_root_block){ed.onKeyUp.add(t.forceRoots,t);ed.onPreProcess.add(t.forceRoots,t);}if(s.force_br_newlines){if(isIE){ed.onKeyPress.add(function(ed,e){var n,s=ed.selection;if(e.keyCode==13&&s.getNode().nodeName!='LI'){s.setContent('<br id="__" /> ',{format:'raw'});n=ed.dom.get('__');n.removeAttribute('id');s.select(n);s.collapse();return Event.cancel(e);}});}return;}if(!isIE&&s.force_p_newlines){ed.onKeyPress.add(function(ed,e){if(e.keyCode==13&&!e.shiftKey){if(!t.insertPara(e))Event.cancel(e);}});if(isGecko){ed.onKeyDown.add(function(ed,e){if((e.keyCode==8||e.keyCode==46)&&!e.shiftKey)t.backspaceDelete(e,e.keyCode==8);});}}function ren(rn,na){var ne=ed.dom.create(na);each(rn.attributes,function(a){if(a.specified&&a.nodeValue)ne.setAttribute(a.nodeName.toLowerCase(),a.nodeValue);});each(rn.childNodes,function(n){ne.appendChild(n.cloneNode(true));});rn.parentNode.replaceChild(ne,rn);return ne;};if(isIE&&s.element!='P'){ed.onKeyPress.add(function(ed,e){t.lastElm=ed.selection.getNode().nodeName;});ed.onKeyUp.add(function(ed,e){var bl,sel=ed.selection,n=sel.getNode(),b=ed.getBody();if(b.childNodes.length===1&&n.nodeName=='P'){n=ren(n,s.element);sel.select(n);sel.collapse();ed.nodeChanged();}else if(e.keyCode==13&&!e.shiftKey&&t.lastElm!='P'){bl=ed.dom.getParent(n,'P');if(bl){ren(bl,s.element);ed.nodeChanged();}}});}},find:function(n,t,s){var ed=this.editor,w=ed.getDoc().createTreeWalker(n,4,null,false),c=-1;while(n=w.nextNode()){c++;if(t==0&&n==s)return c;if(t==1&&c==s)return n;}return-1;},forceRoots:function(ed,e){var t=this,ed=t.editor,b=ed.getBody(),d=ed.getDoc(),se=ed.selection,s=se.getSel(),r=se.getRng(),si=-2,ei,so,eo,tr,c=-0xFFFFFF;var nx,bl,bp,sp,le,nl=b.childNodes,i;if(e&&e.keyCode==13)return true;for(i=nl.length-1;i>=0;i--){nx=nl[i];if(nx.nodeType==3||(!t.dom.isBlock(nx)&&nx.nodeType!=8)){if(!bl){if(nx.nodeType!=3||/[^\s]/g.test(nx.nodeValue)){if(si==-2&&r){if(!isIE){if(ed.dom.getParent(r.startContainer,function(e){return e===b;})){so=r.startOffset;eo=r.endOffset;si=t.find(b,0,r.startContainer);ei=t.find(b,0,r.endContainer);}}else{tr=d.body.createTextRange();tr.moveToElementText(b);tr.collapse(1);bp=tr.move('character',c)*-1;tr=r.duplicate();tr.collapse(1);sp=tr.move('character',c)*-1;tr=r.duplicate();tr.collapse(0);le=(tr.move('character',c)*-1)-sp;si=sp-bp;ei=le;}}bl=ed.dom.create(ed.settings.forced_root_block);bl.appendChild(nx.cloneNode(1));nx.parentNode.replaceChild(bl,nx);}}else{if(bl.hasChildNodes())bl.insertBefore(nx,bl.firstChild);else bl.appendChild(nx);}}else bl=null;}if(si!=-2){if(!isIE){bl=b.getElementsByTagName(ed.settings.element)[0];r=d.createRange();if(si!=-1)r.setStart(t.find(b,1,si),so);else r.setStart(bl,0);if(ei!=-1)r.setEnd(t.find(b,1,ei),eo);else r.setEnd(bl,0);if(s){s.removeAllRanges();s.addRange(r);}}else{try{r=s.createRange();r.moveToElementText(b);r.collapse(1);r.moveStart('character',si);r.moveEnd('character',ei);r.select();}catch(ex){}}}},getParentBlock:function(n){var d=this.dom;return d.getParent(n,d.isBlock);},insertPara:function(e){var t=this,ed=t.editor,dom=ed.dom,d=ed.getDoc(),se=ed.settings,s=ed.selection.getSel(),r=s.getRangeAt(0),b=d.body;var rb,ra,dir,sn,so,en,eo,sb,eb,bn,bef,aft,sc,ec,n,vp=dom.getViewPort(ed.getWin()),y,ch;function isEmpty(n){n=n.innerHTML;n=n.replace(/<(img|hr|table)/gi,'-');n=n.replace(/<[^>]+>/g,'');return n.replace(/[ \t\r\n]+/g,'')=='';};rb=d.createRange();rb.setStart(s.anchorNode,s.anchorOffset);rb.collapse(true);ra=d.createRange();ra.setStart(s.focusNode,s.focusOffset);ra.collapse(true);dir=rb.compareBoundaryPoints(rb.START_TO_END,ra)<0;sn=dir?s.anchorNode:s.focusNode;so=dir?s.anchorOffset:s.focusOffset;en=dir?s.focusNode:s.anchorNode;eo=dir?s.focusOffset:s.anchorOffset;if(sn===en&&/^(TD|TH)$/.test(sn.nodeName)){dom.remove(sn.firstChild);ed.dom.add(sn,se.element,null,'<br />');aft=ed.dom.add(sn,se.element,null,'<br />');r=d.createRange();r.selectNodeContents(aft);r.collapse(1);ed.selection.setRng(r);return false;}if(sn==b&&en==b&&b.firstChild&&ed.dom.isBlock(b.firstChild)){sn=en=sn.firstChild;so=eo=0;rb=d.createRange();rb.setStart(sn,0);ra=d.createRange();ra.setStart(en,0);}sn=sn.nodeName=="HTML"?d.body:sn;sn=sn.nodeName=="BODY"?sn.firstChild:sn;en=en.nodeName=="HTML"?d.body:en;en=en.nodeName=="BODY"?en.firstChild:en;sb=t.getParentBlock(sn);eb=t.getParentBlock(en);bn=sb?sb.nodeName:se.element;if(t.dom.getParent(sb,function(n){return/OL|UL|PRE/.test(n.nodeName);}))return true;if(sb&&(sb.nodeName=='CAPTION'||/absolute|relative|static/gi.test(sb.style.position))){bn=se.element;sb=null;}if(eb&&(eb.nodeName=='CAPTION'||/absolute|relative|static/gi.test(eb.style.position))){bn=se.element;eb=null;}if(/(TD|TABLE|TH|CAPTION)/.test(bn)||(sb&&bn=="DIV"&&/left|right/gi.test(sb.style.cssFloat))){bn=se.element;sb=eb=null;}bef=(sb&&sb.nodeName==bn)?sb.cloneNode(0):ed.dom.create(bn);aft=(eb&&eb.nodeName==bn)?eb.cloneNode(0):ed.dom.create(bn);aft.removeAttribute('id');if(/^(H[1-6])$/.test(bn)&&sn.nodeValue&&so==sn.nodeValue.length)aft=ed.dom.create(se.element);n=sc=sn;do{if(n==b||n.nodeType==9||t.dom.isBlock(n)||/(TD|TABLE|TH|CAPTION)/.test(n.nodeName))break;sc=n;}while((n=n.previousSibling?n.previousSibling:n.parentNode));n=ec=en;do{if(n==b||n.nodeType==9||t.dom.isBlock(n)||/(TD|TABLE|TH|CAPTION)/.test(n.nodeName))break;ec=n;}while((n=n.nextSibling?n.nextSibling:n.parentNode));if(sc.nodeName==bn)rb.setStart(sc,0);else rb.setStartBefore(sc);rb.setEnd(sn,so);bef.appendChild(rb.cloneContents()||d.createTextNode(''));try{ra.setEndAfter(ec);}catch(ex){}ra.setStart(en,eo);aft.appendChild(ra.cloneContents()||d.createTextNode(''));r=d.createRange();if(!sc.previousSibling&&sc.parentNode.nodeName==bn){r.setStartBefore(sc.parentNode);}else{if(rb.startContainer.nodeName==bn&&rb.startOffset==0)r.setStartBefore(rb.startContainer);else r.setStart(rb.startContainer,rb.startOffset);}if(!ec.nextSibling&&ec.parentNode.nodeName==bn)r.setEndAfter(ec.parentNode);else r.setEnd(ra.endContainer,ra.endOffset);r.deleteContents();if(isOpera)ed.getWin().scrollTo(0,vp.y);if(bef.firstChild&&bef.firstChild.nodeName==bn)bef.innerHTML=bef.firstChild.innerHTML;if(aft.firstChild&&aft.firstChild.nodeName==bn)aft.innerHTML=aft.firstChild.innerHTML;if(isEmpty(bef))bef.innerHTML='<br />';if(isEmpty(aft))aft.innerHTML=isOpera?'&nbsp;':'<br />';if(isOpera){r.insertNode(bef);r.insertNode(aft);}else{r.insertNode(aft);r.insertNode(bef);}aft.normalize();bef.normalize();function first(n){return d.createTreeWalker(n,NodeFilter.SHOW_TEXT,null,false).nextNode()||n;};r=d.createRange();r.selectNodeContents(isGecko?first(aft):aft);r.collapse(1);s.removeAllRanges();s.addRange(r);y=ed.dom.getPos(aft).y;ch=aft.clientHeight;if(y<vp.y||y+ch>vp.y+vp.h){ed.getWin().scrollTo(0,y<vp.y?y:y-vp.h+ch);}return false;},backspaceDelete:function(e,bs){var t=this,ed=t.editor,b=ed.getBody(),n,se=ed.selection,r=se.getRng(),sc=r.startContainer,n,w,tn;if(sc&&ed.dom.isBlock(sc)&&!/^(TD|TH)$/.test(sc.nodeName)&&bs){if(sc.childNodes.length==0||(sc.childNodes.length==1&&sc.firstChild.nodeName=='BR')){n=sc;while((n=n.previousSibling)&&!ed.dom.isBlock(n));if(n){if(sc!=b.firstChild){w=ed.dom.doc.createTreeWalker(n,NodeFilter.SHOW_TEXT,null,false);while(tn=w.nextNode())n=tn;r=ed.getDoc().createRange();r.setStart(n,n.nodeValue?n.nodeValue.length:0);r.setEnd(n,n.nodeValue?n.nodeValue.length:0);se.setRng(r);ed.dom.remove(sc);}return Event.cancel(e);}}}function handler(e){e=e.target;if(e&&e.parentNode&&e.nodeName=='BR'&&(n=t.getParentBlock(e))){Event.remove(b,'DOMNodeInserted',handler);if(e.previousSibling||e.nextSibling)ed.dom.remove(e);}};Event._add(b,'DOMNodeInserted',handler);window.setTimeout(function(){Event._remove(b,'DOMNodeInserted',handler);},1);}});})();(function(){var DOM=tinymce.DOM,Event=tinymce.dom.Event,each=tinymce.each,extend=tinymce.extend;tinymce.create('tinymce.ControlManager',{ControlManager:function(ed,s){var t=this,i;s=s||{};t.editor=ed;t.controls={};t.onAdd=new tinymce.util.Dispatcher(t);t.onPostRender=new tinymce.util.Dispatcher(t);t.prefix=s.prefix||ed.id+'_';t._cls={};t.onPostRender.add(function(){each(t.controls,function(c){c.postRender();});});},get:function(id){return this.controls[this.prefix+id]||this.controls[id];},setActive:function(id,s){var c=null;if(c=this.get(id))c.setActive(s);return c;},setDisabled:function(id,s){var c=null;if(c=this.get(id))c.setDisabled(s);return c;},add:function(c){var t=this;if(c){t.controls[c.id]=c;t.onAdd.dispatch(c,t);}return c;},createControl:function(n){var c,t=this,ed=t.editor;each(ed.plugins,function(p){if(p.createControl){c=p.createControl(n,t);if(c)return false;}});switch(n){case"|":case"separator":return t.createSeparator();}if(!c&&ed.buttons&&(c=ed.buttons[n]))return t.createButton(n,c);return t.add(c);},createDropMenu:function(id,s,cc){var t=this,ed=t.editor,c,bm,v,cls;s=extend({'class':'mceDropDown',constrain:ed.settings.constrain_menus},s);s['class']=s['class']+' '+ed.getParam('skin')+'Skin';if(v=ed.getParam('skin_variant'))s['class']+=' '+ed.getParam('skin')+'Skin'+v.substring(0,1).toUpperCase()+v.substring(1);id=t.prefix+id;cls=cc||t._cls.dropmenu||tinymce.ui.DropMenu;c=t.controls[id]=new cls(id,s);c.onAddItem.add(function(c,o){var s=o.settings;s.title=ed.getLang(s.title,s.title);if(!s.onclick){s.onclick=function(v){ed.execCommand(s.cmd,s.ui||false,s.value);};}});ed.onRemove.add(function(){c.destroy();});if(tinymce.isIE){c.onShowMenu.add(function(){bm=ed.selection.getBookmark(1);});c.onHideMenu.add(function(){if(bm)ed.selection.moveToBookmark(bm);});}return t.add(c);},createListBox:function(id,s,cc){var t=this,ed=t.editor,cmd,c,cls;if(t.get(id))return null;s.title=ed.translate(s.title);s.scope=s.scope||ed;if(!s.onselect){s.onselect=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}s=extend({title:s.title,'class':'mce_'+id,scope:s.scope,control_manager:t},s);id=t.prefix+id;if(ed.settings.use_native_selects)c=new tinymce.ui.NativeListBox(id,s);else{cls=cc||t._cls.listbox||tinymce.ui.ListBox;c=new cls(id,s);}t.controls[id]=c;if(tinymce.isWebKit){c.onPostRender.add(function(c,n){Event.add(n,'mousedown',function(){ed.bookmark=ed.selection.getBookmark('simple');});Event.add(n,'focus',function(){ed.selection.moveToBookmark(ed.bookmark);ed.bookmark=null;});});}if(c.hideMenu)ed.onMouseDown.add(c.hideMenu,c);return t.add(c);},createButton:function(id,s,cc){var t=this,ed=t.editor,o,c,cls;if(t.get(id))return null;s.title=ed.translate(s.title);s.label=ed.translate(s.label);s.scope=s.scope||ed;if(!s.onclick&&!s.menu_button){s.onclick=function(){ed.execCommand(s.cmd,s.ui||false,s.value);};}s=extend({title:s.title,'class':'mce_'+id,unavailable_prefix:ed.getLang('unavailable',''),scope:s.scope,control_manager:t},s);id=t.prefix+id;if(s.menu_button){cls=cc||t._cls.menubutton||tinymce.ui.MenuButton;c=new cls(id,s);ed.onMouseDown.add(c.hideMenu,c);}else{cls=t._cls.button||tinymce.ui.Button;c=new cls(id,s);}return t.add(c);},createMenuButton:function(id,s){s=s||{};s.menu_button=1;return this.createButton(id,s);},createSplitButton:function(id,s,cc){var t=this,ed=t.editor,cmd,c,cls;if(t.get(id))return null;s.title=ed.translate(s.title);s.scope=s.scope||ed;if(!s.onclick){s.onclick=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}if(!s.onselect){s.onselect=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}s=extend({title:s.title,'class':'mce_'+id,scope:s.scope,control_manager:t},s);id=t.prefix+id;cls=cc||t._cls.splitbutton||tinymce.ui.SplitButton;c=t.add(new cls(id,s));ed.onMouseDown.add(c.hideMenu,c);return c;},createColorSplitButton:function(id,s,cc){var t=this,ed=t.editor,cmd,c,cls,bm;if(t.get(id))return null;s.title=ed.translate(s.title);s.scope=s.scope||ed;if(!s.onclick){s.onclick=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}if(!s.onselect){s.onselect=function(v){ed.execCommand(s.cmd,s.ui||false,v||s.value);};}s=extend({title:s.title,'class':'mce_'+id,'menu_class':ed.getParam('skin')+'Skin',scope:s.scope,more_colors_title:ed.getLang('more_colors')},s);id=t.prefix+id;cls=cc||t._cls.colorsplitbutton||tinymce.ui.ColorSplitButton;c=new cls(id,s);ed.onMouseDown.add(c.hideMenu,c);ed.onRemove.add(function(){c.destroy();});if(tinymce.isIE){c.onShowMenu.add(function(){bm=ed.selection.getBookmark(1);});c.onHideMenu.add(function(){if(bm)ed.selection.moveToBookmark(bm);});}return t.add(c);},createToolbar:function(id,s,cc){var c,t=this,cls;id=t.prefix+id;cls=cc||t._cls.toolbar||tinymce.ui.Toolbar;c=new cls(id,s);if(t.get(id))return null;return t.add(c);},createSeparator:function(cc){var cls=cc||this._cls.separator||tinymce.ui.Separator;return new cls();},setControlType:function(n,c){return this._cls[n.toLowerCase()]=c;},destroy:function(){each(this.controls,function(c){c.destroy();});this.controls=null;}});})();(function(){var Dispatcher=tinymce.util.Dispatcher,each=tinymce.each,isIE=tinymce.isIE,isOpera=tinymce.isOpera;tinymce.create('tinymce.WindowManager',{WindowManager:function(ed){var t=this;t.editor=ed;t.onOpen=new Dispatcher(t);t.onClose=new Dispatcher(t);t.params={};t.features={};},open:function(s,p){var t=this,f='',x,y,mo=t.editor.settings.dialog_type=='modal',w,sw,sh,vp=tinymce.DOM.getViewPort(),u;s=s||{};p=p||{};sw=isOpera?vp.w:screen.width;sh=isOpera?vp.h:screen.height;s.name=s.name||'mc_'+new Date().getTime();s.width=parseInt(s.width||320);s.height=parseInt(s.height||240);s.resizable=true;s.left=s.left||parseInt(sw/ 2.0) - (s.width /2.0);s.top=s.top||parseInt(sh/ 2.0) - (s.height /2.0);p.inline=false;p.mce_width=s.width;p.mce_height=s.height;p.mce_auto_focus=s.auto_focus;if(mo){if(isIE){s.center=true;s.help=false;s.dialogWidth=s.width+'px';s.dialogHeight=s.height+'px';s.scroll=s.scrollbars||false;}}each(s,function(v,k){if(tinymce.is(v,'boolean'))v=v?'yes':'no';if(!/^(name|url)$/.test(k)){if(isIE&&mo)f+=(f?';':'')+k+':'+v;else f+=(f?',':'')+k+'='+v;}});t.features=s;t.params=p;t.onOpen.dispatch(t,s,p);u=s.url||s.file;if(tinymce.relaxedDomain)u+=(u.indexOf('?')==-1?'?':'&')+'mce_rdomain='+tinymce.relaxedDomain;u=tinymce._addVer(u);try{if(isIE&&mo){w=1;window.showModalDialog(u,window,f);}else w=window.open(u,s.name,f);}catch(ex){}if(!w)alert(t.editor.getLang('popup_blocked'));},close:function(w){w.close();this.onClose.dispatch(this);},createInstance:function(cl,a,b,c,d,e){var f=tinymce.resolve(cl);return new f(a,b,c,d,e);},confirm:function(t,cb,s){cb.call(s||this,confirm(this._decode(this.editor.getLang(t,t))));},alert:function(tx,cb,s){var t=this;alert(t._decode(t.editor.getLang(tx,tx)));if(cb)cb.call(s||t);},_decode:function(s){return tinymce.DOM.decode(s).replace(/\\n/g,'\n');}});}());

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/tiny_mce_gzip.js
@@ -1,1 +1,186 @@
+var tinyMCE_GZ = {
+	settings : {
+		themes : '',
+		plugins : '',
+		languages : '',
+		disk_cache : true,
+		page_name : 'tiny_mce_gzip.php',
+		debug : false,
+		suffix : ''
+	},
 
+	init : function(s, cb, sc) {
+		var t = this, n, i, nl = document.getElementsByTagName('script');
+
+		for (n in s)
+			t.settings[n] = s[n];
+
+		s = t.settings;
+
+		for (i=0; i<nl.length; i++) {
+			n = nl[i];
+
+			if (n.src && n.src.indexOf('tiny_mce') != -1)
+				t.baseURL = n.src.substring(0, n.src.lastIndexOf('/'));
+		}
+
+		if (!t.coreLoaded)
+			t.loadScripts(1, s.themes, s.plugins, s.languages, cb, sc);
+	},
+
+	loadScripts : function(co, th, pl, la, cb, sc) {
+		var t = this, x, w = window, q, c = 0, ti, s = t.settings;
+
+		function get(s) {
+			x = 0;
+
+			try {
+				x = new ActiveXObject(s);
+			} catch (s) {
+			}
+
+			return x;
+		};
+
+		// Build query string
+		q = 'js=true&diskcache=' + (s.disk_cache ? 'true' : 'false') + '&core=' + (co ? 'true' : 'false') + '&suffix=' + escape(s.suffix) + '&themes=' + escape(th) + '&plugins=' + escape(pl) + '&languages=' + escape(la);
+
+		if (co)
+			t.coreLoaded = 1;
+
+		// Send request
+		x = w.XMLHttpRequest ? new XMLHttpRequest() : get('Msxml2.XMLHTTP') || get('Microsoft.XMLHTTP');
+		x.overrideMimeType && x.overrideMimeType('text/javascript');
+		x.open('GET', t.baseURL + '/' + s.page_name + '?' + q, !!cb);
+//		x.setRequestHeader('Content-Type', 'text/javascript');
+		x.send('');
+
+		// Handle asyncronous loading
+		if (cb) {
+			// Wait for response
+			ti = w.setInterval(function() {
+				if (x.readyState == 4 || c++ > 10000) {
+					w.clearInterval(ti);
+
+					if (c < 10000 && x.status == 200) {
+						t.loaded = 1;
+						t.eval(x.responseText);
+						tinymce.dom.Event.domLoaded = true;
+						cb.call(sc || t, x);
+					}
+
+					ti = x = null;
+				}
+			}, 10);
+		} else
+			t.eval(x.responseText);
+	},
+
+	start : function() {
+		var t = this, each = tinymce.each, s = t.settings, sl, ln = s.languages.split(',');
+
+		tinymce.suffix = s.suffix;
+
+		// Extend script loader
+		tinymce.create('tinymce.compressor.ScriptLoader:tinymce.dom.ScriptLoader', {
+			loadScripts : function(sc, cb, s) {
+				var ti = this, th = [], pl = [], la = [];
+
+				each(sc, function(o) {
+					var u = o.url;
+
+					if ((!ti.lookup[u] || ti.lookup[u].state != 2) && u.indexOf(t.baseURL) === 0) {
+						// Collect theme
+						if (u.indexOf('editor_template') != -1) {
+							th.push(/\/themes\/([^\/]+)/.exec(u)[1]);
+							load(u, 1);
+						}
+
+						// Collect plugin
+						if (u.indexOf('editor_plugin') != -1) {
+							pl.push(/\/plugins\/([^\/]+)/.exec(u)[1]);
+							load(u, 1);
+						}
+
+						// Collect language
+						if (u.indexOf('/langs/') != -1) {
+							la.push(/\/langs\/([^.]+)/.exec(u)[1]);
+							load(u, 1);
+						}
+					}
+				});
+
+				if (th.length + pl.length + la.length > 0) {
+					if (sl.settings.strict_mode) {
+						// Async
+						t.loadScripts(0, th.join(','), pl.join(','), la.join(','), cb, s);
+						return;
+					} else
+						t.loadScripts(0, th.join(','), pl.join(','), la.join(','), cb, s);
+				}
+
+				return ti.parent(sc, cb, s);
+			}
+		});
+
+		sl = tinymce.ScriptLoader = new tinymce.compressor.ScriptLoader();
+
+		function load(u, sp) {
+			var o;
+
+			if (!sp)
+				u = t.baseURL + u;
+
+			o = {url : u, state : 2};
+			sl.queue.push(o);
+			sl.lookup[o.url] = o;
+		};
+
+		// Add core languages
+		each (ln, function(c) {
+			if (c)
+				load('/langs/' + c + '.js');
+		});
+
+		// Add themes with languages
+		each(s.themes.split(','), function(n) {
+			if (n) {
+				load('/themes/' + n + '/editor_template' + s.suffix + '.js');
+
+				each (ln, function(c) {
+					if (c)
+						load('/themes/' + n + '/langs/' + c + '.js');
+				});
+			}
+		});
+
+		// Add plugins with languages
+		each(s.plugins.split(','), function(n) {
+			if (n) {
+				load('/plugins/' + n + '/editor_plugin' + s.suffix + '.js');
+
+				each (ln, function(c) {
+					if (c)
+						load('/plugins/' + n + '/langs/' + c + '.js');
+				});
+			}
+		});
+	},
+
+	end : function() {
+	},
+
+	eval : function(co) {
+		var w = window;
+
+		// Evaluate script
+		if (!w.execScript) {
+			if (/Gecko/.test(navigator.userAgent))
+				eval(co, w); // Firefox 3.0
+			else
+				eval.call(w, co);
+		} else
+			w.execScript(co); // IE
+	}
+};
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/tiny_mce_gzip.php
@@ -1,1 +1,183 @@
+<?php
+/**
+ * $Id: tiny_mce_gzip.php 315 2007-10-25 14:03:43Z spocke $
+ *
+ * @author Moxiecode

+ *
+ * This file compresses the TinyMCE JavaScript using GZip and
+ * enables the browser to do two requests instead of one for each .js file.
+ * Notice: This script defaults the button_tile_map option to true for extra performance.
+ */
 
+	// Set the error reporting to minimal.
+	@error_reporting(E_ERROR | E_WARNING | E_PARSE);
+
+	// Get input
+	$plugins = explode(',', getParam("plugins", ""));
+	$languages = explode(',', getParam("languages", ""));
+	$themes = explode(',', getParam("themes", ""));
+	$diskCache = getParam("diskcache", "") == "true";
+	$isJS = getParam("js", "") == "true";
+	$compress = getParam("compress", "true") == "true";
+	$core = getParam("core", "true") == "true";
+	$suffix = getParam("suffix", "_src") == "_src" ? "_src" : "";
+	$cachePath = realpath("."); // Cache path, this is where the .gz files will be stored
+	$expiresOffset = 3600 * 24 * 10; // Cache for 10 days in browser cache
+	$content = "";
+	$encodings = array();
+	$supportsGzip = false;
+	$enc = "";
+	$cacheKey = "";
+
+	// Custom extra javascripts to pack
+	$custom = array(/*
+		"some custom .js file",
+		"some custom .js file"
+	*/);
+
+	// Headers
+	header("Content-type: text/javascript");
+	header("Vary: Accept-Encoding");  // Handle proxies
+	header("Expires: " . gmdate("D, d M Y H:i:s", time() + $expiresOffset) . " GMT");
+
+	// Is called directly then auto init with default settings
+	if (!$isJS) {
+		echo getFileContents("tiny_mce_gzip.js");
+		echo "tinyMCE_GZ.init({});";
+		die();
+	}
+
+	// Setup cache info
+	if ($diskCache) {
+		if (!$cachePath)
+			die("alert('Real path failed.');");
+
+		$cacheKey = getParam("plugins", "") . getParam("languages", "") . getParam("themes", "") . $suffix;
+
+		foreach ($custom as $file)
+			$cacheKey .= $file;
+
+		$cacheKey = md5($cacheKey);
+
+		if ($compress)
+			$cacheFile = $cachePath . "/tiny_mce_" . $cacheKey . ".gz";
+		else
+			$cacheFile = $cachePath . "/tiny_mce_" . $cacheKey . ".js";
+	}
+
+	// Check if it supports gzip
+	if (isset($_SERVER['HTTP_ACCEPT_ENCODING']))
+		$encodings = explode(',', strtolower(preg_replace("/\s+/", "", $_SERVER['HTTP_ACCEPT_ENCODING'])));
+
+	if ((in_array('gzip', $encodings) || in_array('x-gzip', $encodings) || isset($_SERVER['---------------'])) && function_exists('ob_gzhandler') && !ini_get('zlib.output_compression')) {
+		$enc = in_array('x-gzip', $encodings) ? "x-gzip" : "gzip";
+		$supportsGzip = true;
+	}
+
+	// Use cached file disk cache
+	if ($diskCache && $supportsGzip && file_exists($cacheFile)) {
+		if ($compress)
+			header("Content-Encoding: " . $enc);
+
+		echo getFileContents($cacheFile);
+		die();
+	}
+
+	// Add core
+	if ($core == "true") {
+		$content .= getFileContents("tiny_mce" . $suffix . ".js");
+
+		// Patch loading functions
+		$content .= "tinyMCE_GZ.start();";
+	}
+
+	// Add core languages
+	foreach ($languages as $lang)
+		$content .= getFileContents("langs/" . $lang . ".js");
+
+	// Add themes
+	foreach ($themes as $theme) {
+		$content .= getFileContents( "themes/" . $theme . "/editor_template" . $suffix . ".js");
+
+		foreach ($languages as $lang)
+			$content .= getFileContents("themes/" . $theme . "/langs/" . $lang . ".js");
+	}
+
+	// Add plugins
+	foreach ($plugins as $plugin) {
+		$content .= getFileContents("plugins/" . $plugin . "/editor_plugin" . $suffix . ".js");
+
+		foreach ($languages as $lang)
+			$content .= getFileContents("plugins/" . $plugin . "/langs/" . $lang . ".js");
+	}
+
+	// Add custom files
+	foreach ($custom as $file)
+		$content .= getFileContents($file);
+
+	// Restore loading functions
+	if ($core == "true")
+		$content .= "tinyMCE_GZ.end();";
+
+	// Generate GZIP'd content
+	if ($supportsGzip) {
+		if ($compress) {
+			header("Content-Encoding: " . $enc);
+			$cacheData = gzencode($content, 9, FORCE_GZIP);
+		} else
+			$cacheData = $content;
+
+		// Write gz file
+		if ($diskCache && $cacheKey != "")
+			putFileContents($cacheFile, $cacheData);
+
+		// Stream to client
+		echo $cacheData;
+	} else {
+		// Stream uncompressed content
+		echo $content;
+	}
+
+	/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+	function getParam($name, $def = false) {
+		if (!isset($_GET[$name]))
+			return $def;
+
+		return preg_replace("/[^0-9a-z\-_,]+/i", "", $_GET[$name]); // Remove anything but 0-9,a-z,-_
+	}
+
+	function getFileContents($path) {
+		$path = realpath($path);
+
+		if (!$path || !@is_file($path))
+			return "";
+
+		if (function_exists("file_get_contents"))
+			return @file_get_contents($path);
+
+		$content = "";
+		$fp = @fopen($path, "r");
+		if (!$fp)
+			return "";
+
+		while (!feof($fp))
+			$content .= fgets($fp);
+
+		fclose($fp);
+
+		return $content;
+	}
+
+	function putFileContents($path, $content) {
+		if (function_exists("file_put_contents"))
+			return @file_put_contents($path, $content);
+
+		$fp = @fopen($path, "wb");
+		if ($fp) {
+			fwrite($fp, $content);
+			fclose($fp);
+		}
+	}
+?>

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/tiny_mce_popup.js
@@ -1,1 +1,276 @@
-
+// Some global instances
+var tinymce = null, tinyMCEPopup, tinyMCE;
+
+tinyMCEPopup = {
+	init : function() {
+		var t = this, w, ti, li, q, i, it;
+
+		li = ('' + document.location.search).replace(/^\?/, '').split('&');
+		q = {};
+		for (i=0; i<li.length; i++) {
+			it = li[i].split('=');
+			q[unescape(it[0])] = unescape(it[1]);
+		}
+
+		if (q.mce_rdomain)
+			document.domain = q.mce_rdomain;
+
+		// Find window & API
+		w = t.getWin();
+		tinymce = w.tinymce;
+		tinyMCE = w.tinyMCE;
+		t.editor = tinymce.EditorManager.activeEditor;
+		t.params = t.editor.windowManager.params;
+
+		// Setup local DOM
+		t.dom = t.editor.windowManager.createInstance('tinymce.dom.DOMUtils', document);
+		t.dom.loadCSS(t.editor.settings.popup_css);
+
+		// Setup on init listeners
+		t.listeners = [];
+		t.onInit = {
+			add : function(f, s) {
+				t.listeners.push({func : f, scope : s});
+			}
+		};
+
+		t.isWindow = !t.getWindowArg('mce_inline');
+		t.id = t.getWindowArg('mce_window_id');
+		t.editor.windowManager.onOpen.dispatch(t.editor.windowManager, window);
+	},
+
+	getWin : function() {
+		return window.dialogArguments || opener || parent || top;
+	},
+
+	getWindowArg : function(n, dv) {
+		var v = this.params[n];
+
+		return tinymce.is(v) ? v : dv;
+	},
+
+	getParam : function(n, dv) {
+		return this.editor.getParam(n, dv);
+	},
+
+	getLang : function(n, dv) {
+		return this.editor.getLang(n, dv);
+	},
+
+	execCommand : function(cmd, ui, val, a) {
+		a = a || {};
+		a.skip_focus = 1;
+
+		this.restoreSelection();
+		return this.editor.execCommand(cmd, ui, val, a);
+	},
+
+	resizeToInnerSize : function() {
+		var t = this, n, b = document.body, vp = t.dom.getViewPort(window), dw, dh;
+
+		dw = t.getWindowArg('mce_width') - vp.w;
+		dh = t.getWindowArg('mce_height') - vp.h;
+
+		if (t.isWindow)
+			window.resizeBy(dw, dh);
+		else
+			t.editor.windowManager.resizeBy(dw, dh, t.id);
+	},
+
+	executeOnLoad : function(s) {
+		this.onInit.add(function() {
+			eval(s);
+		});
+	},
+
+	storeSelection : function() {
+		this.editor.windowManager.bookmark = tinyMCEPopup.editor.selection.getBookmark('simple');
+	},
+
+	restoreSelection : function() {
+		var t = tinyMCEPopup;
+
+		if (!t.isWindow && tinymce.isIE)
+			t.editor.selection.moveToBookmark(t.editor.windowManager.bookmark);
+	},
+
+	requireLangPack : function() {
+		var u = this.getWindowArg('plugin_url') || this.getWindowArg('theme_url');
+
+		if (u && this.editor.settings.language) {
+			u += '/langs/' + this.editor.settings.language + '_dlg.js';
+
+			if (!tinymce.ScriptLoader.isDone(u)) {
+				document.write('<script type="text/javascript" src="' + tinymce._addVer(u) + '"></script>');
+				tinymce.ScriptLoader.markDone(u);
+			}
+		}
+	},
+
+	pickColor : function(e, element_id) {
+		this.execCommand('mceColorPicker', true, {
+			color : document.getElementById(element_id).value,
+			func : function(c) {
+				document.getElementById(element_id).value = c;
+
+				try {
+					document.getElementById(element_id).onchange();
+				} catch (ex) {
+					// Try fire event, ignore errors
+				}
+			}
+		});
+	},
+
+	openBrowser : function(element_id, type, option) {
+		tinyMCEPopup.restoreSelection();
+		this.editor.execCallback('file_browser_callback', element_id, document.getElementById(element_id).value, type, window);
+	},
+
+	close : function() {
+		var t = this;
+
+		// To avoid domain relaxing issue in Opera
+		function close() {
+			t.editor.windowManager.close(window);
+			tinymce = tinyMCE = t.editor = t.params = t.dom = t.dom.doc = null; // Cleanup
+		};
+
+		if (tinymce.isOpera)
+			t.getWin().setTimeout(close, 0);
+		else
+			close();
+	},
+
+	// Internal functions	
+
+	_restoreSelection : function() {
+		var e = window.event.srcElement;
+
+		if (e.nodeName == 'INPUT' && (e.type == 'submit' || e.type == 'button'))
+			tinyMCEPopup.restoreSelection();
+	},
+
+/*	_restoreSelection : function() {
+		var e = window.event.srcElement;
+
+		// If user focus a non text input or textarea
+		if ((e.nodeName != 'INPUT' && e.nodeName != 'TEXTAREA') || e.type != 'text')
+			tinyMCEPopup.restoreSelection();
+	},*/
+
+	_onDOMLoaded : function() {
+		var t = this, ti = document.title, bm, h;
+
+		// Translate page
+		h = document.body.innerHTML;
+
+		// Replace a=x with a="x" in IE
+		if (tinymce.isIE)
+			h = h.replace(/ (value|title|alt)=([^"][^\s>]+)/gi, ' $1="$2"')
+
+		document.dir = t.editor.getParam('directionality','');
+		document.body.innerHTML = t.editor.translate(h);
+		document.title = ti = t.editor.translate(ti);
+		document.body.style.display = '';
+
+		// Restore selection in IE when focus is placed on a non textarea or input element of the type text
+		if (tinymce.isIE)
+			document.attachEvent('onmouseup', tinyMCEPopup._restoreSelection);
+
+		t.restoreSelection();
+		t.resizeToInnerSize();
+
+		// Set inline title
+		if (!t.isWindow)
+			t.editor.windowManager.setTitle(window, ti);
+		else
+			window.focus();
+
+		if (!tinymce.isIE && !t.isWindow) {
+			tinymce.dom.Event._add(document, 'focus', function() {
+				t.editor.windowManager.focus(t.id)
+			});
+		}
+
+		// Patch for accessibility
+		tinymce.each(t.dom.select('select'), function(e) {
+			e.onkeydown = tinyMCEPopup._accessHandler;
+		});
+
+		// Call onInit
+		// Init must be called before focus so the selection won't get lost by the focus call
+		tinymce.each(t.listeners, function(o) {
+			o.func.call(o.scope, t.editor);
+		});
+
+		// Move focus to window
+		if (t.getWindowArg('mce_auto_focus', true)) {
+			window.focus();
+
+			// Focus element with mceFocus class
+			tinymce.each(document.forms, function(f) {
+				tinymce.each(f.elements, function(e) {
+					if (t.dom.hasClass(e, 'mceFocus') && !e.disabled) {
+						e.focus();
+						return false; // Break loop
+					}
+				});
+			});
+		}
+
+		document.onkeyup = tinyMCEPopup._closeWinKeyHandler;
+	},
+
+	_accessHandler : function(e) {
+		e = e || window.event;
+
+		if (e.keyCode == 13 || e.keyCode == 32) {
+			e = e.target || e.srcElement;
+
+			if (e.onchange)
+				e.onchange();
+
+			return tinymce.dom.Event.cancel(e);
+		}
+	},
+
+	_closeWinKeyHandler : function(e) {
+		e = e || window.event;
+
+		if (e.keyCode == 27)
+			tinyMCEPopup.close();
+	},
+
+	_wait : function() {
+		var t = this, ti;
+
+		if (tinymce.isIE && document.location.protocol != 'https:') {
+			// Fake DOMContentLoaded on IE
+			document.write('<script id=__ie_onload defer src=\'javascript:""\';><\/script>');
+			document.getElementById("__ie_onload").onreadystatechange = function() {
+				if (this.readyState == "complete") {
+					t._onDOMLoaded();
+					document.getElementById("__ie_onload").onreadystatechange = null; // Prevent leak
+				}
+			};
+		} else {
+			if (tinymce.isIE || tinymce.isWebKit) {
+				ti = setInterval(function() {
+					if (/loaded|complete/.test(document.readyState)) {
+						clearInterval(ti);
+						t._onDOMLoaded();
+					}
+				}, 10);
+			} else {
+				window.addEventListener('DOMContentLoaded', function() {
+					t._onDOMLoaded();
+				}, false);
+			}
+		}
+	}
+};
+
+tinyMCEPopup.init();
+tinyMCEPopup._wait(); // Wait for DOM Content Loaded
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/tiny_mce_src.js
@@ -1,1 +1,10605 @@
 
+/* file:jscripts/tiny_mce/classes/tinymce.js */
+
+var tinymce = {
+	majorVersion : '3',
+	minorVersion : '0.9',
+	releaseDate : '2008-06-02',
+
+	_init : function() {
+		var t = this, d = document, w = window, na = navigator, ua = na.userAgent, i, nl, n, base, p, v;
+
+		// Browser checks
+		t.isOpera = w.opera && opera.buildNumber;
+		t.isWebKit = /WebKit/.test(ua);
+		t.isOldWebKit = t.isWebKit && !w.getSelection().getRangeAt;
+		t.isIE = !t.isWebKit && !t.isOpera && (/MSIE/gi).test(ua) && (/Explorer/gi).test(na.appName);
+		t.isIE6 = t.isIE && /MSIE [56]/.test(ua);
+		t.isGecko = !t.isWebKit && /Gecko/.test(ua);
+		t.isMac = ua.indexOf('Mac') != -1;
+
+		// TinyMCE .NET webcontrol might be setting the values for TinyMCE
+		if (w.tinyMCEPreInit) {
+			t.suffix = tinyMCEPreInit.suffix;
+			t.baseURL = tinyMCEPreInit.base;
+			t.query = tinyMCEPreInit.query;
+			return;
+		}
+
+		// Get suffix and base
+		t.suffix = '';
+
+		// If base element found, add that infront of baseURL
+		nl = d.getElementsByTagName('base');
+		for (i=0; i<nl.length; i++) {
+			if (v = nl[i].href) {
+				// Host only value like http://site.com or http://site.com:8008
+				if (/^https?:\/\/[^\/]+$/.test(v))
+					v += '/';
+
+				base = v ? v.match(/.*\//)[0] : ''; // Get only directory
+			}
+		}
+
+		function getBase(n) {
+			if (n.src && /tiny_mce(|_dev|_src|_gzip|_jquery|_prototype).js/.test(n.src)) {
+				if (/_(src|dev)\.js/g.test(n.src))
+					t.suffix = '_src';
+
+				if ((p = n.src.indexOf('?')) != -1)
+					t.query = n.src.substring(p + 1);
+
+				t.baseURL = n.src.substring(0, n.src.lastIndexOf('/'));
+
+				// If path to script is relative and a base href was found add that one infront
+				if (base && t.baseURL.indexOf('://') == -1)
+					t.baseURL = base + t.baseURL;
+
+				return t.baseURL;
+			}
+
+			return null;
+		};
+
+		// Check document
+		nl = d.getElementsByTagName('script');
+		for (i=0; i<nl.length; i++) {
+			if (getBase(nl[i]))
+				return;
+		}
+
+		// Check head
+		n = d.getElementsByTagName('head')[0];
+		if (n) {
+			nl = n.getElementsByTagName('script');
+			for (i=0; i<nl.length; i++) {
+				if (getBase(nl[i]))
+					return;
+			}
+		}
+
+		return;
+	},
+
+	is : function(o, t) {
+		var n = typeof(o);
+
+		if (!t)
+			return n != 'undefined';
+
+		if (t == 'array' && (o instanceof Array))
+			return true;
+
+		return n == t;
+	},
+
+	// #if !jquery
+
+	each : function(o, cb, s) {
+		var n, l;
+
+		if (!o)
+			return 0;
+
+		s = s || o;
+
+		if (typeof(o.length) != 'undefined') {
+			// Indexed arrays, needed for Safari
+			for (n=0, l = o.length; n<l; n++) {
+				if (cb.call(s, o[n], n, o) === false)
+					return 0;
+			}
+		} else {
+			// Hashtables
+			for (n in o) {
+				if (o.hasOwnProperty(n)) {
+					if (cb.call(s, o[n], n, o) === false)
+						return 0;
+				}
+			}
+		}
+
+		return 1;
+	},
+
+	map : function(a, f) {
+		var o = [];
+
+		tinymce.each(a, function(v) {
+			o.push(f(v));
+		});
+
+		return o;
+	},
+
+	grep : function(a, f) {
+		var o = [];
+
+		tinymce.each(a, function(v) {
+			if (!f || f(v))
+				o.push(v);
+		});
+
+		return o;
+	},
+
+	inArray : function(a, v) {
+		var i, l;
+
+		if (a) {
+			for (i = 0, l = a.length; i < l; i++) {
+				if (a[i] === v)
+					return i;
+			}
+		}
+
+		return -1;
+	},
+
+	extend : function(o, e) {
+		var i, a = arguments;
+
+		for (i=1; i<a.length; i++) {
+			e = a[i];
+
+			tinymce.each(e, function(v, n) {
+				if (typeof(v) !== 'undefined')
+					o[n] = v;
+			});
+		}
+
+		return o;
+	},
+
+	trim : function(s) {
+		return (s ? '' + s : '').replace(/^\s*|\s*$/g, '');
+	},
+
+	// #endif
+
+	create : function(s, p) {
+		var t = this, sp, ns, cn, scn, c, de = 0;
+
+		// Parse : <prefix> <class>:<super class>
+		s = /^((static) )?([\w.]+)(:([\w.]+))?/.exec(s);
+		cn = s[3].match(/(^|\.)(\w+)$/i)[2]; // Class name
+
+		// Create namespace for new class
+		ns = t.createNS(s[3].replace(/\.\w+$/, ''));
+
+		// Class already exists
+		if (ns[cn])
+			return;
+
+		// Make pure static class
+		if (s[2] == 'static') {
+			ns[cn] = p;
+
+			if (this.onCreate)
+				this.onCreate(s[2], s[3], ns[cn]);
+
+			return;
+		}
+
+		// Create default constructor
+		if (!p[cn]) {
+			p[cn] = function() {};
+			de = 1;
+		}
+
+		// Add constructor and methods
+		ns[cn] = p[cn];
+		t.extend(ns[cn].prototype, p);
+
+		// Extend
+		if (s[5]) {
+			sp = t.resolve(s[5]).prototype;
+			scn = s[5].match(/\.(\w+)$/i)[1]; // Class name
+
+			// Extend constructor
+			c = ns[cn];
+			if (de) {
+				// Add passthrough constructor
+				ns[cn] = function() {
+					return sp[scn].apply(this, arguments);
+				};
+			} else {
+				// Add inherit constructor
+				ns[cn] = function() {
+					this.parent = sp[scn];
+					return c.apply(this, arguments);
+				};
+			}
+			ns[cn].prototype[cn] = ns[cn];
+
+			// Add super methods
+			t.each(sp, function(f, n) {
+				ns[cn].prototype[n] = sp[n];
+			});
+
+			// Add overridden methods
+			t.each(p, function(f, n) {
+				// Extend methods if needed
+				if (sp[n]) {
+					ns[cn].prototype[n] = function() {
+						this.parent = sp[n];
+						return f.apply(this, arguments);
+					};
+				} else {
+					if (n != cn)
+						ns[cn].prototype[n] = f;
+				}
+			});
+		}
+
+		// Add static methods
+		t.each(p['static'], function(f, n) {
+			ns[cn][n] = f;
+		});
+
+		if (this.onCreate)
+			this.onCreate(s[2], s[3], ns[cn].prototype);
+	},
+
+	walk : function(o, f, n, s) {
+		s = s || this;
+
+		if (o) {
+			if (n)
+				o = o[n];
+
+			tinymce.each(o, function(o, i) {
+				if (f.call(s, o, i, n) === false)
+					return false;
+
+				tinymce.walk(o, f, n, s);
+			});
+		}
+	},
+
+	createNS : function(n, o) {
+		var i, v;
+
+		o = o || window;
+
+		n = n.split('.');
+		for (i=0; i<n.length; i++) {
+			v = n[i];
+
+			if (!o[v])
+				o[v] = {};
+
+			o = o[v];
+		}
+
+		return o;
+	},
+
+	resolve : function(n, o) {
+		var i, l;
+
+		o = o || window;
+
+		n = n.split('.');
+		for (i=0, l = n.length; i<l; i++) {
+			o = o[n[i]];
+
+			if (!o)
+				break;
+		}
+
+		return o;
+	},
+
+	addUnload : function(f, s) {
+		var t = this, w = window;
+
+		f = {func : f, scope : s || this};
+
+		if (!t.unloads) {
+			function unload() {
+				var li = t.unloads, o, n;
+
+				if (li) {
+					// Call unload handlers
+					for (n in li) {
+						o = li[n];
+
+						if (o && o.func)
+							o.func.call(o.scope, 1); // Send in one arg to distinct unload and user destroy
+					}
+
+					// Detach unload function
+					if (w.detachEvent) {
+						w.detachEvent('onbeforeunload', fakeUnload);
+						w.detachEvent('onunload', unload);
+					} else if (w.removeEventListener)
+						w.removeEventListener('unload', unload, false);
+
+					// Destroy references
+					t.unloads = o = li = w = unload = null;
+
+					// Run garbarge collector on IE
+					if (window.CollectGarbage)
+						window.CollectGarbage();
+				}
+			};
+
+			function fakeUnload() {
+				var d = document;
+
+				// Is there things still loading, then do some magic
+				if (d.readyState == 'interactive') {
+					function stop() {
+						// Prevent memory leak
+						d.detachEvent('onstop', stop);
+
+						// Call unload handler
+						unload();
+
+						d = null;
+					};
+
+					// Fire unload when the currently loading page is stopped
+					d.attachEvent('onstop', stop);
+
+					// Remove onstop listener after a while to prevent the unload function
+					// to execute if the user presses cancel in an onbeforeunload
+					// confirm dialog and then presses the browser stop button
+					window.setTimeout(function() {
+						d.detachEvent('onstop', stop);
+					}, 0);
+				}
+			};
+
+			// Attach unload handler
+			if (w.attachEvent) {
+				w.attachEvent('onunload', unload);
+				w.attachEvent('onbeforeunload', fakeUnload);
+			} else if (w.addEventListener)
+				w.addEventListener('unload', unload, false);
+
+			// Setup initial unload handler array
+			t.unloads = [f];
+		} else
+			t.unloads.push(f);
+
+		return f;
+	},
+
+	removeUnload : function(f) {
+		var u = this.unloads, r = null;
+
+		tinymce.each(u, function(o, i) {
+			if (o && o.func == f) {
+				u.splice(i, 1);
+				r = f;
+				return false;
+			}
+		});
+
+		return r;
+	},
+
+	explode : function(s, d) {
+		return s ? tinymce.map(s.split(d || ','), tinymce.trim) : s;
+	},
+
+	_addVer : function(u) {
+		var v;
+
+		if (!this.query)
+			return u;
+
+		v = (u.indexOf('?') == -1 ? '?' : '&') + this.query;
+
+		if (u.indexOf('#') == -1)
+			return u + v;
+
+		return u.replace('#', v + '#');
+	}
+
+	};
+
+// Required for GZip AJAX loading
+window.tinymce = tinymce;
+
+// Initialize the API
+tinymce._init();
+
+/* file:jscripts/tiny_mce/classes/adapter/jquery/adapter.js */
+
+
+/* file:jscripts/tiny_mce/classes/adapter/prototype/adapter.js */
+
+
+/* file:jscripts/tiny_mce/classes/util/Dispatcher.js */
+
+tinymce.create('tinymce.util.Dispatcher', {
+	scope : null,
+	listeners : null,
+
+	Dispatcher : function(s) {
+		this.scope = s || this;
+		this.listeners = [];
+	},
+
+	add : function(cb, s) {
+		this.listeners.push({cb : cb, scope : s || this.scope});
+
+		return cb;
+	},
+
+	addToTop : function(cb, s) {
+		this.listeners.unshift({cb : cb, scope : s || this.scope});
+
+		return cb;
+	},
+
+	remove : function(cb) {
+		var l = this.listeners, o = null;
+
+		tinymce.each(l, function(c, i) {
+			if (cb == c.cb) {
+				o = cb;
+				l.splice(i, 1);
+				return false;
+			}
+		});
+
+		return o;
+	},
+
+	dispatch : function() {
+		var s, a = arguments, i, li = this.listeners, c;
+
+		// Needs to be a real loop since the listener count might change while looping
+		// And this is also more efficient
+		for (i = 0; i<li.length; i++) {
+			c = li[i];
+			s = c.cb.apply(c.scope, a);
+
+			if (s === false)
+				break;
+		}
+
+		return s;
+	}
+
+	});
+
+/* file:jscripts/tiny_mce/classes/util/URI.js */
+
+(function() {
+	var each = tinymce.each;
+
+	tinymce.create('tinymce.util.URI', {
+		URI : function(u, s) {
+			var t = this, o, a, b;
+
+			// Default settings
+			s = t.settings = s || {};
+
+			// Strange app protocol or local anchor
+			if (/^(mailto|news|javascript|about):/i.test(u) || /^\s*#/.test(u)) {
+				t.source = u;
+				return;
+			}
+
+			// Absolute path with no host, fake host and protocol
+			if (u.indexOf('/') === 0 && u.indexOf('//') !== 0)
+				u = (s.base_uri ? s.base_uri.protocol || 'http' : 'http') + '://mce_host' + u;
+
+			// Relative path
+			if (u.indexOf('://') === -1 && u.indexOf('//') !== 0)
+				u = (s.base_uri.protocol || 'http') + '://mce_host' + t.toAbsPath(s.base_uri.path, u);
+
+			// Parse URL (Credits goes to Steave, http://blog.stevenlevithan.com/archives/parseuri)
+			u = u.replace(/@@/g, '(mce_at)'); // Zope 3 workaround, they use @@something
+			u = /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(u);
+			each(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"], function(v, i) {
+				var s = u[i];
+
+				// Zope 3 workaround, they use @@something
+				if (s)
+					s = s.replace(/\(mce_at\)/g, '@@');
+
+				t[v] = s;
+			});
+
+			if (b = s.base_uri) {
+				if (!t.protocol)
+					t.protocol = b.protocol;
+
+				if (!t.userInfo)
+					t.userInfo = b.userInfo;
+
+				if (!t.port && t.host == 'mce_host')
+					t.port = b.port;
+
+				if (!t.host || t.host == 'mce_host')
+					t.host = b.host;
+
+				t.source = '';
+			}
+
+			//t.path = t.path || '/';
+		},
+
+		setPath : function(p) {
+			var t = this;
+
+			p = /^(.*?)\/?(\w+)?$/.exec(p);
+
+			// Update path parts
+			t.path = p[0];
+			t.directory = p[1];
+			t.file = p[2];
+
+			// Rebuild source
+			t.source = '';
+			t.getURI();
+		},
+
+		toRelative : function(u) {
+			var t = this, o;
+
+			u = new tinymce.util.URI(u, {base_uri : t});
+
+			// Not on same domain/port or protocol
+			if ((u.host != 'mce_host' && t.host != u.host && u.host) || t.port != u.port || t.protocol != u.protocol)
+				return u.getURI();
+
+			o = t.toRelPath(t.path, u.path);
+
+			// Add query
+			if (u.query)
+				o += '?' + u.query;
+
+			// Add anchor
+			if (u.anchor)
+				o += '#' + u.anchor;
+
+			return o;
+		},
+	
+		toAbsolute : function(u, nh) {
+			var u = new tinymce.util.URI(u, {base_uri : this});
+
+			return u.getURI(this.host == u.host ? nh : 0);
+		},
+
+		toRelPath : function(base, path) {
+			var items, bp = 0, out = '', i;
+
+			// Split the paths
+			base = base.substring(0, base.lastIndexOf('/'));
+			base = base.split('/');
+			items = path.split('/');
+
+			if (base.length >= items.length) {
+				for (i = 0; i < base.length; i++) {
+					if (i >= items.length || base[i] != items[i]) {
+						bp = i + 1;
+						break;
+					}
+				}
+			}
+
+			if (base.length < items.length) {
+				for (i = 0; i < items.length; i++) {
+					if (i >= base.length || base[i] != items[i]) {
+						bp = i + 1;
+						break;
+					}
+				}
+			}
+
+			if (bp == 1)
+				return path;
+
+			for (i = 0; i < base.length - (bp - 1); i++)
+				out += "../";
+
+			for (i = bp - 1; i < items.length; i++) {
+				if (i != bp - 1)
+					out += "/" + items[i];
+				else
+					out += items[i];
+			}
+
+			return out;
+		},
+
+		toAbsPath : function(base, path) {
+			var i, nb = 0, o = [];
+
+			// Split paths
+			base = base.split('/');
+			path = path.split('/');
+
+			// Remove empty chunks
+			each(base, function(k) {
+				if (k)
+					o.push(k);
+			});
+
+			base = o;
+
+			// Merge relURLParts chunks
+			for (i = path.length - 1, o = []; i >= 0; i--) {
+				// Ignore empty or .
+				if (path[i].length == 0 || path[i] == ".")
+					continue;
+
+				// Is parent
+				if (path[i] == '..') {
+					nb++;
+					continue;
+				}
+
+				// Move up
+				if (nb > 0) {
+					nb--;
+					continue;
+				}
+
+				o.push(path[i]);
+			}
+
+			i = base.length - nb;
+
+			// If /a/b/c or /
+			if (i <= 0)
+				return '/' + o.reverse().join('/');
+
+			return '/' + base.slice(0, i).join('/') + '/' + o.reverse().join('/');
+		},
+
+		getURI : function(nh) {
+			var s, t = this;
+
+			// Rebuild source
+			if (!t.source || nh) {
+				s = '';
+
+				if (!nh) {
+					if (t.protocol)
+						s += t.protocol + '://';
+
+					if (t.userInfo)
+						s += t.userInfo + '@';
+
+					if (t.host)
+						s += t.host;
+
+					if (t.port)
+						s += ':' + t.port;
+				}
+
+				if (t.path)
+					s += t.path;
+
+				if (t.query)
+					s += '?' + t.query;
+
+				if (t.anchor)
+					s += '#' + t.anchor;
+
+				t.source = s;
+			}
+
+			return t.source;
+		}
+
+		});
+})();
+
+/* file:jscripts/tiny_mce/classes/util/Cookie.js */
+
+(function() {
+	var each = tinymce.each;
+
+	tinymce.create('static tinymce.util.Cookie', {
+		getHash : function(n) {
+			var v = this.get(n), h;
+
+			if (v) {
+				each(v.split('&'), function(v) {
+					v = v.split('=');
+					h = h || {};
+					h[unescape(v[0])] = unescape(v[1]);
+				});
+			}
+
+			return h;
+		},
+
+		setHash : function(n, v, e, p, d, s) {
+			var o = '';
+
+			each(v, function(v, k) {
+				o += (!o ? '' : '&') + escape(k) + '=' + escape(v);
+			});
+
+			this.set(n, o, e, p, d, s);
+		},
+
+		get : function(n) {
+			var c = document.cookie, e, p = n + "=", b;
+
+			// Strict mode
+			if (!c)
+				return;
+
+			b = c.indexOf("; " + p);
+
+			if (b == -1) {
+				b = c.indexOf(p);
+
+				if (b != 0)
+					return null;
+			} else
+				b += 2;
+
+			e = c.indexOf(";", b);
+
+			if (e == -1)
+				e = c.length;
+
+			return unescape(c.substring(b + p.length, e));
+		},
+
+		set : function(n, v, e, p, d, s) {
+			document.cookie = n + "=" + escape(v) +
+				((e) ? "; expires=" + e.toGMTString() : "") +
+				((p) ? "; path=" + escape(p) : "") +
+				((d) ? "; domain=" + d : "") +
+				((s) ? "; secure" : "");
+		},
+
+		remove : function(n, p) {
+			var d = new Date();
+
+			d.setTime(d.getTime() - 1000);
+
+			this.set(n, '', d, p, d);
+		}
+
+		});
+})();
+
+/* file:jscripts/tiny_mce/classes/util/JSON.js */
+
+tinymce.create('static tinymce.util.JSON', {
+	serialize : function(o) {
+		var i, v, s = tinymce.util.JSON.serialize, t;
+
+		if (o == null)
+			return 'null';
+
+		t = typeof o;
+
+		if (t == 'string') {
+			v = '\bb\tt\nn\ff\rr\""\'\'\\\\';
+
+			return '"' + o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'])/g, function(a, b) {
+				i = v.indexOf(b);
+
+				if (i + 1)
+					return '\\' + v.charAt(i + 1);
+
+				a = b.charCodeAt().toString(16);
+
+				return '\\u' + '0000'.substring(a.length) + a;
+			}) + '"';
+		}
+
+		if (t == 'object') {
+			if (o instanceof Array) {
+					for (i=0, v = '['; i<o.length; i++)
+						v += (i > 0 ? ',' : '') + s(o[i]);
+
+					return v + ']';
+				}
+
+				v = '{';
+
+				for (i in o)
+					v += typeof o[i] != 'function' ? (v.length > 1 ? ',"' : '"') + i + '":' + s(o[i]) : '';
+
+				return v + '}';
+		}
+
+		return '' + o;
+	},
+
+	parse : function(s) {
+		try {
+			return eval('(' + s + ')');
+		} catch (ex) {
+			// Ignore
+		}
+	}
+
+	});
+
+/* file:jscripts/tiny_mce/classes/util/XHR.js */
+
+tinymce.create('static tinymce.util.XHR', {
+	send : function(o) {
+		var x, t, w = window, c = 0;
+
+		// Default settings
+		o.scope = o.scope || this;
+		o.success_scope = o.success_scope || o.scope;
+		o.error_scope = o.error_scope || o.scope;
+		o.async = o.async === false ? false : true;
+		o.data = o.data || '';
+
+		function get(s) {
+			x = 0;
+
+			try {
+				x = new ActiveXObject(s);
+			} catch (ex) {
+			}
+
+			return x;
+		};
+
+		x = w.XMLHttpRequest ? new XMLHttpRequest() : get('Microsoft.XMLHTTP') || get('Msxml2.XMLHTTP');
+
+		if (x) {
+			if (x.overrideMimeType)
+				x.overrideMimeType(o.content_type);
+
+			x.open(o.type || (o.data ? 'POST' : 'GET'), o.url, o.async);
+
+			if (o.content_type)
+				x.setRequestHeader('Content-Type', o.content_type);
+
+			x.send(o.data);
+
+			function ready() {
+				if (!o.async || x.readyState == 4 || c++ > 10000) {
+					if (o.success && c < 10000 && x.status == 200)
+						o.success.call(o.success_scope, '' + x.responseText, x, o);
+					else if (o.error)
+						o.error.call(o.error_scope, c > 10000 ? 'TIMED_OUT' : 'GENERAL', x, o);
+
+					x = null;
+				} else
+					w.setTimeout(ready, 10);
+			};
+
+			// Syncronous request
+			if (!o.async)
+				return ready();
+
+			// Wait for response, onReadyStateChange can not be used since it leaks memory in IE
+			t = w.setTimeout(ready, 10);
+		}
+
+		}
+});
+
+/* file:jscripts/tiny_mce/classes/util/JSONRequest.js */
+
+(function() {
+	var extend = tinymce.extend, JSON = tinymce.util.JSON, XHR = tinymce.util.XHR;
+
+	tinymce.create('tinymce.util.JSONRequest', {
+		JSONRequest : function(s) {
+			this.settings = extend({
+			}, s);
+			this.count = 0;
+		},
+
+		send : function(o) {
+			var ecb = o.error, scb = o.success;
+
+			o = extend(this.settings, o);
+
+			o.success = function(c, x) {
+				c = JSON.parse(c);
+
+				if (typeof(c) == 'undefined') {
+					c = {
+						error : 'JSON Parse error.'
+					};
+				}
+
+				if (c.error)
+					ecb.call(o.error_scope || o.scope, c.error, x);
+				else
+					scb.call(o.success_scope || o.scope, c.result);
+			};
+
+			o.error = function(ty, x) {
+				ecb.call(o.error_scope || o.scope, ty, x);
+			};
+
+			o.data = JSON.serialize({
+				id : o.id || 'c' + (this.count++),
+				method : o.method,
+				params : o.params
+			});
+
+			// JSON content type for Ruby on rails. Bug: #1883287
+			o.content_type = 'application/json';
+
+			XHR.send(o);
+		},
+
+		'static' : {
+			sendRPC : function(o) {
+				return new tinymce.util.JSONRequest().send(o);
+			}
+		}
+
+		});
+}());
+/* file:jscripts/tiny_mce/classes/dom/DOMUtils.js */
+
+(function() {
+	// Shorten names
+	var each = tinymce.each, is = tinymce.is;
+	var isWebKit = tinymce.isWebKit, isIE = tinymce.isIE;
+
+	tinymce.create('tinymce.dom.DOMUtils', {
+		doc : null,
+		root : null,
+		files : null,
+		listeners : {},
+		pixelStyles : /^(top|left|bottom|right|width|height|borderWidth)$/,
+		cache : {},
+		idPattern : /^#[\w]+$/,
+		elmPattern : /^[\w_*]+$/,
+		elmClassPattern : /^([\w_]*)\.([\w_]+)$/,
+
+		DOMUtils : function(d, s) {
+			var t = this;
+
+			t.doc = d;
+			t.win = window;
+			t.files = {};
+			t.cssFlicker = false;
+			t.counter = 0;
+			t.boxModel = !tinymce.isIE || d.compatMode == "CSS1Compat"; 
+			t.stdMode = d.documentMode === 8;
+
+			this.settings = s = tinymce.extend({
+				keep_values : false,
+				hex_colors : 1,
+				process_html : 1
+			}, s);
+
+			// Fix IE6SP2 flicker and check it failed for pre SP2
+			if (tinymce.isIE6) {
+				try {
+					d.execCommand('BackgroundImageCache', false, true);
+				} catch (e) {
+					t.cssFlicker = true;
+				}
+			}
+
+			tinymce.addUnload(t.destroy, t);
+		},
+
+		getRoot : function() {
+			var t = this, s = t.settings;
+
+			return (s && t.get(s.root_element)) || t.doc.body;
+		},
+
+		getViewPort : function(w) {
+			var d, b;
+
+			w = !w ? this.win : w;
+			d = w.document;
+			b = this.boxModel ? d.documentElement : d.body;
+
+			// Returns viewport size excluding scrollbars
+			return {
+				x : w.pageXOffset || b.scrollLeft,
+				y : w.pageYOffset || b.scrollTop,
+				w : w.innerWidth || b.clientWidth,
+				h : w.innerHeight || b.clientHeight
+			};
+		},
+
+		getRect : function(e) {
+			var p, t = this, w, h;
+
+			e = t.get(e);
+			p = t.getPos(e);
+			w = t.getStyle(e, 'width');
+			h = t.getStyle(e, 'height');
+
+			// Non pixel value, then force offset/clientWidth
+			if (w.indexOf('px') === -1)
+				w = 0;
+
+			// Non pixel value, then force offset/clientWidth
+			if (h.indexOf('px') === -1)
+				h = 0;
+
+			return {
+				x : p.x,
+				y : p.y,
+				w : parseInt(w) || e.offsetWidth || e.clientWidth,
+				h : parseInt(h) || e.offsetHeight || e.clientHeight
+			};
+		},
+
+		getParent : function(n, f, r) {
+			var na, se = this.settings;
+
+			n = this.get(n);
+
+			if (se.strict_root)
+				r = r || this.getRoot();
+
+			// Wrap node name as func
+			if (is(f, 'string')) {
+				na = f.toUpperCase();
+
+				f = function(n) {
+					var s = false;
+
+					// Any element
+					if (n.nodeType == 1 && na === '*') {
+						s = true;
+						return false;
+					}
+
+					each(na.split(','), function(v) {
+						if (n.nodeType == 1 && ((se.strict && n.nodeName.toUpperCase() == v) || n.nodeName.toUpperCase() == v)) {
+							s = true;
+							return false; // Break loop
+						}
+					});
+
+					return s;
+				};
+			}
+
+			while (n) {
+				if (n == r)
+					return null;
+
+				if (f(n))
+					return n;
+
+				n = n.parentNode;
+			}
+
+			return null;
+		},
+
+		get : function(e) {
+			var n;
+
+			if (e && this.doc && typeof(e) == 'string') {
+				n = e;
+				e = this.doc.getElementById(e);
+
+				// IE and Opera returns meta elements when they match the specified input ID, but getElementsByName seems to do the trick
+				if (e && e.id !== n)
+					return this.doc.getElementsByName(n)[1];
+			}
+
+			return e;
+		},
+
+		// #if !jquery
+
+		select : function(pa, s) {
+			var t = this, cs, c, pl, o = [], x, i, l, n;
+
+			s = t.get(s) || t.doc;
+
+			// Look for native support and use that if it's found
+			if (s.querySelectorAll) {
+				// Element scope then use temp id
+				// We need to do this to be compatible with other implementations
+				// See bug report: http://bugs.webkit.org/show_bug.cgi?id=17461
+				if (s != t.doc) {
+					i = s.id;
+					s.id = '_mc_tmp';
+					pa = '#_mc_tmp ' + pa;
+				}
+
+				// Select elements
+				l = tinymce.grep(s.querySelectorAll(pa));
+
+				// Restore old id
+				s.id = i;
+
+				return l;
+			}
+
+			if (t.settings.strict) {
+				function get(s, n) {
+					return s.getElementsByTagName(n.toLowerCase());
+				};
+			} else {
+				function get(s, n) {
+					return s.getElementsByTagName(n);
+				};
+			}
+
+			// Simple element pattern. For example: "p" or "*"
+			if (t.elmPattern.test(pa)) {
+				x = get(s, pa);
+
+				for (i = 0, l = x.length; i<l; i++)
+					o.push(x[i]);
+
+				return o;
+			}
+
+			// Simple class pattern. For example: "p.class" or ".class"
+			if (t.elmClassPattern.test(pa)) {
+				pl = t.elmClassPattern.exec(pa);
+				x = get(s, pl[1] || '*');
+				c = ' ' + pl[2] + ' ';
+
+				for (i = 0, l = x.length; i<l; i++) {
+					n = x[i];
+
+					if (n.className && (' ' + n.className + ' ').indexOf(c) !== -1)
+						o.push(n);
+				}
+
+				return o;
+			}
+
+			function collect(n) {
+				if (!n.mce_save) {
+					n.mce_save = 1;
+					o.push(n);
+				}
+			};
+
+			function collectIE(n) {
+				if (!n.getAttribute('mce_save')) {
+					n.setAttribute('mce_save', '1');
+					o.push(n);
+				}
+			};
+
+			function find(n, f, r) {
+				var i, l, nl = get(r, n);
+
+				for (i = 0, l = nl.length; i < l; i++)
+					f(nl[i]);
+			};
+
+			each(pa.split(','), function(v, i) {
+				v = tinymce.trim(v);
+
+				// Simple element pattern, most common in TinyMCE
+				if (t.elmPattern.test(v)) {
+					each(get(s, v), function(n) {
+						collect(n);
+					});
+
+					return;
+				}
+
+				// Simple element pattern with class, fairly common in TinyMCE
+				if (t.elmClassPattern.test(v)) {
+					x = t.elmClassPattern.exec(v);
+
+					each(get(s, x[1]), function(n) {
+						if (t.hasClass(n, x[2]))
+							collect(n);
+					});
+
+					return;
+				}
+
+				if (!(cs = t.cache[pa])) {
+					cs = 'x=(function(cf, s) {';
+					pl = v.split(' ');
+
+					each(pl, function(v) {
+						var p = /^([\w\\*]+)?(?:#([\w\\]+))?(?:\.([\w\\\.]+))?(?:\[\@([\w\\]+)([\^\$\*!]?=)([\w\\]+)\])?(?:\:([\w\\]+))?/i.exec(v);
+
+						// Find elements
+						p[1] = p[1] || '*';
+						cs += 'find("' + p[1] + '", function(n) {';
+
+						// Check id
+						if (p[2])
+							cs += 'if (n.id !== "' + p[2] + '") return;';
+
+						// Check classes
+						if (p[3]) {
+							cs += 'var c = " " + n.className + " ";';
+							cs += 'if (';
+							c = '';
+							each(p[3].split('.'), function(v) {
+								if (v)
+									c += (c ? '||' : '') + 'c.indexOf(" ' + v + ' ") === -1';
+							});
+							cs += c + ') return;';
+						}
+					});
+
+					cs += 'cf(n);';
+
+					for (i = pl.length - 1; i >= 0; i--)
+						cs += '}, ' + (i ? 'n' : 's') + ');';
+
+					cs += '})';
+
+					// Compile CSS pattern function
+					t.cache[pa] = cs = eval(cs);
+				}
+
+				// Run selector function
+				cs(isIE ? collectIE : collect, s);
+			});
+
+			// Cleanup
+			each(o, function(n) {
+				if (isIE)
+					n.removeAttribute('mce_save');
+				else
+					delete n.mce_save;
+			});
+
+			return o;
+		},
+
+		// #endif
+
+		add : function(p, n, a, h, c) {
+			var t = this;
+
+			return this.run(p, function(p) {
+				var e, k;
+
+				e = is(n, 'string') ? t.doc.createElement(n) : n;
+
+				if (a) {
+					for (k in a) {
+						if (a.hasOwnProperty(k) && !is(a[k], 'object'))
+							t.setAttrib(e, k, '' + a[k]);
+					}
+
+					if (a.style && !is(a.style, 'string')) {
+						each(a.style, function(v, n) {
+							t.setStyle(e, n, v);
+						});
+					}
+				}
+
+				if (h) {
+					if (h.nodeType)
+						e.appendChild(h);
+					else
+						t.setHTML(e, h);
+				}
+
+				return !c ? p.appendChild(e) : e;
+			});
+		},
+
+		create : function(n, a, h) {
+			return this.add(this.doc.createElement(n), n, a, h, 1);
+		},
+
+		createHTML : function(n, a, h) {
+			var o = '', t = this, k;
+
+			o += '<' + n;
+
+			for (k in a) {
+				if (a.hasOwnProperty(k))
+					o += ' ' + k + '="' + t.encode(a[k]) + '"';
+			}
+
+			if (tinymce.is(h))
+				return o + '>' + h + '</' + n + '>';
+
+			return o + ' />';
+		},
+
+		remove : function(n, k) {
+			return this.run(n, function(n) {
+				var p, g;
+
+				p = n.parentNode;
+
+				if (!p)
+					return null;
+
+				if (k) {
+					each (n.childNodes, function(c) {
+						p.insertBefore(c.cloneNode(true), n);
+					});
+				}
+
+				// Fix IE psuedo leak
+		/*		if (isIE) {
+					p = n.cloneNode(true);
+					n.outerHTML = '';
+
+					return p;
+				}*/
+
+				return p.removeChild(n);
+			});
+		},
+
+		// #if !jquery
+
+		setStyle : function(n, na, v) {
+			var t = this;
+
+			return t.run(n, function(e) {
+				var s, i;
+
+				s = e.style;
+
+				// Camelcase it, if needed
+				na = na.replace(/-(\D)/g, function(a, b){
+					return b.toUpperCase();
+				});
+
+				// Default px suffix on these
+				if (t.pixelStyles.test(na) && (tinymce.is(v, 'number') || /^[\-0-9\.]+$/.test(v)))
+					v += 'px';
+
+				switch (na) {
+					case 'opacity':
+						// IE specific opacity
+						if (isIE) {
+							s.filter = v === '' ? '' : "alpha(opacity=" + (v * 100) + ")";
+
+							if (!n.currentStyle || !n.currentStyle.hasLayout)
+								s.display = 'inline-block';
+						}
+
+						// Fix for older browsers
+						s[na] = s['-moz-opacity'] = s['-khtml-opacity'] = v || '';
+						break;
+
+					case 'float':
+						isIE ? s.styleFloat = v : s.cssFloat = v;
+						break;
+					
+					default:
+						s[na] = v || '';
+				}
+
+				// Force update of the style data
+				if (t.settings.update_styles)
+					t.setAttrib(e, 'mce_style');
+			});
+		},
+
+		getStyle : function(n, na, c) {
+			n = this.get(n);
+
+			if (!n)
+				return false;
+
+			// Gecko
+			if (this.doc.defaultView && c) {
+				// Remove camelcase
+				na = na.replace(/[A-Z]/g, function(a){
+					return '-' + a;
+				});
+
+				try {
+					return this.doc.defaultView.getComputedStyle(n, null).getPropertyValue(na);
+				} catch (ex) {
+					// Old safari might fail
+					return null;
+				}
+			}
+
+			// Camelcase it, if needed
+			na = na.replace(/-(\D)/g, function(a, b){
+				return b.toUpperCase();
+			});
+
+			if (na == 'float')
+				na = isIE ? 'styleFloat' : 'cssFloat';
+
+			// IE & Opera
+			if (n.currentStyle && c)
+				return n.currentStyle[na];
+
+			return n.style[na];
+		},
+
+		setStyles : function(e, o) {
+			var t = this, s = t.settings, ol;
+
+			ol = s.update_styles;
+			s.update_styles = 0;
+
+			each(o, function(v, n) {
+				t.setStyle(e, n, v);
+			});
+
+			// Update style info
+			s.update_styles = ol;
+			if (s.update_styles)
+				t.setAttrib(e, s.cssText);
+		},
+
+		setAttrib : function(e, n, v) {
+			var t = this;
+
+			// Strict XML mode
+			if (t.settings.strict)
+				n = n.toLowerCase();
+
+			return this.run(e, function(e) {
+				var s = t.settings;
+
+				switch (n) {
+					case "style":
+						// No mce_style for elements with these since they might get resized by the user
+						if (s.keep_values) {
+							if (v && !t._isRes(v))
+								e.setAttribute('mce_style', v, 2);
+							else
+								e.removeAttribute('mce_style', 2);
+						}
+
+						e.style.cssText = v;
+						break;
+
+					case "class":
+						e.className = v || ''; // Fix IE null bug
+						break;
+
+					case "src":
+					case "href":
+						if (s.keep_values) {
+							if (s.url_converter)
+								v = s.url_converter.call(s.url_converter_scope || t, v, n, e);
+
+							t.setAttrib(e, 'mce_' + n, v, 2);
+						}
+
+						break;
+				}
+
+				if (is(v) && v !== null && v.length !== 0)
+					e.setAttribute(n, '' + v, 2);
+				else
+					e.removeAttribute(n, 2);
+			});
+		},
+
+		setAttribs : function(e, o) {
+			var t = this;
+
+			return this.run(e, function(e) {
+				each(o, function(v, n) {
+					t.setAttrib(e, n, v);
+				});
+			});
+		},
+
+		// #endif
+
+		getAttrib : function(e, n, dv) {
+			var v, t = this;
+
+			e = t.get(e);
+
+			if (!e || e.nodeType !== 1)
+				return false;
+
+			if (!is(dv))
+				dv = "";
+
+			// Try the mce variant for these
+			if (/^(src|href|style|coords)$/.test(n)) {
+				v = e.getAttribute("mce_" + n);
+
+				if (v)
+					return v;
+			}
+
+			v = e.getAttribute(n, 2);
+
+			if (!v) {
+				switch (n) {
+					case 'class':
+						v = e.className;
+						break;
+
+					default:
+						// Fix for IE crash Bug: #1884376 probably due to invalid DOM structure
+						if (isIE && n === 'name' && e.nodeName === 'A') {
+							v = e.name;
+							break;
+						}
+
+						v = e.attributes[n];
+						v = v && is(v.nodeValue) ? v.nodeValue : v;
+				}
+			}
+
+			switch (n) {
+				case 'style':
+					v = v || e.style.cssText;
+
+					if (v) {
+						v = t.serializeStyle(t.parseStyle(v));
+
+						if (t.settings.keep_values && !t._isRes(v))
+							e.setAttribute('mce_style', v);
+					}
+
+					break;
+			}
+
+			// Remove Apple and WebKit stuff
+			if (isWebKit && n === "class" && v)
+				v = v.replace(/(apple|webkit)\-[a-z\-]+/gi, '');
+
+			// Handle IE issues
+			if (isIE) {
+				switch (n) {
+					case 'rowspan':
+					case 'colspan':
+						// IE returns 1 as default value
+						if (v === 1)
+							v = '';
+
+						break;
+
+					case 'size':
+						// IE returns +0 as default value for size
+						if (v === '+0')
+							v = '';
+
+						break;
+
+					case 'hspace':
+						// IE returns -1 as default value
+						if (v === -1)
+							v = '';
+
+						break;
+
+					case 'tabindex':
+						// IE returns 32768 as default value
+						if (v === 32768)
+							v = '';
+
+						break;
+
+					case 'shape':
+						v = v.toLowerCase();
+						break;
+
+					default:
+						// IE has odd anonymous function for event attributes
+						if (n.indexOf('on') === 0 && v)
+							v = ('' + v).replace(/^function\s+anonymous\(\)\s+\{\s+(.*)\s+\}$/, '$1');
+				}
+			}
+
+			return (v && v != '') ? '' + v : dv;
+		},
+
+		getPos : function(n) {
+			var t = this, x = 0, y = 0, e, d = t.doc, r;
+
+			n = t.get(n);
+
+			// Use getBoundingClientRect on IE, Opera has it but it's not perfect
+			if (n && isIE) {
+				n = n.getBoundingClientRect();
+				e = t.boxModel ? d.documentElement : d.body;
+				x = t.getStyle(t.select('html')[0], 'borderWidth'); // Remove border
+				x = (x == 'medium' || t.boxModel && !t.isIE6) && 2 || x;
+				n.top += t.win.self != t.win.top ? 2 : 0; // IE adds some strange extra cord if used in a frameset
+
+				return {x : n.left + e.scrollLeft - x, y : n.top + e.scrollTop - x};
+			}
+
+			r = n;
+			while (r) {
+				x += r.offsetLeft || 0;
+				y += r.offsetTop || 0;
+				r = r.offsetParent;
+			}
+
+			r = n;
+			while (r) {
+				// Opera 9.25 bug fix, fixed in 9.50
+				if (!/^table-row|inline.*/i.test(t.getStyle(r, "display", 1))) {
+					x -= r.scrollLeft || 0;
+					y -= r.scrollTop || 0;
+				}
+
+				r = r.parentNode;
+
+				if (r == d.body)
+					break;
+			}
+
+			return {x : x, y : y};
+		},
+
+		parseStyle : function(st) {
+			var t = this, s = t.settings, o = {};
+
+			if (!st)
+				return o;
+
+			function compress(p, s, ot) {
+				var t, r, b, l;
+
+				// Get values and check it it needs compressing
+				t = o[p + '-top' + s];
+				if (!t)
+					return;
+
+				r = o[p + '-right' + s];
+				if (t != r)
+					return;
+
+				b = o[p + '-bottom' + s];
+				if (r != b)
+					return;
+
+				l = o[p + '-left' + s];
+				if (b != l)
+					return;
+
+				// Compress
+				o[ot] = l;
+				delete o[p + '-top' + s];
+				delete o[p + '-right' + s];
+				delete o[p + '-bottom' + s];
+				delete o[p + '-left' + s];
+			};
+
+			function compress2(ta, a, b, c) {
+				var t;
+
+				t = o[a];
+				if (!t)
+					return;
+
+				t = o[b];
+				if (!t)
+					return;
+
+				t = o[c];
+				if (!t)
+					return;
+
+				// Compress
+				o[ta] = o[a] + ' ' + o[b] + ' ' + o[c];
+				delete o[a];
+				delete o[b];
+				delete o[c];
+			};
+
+			each(st.split(';'), function(v) {
+				var sv, ur = [];
+
+				if (v) {
+					v = v.replace(/url\([^\)]+\)/g, function(v) {ur.push(v);return 'url(' + ur.length + ')';});
+					v = v.split(':');
+					sv = tinymce.trim(v[1]);
+					sv = sv.replace(/url\(([^\)]+)\)/g, function(a, b) {return ur[parseInt(b) - 1];});
+
+					sv = sv.replace(/rgb\([^\)]+\)/g, function(v) {
+						return t.toHex(v);
+					});
+
+					if (s.url_converter) {
+						sv = sv.replace(/url\([\'\"]?([^\)\'\"]+)[\'\"]?\)/g, function(x, c) {
+							return 'url(' + t.encode(s.url_converter.call(s.url_converter_scope || t, t.decode(c), 'style', null)) + ')';
+						});
+					}
+
+					o[tinymce.trim(v[0]).toLowerCase()] = sv;
+				}
+			});
+
+			compress("border", "", "border");
+			compress("border", "-width", "border-width");
+			compress("border", "-color", "border-color");
+			compress("border", "-style", "border-style");
+			compress("padding", "", "padding");
+			compress("margin", "", "margin");
+			compress2('border', 'border-width', 'border-style', 'border-color');
+
+			if (isIE) {
+				// Remove pointless border
+				if (o.border == 'medium none')
+					o.border = '';
+			}
+
+			return o;
+		},
+
+		serializeStyle : function(o) {
+			var s = '';
+
+			each(o, function(v, k) {
+				if (k && v) {
+					switch (k) {
+						case 'color':
+						case 'background-color':
+							v = v.toLowerCase();
+							break;
+					}
+
+					s += (s ? ' ' : '') + k + ': ' + v + ';';
+				}
+			});
+
+			return s;
+		},
+
+		loadCSS : function(u) {
+			var t = this, d = t.doc;
+
+			if (!u)
+				u = '';
+
+			each(u.split(','), function(u) {
+				if (t.files[u])
+					return;
+
+				t.files[u] = true;
+				t.add(t.select('head')[0], 'link', {rel : 'stylesheet', href : tinymce._addVer(u)});
+			});
+		},
+
+		// #if !jquery
+
+		addClass : function(e, c) {
+			return this.run(e, function(e) {
+				var o;
+
+				if (!c)
+					return 0;
+
+				if (this.hasClass(e, c))
+					return e.className;
+
+				o = this.removeClass(e, c);
+
+				return e.className = (o != '' ? (o + ' ') : '') + c;
+			});
+		},
+
+		removeClass : function(e, c) {
+			var t = this, re;
+
+			return t.run(e, function(e) {
+				var v;
+
+				if (t.hasClass(e, c)) {
+					if (!re)
+						re = new RegExp("(^|\\s+)" + c + "(\\s+|$)", "g");
+
+					v = e.className.replace(re, ' ');
+
+					return e.className = tinymce.trim(v != ' ' ? v : '');
+				}
+
+				return e.className;
+			});
+		},
+
+		hasClass : function(n, c) {
+			n = this.get(n);
+
+			if (!n || !c)
+				return false;
+
+			return (' ' + n.className + ' ').indexOf(' ' + c + ' ') !== -1;
+		},
+
+		show : function(e) {
+			return this.setStyle(e, 'display', 'block');
+		},
+
+		hide : function(e) {
+			return this.setStyle(e, 'display', 'none');
+		},
+
+		isHidden : function(e) {
+			e = this.get(e);
+
+			return e.style.display == 'none' || this.getStyle(e, 'display') == 'none';
+		},
+
+		// #endif
+
+		uniqueId : function(p) {
+			return (!p ? 'mce_' : p) + (this.counter++);
+		},
+
+		setHTML : function(e, h) {
+			var t = this;
+
+			return this.run(e, function(e) {
+				var x, i, nl, n, p, x;
+
+				h = t.processHTML(h);
+
+				if (isIE) {
+					function set() {
+						try {
+							// IE will remove comments from the beginning
+							// unless you padd the contents with something
+							e.innerHTML = '<br />' + h;
+							e.removeChild(e.firstChild);
+						} catch (ex) {
+							// IE sometimes produces an unknown runtime error on innerHTML if it's an block element within a block element for example a div inside a p
+							// This seems to fix this problem
+
+							// Remove all child nodes
+							while (e.firstChild)
+								e.firstChild.removeNode();
+
+							// Create new div with HTML contents and a BR infront to keep comments
+							x = t.create('div');
+							x.innerHTML = '<br />' + h;
+
+							// Add all children from div to target
+							each (x.childNodes, function(n, i) {
+								// Skip br element
+								if (i)
+									e.appendChild(n);
+							});
+						}
+					};
+
+					// IE has a serious bug when it comes to paragraphs it can produce an invalid
+					// DOM tree if contents like this <p><ul><li>Item 1</li></ul></p> is inserted
+					// It seems to be that IE doesn't like a root block element placed inside another root block element
+					if (t.settings.fix_ie_paragraphs)
+						h = h.replace(/<p><\/p>|<p([^>]+)><\/p>|<p[^\/+]\/>/gi, '<p$1 mce_keep="true">&nbsp;</p>');
+
+					set();
+
+					if (t.settings.fix_ie_paragraphs) {
+						// Check for odd paragraphs this is a sign of a broken DOM
+						nl = e.getElementsByTagName("p");
+						for (i = nl.length - 1, x = 0; i >= 0; i--) {
+							n = nl[i];
+
+							if (!n.hasChildNodes()) {
+								if (!n.mce_keep) {
+									x = 1; // Is broken
+									break;
+								}
+
+								n.removeAttribute('mce_keep');
+							}
+						}
+					}
+
+					// Time to fix the madness IE left us
+					if (x) {
+						// So if we replace the p elements with divs and mark them and then replace them back to paragraphs
+						// after we use innerHTML we can fix the DOM tree
+						h = h.replace(/<p([^>]+)>|<p>/g, '<div$1 mce_tmp="1">');
+						h = h.replace(/<\/p>/g, '</div>');
+
+						// Set the new HTML with DIVs
+						set();
+
+						// Replace all DIV elements with he mce_tmp attibute back to paragraphs
+						// This is needed since IE has a annoying bug see above for details
+						// This is a slow process but it has to be done. :(
+						if (t.settings.fix_ie_paragraphs) {
+							nl = e.getElementsByTagName("DIV");
+							for (i = nl.length - 1; i >= 0; i--) {
+								n = nl[i];
+
+								// Is it a temp div
+								if (n.mce_tmp) {
+									// Create new paragraph
+									p = t.doc.createElement('p');
+
+									// Copy all attributes
+									n.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi, function(a, b) {
+										var v;
+
+										if (b !== 'mce_tmp') {
+											v = n.getAttribute(b);
+
+											if (!v && b === 'class')
+												v = n.className;
+
+											p.setAttribute(b, v);
+										}
+									});
+
+									// Append all children to new paragraph
+									for (x = 0; x<n.childNodes.length; x++)
+										p.appendChild(n.childNodes[x].cloneNode(true));
+
+									// Replace div with new paragraph
+									n.swapNode(p);
+								}
+							}
+						}
+					}
+				} else
+					e.innerHTML = h;
+
+				return h;
+			});
+		},
+
+		processHTML : function(h) {
+			var t = this, s = t.settings;
+
+			if (!s.process_html)
+				return h;
+
+			// Convert strong and em to b and i in FF since it can't handle them
+			if (tinymce.isGecko) {
+				h = h.replace(/<(\/?)strong>|<strong( [^>]+)>/gi, '<$1b$2>');
+				h = h.replace(/<(\/?)em>|<em( [^>]+)>/gi, '<$1i$2>');
+			} else if (isIE)
+				h = h.replace(/&apos;/g, '&#39;'); // IE can't handle apos
+
+			// Fix some issues
+			h = h.replace(/<a( )([^>]+)\/>|<a\/>/gi, '<a$1$2></a>'); // Force open
+
+			// Store away src and href in mce_src and mce_href since browsers mess them up
+			if (s.keep_values) {
+				// Wrap scripts in comments for serialization purposes
+				if (h.indexOf('<script') !== -1) {
+					h = h.replace(/<script>/g, '<script type="text/javascript">');
+					h = h.replace(/<script(|[^>]+)>(\s*<!--|\/\/\s*<\[CDATA\[)?[\r\n]*/g, '<mce:script$1><!--\n');
+					h = h.replace(/\s*(\/\/\s*-->|\/\/\s*]]>)?<\/script>/g, '\n// --></mce:script>');
+					h = h.replace(/<mce:script(|[^>]+)><!--\n\/\/ --><\/mce:script>/g, '<mce:script$1></mce:script>');
+				}
+
+				// Process all tags with src, href or style
+				h = h.replace(/<([\w:]+) [^>]*(src|href|style|coords)[^>]*>/gi, function(a, n) {
+					function handle(m, b, c) {
+						var u = c;
+
+						// Tag already got a mce_ version
+						if (a.indexOf('mce_' + b) != -1)
+							return m;
+
+						if (b == 'style') {
+							// Why did I need this one?
+							//if (isIE)
+							//	u = t.serializeStyle(t.parseStyle(u));
+
+							// No mce_style for elements with these since they might get resized by the user
+							if (t._isRes(c))
+								return m;
+
+							if (s.hex_colors) {
+								u = u.replace(/rgb\([^\)]+\)/g, function(v) {
+									return t.toHex(v);
+								});
+							}
+
+							if (s.url_converter) {
+								u = u.replace(/url\([\'\"]?([^\)\'\"]+)\)/g, function(x, c) {
+									return 'url(' + t.encode(s.url_converter.call(s.url_converter_scope || t, t.decode(c), b, n)) + ')';
+								});
+							}
+						} else if (b != 'coords') {
+							if (s.url_converter)
+								u = t.encode(s.url_converter.call(s.url_converter_scope || t, t.decode(c), b, n));
+						}
+
+						return ' ' + b + '="' + c + '" mce_' + b + '="' + u + '"';
+					};
+
+					a = a.replace(/ (src|href|style|coords)=[\"]([^\"]+)[\"]/gi, handle); // W3C
+					a = a.replace(/ (src|href|style|coords)=[\']([^\']+)[\']/gi, handle); // W3C
+
+					return a.replace(/ (src|href|style|coords)=([^\s\"\'>]+)/gi, handle); // IE
+				});
+			}
+
+			return h;
+		},
+
+		getOuterHTML : function(e) {
+			var d;
+
+			e = this.get(e);
+
+			if (!e)
+				return null;
+
+			if (isIE)
+				return e.outerHTML;
+
+			d = (e.ownerDocument || this.doc).createElement("body");
+			d.appendChild(e.cloneNode(true));
+
+			return d.innerHTML;
+		},
+
+		setOuterHTML : function(e, h, d) {
+			var t = this;
+
+			return this.run(e, function(e) {
+				var n, tp;
+
+				e = t.get(e);
+				d = d || e.ownerDocument || t.doc;
+
+				if (isIE && e.nodeType == 1)
+					e.outerHTML = h;
+				else {
+					tp = d.createElement("body");
+					tp.innerHTML = h;
+
+					n = tp.lastChild;
+					while (n) {
+						t.insertAfter(n.cloneNode(true), e);
+						n = n.previousSibling;
+					}
+
+					t.remove(e);
+				}
+			});
+		},
+
+		decode : function(s) {
+			var e;
+
+			// Look for entities to decode
+			if (/&[^;]+;/.test(s)) {
+				// Decode the entities using a div element not super efficient but less code
+				e = this.doc.createElement("div");
+				e.innerHTML = s;
+
+				return !e.firstChild ? s : e.firstChild.nodeValue;
+			}
+
+			return s;
+		},
+
+		encode : function(s) {
+			return s ? ('' + s).replace(/[<>&\"]/g, function (c, b) {
+				switch (c) {
+					case '&':
+						return '&amp;';
+
+					case '"':
+						return '&quot;';
+
+					case '<':
+						return '&lt;';
+
+					case '>':
+						return '&gt;';
+				}
+
+				return c;
+			}) : s;
+		},
+
+		// #if !jquery
+
+		insertAfter : function(n, r) {
+			var t = this;
+
+			r = t.get(r);
+
+			return this.run(n, function(n) {
+				var p, ns;
+
+				p = r.parentNode;
+				ns = r.nextSibling;
+
+				if (ns)
+					p.insertBefore(n, ns);
+				else
+					p.appendChild(n);
+
+				return n;
+			});
+		},
+
+		// #endif
+
+		isBlock : function(n) {
+			if (n.nodeType && n.nodeType !== 1)
+				return false;
+
+			n = n.nodeName || n;
+
+			return /^(H[1-6]|HR|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|FORM|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP)$/.test(n);
+		},
+
+		// #if !jquery
+
+		replace : function(n, o, k) {
+			if (is(o, 'array'))
+				n = n.cloneNode(true);
+
+			return this.run(o, function(o) {
+				if (k) {
+					each(o.childNodes, function(c) {
+						n.appendChild(c.cloneNode(true));
+					});
+				}
+
+				// Fix IE psuedo leak for elements since replacing elements if fairly common
+				// Will break parentNode for some unknown reason
+	/*			if (isIE && o.nodeType === 1) {
+					o.parentNode.insertBefore(n, o);
+					o.outerHTML = '';
+					return n;
+				}*/
+
+				return o.parentNode.replaceChild(n, o);
+			});
+		},
+
+		// #endif
+
+		toHex : function(s) {
+			var c = /^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(s);
+
+			function hex(s) {
+				s = parseInt(s).toString(16);
+
+				return s.length > 1 ? s : '0' + s; // 0 -> 00
+			};
+
+			if (c) {
+				s = '#' + hex(c[1]) + hex(c[2]) + hex(c[3]);
+
+				return s;
+			}
+
+			return s;
+		},
+
+		getClasses : function() {
+			var t = this, cl = [], i, lo = {}, f = t.settings.class_filter, ov;
+
+			if (t.classes)
+				return t.classes;
+
+			function addClasses(s) {
+				// IE style imports
+				each(s.imports, function(r) {
+					addClasses(r);
+				});
+
+				each(s.cssRules || s.rules, function(r) {
+					// Real type or fake it on IE
+					switch (r.type || 1) {
+						// Rule
+						case 1:
+							if (r.selectorText) {
+								each(r.selectorText.split(','), function(v) {
+									v = v.replace(/^\s*|\s*$|^\s\./g, "");
+
+									// Is internal or it doesn't contain a class
+									if (/\.mce/.test(v) || !/\.[\w\-]+$/.test(v))
+										return;
+
+									// Remove everything but class name
+									ov = v;
+									v = v.replace(/.*\.([a-z0-9_\-]+).*/i, '$1');
+
+									// Filter classes
+									if (f && !(v = f(v, ov)))
+										return;
+
+									if (!lo[v]) {
+										cl.push({'class' : v});
+										lo[v] = 1;
+									}
+								});
+							}
+							break;
+
+						// Import
+						case 3:
+							addClasses(r.styleSheet);
+							break;
+					}
+				});
+			};
+
+			try {
+				each(t.doc.styleSheets, addClasses);
+			} catch (ex) {
+				// Ignore
+			}
+
+			if (cl.length > 0)
+				t.classes = cl;
+
+			return cl;
+		},
+
+		run : function(e, f, s) {
+			var t = this, o;
+
+			if (t.doc && typeof(e) === 'string')
+				e = t.doc.getElementById(e);
+
+			if (!e)
+				return false;
+
+			s = s || this;
+			if (!e.nodeType && (e.length || e.length === 0)) {
+				o = [];
+
+				each(e, function(e, i) {
+					if (e) {
+						if (typeof(e) == 'string')
+							e = t.doc.getElementById(e);
+
+						o.push(f.call(s, e, i));
+					}
+				});
+
+				return o;
+			}
+
+			return f.call(s, e);
+		},
+
+		getAttribs : function(n) {
+			var o;
+
+			n = this.get(n);
+
+			if (!n)
+				return [];
+
+			if (isIE) {
+				o = [];
+
+				// Object will throw exception in IE
+				if (n.nodeName == 'OBJECT')
+					return n.attributes;
+
+				// It's crazy that this is faster in IE but it's because it returns all attributes all the time
+				n.cloneNode(false).outerHTML.replace(/([a-z0-9\:\-_]+)=/gi, function(a, b) {
+					o.push({specified : 1, nodeName : b});
+				});
+
+				return o;
+			}
+
+			return n.attributes;
+		},
+
+		destroy : function(s) {
+			var t = this;
+
+			t.win = t.doc = t.root = null;
+
+			// Manual destroy then remove unload handler
+			if (!s)
+				tinymce.removeUnload(t.destroy);
+		},
+
+		_isRes : function(c) {
+			// Is live resizble element
+			return /^(top|left|bottom|right|width|height)/i.test(c) || /;\s*(top|left|bottom|right|width|height)/i.test(c);
+		}
+
+		/*
+		walk : function(n, f, s) {
+			var d = this.doc, w;
+
+			if (d.createTreeWalker) {
+				w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false);
+
+				while ((n = w.nextNode()) != null)
+					f.call(s || this, n);
+			} else
+				tinymce.walk(n, f, 'childNodes', s);
+		}
+		*/
+
+		/*
+		toRGB : function(s) {
+			var c = /^\s*?#([0-9A-F]{2})([0-9A-F]{1,2})([0-9A-F]{2})?\s*?$/.exec(s);
+
+			if (c) {
+				// #FFF -> #FFFFFF
+				if (!is(c[3]))
+					c[3] = c[2] = c[1];
+
+				return "rgb(" + parseInt(c[1], 16) + "," + parseInt(c[2], 16) + "," + parseInt(c[3], 16) + ")";
+			}
+
+			return s;
+		}
+		*/
+
+		});
+
+	// Setup page DOM
+	tinymce.DOM = new tinymce.dom.DOMUtils(document, {process_html : 0});
+})();
+
+/* file:jscripts/tiny_mce/classes/dom/Event.js */
+
+(function() {
+	// Shorten names
+	var each = tinymce.each, DOM = tinymce.DOM, isIE = tinymce.isIE, isWebKit = tinymce.isWebKit, Event;
+
+	tinymce.create('static tinymce.dom.Event', {
+		inits : [],
+		events : [],
+
+		// #if !jquery
+
+		add : function(o, n, f, s) {
+			var cb, t = this, el = t.events, r;
+
+			// Handle array
+			if (o && o instanceof Array) {
+				r = [];
+
+				each(o, function(o) {
+					o = DOM.get(o);
+					r.push(t.add(o, n, f, s));
+				});
+
+				return r;
+			}
+
+			o = DOM.get(o);
+
+			if (!o)
+				return;
+
+			// Setup event callback
+			cb = function(e) {
+				e = e || window.event;
+
+				// Patch in target in IE it's W3C valid
+				if (e && !e.target && isIE)
+					e.target = e.srcElement;
+
+				if (!s)
+					return f(e);
+
+				return f.call(s, e);
+			};
+
+			if (n == 'unload') {
+				tinymce.unloads.unshift({func : cb});
+				return cb;
+			}
+
+			if (n == 'init') {
+				if (t.domLoaded)
+					cb();
+				else
+					t.inits.push(cb);
+
+				return cb;
+			}
+
+			// Store away listener reference
+			el.push({
+				obj : o,
+				name : n,
+				func : f,
+				cfunc : cb,
+				scope : s
+			});
+
+			t._add(o, n, cb);
+
+			return f;
+		},
+
+		remove : function(o, n, f) {
+			var t = this, a = t.events, s = false, r;
+
+			// Handle array
+			if (o && o instanceof Array) {
+				r = [];
+
+				each(o, function(o) {
+					o = DOM.get(o);
+					r.push(t.remove(o, n, f));
+				});
+
+				return r;
+			}
+
+			o = DOM.get(o);
+
+			each(a, function(e, i) {
+				if (e.obj == o && e.name == n && (!f || (e.func == f || e.cfunc == f))) {
+					a.splice(i, 1);
+					t._remove(o, n, e.cfunc);
+					s = true;
+					return false;
+				}
+			});
+
+			return s;
+		},
+
+		clear : function(o) {
+			var t = this, a = t.events, i, e;
+
+			if (o) {
+				o = DOM.get(o);
+
+				for (i = a.length - 1; i >= 0; i--) {
+					e = a[i];
+
+					if (e.obj === o) {
+						t._remove(e.obj, e.name, e.cfunc);
+						e.obj = e.cfunc = null;
+						a.splice(i, 1);
+					}
+				}
+			}
+		},
+
+		// #endif
+
+		cancel : function(e) {
+			if (!e)
+				return false;
+
+			this.stop(e);
+			return this.prevent(e);
+		},
+
+		stop : function(e) {
+			if (e.stopPropagation)
+				e.stopPropagation();
+			else
+				e.cancelBubble = true;
+
+			return false;
+		},
+
+		prevent : function(e) {
+			if (e.preventDefault)
+				e.preventDefault();
+			else
+				e.returnValue = false;
+
+			return false;
+		},
+
+		_unload : function() {
+			var t = Event;
+
+			each(t.events, function(e, i) {
+				t._remove(e.obj, e.name, e.cfunc);
+				e.obj = e.cfunc = null;
+			});
+
+			t.events = [];
+			t = null;
+		},
+
+		_add : function(o, n, f) {
+			if (o.attachEvent)
+				o.attachEvent('on' + n, f);
+			else if (o.addEventListener)
+				o.addEventListener(n, f, false);
+			else
+				o['on' + n] = f;
+		},
+
+		_remove : function(o, n, f) {
+			if (o) {
+				try {
+					if (o.detachEvent)
+						o.detachEvent('on' + n, f);
+					else if (o.removeEventListener)
+						o.removeEventListener(n, f, false);
+					else
+						o['on' + n] = null;
+				} catch (ex) {
+					// Might fail with permission denined on IE so we just ignore that
+				}
+			}
+		},
+
+		_pageInit : function() {
+			var e = Event;
+
+			e._remove(window, 'DOMContentLoaded', e._pageInit);
+			e.domLoaded = true;
+
+			each(e.inits, function(c) {
+				c();
+			});
+
+			e.inits = [];
+		},
+
+		_wait : function() {
+			var t;
+
+			// No need since the document is already loaded
+			if (window.tinyMCE_GZ && tinyMCE_GZ.loaded) {
+				Event.domLoaded = 1;
+				return;
+			}
+
+			if (isIE && document.location.protocol != 'https:') {
+				// Fake DOMContentLoaded on IE
+				document.write('<script id=__ie_onload defer src=\'javascript:""\';><\/script>');
+				DOM.get("__ie_onload").onreadystatechange = function() {
+					if (this.readyState == "complete") {
+						Event._pageInit();
+						DOM.get("__ie_onload").onreadystatechange = null; // Prevent leak
+					}
+				};
+			} else {
+				Event._add(window, 'DOMContentLoaded', Event._pageInit, Event);
+
+				if (isIE || isWebKit) {
+					t = setInterval(function() {
+						if (/loaded|complete/.test(document.readyState)) {
+							clearInterval(t);
+							Event._pageInit();
+						}
+					}, 10);
+				}
+			}
+		}
+
+		});
+
+	// Shorten name
+	Event = tinymce.dom.Event;
+
+	// Dispatch DOM content loaded event for IE and Safari
+	Event._wait();
+	tinymce.addUnload(Event._unload);
+})();
+
+/* file:jscripts/tiny_mce/classes/dom/Element.js */
+
+(function() {
+	var each = tinymce.each;
+
+	tinymce.create('tinymce.dom.Element', {
+		Element : function(id, s) {
+			var t = this, dom, el;
+
+			s = s || {};
+			t.id = id;
+			t.dom = dom = s.dom || tinymce.DOM;
+			t.settings = s;
+
+			// Only IE leaks DOM references, this is a lot faster
+			if (!tinymce.isIE)
+				el = t.dom.get(t.id);
+
+			each([
+				'getPos',
+				'getRect',
+				'getParent',
+				'add',
+				'setStyle',
+				'getStyle',
+				'setStyles',
+				'setAttrib',
+				'setAttribs',
+				'getAttrib',
+				'addClass',
+				'removeClass',
+				'hasClass',
+				'getOuterHTML',
+				'setOuterHTML',
+				'remove',
+				'show',
+				'hide',
+				'isHidden',
+				'setHTML',
+				'get'
+			], function(k) {
+				t[k] = function() {
+					var a = arguments, o;
+
+					// Opera fails
+					if (tinymce.isOpera) {
+						a = [id];
+
+						each(arguments, function(v) {
+							a.push(v);
+						});
+					} else
+						Array.prototype.unshift.call(a, el || id);
+
+					o = dom[k].apply(dom, a);
+					t.update(k);
+
+					return o;
+				};
+			});
+		},
+
+		on : function(n, f, s) {
+			return tinymce.dom.Event.add(this.id, n, f, s);
+		},
+
+		getXY : function() {
+			return {
+				x : parseInt(this.getStyle('left')),
+				y : parseInt(this.getStyle('top'))
+			};
+		},
+
+		getSize : function() {
+			var n = this.dom.get(this.id);
+
+			return {
+				w : parseInt(this.getStyle('width') || n.clientWidth),
+				h : parseInt(this.getStyle('height') || n.clientHeight)
+			};
+		},
+
+		moveTo : function(x, y) {
+			this.setStyles({left : x, top : y});
+		},
+
+		moveBy : function(x, y) {
+			var p = this.getXY();
+
+			this.moveTo(p.x + x, p.y + y);
+		},
+
+		resizeTo : function(w, h) {
+			this.setStyles({width : w, height : h});
+		},
+
+		resizeBy : function(w, h) {
+			var s = this.getSize();
+
+			this.resizeTo(s.w + w, s.h + h);
+		},
+
+		update : function(k) {
+			var t = this, b, dom = t.dom;
+
+			if (tinymce.isIE6 && t.settings.blocker) {
+				k = k || '';
+
+				// Ignore getters
+				if (k.indexOf('get') === 0 || k.indexOf('has') === 0 || k.indexOf('is') === 0)
+					return;
+
+				// Remove blocker on remove
+				if (k == 'remove') {
+					dom.remove(t.blocker);
+					return;
+				}
+
+				if (!t.blocker) {
+					t.blocker = dom.uniqueId();
+					b = dom.add(t.settings.container || dom.getRoot(), 'iframe', {id : t.blocker, style : 'position:absolute;', frameBorder : 0, src : 'javascript:""'});
+					dom.setStyle(b, 'opacity', 0);
+				} else
+					b = dom.get(t.blocker);
+
+				dom.setStyle(b, 'left', t.getStyle('left', 1));
+				dom.setStyle(b, 'top', t.getStyle('top', 1));
+				dom.setStyle(b, 'width', t.getStyle('width', 1));
+				dom.setStyle(b, 'height', t.getStyle('height', 1));
+				dom.setStyle(b, 'display', t.getStyle('display', 1));
+				dom.setStyle(b, 'zIndex', parseInt(t.getStyle('zIndex', 1) || 0) - 1);
+			}
+		}
+
+		});
+})();
+
+/* file:jscripts/tiny_mce/classes/dom/Selection.js */
+
+(function() {
+	function trimNl(s) {
+		return s.replace(/[\n\r]+/g, '');
+	};
+
+	// Shorten names
+	var is = tinymce.is, isIE = tinymce.isIE, each = tinymce.each;
+
+	tinymce.create('tinymce.dom.Selection', {
+		Selection : function(dom, win, serializer) {
+			var t = this;
+
+			t.dom = dom;
+			t.win = win;
+			t.serializer = serializer;
+
+			// Prevent leaks
+			tinymce.addUnload(t.destroy, t);
+		},
+
+		getContent : function(s) {
+			var t = this, r = t.getRng(), e = t.dom.create("body"), se = t.getSel(), wb, wa, n;
+
+			s = s || {};
+			wb = wa = '';
+			s.get = true;
+			s.format = s.format || 'html';
+
+			if (s.format == 'text')
+				return t.isCollapsed() ? '' : (r.text || (se.toString ? se.toString() : ''));
+
+			if (r.cloneContents) {
+				n = r.cloneContents();
+
+				if (n)
+					e.appendChild(n);
+			} else if (is(r.item) || is(r.htmlText))
+				e.innerHTML = r.item ? r.item(0).outerHTML : r.htmlText;
+			else
+				e.innerHTML = r.toString();
+
+			// Keep whitespace before and after
+			if (/^\s/.test(e.innerHTML))
+				wb = ' ';
+
+			if (/\s+$/.test(e.innerHTML))
+				wa = ' ';
+
+			s.getInner = true;
+
+			return t.isCollapsed() ? '' : wb + t.serializer.serialize(e, s) + wa;
+		},
+
+		setContent : function(h, s) {
+			var t = this, r = t.getRng(), d = t.win.document;
+
+			s = s || {format : 'html'};
+			s.set = true;
+			h = t.dom.processHTML(h);
+
+			if (r.insertNode) {
+				// Gecko has a bug where if you insert &nbsp; using InsertHTML it will insert a space instead
+				// So we simply check if the input is HTML or text and then insert text using the insertNode method
+				if (tinymce.isGecko && h.indexOf('<') == -1) {
+					r.deleteContents();
+					r.insertNode(t.getRng().createContextualFragment(h + '<span id="__caret">_</span>'));
+					t.select(t.dom.get('__caret'));
+					t.getRng().deleteContents();
+					return;
+				}
+
+				// Use insert HTML if it exists (places cursor after content)
+				try {
+					// This might fail with an exception see bug #1893736
+					if (d.queryCommandEnabled('InsertHTML'))
+						return d.execCommand('InsertHTML', false, h);
+				} catch (ex) {
+					// Use old school method
+					r.deleteContents();
+					r.insertNode(t.getRng().createContextualFragment(h));
+				}
+			} else {
+				if (r.item) {
+					// Delete content and get caret text selection
+					d.execCommand('Delete', false, null);
+					r = t.getRng();
+				}
+
+				r.pasteHTML(h);
+			}
+		},
+
+		getStart : function() {
+			var t = this, r = t.getRng(), e;
+
+			if (isIE) {
+				if (r.item)
+					return r.item(0);
+
+				r = r.duplicate();
+				r.collapse(1);
+				e = r.parentElement();
+
+				if (e && e.nodeName == 'BODY')
+					return e.firstChild;
+
+				return e;
+			} else {
+				e = r.startContainer;
+
+				if (e.nodeName == 'BODY')
+					return e.firstChild;
+
+				return t.dom.getParent(e, function(n) {return n.nodeType == 1;});
+			}
+		},
+
+		getEnd : function() {
+			var t = this, r = t.getRng(), e;
+
+			if (isIE) {
+				if (r.item)
+					return r.item(0);
+
+				r = r.duplicate();
+				r.collapse(0);
+				e = r.parentElement();
+
+				if (e && e.nodeName == 'BODY')
+					return e.lastChild;
+
+				return e;
+			} else {
+				e = r.endContainer;
+
+				if (e.nodeName == 'BODY')
+					return e.lastChild;
+
+				return t.dom.getParent(e, function(n) {return n.nodeType == 1;});
+			}
+		},
+
+		getBookmark : function(si) {
+			var t = this, r = t.getRng(), tr, sx, sy, vp = t.dom.getViewPort(t.win), e, sp, bp, le, c = -0xFFFFFF, s, ro = t.dom.getRoot(), wb = 0, wa = 0, nv;
+			sx = vp.x;
+			sy = vp.y;
+
+			// Simple bookmark fast but not as persistent
+			if (si == 'simple')
+				return {rng : r, scrollX : sx, scrollY : sy};
+
+			// Handle IE
+			if (isIE) {
+				// Control selection
+				if (r.item) {
+					e = r.item(0);
+
+					each(t.dom.select(e.nodeName), function(n, i) {
+						if (e == n) {
+							sp = i;
+							return false;
+						}
+					});
+
+					return {
+						tag : e.nodeName,
+						index : sp,
+						scrollX : sx,
+						scrollY : sy
+					};
+				}
+
+				// Text selection
+				tr = t.dom.doc.body.createTextRange();
+				tr.moveToElementText(ro);
+				tr.collapse(true);
+				bp = Math.abs(tr.move('character', c));
+
+				tr = r.duplicate();
+				tr.collapse(true);
+				sp = Math.abs(tr.move('character', c));
+
+				tr = r.duplicate();
+				tr.collapse(false);
+				le = Math.abs(tr.move('character', c)) - sp;
+
+				return {
+					start : sp - bp,
+					length : le,
+					scrollX : sx,
+					scrollY : sy
+				};
+			}
+
+			// Handle W3C
+			e = t.getNode();
+			s = t.getSel();
+
+			if (!s)
+				return null;
+
+			// Image selection
+			if (e && e.nodeName == 'IMG') {
+				return {
+					scrollX : sx,
+					scrollY : sy
+				};
+			}
+
+			// Text selection
+
+			function getPos(r, sn, en) {
+				var w = t.dom.doc.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 += trimNl(n.nodeValue || '').length;
+				}
+
+				return null;
+			};
+
+			// Caret or selection
+			if (s.anchorNode == s.focusNode && s.anchorOffset == s.focusOffset) {
+				e = getPos(ro, s.anchorNode, s.focusNode);
+
+				if (!e)
+					return {scrollX : sx, scrollY : sy};
+
+				// Count whitespace before
+				trimNl(s.anchorNode.nodeValue || '').replace(/^\s+/, function(a) {wb = a.length;});
+
+				return {
+					start : Math.max(e.start + s.anchorOffset - wb, 0),
+					end : Math.max(e.end + s.focusOffset - wb, 0),
+					scrollX : sx,
+					scrollY : sy,
+					beg : s.anchorOffset - wb == 0
+				};
+			} else {
+				e = getPos(ro, r.startContainer, r.endContainer);
+
+				// Count whitespace before start and end container
+				//(r.startContainer.nodeValue || '').replace(/^\s+/, function(a) {wb = a.length;});
+				//(r.endContainer.nodeValue || '').replace(/^\s+/, function(a) {wa = a.length;});
+
+				if (!e)
+					return {scrollX : sx, scrollY : sy};
+
+				return {
+					start : Math.max(e.start + r.startOffset - wb, 0),
+					end : Math.max(e.end + r.endOffset - wa, 0),
+					scrollX : sx,
+					scrollY : sy,
+					beg : r.startOffset - wb == 0
+				};
+			}
+		},
+
+		moveToBookmark : function(b) {
+			var t = this, r = t.getRng(), s = t.getSel(), ro = t.dom.getRoot(), sd, nvl, nv;
+
+			function getPos(r, sp, ep) {
+				var w = t.dom.doc.createTreeWalker(r, NodeFilter.SHOW_TEXT, null, false), n, p = 0, d = {}, o, v, wa, wb;
+
+				while ((n = w.nextNode()) != null) {
+					wa = wb = 0;
+
+					nv = n.nodeValue || '';
+					//nv.replace(/^\s+[^\s]/, function(a) {wb = a.length - 1;});
+					//nv.replace(/[^\s]\s+$/, function(a) {wa = a.length - 1;});
+
+					nvl = trimNl(nv).length;
+					p += nvl;
+
+					if (p >= sp && !d.startNode) {
+						o = sp - (p - nvl);
+
+						// Fix for odd quirk in FF
+						if (b.beg && o >= nvl)
+							continue;
+
+						d.startNode = n;
+						d.startOffset = o + wb;
+					}
+
+					if (p >= ep) {
+						d.endNode = n;
+						d.endOffset = ep - (p - nvl) + wb;
+						return d;
+					}
+				}
+
+				return null;
+			};
+
+			if (!b)
+				return false;
+
+			t.win.scrollTo(b.scrollX, b.scrollY);
+
+			// Handle explorer
+			if (isIE) {
+				// Handle simple
+				if (r = b.rng) {
+					try {
+						r.select();
+					} catch (ex) {
+						// Ignore
+					}
+
+					return true;
+				}
+
+				t.win.focus();
+
+				// Handle control bookmark
+				if (b.tag) {
+					r = ro.createControlRange();
+
+					each(t.dom.select(b.tag), function(n, i) {
+						if (i == b.index)
+							r.addElement(n);
+					});
+				} else {
+					// Try/catch needed since this operation breaks when TinyMCE is placed in hidden divs/tabs
+					try {
+						// Incorrect bookmark
+						if (b.start < 0)
+							return true;
+
+						r = s.createRange();
+						r.moveToElementText(ro);
+						r.collapse(true);
+						r.moveStart('character', b.start);
+						r.moveEnd('character', b.length);
+					} catch (ex2) {
+						return true;
+					}
+				}
+
+				try {
+					r.select();
+				} catch (ex) {
+					// Needed for some odd IE bug #1843306
+				}
+
+				return true;
+			}
+
+			// Handle W3C
+			if (!s)
+				return false;
+
+			// Handle simple
+			if (b.rng) {
+				s.removeAllRanges();
+				s.addRange(b.rng);
+			} else {
+				if (is(b.start) && is(b.end)) {
+					try {
+						sd = getPos(ro, b.start, b.end);
+
+						if (sd) {
+							r = t.dom.doc.createRange();
+							r.setStart(sd.startNode, sd.startOffset);
+							r.setEnd(sd.endNode, sd.endOffset);
+							s.removeAllRanges();
+							s.addRange(r);
+						}
+
+						if (!tinymce.isOpera)
+							t.win.focus();
+					} catch (ex) {
+						// Ignore
+					}
+				}
+			}
+		},
+
+		select : function(n, c) {
+			var t = this, r = t.getRng(), s = t.getSel(), b, fn, ln, d = t.win.document;
+
+			function first(n) {
+				return n ? d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false).nextNode() : null;
+			};
+
+			function last(n) {
+				var c, o, w;
+
+				if (!n)
+					return null;
+
+				w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false);
+				while (c = w.nextNode())
+					o = c;
+
+				return o;
+			};
+
+			if (isIE) {
+				try {
+					b = d.body;
+
+					if (/^(IMG|TABLE)$/.test(n.nodeName)) {
+						r = b.createControlRange();
+						r.addElement(n);
+					} else {
+						r = b.createTextRange();
+						r.moveToElementText(n);
+					}
+
+					r.select();
+				} catch (ex) {
+					// Throws illigal agrument in IE some times
+				}
+			} else {
+				if (c) {
+					fn = first(n);
+					ln = last(n);
+
+					if (fn && ln) {
+						//console.debug(fn, ln);
+						r = d.createRange();
+						r.setStart(fn, 0);
+						r.setEnd(ln, ln.nodeValue.length);
+					} else
+						r.selectNode(n);
+				} else
+					r.selectNode(n);
+
+				t.setRng(r);
+			}
+
+			return n;
+		},
+
+		isCollapsed : function() {
+			var t = this, r = t.getRng(), s = t.getSel();
+
+			if (!r || r.item)
+				return false;
+
+			return !s || r.boundingWidth == 0 || s.isCollapsed;
+		},
+
+		collapse : function(b) {
+			var t = this, r = t.getRng(), n;
+
+			// Control range on IE
+			if (r.item) {
+				n = r.item(0);
+				r = this.win.document.body.createTextRange();
+				r.moveToElementText(n);
+			}
+
+			r.collapse(!!b);
+			t.setRng(r);
+		},
+
+		getSel : function() {
+			var t = this, w = this.win;
+
+			return w.getSelection ? w.getSelection() : w.document.selection;
+		},
+
+		getRng : function() {
+			var t = this, s = t.getSel(), r;
+
+			try {
+				if (s)
+					r = s.rangeCount > 0 ? s.getRangeAt(0) : (s.createRange ? s.createRange() : t.win.document.createRange());
+			} catch (ex) {
+				// IE throws unspecified error here if TinyMCE is placed in a frame/iframe
+			}
+
+			// No range found then create an empty one
+			// This can occur when the editor is placed in a hidden container element on Gecko
+			// Or on IE when there was an exception
+			if (!r)
+				r = isIE ? t.win.document.body.createTextRange() : t.win.document.createRange();
+
+			return r;
+		},
+
+		setRng : function(r) {
+			var s;
+
+			if (!isIE) {
+				s = this.getSel();
+
+				if (s) {
+					s.removeAllRanges();
+					s.addRange(r);
+				}
+			} else {
+				try {
+					r.select();
+				} catch (ex) {
+					// Needed for some odd IE bug #1843306
+				}
+			}
+		},
+
+		setNode : function(n) {
+			var t = this;
+
+			t.setContent(t.dom.getOuterHTML(n));
+
+			return n;
+		},
+
+		getNode : function() {
+			var t = this, r = t.getRng(), s = t.getSel(), e;
+
+			if (!isIE) {
+				// Range maybe lost after the editor is made visible again
+				if (!r)
+					return t.dom.getRoot();
+
+				e = r.commonAncestorContainer;
+
+				// Handle selection a image or other control like element such as anchors
+				if (!r.collapsed) {
+					if (r.startContainer == r.endContainer || (tinymce.isWebKit && r.startContainer == r.endContainer.parentNode)) {
+						if (r.startOffset - r.endOffset < 2 || tinymce.isWebKit) {
+							if (r.startContainer.hasChildNodes())
+								e = r.startContainer.childNodes[r.startOffset];
+						}
+					}
+				}
+
+				return t.dom.getParent(e, function(n) {
+					return n.nodeType == 1;
+				});
+			}
+
+			return r.item ? r.item(0) : r.parentElement();
+		},
+
+		destroy : function(s) {
+			var t = this;
+
+			t.win = null;
+
+			// Manual destroy then remove unload handler
+			if (!s)
+				tinymce.removeUnload(t.destroy);
+		}
+
+		});
+})();
+
+/* file:jscripts/tiny_mce/classes/dom/XMLWriter.js */
+
+(function() {
+	tinymce.create('tinymce.dom.XMLWriter', {
+		node : null,
+
+		XMLWriter : function(s) {
+			// Get XML document
+			function getXML() {
+				var i = document.implementation;
+
+				if (!i || !i.createDocument) {
+					// Try IE objects
+					try {return new ActiveXObject('MSXML2.DOMDocument');} catch (ex) {}
+					try {return new ActiveXObject('Microsoft.XmlDom');} catch (ex) {}
+				} else
+					return i.createDocument('', '', null);
+			};
+
+			this.doc = getXML();
+			
+			// Since Opera and WebKit doesn't escape > into &gt; we need to do it our self to normalize the output for all browsers
+			this.valid = tinymce.isOpera || tinymce.isWebKit;
+
+			this.reset();
+		},
+
+		reset : function() {
+			var t = this, d = t.doc;
+
+			if (d.firstChild)
+				d.removeChild(d.firstChild);
+
+			t.node = d.appendChild(d.createElement("html"));
+		},
+
+		writeStartElement : function(n) {
+			var t = this;
+
+			t.node = t.node.appendChild(t.doc.createElement(n));
+		},
+
+		writeAttribute : function(n, v) {
+			if (this.valid)
+				v = v.replace(/>/g, '%MCGT%');
+
+			this.node.setAttribute(n, v);
+		},
+
+		writeEndElement : function() {
+			this.node = this.node.parentNode;
+		},
+
+		writeFullEndElement : function() {
+			var t = this, n = t.node;
+
+			n.appendChild(t.doc.createTextNode(""));
+			t.node = n.parentNode;
+		},
+
+		writeText : function(v) {
+			if (this.valid)
+				v = v.replace(/>/g, '%MCGT%');
+
+			this.node.appendChild(this.doc.createTextNode(v));
+		},
+
+		writeCDATA : function(v) {
+			this.node.appendChild(this.doc.createCDATA(v));
+		},
+
+		writeComment : function(v) {
+			this.node.appendChild(this.doc.createComment(v.replace(/\-\-/g, ' ')));
+		},
+
+		getContent : function() {
+			var h;
+
+			h = this.doc.xml || new XMLSerializer().serializeToString(this.doc);
+			h = h.replace(/<\?[^?]+\?>|<html>|<\/html>|<html\/>|<!DOCTYPE[^>]+>/g, '');
+			h = h.replace(/ ?\/>/g, ' />');
+
+			if (this.valid)
+				h = h.replace(/\%MCGT%/g, '&gt;');
+
+			return h;
+		}
+
+		});
+})();
+
+/* file:jscripts/tiny_mce/classes/dom/StringWriter.js */
+
+(function() {
+	tinymce.create('tinymce.dom.StringWriter', {
+		str : null,
+		tags : null,
+		count : 0,
+		settings : null,
+		indent : null,
+
+		StringWriter : function(s) {
+			this.settings = tinymce.extend({
+				indent_char : ' ',
+				indentation : 1
+			}, s);
+
+			this.reset();
+		},
+
+		reset : function() {
+			this.indent = '';
+			this.str = "";
+			this.tags = [];
+			this.count = 0;
+		},
+
+		writeStartElement : function(n) {
+			this._writeAttributesEnd();
+			this.writeRaw('<' + n);
+			this.tags.push(n);
+			this.inAttr = true;
+			this.count++;
+			this.elementCount = this.count;
+		},
+
+		writeAttribute : function(n, v) {
+			var t = this;
+
+			t.writeRaw(" " + t.encode(n) + '="' + t.encode(v) + '"');
+		},
+
+		writeEndElement : function() {
+			var n;
+
+			if (this.tags.length > 0) {
+				n = this.tags.pop();
+
+				if (this._writeAttributesEnd(1))
+					this.writeRaw('</' + n + '>');
+
+				if (this.settings.indentation > 0)
+					this.writeRaw('\n');
+			}
+		},
+
+		writeFullEndElement : function() {
+			if (this.tags.length > 0) {
+				this._writeAttributesEnd();
+				this.writeRaw('</' + this.tags.pop() + '>');
+
+				if (this.settings.indentation > 0)
+					this.writeRaw('\n');
+			}
+		},
+
+		writeText : function(v) {
+			this._writeAttributesEnd();
+			this.writeRaw(this.encode(v));
+			this.count++;
+		},
+
+		writeCDATA : function(v) {
+			this._writeAttributesEnd();
+			this.writeRaw('<![CDATA[' + v + ']]>');
+			this.count++;
+		},
+
+		writeComment : function(v) {
+			this._writeAttributesEnd();
+			this.writeRaw('<!-- ' + v + '-->');
+			this.count++;
+		},
+
+		writeRaw : function(v) {
+			this.str += v;
+		},
+
+		encode : function(s) {
+			return s.replace(/[<>&"]/g, function(v) {
+				switch (v) {
+					case '<':
+						return '&lt;';
+
+					case '>':
+						return '&gt;';
+
+					case '&':
+						return '&amp;';
+
+					case '"':
+						return '&quot;';
+				}
+
+				return v;
+			});
+		},
+
+		getContent : function() {
+			return this.str;
+		},
+
+		_writeAttributesEnd : function(s) {
+			if (!this.inAttr)
+				return;
+
+			this.inAttr = false;
+
+			if (s && this.elementCount == this.count) {
+				this.writeRaw(' />');
+				return false;
+			}
+
+			this.writeRaw('>');
+
+			return true;
+		}
+
+		});
+})();
+
+/* file:jscripts/tiny_mce/classes/dom/Serializer.js */
+
+(function() {
+	// Shorten names
+	var extend = tinymce.extend, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher, isIE = tinymce.isIE, isGecko = tinymce.isGecko;
+
+	// Returns only attribites that have values not all attributes in IE
+	function getIEAtts(n) {
+		var o = [];
+
+		// Object will throw exception in IE
+		if (n.nodeName == 'OBJECT')
+			return n.attributes;
+
+		n.cloneNode(false).outerHTML.replace(/([a-z0-9\:\-_]+)=/gi, function(a, b) {
+			o.push({specified : 1, nodeName : b});
+		});
+
+		return o;
+	};
+
+	function wildcardToRE(s) {
+		return s.replace(/([?+*])/g, '.$1');
+	};
+
+	tinymce.create('tinymce.dom.Serializer', {
+		Serializer : function(s) {
+			var t = this;
+
+			t.key = 0;
+			t.onPreProcess = new Dispatcher(t);
+			t.onPostProcess = new Dispatcher(t);
+
+			if (tinymce.relaxedDomain && tinymce.isGecko) {
+				// Gecko has a bug where we can't create a new XML document if domain relaxing is used
+				t.writer = new tinymce.dom.StringWriter();
+			} else {
+				try {
+					t.writer = new tinymce.dom.XMLWriter();
+				} catch (ex) {
+					// IE might throw exception if ActiveX is disabled so we then switch to the slightly slower StringWriter
+					t.writer = new tinymce.dom.StringWriter();
+				}
+			}
+
+			// Default settings
+			t.settings = s = extend({
+				dom : tinymce.DOM,
+				valid_nodes : 0,
+				node_filter : 0,
+				attr_filter : 0,
+				invalid_attrs : /^(mce_|_moz_)/,
+				closed : /(br|hr|input|meta|img|link|param)/,
+				entity_encoding : 'named',
+				entities : '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,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',
+				valid_elements : '*[*]',
+				extended_valid_elements : 0,
+				valid_child_elements : 0,
+				invalid_elements : 0,
+				fix_table_elements : 0,
+				fix_list_elements : true,
+				fix_content_duplication : true,
+				convert_fonts_to_spans : false,
+				font_size_classes : 0,
+				font_size_style_values : 0,
+				apply_source_formatting : 0,
+				indent_mode : 'simple',
+				indent_char : '\t',
+				indent_levels : 1,
+				remove_linebreaks : 1
+			}, s);
+
+			t.dom = s.dom;
+
+			if (s.fix_list_elements) {
+				t.onPreProcess.add(function(se, o) {
+					var nl, x, a = ['ol', 'ul'], i, n, p, r = /^(OL|UL)$/, np;
+
+					function prevNode(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;
+					};
+
+					for (x=0; x<a.length; x++) {
+						nl = t.dom.select(a[x], o.node);
+
+						for (i=0; i<nl.length; i++) {
+							n = nl[i];
+							p = n.parentNode;
+
+							if (r.test(p.nodeName)) {
+								np = prevNode(n, 'LI');
+
+								if (!np) {
+									np = t.dom.create('li');
+									np.innerHTML = '&nbsp;';
+									np.appendChild(n);
+									p.insertBefore(np, p.firstChild);
+								} else
+									np.appendChild(n);
+							}
+						}
+					}
+				});
+			}
+
+			if (s.fix_table_elements) {
+				t.onPreProcess.add(function(se, o) {
+					each(t.dom.select('table', o.node), function(e) {
+						var pa = t.dom.getParent(e, 'H1,H2,H3,H4,H5,H6,P'), pa2, n, tm, pl = [], i, ns;
+
+						if (pa) {
+							pa2 = pa.cloneNode(false);
+
+							pl.push(e);
+							for (n = e; n = n.parentNode;) {
+								pl.push(n);
+
+								if (n == pa)
+									break;
+							}
+
+							tm = pa2;
+							for (i = pl.length - 1; i >= 0; i--) {
+								if (i == pl.length - 1) {
+									while (ns = pl[i - 1].nextSibling)
+										tm.appendChild(ns.parentNode.removeChild(ns));
+								} else {
+									n = pl[i].cloneNode(false);
+
+									if (i != 0) {
+										while (ns = pl[i - 1].nextSibling)
+											n.appendChild(ns.parentNode.removeChild(ns));
+									}
+
+									tm = tm.appendChild(n);
+								}
+							}
+
+							e = t.dom.insertAfter(e.parentNode.removeChild(e), pa);
+							t.dom.insertAfter(e, pa);
+							t.dom.insertAfter(pa2, e);
+						}
+					});
+				});
+			}
+		},
+
+		setEntities : function(s) {
+			var t = this, a, i, l = {}, re = '', v;
+
+			// No need to setup more than once
+			if (t.entityLookup)
+				return;
+
+			// Build regex and lookup array
+			a = s.split(',');
+			for (i = 0; i < a.length; i += 2) {
+				v = a[i];
+
+				// Don't add default &amp; &quot; etc.
+				if (v == 34 || v == 38 || v == 60 || v == 62)
+					continue;
+
+				l[String.fromCharCode(a[i])] = a[i + 1];
+
+				v = parseInt(a[i]).toString(16);
+				re += '\\u' + '0000'.substring(v.length) + v;
+			}
+
+			if (!re) {
+				t.settings.entity_encoding = 'raw';
+				return;
+			}
+
+			t.entitiesRE = new RegExp('[' + re + ']', 'g');
+			t.entityLookup = l;
+		},
+
+		setValidChildRules : function(s) {
+			this.childRules = null;
+			this.addValidChildRules(s);
+		},
+
+		addValidChildRules : function(s) {
+			var t = this, inst, intr, bloc;
+
+			if (!s)
+				return;
+
+			inst = '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';
+			intr = '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';
+			bloc = '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';
+
+			each(s.split(','), function(s) {
+				var p = s.split(/\[|\]/), re;
+
+				s = '';
+				each(p[1].split('|'), function(v) {
+					if (s)
+						s += '|';
+
+					switch (v) {
+						case '%itrans':
+							v = intr;
+							break;
+
+						case '%itrans_na':
+							v = intr.substring(2);
+							break;
+
+						case '%istrict':
+							v = inst;
+							break;
+
+						case '%istrict_na':
+							v = inst.substring(2);
+							break;
+
+						case '%btrans':
+							v = bloc;
+							break;
+
+						case '%bstrict':
+							v = bloc;
+							break;
+					}
+
+					s += v;
+				});
+				re = new RegExp('^(' + s.toLowerCase() + ')$', 'i');
+
+				each(p[0].split('/'), function(s) {
+					t.childRules = t.childRules || {};
+					t.childRules[s] = re;
+				});
+			});
+
+			// Build regex
+			s = '';
+			each(t.childRules, function(v, k) {
+				if (s)
+					s += '|';
+
+				s += k;
+			});
+
+			t.parentElementsRE = new RegExp('^(' + s.toLowerCase() + ')$', 'i');
+
+			/*console.debug(t.parentElementsRE.toString());
+			each(t.childRules, function(v) {
+				console.debug(v.toString());
+			});*/
+		},
+
+		setRules : function(s) {
+			var t = this;
+
+			t._setup();
+			t.rules = {};
+			t.wildRules = [];
+			t.validElements = {};
+
+			return t.addRules(s);
+		},
+
+		addRules : function(s) {
+			var t = this, dr;
+
+			if (!s)
+				return;
+
+			t._setup();
+
+			each(s.split(','), function(s) {
+				var p = s.split(/\[|\]/), tn = p[0].split('/'), ra, at, wat, va = [];
+
+				// Extend with default rules
+				if (dr)
+					at = tinymce.extend([], dr.attribs);
+
+				// Parse attributes
+				if (p.length > 1) {
+					each(p[1].split('|'), function(s) {
+						var ar = {}, i;
+
+						at = at || [];
+
+						// Parse attribute rule
+						s = s.replace(/::/g, '~');
+						s = /^([!\-])?([\w*.?~_\-]+|)([=:<])?(.+)?$/.exec(s);
+						s[2] = s[2].replace(/~/g, ':');
+
+						// Add required attributes
+						if (s[1] == '!') {
+							ra = ra || [];
+							ra.push(s[2]);
+						}
+
+						// Remove inherited attributes
+						if (s[1] == '-') {
+							for (i = 0; i <at.length; i++) {
+								if (at[i].name == s[2]) {
+									at.splice(i, 1);
+									return;
+								}
+							}
+						}
+
+						switch (s[3]) {
+							// Add default attrib values
+							case '=':
+								ar.defaultVal = s[4] || '';
+								break;
+
+							// Add forced attrib values
+							case ':':
+								ar.forcedVal = s[4];
+								break;
+
+							// Add validation values
+							case '<':
+								ar.validVals = s[4].split('?');
+								break;
+						}
+
+						if (/[*.?]/.test(s[2])) {
+							wat = wat || [];
+							ar.nameRE = new RegExp('^' + wildcardToRE(s[2]) + '$');
+							wat.push(ar);
+						} else {
+							ar.name = s[2];
+							at.push(ar);
+						}
+
+						va.push(s[2]);
+					});
+				}
+
+				// Handle element names
+				each(tn, function(s, i) {
+					var pr = s.charAt(0), x = 1, ru = {};
+
+					// Extend with default rule data
+					if (dr) {
+						if (dr.noEmpty)
+							ru.noEmpty = dr.noEmpty;
+
+						if (dr.fullEnd)
+							ru.fullEnd = dr.fullEnd;
+
+						if (dr.padd)
+							ru.padd = dr.padd;
+					}
+
+					// Handle prefixes
+					switch (pr) {
+						case '-':
+							ru.noEmpty = true;
+							break;
+
+						case '+':
+							ru.fullEnd = true;
+							break;
+
+						case '#':
+							ru.padd = true;
+							break;
+
+						default:
+							x = 0;
+					}
+
+					tn[i] = s = s.substring(x);
+					t.validElements[s] = 1;
+
+					// Add element name or element regex
+					if (/[*.?]/.test(tn[0])) {
+						ru.nameRE = new RegExp('^' + wildcardToRE(tn[0]) + '$');
+						t.wildRules = t.wildRules || {};
+						t.wildRules.push(ru);
+					} else {
+						ru.name = tn[0];
+
+						// Store away default rule
+						if (tn[0] == '@')
+							dr = ru;
+
+						t.rules[s] = ru;
+					}
+
+					ru.attribs = at;
+
+					if (ra)
+						ru.requiredAttribs = ra;
+
+					if (wat) {
+						// Build valid attributes regexp
+						s = '';
+						each(va, function(v) {
+							if (s)
+								s += '|';
+
+							s += '(' + wildcardToRE(v) + ')';
+						});
+						ru.validAttribsRE = new RegExp('^' + s.toLowerCase() + '$');
+						ru.wildAttribs = wat;
+					}
+				});
+			});
+
+			// Build valid elements regexp
+			s = '';
+			each(t.validElements, function(v, k) {
+				if (s)
+					s += '|';
+
+				if (k != '@')
+					s += k;
+			});
+			t.validElementsRE = new RegExp('^(' + wildcardToRE(s.toLowerCase()) + ')$');
+
+			//console.debug(t.validElementsRE.toString());
+			//console.dir(t.rules);
+			//console.dir(t.wildRules);
+		},
+
+		findRule : function(n) {
+			var t = this, rl = t.rules, i, r;
+
+			t._setup();
+
+			// Exact match
+			r = rl[n];
+			if (r)
+				return r;
+
+			// Try wildcards
+			rl = t.wildRules;
+			for (i = 0; i < rl.length; i++) {
+				if (rl[i].nameRE.test(n))
+					return rl[i];
+			}
+
+			return null;
+		},
+
+		findAttribRule : function(ru, n) {
+			var i, wa = ru.wildAttribs;
+
+			for (i = 0; i < wa.length; i++) {
+				if (wa[i].nameRE.test(n))
+					return wa[i];
+			}
+
+			return null;
+		},
+
+		serialize : function(n, o) {
+			var h, t = this;
+
+			t._setup();
+			o = o || {};
+			o.format = o.format || 'html';
+			t.processObj = o;
+			n = n.cloneNode(true);
+			t.key = '' + (parseInt(t.key) + 1);
+
+			// Pre process
+			if (!o.no_events) {
+				o.node = n;
+				t.onPreProcess.dispatch(t, o);
+			}
+
+			// Serialize HTML DOM into a string
+			t.writer.reset();
+			t._serializeNode(n, o.getInner);
+
+			// Post process
+			o.content = t.writer.getContent();
+
+			if (!o.no_events)
+				t.onPostProcess.dispatch(t, o);
+
+			t._postProcess(o);
+			o.node = null;
+
+			return tinymce.trim(o.content);
+		},
+
+		// Internal functions
+
+		_postProcess : function(o) {
+			var t = this, s = t.settings, h = o.content, sc = [], p;
+
+			if (o.format == 'html') {
+				// Protect some elements
+				p = t._protect({
+					content : h,
+					patterns : [
+						{pattern : /(<script[^>]*>)(.*?)(<\/script>)/g},
+						{pattern : /(<style[^>]*>)(.*?)(<\/style>)/g},
+						{pattern : /(<pre[^>]*>)(.*?)(<\/pre>)/g, encode : 1}
+					]
+				});
+
+				h = p.content;
+
+				// Entity encode
+				if (s.entity_encoding !== 'raw')
+					h = t._encode(h);
+
+				// Use BR instead of &nbsp; padded P elements inside editor and use <p>&nbsp;</p> outside editor
+/*				if (o.set)
+					h = h.replace(/<p>\s+(&nbsp;|&#160;|\u00a0|<br \/>)\s+<\/p>/g, '<p><br /></p>');
+				else
+					h = h.replace(/<p>\s+(&nbsp;|&#160;|\u00a0|<br \/>)\s+<\/p>/g, '<p>$1</p>');*/
+
+				// Since Gecko and Safari keeps whitespace in the DOM we need to
+				// remove it inorder to match other browsers. But I think Gecko and Safari is right.
+				// This process is only done when getting contents out from the editor.
+				if (!o.set) {
+					// We need to replace paragraph whitespace with an nbsp before indentation to keep the \u00a0 char
+					h = h.replace(/<p>\s+<\/p>|<p([^>]+)>\s+<\/p>/g, s.entity_encoding == 'numeric' ? '<p$1>&#160;</p>' : '<p$1>&nbsp;</p>');
+
+					if (s.remove_linebreaks) {
+						h = h.replace(/\r?\n|\r/g, ' ');
+						h = h.replace(/(<[^>]+>)\s+/g, '$1 ');
+						h = h.replace(/\s+(<\/[^>]+>)/g, ' $1');
+						h = h.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object) ([^>]+)>\s+/g, '<$1 $2>'); // Trim block start
+						h = h.replace(/<(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>\s+/g, '<$1>'); // Trim block start
+						h = h.replace(/\s+<\/(p|h[1-6]|blockquote|hr|div|table|tbody|tr|td|body|head|html|title|meta|style|pre|script|link|object)>/g, '</$1>'); // Trim block end
+					}
+
+					// Simple indentation
+					if (s.apply_source_formatting && s.indent_mode == 'simple') {
+						// Add line breaks before and after block elements
+						h = h.replace(/<(\/?)(ul|hr|table|meta|link|tbody|tr|object|body|head|html|map)(|[^>]+)>\s*/g, '\n<$1$2$3>\n');
+						h = h.replace(/\s*<(p|h[1-6]|blockquote|div|title|style|pre|script|td|li|area)(|[^>]+)>/g, '\n<$1$2>');
+						h = h.replace(/<\/(p|h[1-6]|blockquote|div|title|style|pre|script|td|li)>\s*/g, '</$1>\n');
+						h = h.replace(/\n\n/g, '\n');
+					}
+				}
+
+				h = t._unprotect(h, p);
+
+				// Restore the \u00a0 character if raw mode is enabled
+				if (s.entity_encoding == 'raw')
+					h = h.replace(/<p>&nbsp;<\/p>|<p([^>]+)>&nbsp;<\/p>/g, '<p$1>\u00a0</p>');
+			}
+
+			o.content = h;
+		},
+
+		_serializeNode : function(n, inn) {
+			var t = this, s = t.settings, w = t.writer, hc, el, cn, i, l, a, at, no, v, nn, ru, ar, iv;
+
+			if (!s.node_filter || s.node_filter(n)) {
+				switch (n.nodeType) {
+					case 1: // Element
+						if (n.hasAttribute ? n.hasAttribute('mce_bogus') : n.getAttribute('mce_bogus'))
+							return;
+
+						iv = false;
+						hc = n.hasChildNodes();
+						nn = n.getAttribute('mce_name') || n.nodeName.toLowerCase();
+
+						// Add correct prefix on IE
+						if (isIE) {
+							if (n.scopeName !== 'HTML' && n.scopeName !== 'html')
+								nn = n.scopeName + ':' + nn;
+						}
+
+						// Remove mce prefix on IE needed for the abbr element
+						if (nn.indexOf('mce:') === 0)
+							nn = nn.substring(4);
+
+						// Check if valid
+						if (!t.validElementsRE.test(nn) || (t.invalidElementsRE && t.invalidElementsRE.test(nn)) || inn) {
+							iv = true;
+							break;
+						}
+
+						if (isIE) {
+							// Fix IE content duplication (DOM can have multiple copies of the same node)
+							if (s.fix_content_duplication) {
+								if (n.mce_serialized == t.key)
+									return;
+
+								n.mce_serialized = t.key;
+							}
+
+							// IE sometimes adds a / infront of the node name
+							if (nn.charAt(0) == '/')
+								nn = nn.substring(1);
+						} else if (isGecko) {
+							// Ignore br elements
+							if (n.nodeName === 'BR' && n.getAttribute('type') == '_moz')
+								return;
+						}
+
+						// Check if valid child
+						if (t.childRules) {
+							if (t.parentElementsRE.test(t.elementName)) {
+								if (!t.childRules[t.elementName].test(nn)) {
+									iv = true;
+									break;
+								}
+							}
+
+							t.elementName = nn;
+						}
+
+						ru = t.findRule(nn);
+						nn = ru.name || nn;
+
+						// Skip empty nodes or empty node name in IE
+						if ((!hc && ru.noEmpty) || (isIE && !nn)) {
+							iv = true;
+							break;
+						}
+
+						// Check required
+						if (ru.requiredAttribs) {
+							a = ru.requiredAttribs;
+
+							for (i = a.length - 1; i >= 0; i--) {
+								if (this.dom.getAttrib(n, a[i]) !== '')
+									break;
+							}
+
+							// None of the required was there
+							if (i == -1) {
+								iv = true;
+								break;
+							}
+						}
+
+						w.writeStartElement(nn);
+
+						// Add ordered attributes
+						if (ru.attribs) {
+							for (i=0, at = ru.attribs, l = at.length; i<l; i++) {
+								a = at[i];
+								v = t._getAttrib(n, a);
+
+								if (v !== null)
+									w.writeAttribute(a.name, v);
+							}
+						}
+
+						// Add wild attributes
+						if (ru.validAttribsRE) {
+							at = isIE ? getIEAtts(n) : n.attributes;
+							for (i=at.length-1; i>-1; i--) {
+								no = at[i];
+
+								if (no.specified) {
+									a = no.nodeName.toLowerCase();
+
+									if (s.invalid_attrs.test(a) || !ru.validAttribsRE.test(a))
+										continue;
+
+									ar = t.findAttribRule(ru, a);
+									v = t._getAttrib(n, ar, a);
+
+									if (v !== null)
+										w.writeAttribute(a, v);
+								}
+							}
+						}
+
+						// Padd empty nodes with a &nbsp;
+						if (!hc && ru.padd)
+							w.writeText('\u00a0');
+
+						break;
+
+					case 3: // Text
+						// Check if valid child
+						if (t.childRules && t.parentElementsRE.test(t.elementName)) {
+							if (!t.childRules[t.elementName].test(n.nodeName))
+								return;
+						}
+
+						return w.writeText(n.nodeValue);
+
+					case 4: // CDATA
+						return w.writeCDATA(n.nodeValue);
+
+					case 8: // Comment
+						return w.writeComment(n.nodeValue);
+				}
+			} else if (n.nodeType == 1)
+				hc = n.hasChildNodes();
+
+			if (hc) {
+				cn = n.firstChild;
+
+				while (cn) {
+					t._serializeNode(cn);
+					t.elementName = nn;
+					cn = cn.nextSibling;
+				}
+			}
+
+			// Write element end
+			if (!iv) {
+				if (hc || !s.closed.test(nn))
+					w.writeFullEndElement();
+				else
+					w.writeEndElement();
+			}
+		},
+
+		_protect : function(o) {
+			var t = this;
+
+			o.items = o.items || [];
+
+			function enc(s) {
+				return s.replace(/[\r\n\\]/g, function(c) {
+					if (c === '\n')
+						return '\\n';
+					else if (c === '\\')
+						return '\\\\';
+
+					return '\\r';
+				});
+			};
+
+			function dec(s) {
+				return s.replace(/\\[\\rn]/g, function(c) {
+					if (c === '\\n')
+						return '\n';
+					else if (c === '\\\\')
+						return '\\';
+
+					return '\r';
+				});
+			};
+
+			each(o.patterns, function(p) {
+				o.content = dec(enc(o.content).replace(p.pattern, function(x, a, b, c) {
+					b = dec(b);
+
+					if (p.encode)
+						b = t._encode(b);
+
+					o.items.push(b);
+					return a + '<!--mce:' + (o.items.length - 1) + '-->' + c;
+				}));
+			});
+
+			return o;
+		},
+
+		_unprotect : function(h, o) {
+			h = h.replace(/\<!--mce:([0-9]+)--\>/g, function(a, b) {
+				return o.items[parseInt(b)];
+			});
+
+			o.items = [];
+
+			return h;
+		},
+
+		_encode : function(h) {
+			var t = this, s = t.settings, l;
+
+			// Entity encode
+			if (s.entity_encoding !== 'raw') {
+				if (s.entity_encoding.indexOf('named') != -1) {
+					t.setEntities(s.entities);
+					l = t.entityLookup;
+
+					h = h.replace(t.entitiesRE, function(a) {
+						var v;
+
+						if (v = l[a])
+							a = '&' + v + ';';
+
+						return a;
+					});
+				}
+
+				if (s.entity_encoding.indexOf('numeric') != -1) {
+					h = h.replace(/[\u007E-\uFFFF]/g, function(a) {
+						return '&#' + a.charCodeAt(0) + ';';
+					});
+				}
+			}
+
+			return h;
+		},
+
+		_setup : function() {
+			var t = this, s = this.settings;
+
+			if (t.done)
+				return;
+
+			t.done = 1;
+
+			t.setRules(s.valid_elements);
+			t.addRules(s.extended_valid_elements);
+			t.addValidChildRules(s.valid_child_elements);
+
+			if (s.invalid_elements)
+				t.invalidElementsRE = new RegExp('^(' + wildcardToRE(s.invalid_elements.replace(/,/g, '|').toLowerCase()) + ')$');
+
+			if (s.attrib_value_filter)
+				t.attribValueFilter = s.attribValueFilter;
+		},
+
+		_getAttrib : function(n, a, na) {
+			var i, v;
+
+			na = na || a.name;
+
+			if (a.forcedVal && (v = a.forcedVal)) {
+				if (v === '{$uid}')
+					return this.dom.uniqueId();
+
+				return v;
+			}
+
+			v = this.dom.getAttrib(n, na);
+
+			switch (na) {
+				case 'rowspan':
+				case 'colspan':
+					// Whats the point? Remove usless attribute value
+					if (v == '1')
+						v = '';
+
+					break;
+			}
+
+			if (this.attribValueFilter)
+				v = this.attribValueFilter(na, v, n);
+
+			if (a.validVals) {
+				for (i = a.validVals.length - 1; i >= 0; i--) {
+					if (v == a.validVals[i])
+						break;
+				}
+
+				if (i == -1)
+					return null;
+			}
+
+			if (v === '' && typeof(a.defaultVal) != 'undefined') {
+				v = a.defaultVal;
+
+				if (v === '{$uid}')
+					return this.dom.uniqueId();
+
+				return v;
+			} else {
+				// Remove internal mceItemXX classes when content is extracted from editor
+				if (na == 'class' && this.processObj.get)
+					v = v.replace(/\s?mceItem\w+\s?/g, '');
+			}
+
+			if (v === '')
+				return null;
+
+
+			return v;
+		}
+
+		});
+})();
+
+/* file:jscripts/tiny_mce/classes/dom/ScriptLoader.js */
+
+(function() {
+	var each = tinymce.each;
+
+	tinymce.create('tinymce.dom.ScriptLoader', {
+		ScriptLoader : function(s) {
+			this.settings = s || {};
+			this.queue = [];
+			this.lookup = {};
+		},
+
+		isDone : function(u) {
+			return this.lookup[u] ? this.lookup[u].state == 2 : 0;
+		},
+
+		markDone : function(u) {
+			this.lookup[u] = {state : 2, url : u};
+		},
+
+		add : function(u, cb, s, pr) {
+			var t = this, lo = t.lookup, o;
+
+			if (o = lo[u]) {
+				// Is loaded fire callback
+				if (cb && o.state == 2)
+					cb.call(s || this);
+
+				return o;
+			}
+
+			o = {state : 0, url : u, func : cb, scope : s || this};
+
+			if (pr)
+				t.queue.unshift(o);
+			else
+				t.queue.push(o);
+
+			lo[u] = o;
+
+			return o;
+		},
+
+		load : function(u, cb, s) {
+			var t = this, o;
+
+			if (o = t.lookup[u]) {
+				// Is loaded fire callback
+				if (cb && o.state == 2)
+					cb.call(s || t);
+
+				return o;
+			}
+
+			function loadScript(u) {
+				if (tinymce.dom.Event.domLoaded || t.settings.strict_mode) {
+					tinymce.util.XHR.send({
+						url : tinymce._addVer(u),
+						error : t.settings.error,
+						async : false,
+						success : function(co) {
+							t.eval(co);
+						}
+					});
+				} else
+					document.write('<script type="text/javascript" src="' + tinymce._addVer(u) + '"></script>');
+			};
+
+			if (!tinymce.is(u, 'string')) {
+				each(u, function(u) {
+					loadScript(u);
+				});
+
+				if (cb)
+					cb.call(s || t);
+			} else {
+				loadScript(u);
+
+				if (cb)
+					cb.call(s || t);
+			}
+		},
+
+		loadQueue : function(cb, s) {
+			var t = this;
+
+			if (!t.queueLoading) {
+				t.queueLoading = 1;
+				t.queueCallbacks = [];
+
+				t.loadScripts(t.queue, function() {
+					t.queueLoading = 0;
+
+					if (cb)
+						cb.call(s || t);
+
+					each(t.queueCallbacks, function(o) {
+						o.func.call(o.scope);
+					});
+				});
+			} else if (cb)
+				t.queueCallbacks.push({func : cb, scope : s || t});
+		},
+
+		eval : function(co) {
+			var w = window;
+
+			// Evaluate script
+			if (!w.execScript) {
+				try {
+					eval.call(w, co);
+				} catch (ex) {
+					eval(co, w); // Firefox 3.0a8
+				}
+			} else
+				w.execScript(co); // IE
+		},
+
+		loadScripts : function(sc, cb, s) {
+			var t = this, lo = t.lookup;
+
+			function done(o) {
+				o.state = 2; // Has been loaded
+
+				// Run callback
+				if (o.func)
+					o.func.call(o.scope || t);
+			};
+
+			function allDone() {
+				var l;
+
+				// Check if all files are loaded
+				l = sc.length;
+				each(sc, function(o) {
+					o = lo[o.url];
+
+					if (o.state === 2) {// It has finished loading
+						done(o);
+						l--;
+					} else
+						load(o);
+				});
+
+				// They are all loaded
+				if (l === 0 && cb) {
+					cb.call(s || t);
+					cb = 0;
+				}
+			};
+
+			function load(o) {
+				if (o.state > 0)
+					return;
+
+				o.state = 1; // Is loading
+
+				tinymce.util.XHR.send({
+					url : o.url,
+					error : t.settings.error,
+					success : function(co) {
+						t.eval(co);
+						done(o);
+						allDone();
+					}
+				});
+			};
+
+			each(sc, function(o) {
+				var u = o.url;
+
+				// Add to queue if needed
+				if (!lo[u]) {
+					lo[u] = o;
+					t.queue.push(o);
+				} else
+					o = lo[u];
+
+				// Is already loading or has been loaded
+				if (o.state > 0)
+					return;
+
+				if (!tinymce.dom.Event.domLoaded && !t.settings.strict_mode) {
+					var ix, ol = '';
+
+					// Add onload events
+					if (cb || o.func) {
+						o.state = 1; // Is loading
+
+						ix = tinymce.dom.ScriptLoader._addOnLoad(function() {
+							done(o);
+							allDone();
+						});
+
+						if (tinymce.isIE)
+							ol = ' onreadystatechange="';
+						else
+							ol = ' onload="';
+
+						ol += 'tinymce.dom.ScriptLoader._onLoad(this,\'' + u + '\',' + ix + ');"';
+					}
+
+					document.write('<script type="text/javascript" src="' + tinymce._addVer(u) + '"' + ol + '></script>');
+
+					if (!o.func)
+						done(o);
+				} else
+					load(o);
+			});
+
+			allDone();
+		},
+
+		// Static methods
+		'static' : {
+			_addOnLoad : function(f) {
+				var t = this;
+
+				t._funcs = t._funcs || [];
+				t._funcs.push(f);
+
+				return t._funcs.length - 1;
+			},
+
+			_onLoad : function(e, u, ix) {
+				if (!tinymce.isIE || e.readyState == 'complete')
+					this._funcs[ix].call(this);
+			}
+		}
+
+		});
+
+	// Global script loader
+	tinymce.ScriptLoader = new tinymce.dom.ScriptLoader();
+})();
+
+/* file:jscripts/tiny_mce/classes/ui/Control.js */
+
+(function() {
+	// Shorten class names
+	var DOM = tinymce.DOM, is = tinymce.is;
+
+	tinymce.create('tinymce.ui.Control', {
+		Control : function(id, s) {
+			this.id = id;
+			this.settings = s = s || {};
+			this.rendered = false;
+			this.onRender = new tinymce.util.Dispatcher(this);
+			this.classPrefix = '';
+			this.scope = s.scope || this;
+			this.disabled = 0;
+			this.active = 0;
+		},
+
+		setDisabled : function(s) {
+			var e;
+
+			if (s != this.disabled) {
+				e = DOM.get(this.id);
+
+				// Add accessibility title for unavailable actions
+				if (e && this.settings.unavailable_prefix) {
+					if (s) {
+						this.prevTitle = e.title;
+						e.title = this.settings.unavailable_prefix + ": " + e.title;
+					} else
+						e.title = this.prevTitle;
+				}
+
+				this.setState('Disabled', s);
+				this.setState('Enabled', !s);
+				this.disabled = s;
+			}
+		},
+
+		isDisabled : function() {
+			return this.disabled;
+		},
+
+		setActive : function(s) {
+			if (s != this.active) {
+				this.setState('Active', s);
+				this.active = s;
+			}
+		},
+
+		isActive : function() {
+			return this.active;
+		},
+
+		setState : function(c, s) {
+			var n = DOM.get(this.id);
+
+			c = this.classPrefix + c;
+
+			if (s)
+				DOM.addClass(n, c);
+			else
+				DOM.removeClass(n, c);
+		},
+
+		isRendered : function() {
+			return this.rendered;
+		},
+
+		renderHTML : function() {
+		},
+
+		renderTo : function(n) {
+			DOM.setHTML(n, this.renderHTML());
+		},
+
+		postRender : function() {
+			var t = this, b;
+
+			// Set pending states
+			if (is(t.disabled)) {
+				b = t.disabled;
+				t.disabled = -1;
+				t.setDisabled(b);
+			}
+
+			if (is(t.active)) {
+				b = t.active;
+				t.active = -1;
+				t.setActive(b);
+			}
+		},
+
+		remove : function() {
+			DOM.remove(this.id);
+			this.destroy();
+		},
+
+		destroy : function() {
+			tinymce.dom.Event.clear(this.id);
+		}
+
+		});
+})();
+/* file:jscripts/tiny_mce/classes/ui/Container.js */
+
+tinymce.create('tinymce.ui.Container:tinymce.ui.Control', {
+	Container : function(id, s) {
+		this.parent(id, s);
+		this.controls = [];
+		this.lookup = {};
+	},
+
+	add : function(c) {
+		this.lookup[c.id] = c;
+		this.controls.push(c);
+
+		return c;
+	},
+
+	get : function(n) {
+		return this.lookup[n];
+	}
+
+	});
+
+
+/* file:jscripts/tiny_mce/classes/ui/Separator.js */
+
+tinymce.create('tinymce.ui.Separator:tinymce.ui.Control', {
+	Separator : function(id, s) {
+		this.parent(id, s);
+		this.classPrefix = 'mceSeparator';
+	},
+
+	renderHTML : function() {
+		return tinymce.DOM.createHTML('span', {'class' : this.classPrefix});
+	}
+
+	});
+
+/* file:jscripts/tiny_mce/classes/ui/MenuItem.js */
+
+(function() {
+	var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk = tinymce.walk;
+
+	tinymce.create('tinymce.ui.MenuItem:tinymce.ui.Control', {
+		MenuItem : function(id, s) {
+			this.parent(id, s);
+			this.classPrefix = 'mceMenuItem';
+		},
+
+		setSelected : function(s) {
+			this.setState('Selected', s);
+			this.selected = s;
+		},
+
+		isSelected : function() {
+			return this.selected;
+		},
+
+		postRender : function() {
+			var t = this;
+			
+			t.parent();
+
+			// Set pending state
+			if (is(t.selected))
+				t.setSelected(t.selected);
+		}
+
+		});
+})();
+
+/* file:jscripts/tiny_mce/classes/ui/Menu.js */
+
+(function() {
+	var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, walk = tinymce.walk;
+
+	tinymce.create('tinymce.ui.Menu:tinymce.ui.MenuItem', {
+		Menu : function(id, s) {
+			var t = this;
+
+			t.parent(id, s);
+			t.items = {};
+			t.collapsed = false;
+			t.menuCount = 0;
+			t.onAddItem = new tinymce.util.Dispatcher(this);
+		},
+
+		expand : function(d) {
+			var t = this;
+
+			if (d) {
+				walk(t, function(o) {
+					if (o.expand)
+						o.expand();
+				}, 'items', t);
+			}
+
+			t.collapsed = false;
+		},
+
+		collapse : function(d) {
+			var t = this;
+
+			if (d) {
+				walk(t, function(o) {
+					if (o.collapse)
+						o.collapse();
+				}, 'items', t);
+			}
+
+			t.collapsed = true;
+		},
+
+		isCollapsed : function() {
+			return this.collapsed;
+		},
+
+		add : function(o) {
+			if (!o.settings)
+				o = new tinymce.ui.MenuItem(o.id || DOM.uniqueId(), o);
+
+			this.onAddItem.dispatch(this, o);
+
+			return this.items[o.id] = o;
+		},
+
+		addSeparator : function() {
+			return this.add({separator : true});
+		},
+
+		addMenu : function(o) {
+			if (!o.collapse)
+				o = this.createMenu(o);
+
+			this.menuCount++;
+
+			return this.add(o);
+		},
+
+		hasMenus : function() {
+			return this.menuCount !== 0;
+		},
+
+		remove : function(o) {
+			delete this.items[o.id];
+		},
+
+		removeAll : function() {
+			var t = this;
+
+			walk(t, function(o) {
+				if (o.removeAll)
+					o.removeAll();
+				else
+					o.remove();
+
+				o.destroy();
+			}, 'items', t);
+
+			t.items = {};
+		},
+
+		createMenu : function(o) {
+			var m = new tinymce.ui.Menu(o.id || DOM.uniqueId(), o);
+
+			m.onAddItem.add(this.onAddItem.dispatch, this.onAddItem);
+
+			return m;
+		}
+
+		});
+})();
+/* file:jscripts/tiny_mce/classes/ui/DropMenu.js */
+
+(function() {
+	var is = tinymce.is, DOM = tinymce.DOM, each = tinymce.each, Event = tinymce.dom.Event, Element = tinymce.dom.Element;
+
+	tinymce.create('tinymce.ui.DropMenu:tinymce.ui.Menu', {
+		DropMenu : function(id, s) {
+			s = s || {};
+			s.container = s.container || DOM.doc.body;
+			s.offset_x = s.offset_x || 0;
+			s.offset_y = s.offset_y || 0;
+			s.vp_offset_x = s.vp_offset_x || 0;
+			s.vp_offset_y = s.vp_offset_y || 0;
+
+			if (is(s.icons) && !s.icons)
+				s['class'] += ' mceNoIcons';
+
+			this.parent(id, s);
+			this.onShowMenu = new tinymce.util.Dispatcher(this);
+			this.onHideMenu = new tinymce.util.Dispatcher(this);
+			this.classPrefix = 'mceMenu';
+		},
+
+		createMenu : function(s) {
+			var t = this, cs = t.settings, m;
+
+			s.container = s.container || cs.container;
+			s.parent = t;
+			s.constrain = s.constrain || cs.constrain;
+			s['class'] = s['class'] || cs['class'];
+			s.vp_offset_x = s.vp_offset_x || cs.vp_offset_x;
+			s.vp_offset_y = s.vp_offset_y || cs.vp_offset_y;
+			m = new tinymce.ui.DropMenu(s.id || DOM.uniqueId(), s);
+
+			m.onAddItem.add(t.onAddItem.dispatch, t.onAddItem);
+
+			return m;
+		},
+
+		update : function() {
+			var t = this, s = t.settings, tb = DOM.get('menu_' + t.id + '_tbl'), co = DOM.get('menu_' + t.id + '_co'), tw, th;
+
+			tw = s.max_width ? Math.min(tb.clientWidth, s.max_width) : tb.clientWidth;
+			th = s.max_height ? Math.min(tb.clientHeight, s.max_height) : tb.clientHeight;
+
+			if (!DOM.boxModel)
+				t.element.setStyles({width : tw + 2, height : th + 2});
+			else
+				t.element.setStyles({width : tw, height : th});
+
+			if (s.max_width)
+				DOM.setStyle(co, 'width', tw);
+
+			if (s.max_height) {
+				DOM.setStyle(co, 'height', th);
+
+				if (tb.clientHeight < s.max_height)
+					DOM.setStyle(co, 'overflow', 'hidden');
+			}
+		},
+
+		showMenu : function(x, y, px) {
+			var t = this, s = t.settings, co, vp = DOM.getViewPort(), w, h, mx, my, ot = 2, dm, tb, cp = t.classPrefix;
+
+			t.collapse(1);
+
+			if (t.isMenuVisible)
+				return;
+
+			if (!t.rendered) {
+				co = DOM.add(t.settings.container, t.renderNode());
+
+				each(t.items, function(o) {
+					o.postRender();
+				});
+
+				t.element = new Element('menu_' + t.id, {blocker : 1, container : s.container});
+			} else
+				co = DOM.get('menu_' + t.id);
+
+			// Move layer out of sight unless it's Opera since it scrolls to top of page due to an bug
+			if (!tinymce.isOpera)
+				DOM.setStyles(co, {left : -0xFFFF , top : -0xFFFF});
+
+			DOM.show(co);
+			t.update();
+
+			x += s.offset_x || 0;
+			y += s.offset_y || 0;
+			vp.w -= 4;
+			vp.h -= 4;
+
+			// Move inside viewport if not submenu
+			if (s.constrain) {
+				w = co.clientWidth - ot;
+				h = co.clientHeight - ot;
+				mx = vp.x + vp.w;
+				my = vp.y + vp.h;
+
+				if ((x + s.vp_offset_x + w) > mx)
+					x = px ? px - w : Math.max(0, (mx - s.vp_offset_x) - w);
+
+				if ((y + s.vp_offset_y + h) > my)
+					y = Math.max(0, (my - s.vp_offset_y) - h);
+			}
+
+			DOM.setStyles(co, {left : x , top : y});
+			t.element.update();
+
+			t.isMenuVisible = 1;
+			t.mouseClickFunc = Event.add(co, 'click', function(e) {
+				var m;
+
+				e = e.target;
+
+				if (e && (e = DOM.getParent(e, 'TR')) && !DOM.hasClass(e, cp + 'ItemSub')) {
+					m = t.items[e.id];
+
+					if (m.isDisabled())
+						return;
+
+					dm = t;
+
+					while (dm) {
+						if (dm.hideMenu)
+							dm.hideMenu();
+
+						dm = dm.settings.parent;
+					}
+
+					if (m.settings.onclick)
+						m.settings.onclick(e);
+
+					return Event.cancel(e); // Cancel to fix onbeforeunload problem
+				}
+			});
+
+			if (t.hasMenus()) {
+				t.mouseOverFunc = Event.add(co, 'mouseover', function(e) {
+					var m, r, mi;
+
+					e = e.target;
+					if (e && (e = DOM.getParent(e, 'TR'))) {
+						m = t.items[e.id];
+
+						if (t.lastMenu)
+							t.lastMenu.collapse(1);
+
+						if (m.isDisabled())
+							return;
+
+						if (e && DOM.hasClass(e, cp + 'ItemSub')) {
+							//p = DOM.getPos(s.container);
+							r = DOM.getRect(e);
+							m.showMenu((r.x + r.w - ot), r.y - ot, r.x);
+							t.lastMenu = m;
+							DOM.addClass(DOM.get(m.id).firstChild, cp + 'ItemActive');
+						}
+					}
+				});
+			}
+
+			t.onShowMenu.dispatch(t);
+
+			if (s.keyboard_focus) {
+				Event.add(co, 'keydown', t._keyHandler, t);
+				DOM.select('a', 'menu_' + t.id)[0].focus(); // Select first link
+				t._focusIdx = 0;
+			}
+		},
+
+		hideMenu : function(c) {
+			var t = this, co = DOM.get('menu_' + t.id), e;
+
+			if (!t.isMenuVisible)
+				return;
+
+			Event.remove(co, 'mouseover', t.mouseOverFunc);
+			Event.remove(co, 'click', t.mouseClickFunc);
+			Event.remove(co, 'keydown', t._keyHandler);
+			DOM.hide(co);
+			t.isMenuVisible = 0;
+
+			if (!c)
+				t.collapse(1);
+
+			if (t.element)
+				t.element.hide();
+
+			if (e = DOM.get(t.id))
+				DOM.removeClass(e.firstChild, t.classPrefix + 'ItemActive');
+
+			t.onHideMenu.dispatch(t);
+		},
+
+		add : function(o) {
+			var t = this, co;
+
+			o = t.parent(o);
+
+			if (t.isRendered && (co = DOM.get('menu_' + t.id)))
+				t._add(DOM.select('tbody', co)[0], o);
+
+			return o;
+		},
+
+		collapse : function(d) {
+			this.parent(d);
+			this.hideMenu(1);
+		},
+
+		remove : function(o) {
+			DOM.remove(o.id);
+			this.destroy();
+
+			return this.parent(o);
+		},
+
+		destroy : function() {
+			var t = this, co = DOM.get('menu_' + t.id);
+
+			Event.remove(co, 'mouseover', t.mouseOverFunc);
+			Event.remove(co, 'click', t.mouseClickFunc);
+
+			if (t.element)
+				t.element.remove();
+
+			DOM.remove(co);
+		},
+
+		renderNode : function() {
+			var t = this, s = t.settings, n, tb, co, w;
+
+			w = DOM.create('div', {id : 'menu_' + t.id, 'class' : s['class'], 'style' : 'position:absolute;left:0;top:0;z-index:200000'});
+			co = DOM.add(w, 'div', {id : 'menu_' + t.id + '_co', 'class' : t.classPrefix + (s['class'] ? ' ' + s['class'] : '')});
+			t.element = new Element('menu_' + t.id, {blocker : 1, container : s.container});
+
+			if (s.menu_line)
+				DOM.add(co, 'span', {'class' : t.classPrefix + 'Line'});
+
+//			n = DOM.add(co, 'div', {id : 'menu_' + t.id + '_co', 'class' : 'mceMenuContainer'});
+			n = DOM.add(co, 'table', {id : 'menu_' + t.id + '_tbl', border : 0, cellPadding : 0, cellSpacing : 0});
+			tb = DOM.add(n, 'tbody');
+
+			each(t.items, function(o) {
+				t._add(tb, o);
+			});
+
+			t.rendered = true;
+
+			return w;
+		},
+
+		// Internal functions
+
+		_keyHandler : function(e) {
+			var t = this, kc = e.keyCode;
+
+			function focus(d) {
+				var i = t._focusIdx + d, e = DOM.select('a', 'menu_' + t.id)[i];
+
+				if (e) {
+					t._focusIdx = i;
+					e.focus();
+				}
+			};
+
+			switch (kc) {
+				case 38:
+					focus(-1); // Select first link
+					return;
+
+				case 40:
+					focus(1);
+					return;
+
+				case 13:
+					return;
+
+				case 27:
+					return this.hideMenu();
+			}
+		},
+
+		_add : function(tb, o) {
+			var n, s = o.settings, a, ro, it, cp = this.classPrefix;
+
+			if (s.separator) {
+				ro = DOM.add(tb, 'tr', {id : o.id, 'class' : cp + 'ItemSeparator'});
+				DOM.add(ro, 'td', {'class' : cp + 'ItemSeparator'});
+
+				if (n = ro.previousSibling)
+					DOM.addClass(n, 'mceLast');
+
+				return;
+			}
+
+			n = ro = DOM.add(tb, 'tr', {id : o.id, 'class' : cp + 'Item ' + cp + 'ItemEnabled'});
+			n = it = DOM.add(n, 'td');
+			n = a = DOM.add(n, 'a', {href : 'javascript:;', onclick : "return false;", onmousedown : 'return false;'});
+
+			DOM.addClass(it, s['class']);
+//			n = DOM.add(n, 'span', {'class' : 'item'});
+			DOM.add(n, 'span', {'class' : 'mceIcon' + (s.icon ? ' mce_' + s.icon : '')});
+			n = DOM.add(n, s.element || 'span', {'class' : 'mceText', title : o.settings.title}, o.settings.title);
+
+			if (o.settings.style)
+				DOM.setAttrib(n, 'style', o.settings.style);
+
+			if (tb.childNodes.length == 1)
+				DOM.addClass(ro, 'mceFirst');
+
+			if ((n = ro.previousSibling) && DOM.hasClass(n, cp + 'ItemSeparator'))
+				DOM.addClass(ro, 'mceFirst');
+
+			if (o.collapse)
+				DOM.addClass(ro, cp + 'ItemSub');
+
+			if (n = ro.previousSibling)
+				DOM.removeClass(n, 'mceLast');
+
+			DOM.addClass(ro, 'mceLast');
+		}
+
+		});
+})();
+/* file:jscripts/tiny_mce/classes/ui/Button.js */
+
+(function() {
+	var DOM = tinymce.DOM;
+
+	tinymce.create('tinymce.ui.Button:tinymce.ui.Control', {
+		Button : function(id, s) {
+			this.parent(id, s);
+			this.classPrefix = 'mceButton';
+		},
+
+		renderHTML : function() {
+			var cp = this.classPrefix, s = this.settings, h, l;
+
+			l = DOM.encode(s.label || '');
+			h = '<a id="' + this.id + '" href="javascript:;" class="' + cp + ' ' + cp + 'Enabled ' + s['class'] + (l ? ' ' + cp + 'Labeled' : '') +'" onmousedown="return false;" onclick="return false;" title="' + DOM.encode(s.title) + '">';
+
+			if (s.image)
+				h += '<img class="mceIcon" src="' + s.image + '" />' + l + '</a>';
+			else
+				h += '<span class="mceIcon ' + s['class'] + '"></span>' + (l ? '<span class="' + cp + 'Label">' + l + '</span>' : '') + '</a>';
+
+			return h;
+		},
+
+		postRender : function() {
+			var t = this, s = t.settings;
+
+			tinymce.dom.Event.add(t.id, 'click', function(e) {
+				if (!t.isDisabled())
+					return s.onclick.call(s.scope, e);
+			});
+		}
+
+		});
+})();
+
+/* file:jscripts/tiny_mce/classes/ui/ListBox.js */
+
+(function() {
+	var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher;
+
+	tinymce.create('tinymce.ui.ListBox:tinymce.ui.Control', {
+		ListBox : function(id, s) {
+			var t = this;
+
+			t.parent(id, s);
+			t.items = [];
+			t.onChange = new Dispatcher(t);
+			t.onPostRender = new Dispatcher(t);
+			t.onAdd = new Dispatcher(t);
+			t.onRenderMenu = new tinymce.util.Dispatcher(this);
+			t.classPrefix = 'mceListBox';
+		},
+
+		select : function(v) {
+			var t = this, e, fv;
+
+			// Do we need to do something?
+			if (v != t.selectedValue) {
+				e = DOM.get(t.id + '_text');
+				t.selectedValue = v;
+
+				// Find item
+				each(t.items, function(o) {
+					if (o.value == v) {
+						DOM.setHTML(e, DOM.encode(o.title));
+						fv = 1;
+						return false;
+					}
+				});
+
+				// If no item was found then present title
+				if (!fv) {
+					DOM.setHTML(e, DOM.encode(t.settings.title));
+					DOM.addClass(e, 'mceTitle');
+					e = 0;
+					return;
+				} else
+					DOM.removeClass(e, 'mceTitle');
+			}
+
+			e = 0;
+		},
+
+		add : function(n, v, o) {
+			var t = this;
+
+			o = o || {};
+			o = tinymce.extend(o, {
+				title : n,
+				value : v
+			});
+
+			t.items.push(o);
+			t.onAdd.dispatch(t, o);
+		},
+
+		getLength : function() {
+			return this.items.length;
+		},
+
+		renderHTML : function() {
+			var h = '', t = this, s = t.settings, cp = t.classPrefix;
+
+			h = '<table id="' + t.id + '" cellpadding="0" cellspacing="0" class="' + cp + ' ' + cp + 'Enabled' + (s['class'] ? (' ' + s['class']) : '') + '"><tbody><tr>';
+			h += '<td>' + DOM.createHTML('a', {id : t.id + '_text', href : 'javascript:;', 'class' : 'mceText', onclick : "return false;", onmousedown : 'return false;'}, DOM.encode(t.settings.title)) + '</td>';
+			h += '<td>' + DOM.createHTML('a', {id : t.id + '_open', tabindex : -1, href : 'javascript:;', 'class' : 'mceOpen', onclick : "return false;", onmousedown : 'return false;'}, '<span></span>') + '</td>';
+			h += '</tr></tbody></table>';
+
+			return h;
+		},
+
+		showMenu : function() {
+			var t = this, p1, p2, e = DOM.get(this.id), m;
+
+			if (t.isDisabled() || t.items.length == 0)
+				return;
+
+			if (t.menu && t.menu.isMenuVisible)
+				return t.hideMenu();
+
+			if (!t.isMenuRendered) {
+				t.renderMenu();
+				t.isMenuRendered = true;
+			}
+
+			p1 = DOM.getPos(this.settings.menu_container);
+			p2 = DOM.getPos(e);
+
+			m = t.menu;
+			m.settings.offset_x = p2.x;
+			m.settings.offset_y = p2.y;
+			m.settings.keyboard_focus = !tinymce.isOpera; // Opera is buggy when it comes to auto focus
+
+			// Select in menu
+			if (t.oldID)
+				m.items[t.oldID].setSelected(0);
+
+			each(t.items, function(o) {
+				if (o.value === t.selectedValue) {
+					m.items[o.id].setSelected(1);
+					t.oldID = o.id;
+				}
+			});
+
+			m.showMenu(0, e.clientHeight);
+
+			Event.add(DOM.doc, 'mousedown', t.hideMenu, t);
+			DOM.addClass(t.id, t.classPrefix + 'Selected');
+
+			//DOM.get(t.id + '_text').focus();
+		},
+
+		hideMenu : function(e) {
+			var t = this;
+
+			// Prevent double toogles by canceling the mouse click event to the button
+			if (e && e.type == "mousedown" && (e.target.id == t.id + '_text' || e.target.id == t.id + '_open'))
+				return;
+
+			if (!e || !DOM.getParent(e.target, function(n) {return DOM.hasClass(n, 'mceMenu');})) {
+				DOM.removeClass(t.id, t.classPrefix + 'Selected');
+				Event.remove(DOM.doc, 'mousedown', t.hideMenu, t);
+
+				if (t.menu)
+					t.menu.hideMenu();
+			}
+		},
+
+		renderMenu : function() {
+			var t = this, m;
+
+			m = t.settings.control_manager.createDropMenu(t.id + '_menu', {
+				menu_line : 1,
+				'class' : t.classPrefix + 'Menu mceNoIcons',
+				max_width : 150,
+				max_height : 150
+			});
+
+			m.onHideMenu.add(t.hideMenu, t);
+
+			m.add({
+				title : t.settings.title,
+				'class' : 'mceMenuItemTitle'
+			}).setDisabled(1);
+
+			each(t.items, function(o) {
+				o.id = DOM.uniqueId();
+				o.onclick = function() {
+					if (t.settings.onselect(o.value) !== false)
+						t.select(o.value); // Must be runned after
+				};
+
+				m.add(o);
+			});
+
+			t.onRenderMenu.dispatch(t, m);
+			t.menu = m;
+		},
+
+		postRender : function() {
+			var t = this, cp = t.classPrefix;
+
+			Event.add(t.id, 'click', t.showMenu, t);
+			Event.add(t.id + '_text', 'focus', function(e) {
+				if (!t._focused) {
+					t.keyDownHandler = Event.add(t.id + '_text', 'keydown', function(e) {
+						var idx = -1, v, kc = e.keyCode;
+
+						// Find current index
+						each(t.items, function(v, i) {
+							if (t.selectedValue == v.value)
+								idx = i;
+						});
+
+						// Move up/down
+						if (kc == 38)
+							v = t.items[idx - 1];
+						else if (kc == 40)
+							v = t.items[idx + 1];
+						else if (kc == 13) {
+							// Fake select on enter
+							v = t.selectedValue;
+							t.selectedValue = null; // Needs to be null to fake change
+							t.settings.onselect(v);
+							return Event.cancel(e);
+						}
+
+						if (v) {
+							t.hideMenu();
+							t.select(v.value);
+						}
+					});
+				}
+
+				t._focused = 1;
+			});
+			Event.add(t.id + '_text', 'blur', function() {Event.remove(t.id + '_text', 'keydown', t.keyDownHandler); t._focused = 0;});
+
+			// Old IE doesn't have hover on all elements
+			if (tinymce.isIE6 || !DOM.boxModel) {
+				Event.add(t.id, 'mouseover', function() {
+					if (!DOM.hasClass(t.id, cp + 'Disabled'))
+						DOM.addClass(t.id, cp + 'Hover');
+				});
+
+				Event.add(t.id, 'mouseout', function() {
+					if (!DOM.hasClass(t.id, cp + 'Disabled'))
+						DOM.removeClass(t.id, cp + 'Hover');
+				});
+			}
+
+			t.onPostRender.dispatch(t, DOM.get(t.id));
+		},
+
+		destroy : function() {
+			this.parent();
+
+			Event.clear(this.id + '_text');
+		}
+
+		});
+})();
+/* file:jscripts/tiny_mce/classes/ui/NativeListBox.js */
+
+(function() {
+	var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, Dispatcher = tinymce.util.Dispatcher;
+
+	tinymce.create('tinymce.ui.NativeListBox:tinymce.ui.ListBox', {
+		NativeListBox : function(id, s) {
+			this.parent(id, s);
+			this.classPrefix = 'mceNativeListBox';
+		},
+
+		setDisabled : function(s) {
+			DOM.get(this.id).disabled = s;
+		},
+
+		isDisabled : function() {
+			return DOM.get(this.id).disabled;
+		},
+
+		select : function(v) {
+			var e = DOM.get(this.id), ol = e.options;
+
+			v = '' + (v || '');
+
+			e.selectedIndex = 0;
+			each(ol, function(o, i) {
+				if (o.value == v) {
+					e.selectedIndex = i;
+					return false;
+				}
+			});
+		},
+
+		add : function(n, v, a) {
+			var o, t = this;
+
+			a = a || {};
+			a.value = v;
+
+			if (t.isRendered())
+				DOM.add(DOM.get(this.id), 'option', a, n);
+
+			o = {
+				title : n,
+				value : v,
+				attribs : a
+			};
+
+			t.items.push(o);
+			t.onAdd.dispatch(t, o);
+		},
+
+		getLength : function() {
+			return DOM.get(this.id).options.length - 1;
+		},
+
+		renderHTML : function() {
+			var h, t = this;
+
+			h = DOM.createHTML('option', {value : ''}, '-- ' + t.settings.title + ' --');
+
+			each(t.items, function(it) {
+				h += DOM.createHTML('option', {value : it.value}, it.title);
+			});
+
+			h = DOM.createHTML('select', {id : t.id, 'class' : 'mceNativeListBox'}, h);
+
+			return h;
+		},
+
+		postRender : function() {
+			var t = this, ch;
+
+			t.rendered = true;
+
+			function onChange(e) {
+				var v = e.target.options[e.target.selectedIndex].value;
+
+				t.onChange.dispatch(t, v);
+
+				if (t.settings.onselect)
+					t.settings.onselect(v);
+			};
+
+			Event.add(t.id, 'change', onChange);
+
+			// Accessibility keyhandler
+			Event.add(t.id, 'keydown', function(e) {
+				var bf;
+
+				Event.remove(t.id, 'change', ch);
+
+				bf = Event.add(t.id, 'blur', function() {
+					Event.add(t.id, 'change', onChange);
+					Event.remove(t.id, 'blur', bf);
+				});
+
+				if (e.keyCode == 13 || e.keyCode == 32) {
+					onChange(e);
+					return Event.cancel(e);
+				}
+			});
+
+			t.onPostRender.dispatch(t, DOM.get(t.id));
+		}
+
+		});
+})();
+/* file:jscripts/tiny_mce/classes/ui/MenuButton.js */
+
+(function() {
+	var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each;
+
+	tinymce.create('tinymce.ui.MenuButton:tinymce.ui.Button', {
+		MenuButton : function(id, s) {
+			this.parent(id, s);
+			this.onRenderMenu = new tinymce.util.Dispatcher(this);
+			s.menu_container = s.menu_container || DOM.doc.body;
+		},
+
+		showMenu : function() {
+			var t = this, p1, p2, e = DOM.get(t.id), m;
+
+			if (t.isDisabled())
+				return;
+
+			if (!t.isMenuRendered) {
+				t.renderMenu();
+				t.isMenuRendered = true;
+			}
+
+			if (t.isMenuVisible)
+				return t.hideMenu();
+
+			p1 = DOM.getPos(t.settings.menu_container);
+			p2 = DOM.getPos(e);
+
+			m = t.menu;
+			m.settings.offset_x = p2.x;
+			m.settings.offset_y = p2.y;
+			m.settings.vp_offset_x = p2.x;
+			m.settings.vp_offset_y = p2.y;
+			m.settings.keyboard_focus = t._focused;
+			m.showMenu(0, e.clientHeight);
+
+			Event.add(DOM.doc, 'mousedown', t.hideMenu, t);
+			t.setState('Selected', 1);
+
+			t.isMenuVisible = 1;
+		},
+
+		renderMenu : function() {
+			var t = this, m;
+
+			m = t.settings.control_manager.createDropMenu(t.id + '_menu', {
+				menu_line : 1,
+				'class' : this.classPrefix + 'Menu',
+				icons : t.settings.icons
+			});
+
+			m.onHideMenu.add(t.hideMenu, t);
+
+			t.onRenderMenu.dispatch(t, m);
+			t.menu = m;
+		},
+
+		hideMenu : function(e) {
+			var t = this;
+
+			// Prevent double toogles by canceling the mouse click event to the button
+			if (e && e.type == "mousedown" && DOM.getParent(e.target, function(e) {return e.id === t.id || e.id === t.id + '_open';}))
+				return;
+
+			if (!e || !DOM.getParent(e.target, function(n) {return DOM.hasClass(n, 'mceMenu');})) {
+				t.setState('Selected', 0);
+				Event.remove(DOM.doc, 'mousedown', t.hideMenu, t);
+				if (t.menu)
+					t.menu.hideMenu();
+			}
+
+			t.isMenuVisible = 0;
+		},
+
+		postRender : function() {
+			var t = this, s = t.settings;
+
+			Event.add(t.id, 'click', function() {
+				if (!t.isDisabled()) {
+					if (s.onclick)
+						s.onclick(t.value);
+
+					t.showMenu();
+				}
+			});
+		}
+
+		});
+})();
+
+/* file:jscripts/tiny_mce/classes/ui/SplitButton.js */
+
+(function() {
+	var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each;
+
+	tinymce.create('tinymce.ui.SplitButton:tinymce.ui.MenuButton', {
+		SplitButton : function(id, s) {
+			this.parent(id, s);
+			this.classPrefix = 'mceSplitButton';
+		},
+
+		renderHTML : function() {
+			var h, t = this, s = t.settings, h1;
+
+			h = '<tbody><tr>';
+
+			if (s.image)
+				h1 = DOM.createHTML('img ', {src : s.image, 'class' : 'mceAction ' + s['class']});
+			else
+				h1 = DOM.createHTML('span', {'class' : 'mceAction ' + s['class']}, '');
+
+			h += '<td>' + DOM.createHTML('a', {id : t.id + '_action', href : 'javascript:;', 'class' : 'mceAction ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + '</td>';
+	
+			h1 = DOM.createHTML('span', {'class' : 'mceOpen ' + s['class']});
+			h += '<td>' + DOM.createHTML('a', {id : t.id + '_open', href : 'javascript:;', 'class' : 'mceOpen ' + s['class'], onclick : "return false;", onmousedown : 'return false;', title : s.title}, h1) + '</td>';
+
+			h += '</tr></tbody>';
+
+			return DOM.createHTML('table', {id : t.id, 'class' : 'mceSplitButton mceSplitButtonEnabled ' + s['class'], cellpadding : '0', cellspacing : '0', onmousedown : 'return false;', title : s.title}, h);
+		},
+
+		postRender : function() {
+			var t = this, s = t.settings;
+
+			if (s.onclick) {
+				Event.add(t.id + '_action', 'click', function() {
+					if (!t.isDisabled())
+						s.onclick(t.value);
+				});
+			}
+
+			Event.add(t.id + '_open', 'click', t.showMenu, t);
+			Event.add(t.id + '_open', 'focus', function() {t._focused = 1;});
+			Event.add(t.id + '_open', 'blur', function() {t._focused = 0;});
+
+			// Old IE doesn't have hover on all elements
+			if (tinymce.isIE6 || !DOM.boxModel) {
+				Event.add(t.id, 'mouseover', function() {
+					if (!DOM.hasClass(t.id, 'mceSplitButtonDisabled'))
+						DOM.addClass(t.id, 'mceSplitButtonHover');
+				});
+
+				Event.add(t.id, 'mouseout', function() {
+					if (!DOM.hasClass(t.id, 'mceSplitButtonDisabled'))
+						DOM.removeClass(t.id, 'mceSplitButtonHover');
+				});
+			}
+		},
+
+		destroy : function() {
+			this.parent();
+
+			Event.clear(this.id + '_action');
+			Event.clear(this.id + '_open');
+		}
+
+		});
+})();
+
+/* file:jscripts/tiny_mce/classes/ui/ColorSplitButton.js */
+
+(function() {
+	var DOM = tinymce.DOM, Event = tinymce.dom.Event, is = tinymce.is, each = tinymce.each;
+
+	tinymce.create('tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton', {
+		ColorSplitButton : function(id, s) {
+			var t = this;
+
+			t.parent(id, s);
+
+			t.settings = s = tinymce.extend({
+				colors : '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',
+				grid_width : 8,
+				default_color : '#888888'
+			}, t.settings);
+
+			t.onShowMenu = new tinymce.util.Dispatcher(t);
+			t.onHideMenu = new tinymce.util.Dispatcher(t);
+
+			t.value = s.default_color;
+		},
+
+		showMenu : function() {
+			var t = this, r, p, e, p2;
+
+			if (t.isDisabled())
+				return;
+
+			if (!t.isMenuRendered) {
+				t.renderMenu();
+				t.isMenuRendered = true;
+			}
+
+			if (t.isMenuVisible)
+				return t.hideMenu();
+
+			e = DOM.get(t.id);
+			DOM.show(t.id + '_menu');
+			DOM.addClass(e, 'mceSplitButtonSelected');
+			p2 = DOM.getPos(e);
+			DOM.setStyles(t.id + '_menu', {
+				left : p2.x,
+				top : p2.y + e.clientHeight,
+				zIndex : 200000
+			});
+			e = 0;
+
+			Event.add(DOM.doc, 'mousedown', t.hideMenu, t);
+
+			if (t._focused) {
+				t._keyHandler = Event.add(t.id + '_menu', 'keydown', function(e) {
+					if (e.keyCode == 27)
+						t.hideMenu();
+				});
+
+				DOM.select('a', t.id + '_menu')[0].focus(); // Select first link
+			}
+
+			t.onShowMenu.dispatch(t);
+
+			t.isMenuVisible = 1;
+		},
+
+		hideMenu : function(e) {
+			var t = this;
+
+			// Prevent double toogles by canceling the mouse click event to the button
+			if (e && e.type == "mousedown" && DOM.getParent(e.target, function(e) {return e.id === t.id + '_open';}))
+				return;
+
+			if (!e || !DOM.getParent(e.target, function(n) {return DOM.hasClass(n, 'mceSplitButtonMenu');})) {
+				DOM.removeClass(t.id, 'mceSplitButtonSelected');
+				Event.remove(DOM.doc, 'mousedown', t.hideMenu, t);
+				Event.remove(t.id + '_menu', 'keydown', t._keyHandler);
+				DOM.hide(t.id + '_menu');
+			}
+
+			t.onHideMenu.dispatch(t);
+
+			t.isMenuVisible = 0;
+		},
+
+		renderMenu : function() {
+			var t = this, m, i = 0, s = t.settings, n, tb, tr, w;
+
+			w = DOM.add(s.menu_container, 'div', {id : t.id + '_menu', 'class' : s['menu_class'] + ' ' + s['class'], style : 'position:absolute;left:0;top:-1000px;'});
+			m = DOM.add(w, 'div', {'class' : s['class'] + ' mceSplitButtonMenu'});
+			DOM.add(m, 'span', {'class' : 'mceMenuLine'});
+
+			n = DOM.add(m, 'table', {'class' : 'mceColorSplitMenu'});
+			tb = DOM.add(n, 'tbody');
+
+			// Generate color grid
+			i = 0;
+			each(is(s.colors, 'array') ? s.colors : s.colors.split(','), function(c) {
+				c = c.replace(/^#/, '');
+
+				if (!i--) {
+					tr = DOM.add(tb, 'tr');
+					i = s.grid_width - 1;
+				}
+
+				n = DOM.add(tr, 'td');
+
+				n = DOM.add(n, 'a', {
+					href : 'javascript:;',
+					style : {
+						backgroundColor : '#' + c
+					},
+					mce_color : '#' + c
+				});
+			});
+
+			if (s.more_colors_func) {
+				n = DOM.add(tb, 'tr');
+				n = DOM.add(n, 'td', {colspan : s.grid_width, 'class' : 'mceMoreColors'});
+				n = DOM.add(n, 'a', {id : t.id + '_more', href : 'javascript:;', onclick : 'return false;', 'class' : 'mceMoreColors'}, s.more_colors_title);
+
+				Event.add(n, 'click', function(e) {
+					s.more_colors_func.call(s.more_colors_scope || this);
+					return Event.cancel(e); // Cancel to fix onbeforeunload problem
+				});
+			}
+
+			DOM.addClass(m, 'mceColorSplitMenu');
+
+			Event.add(t.id + '_menu', 'click', function(e) {
+				var c;
+
+				e = e.target;
+
+				if (e.nodeName == 'A' && (c = e.getAttribute('mce_color')))
+					t.setColor(c);
+
+				return Event.cancel(e); // Prevent IE auto save warning
+			});
+
+			return w;
+		},
+
+		setColor : function(c) {
+			var t = this;
+
+			DOM.setStyle(t.id + '_preview', 'backgroundColor', c);
+
+			t.value = c;
+			t.hideMenu();
+			t.settings.onselect(c);
+		},
+
+		postRender : function() {
+			var t = this, id = t.id;
+
+			t.parent();
+			DOM.add(id + '_action', 'div', {id : id + '_preview', 'class' : 'mceColorPreview'});
+		},
+
+		destroy : function() {
+			this.parent();
+
+			Event.clear(this.id + '_menu');
+			Event.clear(this.id + '_more');
+			DOM.remove(this.id + '_menu');
+		}
+
+		});
+})();
+
+/* file:jscripts/tiny_mce/classes/ui/Toolbar.js */
+
+tinymce.create('tinymce.ui.Toolbar:tinymce.ui.Container', {
+	renderHTML : function() {
+		var t = this, h = '', c, co, dom = tinymce.DOM, s = t.settings, i, pr, nx, cl;
+
+		cl = t.controls;
+		for (i=0; i<cl.length; i++) {
+			// Get current control, prev control, next control and if the control is a list box or not
+			co = cl[i];
+			pr = cl[i - 1];
+			nx = cl[i + 1];
+
+			// Add toolbar start
+			if (i === 0) {
+				c = 'mceToolbarStart';
+
+				if (co.Button)
+					c += ' mceToolbarStartButton';
+				else if (co.SplitButton)
+					c += ' mceToolbarStartSplitButton';
+				else if (co.ListBox)
+					c += ' mceToolbarStartListBox';
+
+				h += dom.createHTML('td', {'class' : c}, dom.createHTML('span', null, '<!-- IE -->'));
+			}
+
+			// Add toolbar end before list box and after the previous button
+			// This is to fix the o2k7 editor skins
+			if (pr && co.ListBox) {
+				if (pr.Button || pr.SplitButton)
+					h += dom.createHTML('td', {'class' : 'mceToolbarEnd'}, dom.createHTML('span', null, '<!-- IE -->'));
+			}
+
+			// Render control HTML
+
+			// IE 8 quick fix, needed to propertly generate a hit area for anchors
+			if (dom.stdMode)
+				h += '<td style="position: relative">' + co.renderHTML() + '</td>';
+			else
+				h += '<td>' + co.renderHTML() + '</td>';
+
+			// Add toolbar start after list box and before the next button
+			// This is to fix the o2k7 editor skins
+			if (nx && co.ListBox) {
+				if (nx.Button || nx.SplitButton)
+					h += dom.createHTML('td', {'class' : 'mceToolbarStart'}, dom.createHTML('span', null, '<!-- IE -->'));
+			}
+		}
+
+		c = 'mceToolbarEnd';
+
+		if (co.Button)
+			c += ' mceToolbarEndButton';
+		else if (co.SplitButton)
+			c += ' mceToolbarEndSplitButton';
+		else if (co.ListBox)
+			c += ' mceToolbarEndListBox';
+
+		h += dom.createHTML('td', {'class' : c}, dom.createHTML('span', null, '<!-- IE -->'));
+
+		return dom.createHTML('table', {id : t.id, 'class' : 'mceToolbar' + (s['class'] ? ' ' + s['class'] : ''), cellpadding : '0', cellspacing : '0', align : t.settings.align || ''}, '<tbody><tr>' + h + '</tr></tbody>');
+	}
+
+	});
+
+/* file:jscripts/tiny_mce/classes/AddOnManager.js */
+
+(function() {
+	var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each;
+
+	tinymce.create('tinymce.AddOnManager', {
+		items : [],
+		urls : {},
+		lookup : {},
+		onAdd : new Dispatcher(this),
+
+		get : function(n) {
+			return this.lookup[n];
+		},
+
+		requireLangPack : function(n) {
+			var u, s;
+
+			if (tinymce.EditorManager.settings) {
+				u = this.urls[n] + '/langs/' + tinymce.EditorManager.settings.language + '.js';
+				s = tinymce.EditorManager.settings;
+
+				if (s) {
+					if (!tinymce.dom.Event.domLoaded && !s.strict_mode)
+						tinymce.ScriptLoader.load(u);
+					else
+						tinymce.ScriptLoader.add(u);
+				}
+			}
+		},
+
+		add : function(id, o) {
+			this.items.push(o);
+			this.lookup[id] = o;
+			this.onAdd.dispatch(this, id, o);
+
+			return o;
+		},
+
+		load : function(n, u, cb, s) {
+			var t = this;
+
+			if (t.urls[n])
+				return;
+
+			if (u.indexOf('/') != 0 && u.indexOf('://') == -1)
+				u = tinymce.baseURL + '/' +  u;
+
+			t.urls[n] = u.substring(0, u.lastIndexOf('/'));
+			tinymce.ScriptLoader.add(u, cb, s);
+		}
+
+		});
+
+	// Create plugin and theme managers
+	tinymce.PluginManager = new tinymce.AddOnManager();
+	tinymce.ThemeManager = new tinymce.AddOnManager();
+}());
+/* file:jscripts/tiny_mce/classes/EditorManager.js */
+
+(function() {
+	// Shorten names
+	var each = tinymce.each, extend = tinymce.extend, DOM = tinymce.DOM, Event = tinymce.dom.Event, ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager, explode = tinymce.explode;
+
+	tinymce.create('static tinymce.EditorManager', {
+		editors : {},
+		i18n : {},
+		activeEditor : null,
+
+		preInit : function() {
+			var t = this, lo = window.location;
+
+			// Setup some URLs where the editor API is located and where the document is
+			tinymce.documentBaseURL = lo.href.replace(/[\?#].*$/, '').replace(/[\/\\][^\/]+$/, '');
+			if (!/[\/\\]$/.test(tinymce.documentBaseURL))
+				tinymce.documentBaseURL += '/';
+
+			tinymce.baseURL = new tinymce.util.URI(tinymce.documentBaseURL).toAbsolute(tinymce.baseURL);
+			tinymce.EditorManager.baseURI = new tinymce.util.URI(tinymce.baseURL);
+
+			// Setup document domain
+			if (tinymce.EditorManager.baseURI.host != lo.hostname && lo.hostname)
+				document.domain = tinymce.relaxedDomain = lo.hostname.replace(/.*\.(.+\..+)$/, '$1');
+
+			// Add before unload listener
+			// This was required since IE was leaking memory if you added and removed beforeunload listeners
+			// with attachEvent/detatchEvent so this only adds one listener and instances can the attach to the onBeforeUnload event
+			t.onBeforeUnload = new tinymce.util.Dispatcher(t);
+
+			// Must be on window or IE will leak if the editor is placed in frame or iframe
+			Event.add(window, 'beforeunload', function(e) {
+				t.onBeforeUnload.dispatch(t, e);
+			});
+		},
+
+		init : function(s) {
+			var t = this, pl, sl = tinymce.ScriptLoader, c, e;
+
+			function execCallback(se, n, s) {
+				var f = se[n];
+
+				if (!f)
+					return;
+
+				if (tinymce.is(f, 'string')) {
+					s = f.replace(/\.\w+$/, '');
+					s = s ? tinymce.resolve(s) : 0;
+					f = tinymce.resolve(f);
+				}
+
+				return f.apply(s || this, Array.prototype.slice.call(arguments, 2));
+			};
+
+			s = extend({
+				theme : "simple",
+				language : "en",
+				strict_loading_mode : document.contentType == 'application/xhtml+xml'
+			}, s);
+
+			t.settings = s;
+
+			// If page not loaded and strict mode isn't enabled then load them
+			if (!Event.domLoaded && !s.strict_loading_mode) {
+				// Load language
+				if (s.language)
+					sl.add(tinymce.baseURL + '/langs/' + s.language + '.js');
+
+				// Load theme
+				if (s.theme && s.theme.charAt(0) != '-' && !ThemeManager.urls[s.theme])
+					ThemeManager.load(s.theme, 'themes/' + s.theme + '/editor_template' + tinymce.suffix + '.js');
+
+				// Load plugins
+				if (s.plugins) {
+					pl = explode(s.plugins);
+
+					// Load compat2x first
+					if (tinymce.inArray(pl, 'compat2x') != -1)
+						PluginManager.load('compat2x', 'plugins/compat2x/editor_plugin' + tinymce.suffix + '.js');
+
+					// Load rest if plugins
+					each(pl, function(v) {
+						if (v && v.charAt(0) != '-' && !PluginManager.urls[v]) {
+							// Skip safari plugin for other browsers
+							if (!tinymce.isWebKit && v == 'safari')
+								return;
+
+							PluginManager.load(v, 'plugins/' + v + '/editor_plugin' + tinymce.suffix + '.js');
+						}
+					});
+				}
+
+				sl.loadQueue();
+			}
+
+			// Legacy call
+			Event.add(document, 'init', function() {
+				var l, co;
+
+				execCallback(s, 'onpageload');
+
+				// Verify that it's a valid browser
+				if (s.browsers) {
+					l = false;
+
+					each(explode(s.browsers), function(v) {
+						switch (v) {
+							case 'ie':
+							case 'msie':
+								if (tinymce.isIE)
+									l = true;
+								break;
+
+							case 'gecko':
+								if (tinymce.isGecko)
+									l = true;
+								break;
+
+							case 'safari':
+							case 'webkit':
+								if (tinymce.isWebKit)
+									l = true;
+								break;
+
+							case 'opera':
+								if (tinymce.isOpera)
+									l = true;
+
+								break;
+						}
+					});
+
+					// Not a valid one
+					if (!l)
+						return;
+				}
+
+				switch (s.mode) {
+					case "exact":
+						l = s.elements || '';
+
+						if(l.length > 0) {
+							each(explode(l), function(v) {
+								if (DOM.get(v))
+									new tinymce.Editor(v, s).render(1);
+								else {
+									c = 0;
+
+									each(document.forms, function(f) {
+										each(f.elements, function(e) {
+											if (e.name === v) {
+												v = 'mce_editor_' + c;
+												DOM.setAttrib(e, 'id', v);
+												new tinymce.Editor(v, s).render(1);
+											}
+										});
+									});
+								}
+							});
+						}
+						break;
+
+					case "textareas":
+					case "specific_textareas":
+						function hasClass(n, c) {
+							return c.constructor === RegExp ? c.test(n.className) : DOM.hasClass(n, c);
+						};
+
+						each(DOM.select('textarea'), function(v) {
+							if (s.editor_deselector && hasClass(v, s.editor_deselector))
+								return;
+
+							if (!s.editor_selector || hasClass(v, s.editor_selector)) {
+								// Can we use the name
+								e = DOM.get(v.name);
+								if (!v.id && !e)
+									v.id = v.name;
+
+								// Generate unique name if missing or already exists
+								if (!v.id || t.get(v.id))
+									v.id = DOM.uniqueId();
+
+								new tinymce.Editor(v.id, s).render(1);
+							}
+						});
+						break;
+				}
+
+				// Call onInit when all editors are initialized
+				if (s.oninit) {
+					l = co = 0;
+
+					each (t.editors, function(ed) {
+						co++;
+
+						if (!ed.initialized) {
+							// Wait for it
+							ed.onInit.add(function() {
+								l++;
+
+								// All done
+								if (l == co)
+									execCallback(s, 'oninit');
+							});
+						} else
+							l++;
+
+						// All done
+						if (l == co)
+							execCallback(s, 'oninit');					
+					});
+				}
+			});
+		},
+
+		get : function(id) {
+			return this.editors[id];
+		},
+
+		getInstanceById : function(id) {
+			return this.get(id);
+		},
+
+		add : function(e) {
+			this.editors[e.id] = e;
+			this._setActive(e);
+
+			return e;
+		},
+
+		remove : function(e) {
+			var t = this;
+
+			// Not in the collection
+			if (!t.editors[e.id])
+				return null;
+
+			delete t.editors[e.id];
+
+			// Select another editor since the active one was removed
+			if (t.activeEditor == e) {
+				each(t.editors, function(e) {
+					t._setActive(e);
+					return false; // Break
+				});
+			}
+
+			e.destroy();
+
+			return e;
+		},
+
+		execCommand : function(c, u, v) {
+			var t = this, ed = t.get(v), w;
+
+			// Manager commands
+			switch (c) {
+				case "mceFocus":
+					ed.focus();
+					return true;
+
+				case "mceAddEditor":
+				case "mceAddControl":
+					if (!t.get(v))
+						new tinymce.Editor(v, t.settings).render();
+
+					return true;
+
+				case "mceAddFrameControl":
+					w = v.window;
+
+					// Add tinyMCE global instance and tinymce namespace to specified window
+					w.tinyMCE = tinyMCE;
+					w.tinymce = tinymce;
+
+					tinymce.DOM.doc = w.document;
+					tinymce.DOM.win = w;
+
+					ed = new tinymce.Editor(v.element_id, v);
+					ed.render();
+
+					// Fix IE memory leaks
+					if (tinymce.isIE) {
+						function clr() {
+							ed.destroy();
+							w.detachEvent('onunload', clr);
+							w = w.tinyMCE = w.tinymce = null; // IE leak
+						};
+
+						w.attachEvent('onunload', clr);
+					}
+
+					v.page_window = null;
+
+					return true;
+
+				case "mceRemoveEditor":
+				case "mceRemoveControl":
+					ed.remove();
+					return true;
+
+				case 'mceToggleEditor':
+					if (!ed) {
+						t.execCommand('mceAddControl', 0, v);
+						return true;
+					}
+
+					if (ed.isHidden())
+						ed.show();
+					else
+						ed.hide();
+
+					return true;
+			}
+
+			// Run command on active editor
+			if (t.activeEditor)
+				return t.activeEditor.execCommand(c, u, v);
+
+			return false;
+		},
+
+		execInstanceCommand : function(id, c, u, v) {
+			var ed = this.get(id);
+
+			if (ed)
+				return ed.execCommand(c, u, v);
+
+			return false;
+		},
+
+		triggerSave : function() {
+			each(this.editors, function(e) {
+				e.save();
+			});
+		},
+
+		addI18n : function(p, o) {
+			var lo, i18n = this.i18n;
+
+			if (!tinymce.is(p, 'string')) {
+				each(p, function(o, lc) {
+					each(o, function(o, g) {
+						each(o, function(o, k) {
+							if (g === 'common')
+								i18n[lc + '.' + k] = o;
+							else
+								i18n[lc + '.' + g + '.' + k] = o;
+						});
+					});
+				});
+			} else {
+				each(o, function(o, k) {
+					i18n[p + '.' + k] = o;
+				});
+			}
+		},
+
+		// Private methods
+
+		_setActive : function(e) {
+			this.selectedInstance = this.activeEditor = e;
+		}
+
+		});
+
+	tinymce.EditorManager.preInit();
+})();
+
+// Short for editor manager window.tinyMCE is needed when TinyMCE gets loaded though a XHR call
+var tinyMCE = window.tinyMCE = tinymce.EditorManager;
+
+/* file:jscripts/tiny_mce/classes/Editor.js */
+
+(function() {
+	var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, Dispatcher = tinymce.util.Dispatcher;
+	var each = tinymce.each, isGecko = tinymce.isGecko, isIE = tinymce.isIE, isWebKit = tinymce.isWebKit;
+	var is = tinymce.is, ThemeManager = tinymce.ThemeManager, PluginManager = tinymce.PluginManager, EditorManager = tinymce.EditorManager;
+	var inArray = tinymce.inArray, grep = tinymce.grep, explode = tinymce.explode;
+
+	tinymce.create('tinymce.Editor', {
+		Editor : function(id, s) {
+			var t = this;
+
+			t.id = t.editorId = id;
+			t.execCommands = {};
+			t.queryStateCommands = {};
+			t.queryValueCommands = {};
+			t.plugins = {};
+
+			// Add events to the editor
+			each([
+				'onPreInit',
+				'onBeforeRenderUI',
+				'onPostRender',
+				'onInit',
+				'onRemove',
+				'onActivate',
+				'onDeactivate',
+				'onClick',
+				'onEvent',
+				'onMouseUp',
+				'onMouseDown',
+				'onDblClick',
+				'onKeyDown',
+				'onKeyUp',
+				'onKeyPress',
+				'onContextMenu',
+				'onSubmit',
+				'onReset',
+				'onPaste',
+				'onPreProcess',
+				'onPostProcess',
+				'onBeforeSetContent',
+				'onBeforeGetContent',
+				'onSetContent',
+				'onGetContent',
+				'onLoadContent',
+				'onSaveContent',
+				'onNodeChange',
+				'onChange',
+				'onBeforeExecCommand',
+				'onExecCommand',
+				'onUndo',
+				'onRedo',
+				'onVisualAid',
+				'onSetProgressState'
+			], function(e) {
+				t[e] = new Dispatcher(t);
+			});
+
+			// Default editor config
+			t.settings = s = extend({
+				id : id,
+				language : 'en',
+				docs_language : 'en',
+				theme : 'simple',
+				skin : 'default',
+				delta_width : 0,
+				delta_height : 0,
+				popup_css : '',
+				plugins : '',
+				document_base_url : tinymce.documentBaseURL,
+				add_form_submit_trigger : 1,
+				submit_patch : 1,
+				add_unload_trigger : 1,
+				convert_urls : 1,
+				relative_urls : 1,
+				remove_script_host : 1,
+				table_inline_editing : 0,
+				object_resizing : 1,
+				cleanup : 1,
+				accessibility_focus : 1,
+				custom_shortcuts : 1,
+				custom_undo_redo_keyboard_shortcuts : 1,
+				custom_undo_redo_restore_selection : 1,
+				custom_undo_redo : 1,
+				doctype : '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">',
+				visual_table_class : 'mceItemTable',
+				visual : 1,
+				inline_styles : true,
+				convert_fonts_to_spans : true,
+				font_size_style_values : 'xx-small,x-small,small,medium,large,x-large,xx-large',
+				apply_source_formatting : 1,
+				directionality : 'ltr',
+				forced_root_block : 'p',
+				valid_elements : '@[id|class|style|title|dir<ltr?rtl|lang|xml::lang|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup],a[rel|rev|charset|hreflang|tabindex|accesskey|type|name|href|target|title|class|onfocus|onblur],strong/b,em/i,strike,u,#p[align],-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|src|border|alt=|title|hspace|vspace|width|height|align],-sub,-sup,-blockquote[cite],-table[border=0|cellspacing|cellpadding|width|frame|rules|height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot,#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div,-span,-code,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite],object[classid|width|height|codebase|*],param[name|value|_value],embed[type|width|height|src|*],script[src|type],map[name],area[shape|coords|href|alt|target],bdo,button,col[align|char|charoff|span|valign|width],colgroup[align|char|charoff|span|valign|width],dfn,fieldset,form[action|accept|accept-charset|enctype|method],input[accept|alt|checked|disabled|maxlength|name|readonly|size|src|type|value],kbd,label[for],legend,noscript,optgroup[label|disabled],option[disabled|label|selected|value],q[cite],samp,select[disabled|multiple|name|size],small,textarea[cols|rows|disabled|name|readonly],tt,var,big',
+				hidden_input : 1,
+				padd_empty_editor : 1,
+				render_ui : 1,
+				init_theme : 1,
+				force_p_newlines : 1,
+				indentation : '30px'
+			}, s);
+
+			// Setup URIs
+			t.documentBaseURI = new tinymce.util.URI(s.document_base_url || tinymce.documentBaseURL, {
+				base_uri : tinyMCE.baseURI
+			});
+			t.baseURI = EditorManager.baseURI;
+
+			// Call setup
+			t.execCallback('setup', t);
+		},
+
+		render : function(nst) {
+			var t = this, s = t.settings, id = t.id, sl = tinymce.ScriptLoader;
+
+			// Page is not loaded yet, wait for it
+			if (!Event.domLoaded) {
+				Event.add(document, 'init', function() {
+					t.render();
+				});
+				return;
+			}
+
+			// Force strict loading mode if render us called by user and not internally
+			if (!nst) {
+				s.strict_loading_mode = 1;
+				tinyMCE.settings = s;
+			}
+
+			// Element not found, then skip initialization
+			if (!t.getElement())
+				return;
+
+			if (s.strict_loading_mode) {
+				sl.settings.strict_mode = s.strict_loading_mode;
+				tinymce.DOM.settings.strict = 1;
+			}
+
+			// Add hidden input for non input elements inside form elements
+			if (!/TEXTAREA|INPUT/i.test(t.getElement().nodeName) && s.hidden_input && DOM.getParent(id, 'form'))
+				DOM.insertAfter(DOM.create('input', {type : 'hidden', name : id}), id);
+
+			t.windowManager = new tinymce.WindowManager(t);
+
+			if (s.encoding == 'xml') {
+				t.onGetContent.add(function(ed, o) {
+					if (o.save)
+						o.content = DOM.encode(o.content);
+				});
+			}
+
+			if (s.add_form_submit_trigger) {
+				t.onSubmit.addToTop(function() {
+					if (t.initialized) {
+						t.save();
+						t.isNotDirty = 1;
+					}
+				});
+			}
+
+			if (s.add_unload_trigger && !s.ask) {
+				t._beforeUnload = tinyMCE.onBeforeUnload.add(function() {
+					if (t.initialized && !t.destroyed && !t.isHidden())
+						t.save({format : 'raw', no_events : true});
+				});
+			}
+
+			tinymce.addUnload(t.destroy, t);
+
+			if (s.submit_patch) {
+				t.onBeforeRenderUI.add(function() {
+					var n = t.getElement().form;
+
+					if (!n)
+						return;
+
+					// Already patched
+					if (n._mceOldSubmit)
+						return;
+
+					// Check page uses id="submit" or name="submit" for it's submit button
+					if (!n.submit.nodeType && !n.submit.length) {
+						t.formElement = n;
+						n._mceOldSubmit = n.submit;
+						n.submit = function() {
+							// Save all instances
+							EditorManager.triggerSave();
+							t.isNotDirty = 1;
+
+							return this._mceOldSubmit(this);
+						};
+					}
+
+					n = null;
+				});
+			}
+
+			// Load scripts
+			function loadScripts() {
+				if (s.language)
+					sl.add(tinymce.baseURL + '/langs/' + s.language + '.js');
+
+				if (s.theme.charAt(0) != '-' && !ThemeManager.urls[s.theme])
+					ThemeManager.load(s.theme, 'themes/' + s.theme + '/editor_template' + tinymce.suffix + '.js');
+
+				each(explode(s.plugins), function(p) {
+					if (p && p.charAt(0) != '-' && !PluginManager.urls[p]) {
+						// Skip safari plugin for other browsers
+						if (!isWebKit && p == 'safari')
+							return;
+
+						PluginManager.load(p, 'plugins/' + p + '/editor_plugin' + tinymce.suffix + '.js');
+					}
+				});
+
+				// Init when que is loaded
+				sl.loadQueue(function() {
+					if (s.ask) {
+						function ask() {
+							// Yield for awhile to avoid focus bug on FF 3 when cancel is pressed
+							window.setTimeout(function() {
+								Event.remove(t.id, 'focus', ask);
+
+								t.windowManager.confirm(t.getLang('edit_confirm'), function(s) {
+									if (s)
+										t.init();
+								});
+							}, 0);
+						};
+
+						Event.add(t.id, 'focus', ask);
+						return;
+					}
+
+					if (!t.removed)
+						t.init();
+				});
+			};
+
+			// Load compat2x first
+			if (s.plugins.indexOf('compat2x') != -1) {
+				PluginManager.load('compat2x', 'plugins/compat2x/editor_plugin' + tinymce.suffix + '.js');
+				sl.loadQueue(loadScripts);
+			} else
+				loadScripts();
+		},
+
+		init : function() {
+			var n, t = this, s = t.settings, w, h, e = t.getElement(), o, ti, u, bi, bc, re;
+
+			EditorManager.add(t);
+
+			// Create theme
+			s.theme = s.theme.replace(/-/, '');
+			o = ThemeManager.get(s.theme);
+			t.theme = new o();
+
+			if (t.theme.init && s.init_theme)
+				t.theme.init(t, ThemeManager.urls[s.theme] || tinymce.documentBaseURL.replace(/\/$/, ''));
+
+			// Create all plugins
+			each(explode(s.plugins.replace(/\-/g, '')), function(p) {
+				var c = PluginManager.get(p), u = PluginManager.urls[p] || tinymce.documentBaseURL.replace(/\/$/, ''), po;
+
+				if (c) {
+					po = new c(t, u);
+
+					t.plugins[p] = po;
+
+					if (po.init)
+						po.init(t, u);
+				}
+			});
+
+			// Setup popup CSS path(s)
+			if (s.popup_css)
+				s.popup_css = t.documentBaseURI.toAbsolute(s.popup_css);
+			else
+				s.popup_css = t.baseURI.toAbsolute("themes/" + s.theme + "/skins/" + s.skin + "/dialog.css");
+
+			if (s.popup_css_add)
+				s.popup_css += ',' + t.documentBaseURI.toAbsolute(s.popup_css_add);
+
+			// Setup control factory
+			t.controlManager = new tinymce.ControlManager(t);
+			t.undoManager = new tinymce.UndoManager(t);
+
+			// Pass through
+			t.undoManager.onAdd.add(function(um, l) {
+				if (!l.initial)
+					return t.onChange.dispatch(t, l, um);
+			});
+
+			t.undoManager.onUndo.add(function(um, l) {
+				return t.onUndo.dispatch(t, l, um);
+			});
+
+			t.undoManager.onRedo.add(function(um, l) {
+				return t.onRedo.dispatch(t, l, um);
+			});
+
+			if (s.custom_undo_redo) {
+				t.onExecCommand.add(function(ed, cmd, ui, val, a) {
+					if (cmd != 'Undo' && cmd != 'Redo' && cmd != 'mceRepaint' && (!a || !a.skip_undo))
+						t.undoManager.add();
+				});
+			}
+
+			t.onExecCommand.add(function(ed, c) {
+				// Don't refresh the select lists until caret move
+				if (!/^(FontName|FontSize)$/.test(c))
+					t.nodeChanged();
+			});
+
+			// Remove ghost selections on images and tables in Gecko
+			if (isGecko) {
+				function repaint(a, o) {
+					if (!o || !o.initial)
+						t.execCommand('mceRepaint');
+				};
+
+				t.onUndo.add(repaint);
+				t.onRedo.add(repaint);
+				t.onSetContent.add(repaint);
+			}
+
+			// Enables users to override the control factory
+			t.onBeforeRenderUI.dispatch(t, t.controlManager);
+
+			// Measure box
+			if (s.render_ui) {
+				w = s.width || e.style.width || e.offsetWidth;
+				h = s.height || e.style.height || e.offsetHeight;
+				t.orgDisplay = e.style.display;
+				re = /^[0-9\.]+(|px)$/i;
+
+				if (re.test('' + w))
+					w = Math.max(parseInt(w) + (o.deltaWidth || 0), 100);
+
+				if (re.test('' + h))
+					h = Math.max(parseInt(h) + (o.deltaHeight || 0), 100);
+
+				// Render UI
+				o = t.theme.renderUI({
+					targetNode : e,
+					width : w,
+					height : h,
+					deltaWidth : s.delta_width,
+					deltaHeight : s.delta_height
+				});
+
+				t.editorContainer = o.editorContainer;
+			}
+
+			
+			// Resize editor
+			DOM.setStyles(o.sizeContainer || o.editorContainer, {
+				width : w,
+				height : h
+			});
+
+			h = (o.iframeHeight || h) + ((h + '').indexOf('%') == -1 ? (o.deltaHeight || 0) : '');
+			if (h < 100)
+				h = 100;
+
+			t.iframeHTML = s.doctype + '<html><head xmlns="http://www.w3.org/1999/xhtml"><base href="' + t.documentBaseURI.getURI() + '"></base>';
+			t.iframeHTML += '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />';
+
+			if (tinymce.relaxedDomain)
+				t.iframeHTML += '<script type="text/javascript">document.domain = "' + tinymce.relaxedDomain + '";</script>';
+
+			bi = s.body_id || 'tinymce';
+			if (bi.indexOf('=') != -1) {
+				bi = t.getParam('body_id', '', 'hash');
+				bi = bi[t.id] || bi;
+			}
+
+			bc = s.body_class || '';
+			if (bc.indexOf('=') != -1) {
+				bc = t.getParam('body_class', '', 'hash');
+				bc = bc[t.id] || '';
+			}
+
+			t.iframeHTML += '</head><body id="' + bi + '" class="mceContentBody ' + bc + '"></body></html>';
+
+			// Domain relaxing enabled, then set document domain
+			if (tinymce.relaxedDomain) {
+				// We need to write the contents here in IE since multiple writes messes up refresh button and back button
+				if (isIE)
+					u = 'javascript:(function(){document.open();document.domain="' + document.domain + '";var ed = window.parent.tinyMCE.get("' + t.id + '");document.write(ed.iframeHTML);document.close();ed.setupIframe();})()';
+				else if (tinymce.isOpera)
+					u = 'javascript:(function(){document.open();document.domain="' + document.domain + '";document.close();ed.setupIframe();})()';					
+			}
+
+			// Create iframe
+			n = DOM.add(o.iframeContainer, 'iframe', {
+				id : t.id + "_ifr",
+				src : u || 'javascript:""', // Workaround for HTTPS warning in IE6/7
+				frameBorder : '0',
+				style : {
+					width : '100%',
+					height : h
+				}
+			});
+
+			t.contentAreaContainer = o.iframeContainer;
+			DOM.get(o.editorContainer).style.display = t.orgDisplay;
+			DOM.get(t.id).style.display = 'none';
+
+			// Safari 2.x requires us to wait for the load event and load a real HTML doc
+			if (tinymce.isOldWebKit) {
+				Event.add(n, 'load', t.setupIframe, t);
+				n.src = tinymce.baseURL + '/plugins/safari/blank.htm';
+			} else {
+				if (!isIE || !tinymce.relaxedDomain)
+					t.setupIframe();
+
+				e = n = o = null; // Cleanup
+			}
+		},
+
+		setupIframe : function() {
+			var t = this, s = t.settings, e = DOM.get(t.id), d = t.getDoc(), h, b;
+
+			// Setup iframe body
+			if (!isIE || !tinymce.relaxedDomain) {
+				d.open();
+				d.write(t.iframeHTML);
+				d.close();
+			}
+
+			// Design mode needs to be added here Ctrl+A will fail otherwise
+			if (!isIE) {
+				try {
+					d.designMode = 'On';
+				} catch (ex) {
+					// Will fail on Gecko if the editor is placed in an hidden container element
+					// The design mode will be set ones the editor is focused
+				}
+			}
+
+			// IE needs to use contentEditable or it will display non secure items for HTTPS
+			if (isIE) {
+				// It will not steal focus if we hide it while setting contentEditable
+				b = t.getBody();
+				DOM.hide(b);
+				b.contentEditable = true;
+				DOM.show(b);
+			}
+
+			// Setup objects
+			t.dom = new tinymce.DOM.DOMUtils(t.getDoc(), {
+				keep_values : true,
+				url_converter : t.convertURL,
+				url_converter_scope : t,
+				hex_colors : s.force_hex_style_colors,
+				class_filter : s.class_filter,
+				update_styles : 1,
+				fix_ie_paragraphs : 1
+			});
+
+			t.serializer = new tinymce.dom.Serializer({
+				entity_encoding : s.entity_encoding,
+				entities : s.entities,
+				valid_elements : s.verify_html === false ? '*[*]' : s.valid_elements,
+				extended_valid_elements : s.extended_valid_elements,
+				valid_child_elements : s.valid_child_elements,
+				invalid_elements : s.invalid_elements,
+				fix_table_elements : s.fix_table_elements,
+				fix_list_elements : s.fix_list_elements,
+				fix_content_duplication : s.fix_content_duplication,
+				convert_fonts_to_spans : s.convert_fonts_to_spans,
+				font_size_classes  : s.font_size_classes,
+				font_size_style_values : s.font_size_style_values,
+				apply_source_formatting : s.apply_source_formatting,
+				remove_linebreaks : s.remove_linebreaks,
+				dom : t.dom
+			});
+
+			t.selection = new tinymce.dom.Selection(t.dom, t.getWin(), t.serializer);
+			t.forceBlocks = new tinymce.ForceBlocks(t, {
+				forced_root_block : s.forced_root_block
+			});
+			t.editorCommands = new tinymce.EditorCommands(t);
+
+			// Pass through
+			t.serializer.onPreProcess.add(function(se, o) {
+				return t.onPreProcess.dispatch(t, o, se);
+			});
+
+			t.serializer.onPostProcess.add(function(se, o) {
+				return t.onPostProcess.dispatch(t, o, se);
+			});
+
+			t.onPreInit.dispatch(t);
+
+			if (!s.gecko_spellcheck)
+				t.getBody().spellcheck = 0;
+
+			t._addEvents();
+
+			t.controlManager.onPostRender.dispatch(t, t.controlManager);
+			t.onPostRender.dispatch(t);
+
+			if (s.directionality)
+				t.getBody().dir = s.directionality;
+
+			if (s.nowrap)
+				t.getBody().style.whiteSpace = "nowrap";
+
+			if (s.auto_resize)
+				t.onNodeChange.add(t.resizeToContent, t);
+
+			if (s.custom_elements) {
+				function handleCustom(ed, o) {
+					each(explode(s.custom_elements), function(v) {
+						var n;
+
+						if (v.indexOf('~') === 0) {
+							v = v.substring(1);
+							n = 'span';
+						} else
+							n = 'div';
+
+						o.content = o.content.replace(new RegExp('<(' + v + ')([^>]*)>', 'g'), '<' + n + ' mce_name="$1"$2>');
+						o.content = o.content.replace(new RegExp('</(' + v + ')>', 'g'), '</' + n + '>');
+					});
+				};
+
+				t.onBeforeSetContent.add(handleCustom);
+				t.onPostProcess.add(function(ed, o) {
+					if (o.set)
+						handleCustom(ed, o)
+				});
+			}
+
+			if (s.handle_node_change_callback) {
+				t.onNodeChange.add(function(ed, cm, n) {
+					t.execCallback('handle_node_change_callback', t.id, n, -1, -1, true, t.selection.isCollapsed());
+				});
+			}
+
+			if (s.save_callback) {
+				t.onSaveContent.add(function(ed, o) {
+					var h = t.execCallback('save_callback', t.id, o.content, t.getBody());
+
+					if (h)
+						o.content = h;
+				});
+			}
+
+			if (s.onchange_callback) {
+				t.onChange.add(function(ed, l) {
+					t.execCallback('onchange_callback', t, l);
+				});
+			}
+
+			if (s.convert_newlines_to_brs) {
+				t.onBeforeSetContent.add(function(ed, o) {
+					if (o.initial)
+						o.content = o.content.replace(/\r?\n/g, '<br />');
+				});
+			}
+
+			if (s.fix_nesting && isIE) {
+				t.onBeforeSetContent.add(function(ed, o) {
+					o.content = t._fixNesting(o.content);
+				});
+			}
+
+			if (s.preformatted) {
+				t.onPostProcess.add(function(ed, o) {
+					o.content = o.content.replace(/^\s*<pre.*?>/, '');
+					o.content = o.content.replace(/<\/pre>\s*$/, '');
+
+					if (o.set)
+						o.content = '<pre class="mceItemHidden">' + o.content + '</pre>';
+				});
+			}
+
+			if (s.verify_css_classes) {
+				t.serializer.attribValueFilter = function(n, v) {
+					var s, cl;
+
+					if (n == 'class') {
+						// Build regexp for classes
+						if (!t.classesRE) {
+							cl = t.dom.getClasses();
+
+							if (cl.length > 0) {
+								s = '';
+
+								each (cl, function(o) {
+									s += (s ? '|' : '') + o['class'];
+								});
+
+								t.classesRE = new RegExp('(' + s + ')', 'gi');
+							}
+						}
+
+						return !t.classesRE || /(\bmceItem\w+\b|\bmceTemp\w+\b)/g.test(v) || t.classesRE.test(v) ? v : '';
+					}
+
+					return v;
+				};
+			}
+
+			if (s.convert_fonts_to_spans)
+				t._convertFonts();
+
+			if (s.inline_styles)
+				t._convertInlineElements();
+
+			if (s.cleanup_callback) {
+				t.onBeforeSetContent.add(function(ed, o) {
+					o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o);
+				});
+
+				t.onPreProcess.add(function(ed, o) {
+					if (o.set)
+						t.execCallback('cleanup_callback', 'insert_to_editor_dom', o.node, o);
+
+					if (o.get)
+						t.execCallback('cleanup_callback', 'get_from_editor_dom', o.node, o);
+				});
+
+				t.onPostProcess.add(function(ed, o) {
+					if (o.set)
+						o.content = t.execCallback('cleanup_callback', 'insert_to_editor', o.content, o);
+
+					if (o.get)						
+						o.content = t.execCallback('cleanup_callback', 'get_from_editor', o.content, o);
+				});
+			}
+
+			if (s.save_callback) {
+				t.onGetContent.add(function(ed, o) {
+					if (o.save)
+						o.content = t.execCallback('save_callback', t.id, o.content, t.getBody());
+				});
+			}
+
+			if (s.handle_event_callback) {
+				t.onEvent.add(function(ed, e, o) {
+					if (t.execCallback('handle_event_callback', e, ed, o) === false)
+						Event.cancel(e);
+				});
+			}
+
+			t.onSetContent.add(function() {
+				// Safari needs some time, it will crash the browser when a link is created otherwise
+				// I think this crash issue is resolved in the latest 3.0.4
+				//window.setTimeout(function() {
+					t.addVisual(t.getBody());
+				//}, 1);
+			});
+
+			// Remove empty contents
+			if (s.padd_empty_editor) {
+				t.onPostProcess.add(function(ed, o) {
+					o.content = o.content.replace(/^(<p>(&nbsp;|&#160;|\s|\u00a0|)<\/p>[\r\n]*|<br \/>[\r\n]*)$/, '');
+				});
+			}
+
+			if (isGecko) {
+				try {
+					// Design mode must be set here once again to fix a bug where
+					// Ctrl+A/Delete/Backspace didn't work if the editor was added using mceAddControl then removed then added again
+					d.designMode = 'Off';
+					d.designMode = 'On';
+				} catch (ex) {
+					// Will fail on Gecko if the editor is placed in an hidden container element
+					// The design mode will be set ones the editor is focused
+				}
+			}
+
+			// A small timeout was needed since firefox will remove. Bug: #1838304
+			setTimeout(function () {
+				if (t.removed)
+					return;
+
+				t.load({initial : true, format : (s.cleanup_on_startup ? 'html' : 'raw')});
+				t.startContent = t.getContent({format : 'raw'});
+				t.undoManager.add({initial : true});
+				t.initialized = true;
+
+				t.onInit.dispatch(t);
+				t.execCallback('setupcontent_callback', t.id, t.getBody(), t.getDoc());
+				t.execCallback('init_instance_callback', t);
+				t.focus(true);
+				t.nodeChanged({initial : 1});
+
+				// Load specified content CSS last
+				if (s.content_css) {
+					tinymce.each(explode(s.content_css), function(u) {
+						t.dom.loadCSS(t.documentBaseURI.toAbsolute(u));
+					});
+				}
+
+				// Handle auto focus
+				if (s.auto_focus) {
+					setTimeout(function () {
+						var ed = EditorManager.get(s.auto_focus);
+
+						ed.selection.select(ed.getBody(), 1);
+						ed.selection.collapse(1);
+						ed.getWin().focus();
+					}, 100);
+				}
+			}, 1);
+	
+			e = null;
+		},
+
+		
+		focus : function(sf) {
+			var oed, t = this, ce = t.settings.content_editable;
+
+			if (!sf) {
+				if (!ce)
+					t.getWin().focus();
+
+							}
+
+			if (EditorManager.activeEditor != t) {
+				if ((oed = EditorManager.activeEditor) != null)
+					oed.onDeactivate.dispatch(oed, t);
+
+				t.onActivate.dispatch(t, oed);
+			}
+
+			EditorManager._setActive(t);
+		},
+
+		execCallback : function(n) {
+			var t = this, f = t.settings[n], s;
+
+			if (!f)
+				return;
+
+			// Look through lookup
+			if (t.callbackLookup && (s = t.callbackLookup[n])) {
+				f = s.func;
+				s = s.scope;
+			}
+
+			if (is(f, 'string')) {
+				s = f.replace(/\.\w+$/, '');
+				s = s ? tinymce.resolve(s) : 0;
+				f = tinymce.resolve(f);
+				t.callbackLookup = t.callbackLookup || {};
+				t.callbackLookup[n] = {func : f, scope : s};
+			}
+
+			return f.apply(s || t, Array.prototype.slice.call(arguments, 1));
+		},
+
+		translate : function(s) {
+			var c = this.settings.language, i18n = EditorManager.i18n;
+
+			if (!s)
+				return '';
+
+			return i18n[c + '.' + s] || s.replace(/{\#([^}]+)\}/g, function(a, b) {
+				return i18n[c + '.' + b] || '{#' + b + '}';
+			});
+		},
+
+		getLang : function(n, dv) {
+			return EditorManager.i18n[this.settings.language + '.' + n] || (is(dv) ? dv : '{#' + n + '}');
+		},
+
+		getParam : function(n, dv, ty) {
+			var tr = tinymce.trim, v = is(this.settings[n]) ? this.settings[n] : dv, o;
+
+			if (ty === 'hash') {
+				o = {};
+
+				if (is(v, 'string')) {
+					each(v.indexOf('=') > 0 ? v.split(/[;,](?![^=;,]*(?:[;,]|$))/) : v.split(','), function(v) {
+						v = v.split('=');
+
+						if (v.length > 1)
+							o[tr(v[0])] = tr(v[1]);
+						else
+							o[tr(v[0])] = tr(v);
+					});
+				} else
+					o = v;
+
+				return o;
+			}
+
+			return v;
+		},
+
+		nodeChanged : function(o) {
+			var t = this, s = t.selection, n = s.getNode() || t.getBody();
+
+			// Fix for bug #1896577 it seems that this can not be fired while the editor is loading
+			if (t.initialized) {
+				t.onNodeChange.dispatch(
+					t,
+					o ? o.controlManager || t.controlManager : t.controlManager,
+					isIE && n.ownerDocument != t.getDoc() ? t.getBody() : n, // Fix for IE initial state
+					s.isCollapsed(),
+					o
+				);
+			}
+		},
+
+		addButton : function(n, s) {
+			var t = this;
+
+			t.buttons = t.buttons || {};
+			t.buttons[n] = s;
+		},
+
+		addCommand : function(n, f, s) {
+			this.execCommands[n] = {func : f, scope : s || this};
+		},
+
+		addQueryStateHandler : function(n, f, s) {
+			this.queryStateCommands[n] = {func : f, scope : s || this};
+		},
+
+		addQueryValueHandler : function(n, f, s) {
+			this.queryValueCommands[n] = {func : f, scope : s || this};
+		},
+
+		addShortcut : function(pa, desc, cmd_func, sc) {
+			var t = this, c;
+
+			if (!t.settings.custom_shortcuts)
+				return false;
+
+			t.shortcuts = t.shortcuts || {};
+
+			if (is(cmd_func, 'string')) {
+				c = cmd_func;
+
+				cmd_func = function() {
+					t.execCommand(c, false, null);
+				};
+			}
+
+			if (is(cmd_func, 'object')) {
+				c = cmd_func;
+
+				cmd_func = function() {
+					t.execCommand(c[0], c[1], c[2]);
+				};
+			}
+
+			each(explode(pa), function(pa) {
+				var o = {
+					func : cmd_func,
+					scope : sc || this,
+					desc : desc,
+					alt : false,
+					ctrl : false,
+					shift : false
+				};
+
+				each(explode(pa, '+'), function(v) {
+					switch (v) {
+						case 'alt':
+						case 'ctrl':
+						case 'shift':
+							o[v] = true;
+							break;
+
+						default:
+							o.charCode = v.charCodeAt(0);
+							o.keyCode = v.toUpperCase().charCodeAt(0);
+					}
+				});
+
+				t.shortcuts[(o.ctrl ? 'ctrl' : '') + ',' + (o.alt ? 'alt' : '') + ',' + (o.shift ? 'shift' : '') + ',' + o.keyCode] = o;
+			});
+
+			return true;
+		},
+
+		execCommand : function(cmd, ui, val, a) {
+			var t = this, s = 0, o, st;
+
+			if (!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(cmd) && (!a || !a.skip_focus))
+				t.focus();
+
+			o = {};
+			t.onBeforeExecCommand.dispatch(t, cmd, ui, val, o);
+			if (o.terminate)
+				return false;
+
+			// Command callback
+			if (t.execCallback('execcommand_callback', t.id, t.selection.getNode(), cmd, ui, val)) {
+				t.onExecCommand.dispatch(t, cmd, ui, val, a);
+				return true;
+			}
+
+			// Registred commands
+			if (o = t.execCommands[cmd]) {
+				st = o.func.call(o.scope, ui, val);
+
+				// Fall through on true
+				if (st !== true) {
+					t.onExecCommand.dispatch(t, cmd, ui, val, a);
+					return st;
+				}
+			}
+
+			// Plugin commands
+			each(t.plugins, function(p) {
+				if (p.execCommand && p.execCommand(cmd, ui, val)) {
+					t.onExecCommand.dispatch(t, cmd, ui, val, a);
+					s = 1;
+					return false;
+				}
+			});
+
+			if (s)
+				return true;
+
+			// Theme commands
+			if (t.theme.execCommand && t.theme.execCommand(cmd, ui, val)) {
+				t.onExecCommand.dispatch(t, cmd, ui, val, a);
+				return true;
+			}
+
+			// Editor commands
+			if (t.editorCommands.execCommand(cmd, ui, val)) {
+				t.onExecCommand.dispatch(t, cmd, ui, val, a);
+				return true;
+			}
+
+			// Browser commands
+			t.getDoc().execCommand(cmd, ui, val);
+			t.onExecCommand.dispatch(t, cmd, ui, val, a);
+		},
+
+		queryCommandState : function(c) {
+			var t = this, o, s;
+
+			// Is hidden then return undefined
+			if (t._isHidden())
+				return;
+
+			// Registred commands
+			if (o = t.queryStateCommands[c]) {
+				s = o.func.call(o.scope);
+
+				// Fall though on true
+				if (s !== true)
+					return s;
+			}
+
+			// Registred commands
+			o = t.editorCommands.queryCommandState(c);
+			if (o !== -1)
+				return o;
+
+			// Browser commands
+			try {
+				return this.getDoc().queryCommandState(c);
+			} catch (ex) {
+				// Fails sometimes see bug: 1896577
+			}
+		},
+
+		queryCommandValue : function(c) {
+			var t = this, o, s;
+
+			// Is hidden then return undefined
+			if (t._isHidden())
+				return;
+
+			// Registred commands
+			if (o = t.queryValueCommands[c]) {
+				s = o.func.call(o.scope);
+
+				// Fall though on true
+				if (s !== true)
+					return s;
+			}
+
+			// Registred commands
+			o = t.editorCommands.queryCommandValue(c);
+			if (is(o))
+				return o;
+
+			// Browser commands
+			try {
+				return this.getDoc().queryCommandValue(c);
+			} catch (ex) {
+				// Fails sometimes see bug: 1896577
+			}
+		},
+
+		show : function() {
+			var t = this;
+
+			DOM.show(t.getContainer());
+			DOM.hide(t.id);
+			t.load();
+		},
+
+		hide : function() {
+			var t = this, d = t.getDoc();
+
+			// Fixed bug where IE has a blinking cursor left from the editor
+			if (isIE && d)
+				d.execCommand('SelectAll');
+
+			// We must save before we hide so Safari doesn't crash
+			t.save();
+			DOM.hide(t.getContainer());
+			DOM.setStyle(t.id, 'display', t.orgDisplay);
+		},
+
+		isHidden : function() {
+			return !DOM.isHidden(this.id);
+		},
+
+		setProgressState : function(b, ti, o) {
+			this.onSetProgressState.dispatch(this, b, ti, o);
+
+			return b;
+		},
+
+		resizeToContent : function() {
+			var t = this;
+
+			DOM.setStyle(t.id + "_ifr", 'height', t.getBody().scrollHeight);
+		},
+
+		load : function(o) {
+			var t = this, e = t.getElement(), h;
+
+			o = o || {};
+			o.load = true;
+
+			h = t.setContent(is(e.value) ? e.value : e.innerHTML, o);
+			o.element = e;
+
+			if (!o.no_events)
+				t.onLoadContent.dispatch(t, o);
+
+			o.element = e = null;
+
+			return h;
+		},
+
+		save : function(o) {
+			var t = this, e = t.getElement(), h, f;
+
+			if (!t.initialized)
+				return;
+
+			o = o || {};
+			o.save = true;
+
+			// Add undo level will trigger onchange event
+			if (!o.no_events) {
+				t.undoManager.typing = 0;
+				t.undoManager.add();
+			}
+
+			o.element = e;
+			h = o.content = t.getContent(o);
+
+			if (!o.no_events)
+				t.onSaveContent.dispatch(t, o);
+
+			h = o.content;
+
+			if (!/TEXTAREA|INPUT/i.test(e.nodeName)) {
+				e.innerHTML = h;
+
+				// Update hidden form element
+				if (f = DOM.getParent(t.id, 'form')) {
+					each(f.elements, function(e) {
+						if (e.name == t.id) {
+							e.value = h;
+							return false;
+						}
+					});
+				}
+			} else
+				e.value = h;
+
+			o.element = e = null;
+
+			return h;
+		},
+
+		setContent : function(h, o) {
+			var t = this;
+
+			o = o || {};
+			o.format = o.format || 'html';
+			o.set = true;
+			o.content = h;
+
+			if (!o.no_events)
+				t.onBeforeSetContent.dispatch(t, o);
+
+			// Padd empty content in Gecko and Safari. Commands will otherwise fail on the content
+			// It will also be impossible to place the caret in the editor unless there is a BR element present
+			if (!tinymce.isIE && (h.length === 0 || /^\s+$/.test(h))) {
+				o.content = t.dom.setHTML(t.getBody(), '<br mce_bogus="1" />');
+				o.format = 'raw';
+			}
+
+			o.content = t.dom.setHTML(t.getBody(), tinymce.trim(o.content));
+
+			if (o.format != 'raw' && t.settings.cleanup) {
+				o.getInner = true;
+				o.content = t.dom.setHTML(t.getBody(), t.serializer.serialize(t.getBody(), o));
+			}
+
+			if (!o.no_events)
+				t.onSetContent.dispatch(t, o);
+
+			return o.content;
+		},
+
+		getContent : function(o) {
+			var t = this, h;
+
+			o = o || {};
+			o.format = o.format || 'html';
+			o.get = true;
+
+			if (!o.no_events)
+				t.onBeforeGetContent.dispatch(t, o);
+
+			if (o.format != 'raw' && t.settings.cleanup) {
+				o.getInner = true;
+				h = t.serializer.serialize(t.getBody(), o);
+			} else
+				h = t.getBody().innerHTML;
+
+			h = h.replace(/^\s*|\s*$/g, '');
+			o.content = h;
+
+			if (!o.no_events)
+				t.onGetContent.dispatch(t, o);
+
+			return o.content;
+		},
+
+		isDirty : function() {
+			var t = this;
+
+			return tinymce.trim(t.startContent) != tinymce.trim(t.getContent({format : 'raw', no_events : 1})) && !t.isNotDirty;
+		},
+
+		getContainer : function() {
+			var t = this;
+
+			if (!t.container)
+				t.container = DOM.get(t.editorContainer || t.id + '_parent');
+
+			return t.container;
+		},
+
+		getContentAreaContainer : function() {
+			return this.contentAreaContainer;
+		},
+
+		getElement : function() {
+			return DOM.get(this.settings.content_element || this.id);
+		},
+
+		getWin : function() {
+			var t = this, e;
+
+			if (!t.contentWindow) {
+				e = DOM.get(t.id + "_ifr");
+
+				if (e)
+					t.contentWindow = e.contentWindow;
+			}
+
+			return t.contentWindow;
+		},
+
+		getDoc : function() {
+			var t = this, w;
+
+			if (!t.contentDocument) {
+				w = t.getWin();
+
+				if (w)
+					t.contentDocument = w.document;
+			}
+
+			return t.contentDocument;
+		},
+
+		getBody : function() {
+			return this.bodyElement || this.getDoc().body;
+		},
+
+		convertURL : function(u, n, e) {
+			var t = this, s = t.settings;
+
+			// Use callback instead
+			if (s.urlconverter_callback)
+				return t.execCallback('urlconverter_callback', u, e, true, n);
+
+			// Don't convert link href since thats the CSS files that gets loaded into the editor also skip local file URLs
+			if (!s.convert_urls || (e && e.nodeName == 'LINK') || u.indexOf('file:') === 0)
+				return u;
+
+			// Convert to relative
+			if (s.relative_urls)
+				return t.documentBaseURI.toRelative(u);
+
+			// Convert to absolute
+			u = t.documentBaseURI.toAbsolute(u, s.remove_script_host);
+
+			return u;
+		},
+
+		addVisual : function(e) {
+			var t = this, s = t.settings;
+
+			e = e || t.getBody();
+
+			if (!is(t.hasVisual))
+				t.hasVisual = s.visual;
+
+			each(t.dom.select('table,a', e), function(e) {
+				var v;
+
+				switch (e.nodeName) {
+					case 'TABLE':
+						v = t.dom.getAttrib(e, 'border');
+
+						if (!v || v == '0') {
+							if (t.hasVisual)
+								t.dom.addClass(e, s.visual_table_class);
+							else
+								t.dom.removeClass(e, s.visual_table_class);
+						}
+
+						return;
+
+					case 'A':
+						v = t.dom.getAttrib(e, 'name');
+
+						if (v) {
+							if (t.hasVisual)
+								t.dom.addClass(e, 'mceItemAnchor');
+							else
+								t.dom.removeClass(e, 'mceItemAnchor');
+						}
+
+						return;
+				}
+			});
+
+			t.onVisualAid.dispatch(t, e, t.hasVisual);
+		},
+
+		remove : function() {
+			var t = this, e = t.getContainer();
+
+			t.removed = 1; // Cancels post remove event execution
+			t.hide();
+
+			t.execCallback('remove_instance_callback', t);
+			t.onRemove.dispatch(t);
+
+			// Clear all execCommand listeners this is required to avoid errors if the editor was removed inside another command
+			t.onExecCommand.listeners = [];
+
+			EditorManager.remove(t);
+			DOM.remove(e);
+		},
+
+		destroy : function(s) {
+			var t = this;
+
+			// One time is enough
+			if (t.destroyed)
+				return;
+
+			if (!s) {
+				tinymce.removeUnload(t.destroy);
+				tinyMCE.onBeforeUnload.remove(t._beforeUnload);
+
+				// Manual destroy
+				if (t.theme.destroy)
+					t.theme.destroy();
+
+				// Destroy controls, selection and dom
+				t.controlManager.destroy();
+				t.selection.destroy();
+				t.dom.destroy();
+
+				// Remove all events
+
+				// Don't clear the window or document if content editable
+				// is enabled since other instances might still be present
+				if (!t.settings.content_editable) {
+					Event.clear(t.getWin());
+					Event.clear(t.getDoc());
+				}
+
+				Event.clear(t.getBody());
+				Event.clear(t.formElement);
+			}
+
+			if (t.formElement) {
+				t.formElement.submit = t.formElement._mceOldSubmit;
+				t.formElement._mceOldSubmit = null;
+			}
+
+			t.contentAreaContainer = t.formElement = t.container = t.settings.content_element = t.bodyElement = t.contentDocument = t.contentWindow = null;
+
+			if (t.selection)
+				t.selection = t.selection.win = t.selection.dom = t.selection.dom.doc = null;
+
+			t.destroyed = 1;
+		},
+
+		// Internal functions
+
+		_addEvents : function() {
+			// 'focus', 'blur', 'dblclick', 'beforedeactivate', submit, reset
+			var t = this, i, s = t.settings, lo = {
+				mouseup : 'onMouseUp',
+				mousedown : 'onMouseDown',
+				click : 'onClick',
+				keyup : 'onKeyUp',
+				keydown : 'onKeyDown',
+				keypress : 'onKeyPress',
+				submit : 'onSubmit',
+				reset : 'onReset',
+				contextmenu : 'onContextMenu',
+				dblclick : 'onDblClick',
+				paste : 'onPaste' // Doesn't work in all browsers yet
+			};
+
+			function eventHandler(e, o) {
+				var ty = e.type;
+
+				// Don't fire events when it's removed
+				if (t.removed)
+					return;
+
+				// Generic event handler
+				if (t.onEvent.dispatch(t, e, o) !== false) {
+					// Specific event handler
+					t[lo[e.fakeType || e.type]].dispatch(t, e, o);
+				}
+			};
+
+			// Add DOM events
+			each(lo, function(v, k) {
+				switch (k) {
+					case 'contextmenu':
+						if (tinymce.isOpera) {
+							// Fake contextmenu on Opera
+							Event.add(t.getBody(), 'mousedown', function(e) {
+								if (e.ctrlKey) {
+									e.fakeType = 'contextmenu';
+									eventHandler(e);
+								}
+							});
+						} else
+							Event.add(t.getBody(), k, eventHandler);
+						break;
+
+					case 'paste':
+						Event.add(t.getBody(), k, function(e) {
+							var tx, h, el, r;
+
+							// Get plain text data
+							if (e.clipboardData)
+								tx = e.clipboardData.getData('text/plain');
+							else if (tinymce.isIE)
+								tx = t.getWin().clipboardData.getData('Text');
+
+							// Get HTML data
+							/*if (tinymce.isIE) {
+								el = DOM.add(DOM.doc.body, 'div', {style : 'visibility:hidden;overflow:hidden;position:absolute;width:1px;height:1px'});
+								r = DOM.doc.body.createTextRange();
+								r.moveToElementText(el);
+								r.execCommand('Paste');
+								h = el.innerHTML;
+								DOM.remove(el);
+							}*/
+
+							eventHandler(e, {text : tx, html : h});
+						});
+						break;
+
+					case 'submit':
+					case 'reset':
+						Event.add(t.getElement().form || DOM.getParent(t.id, 'form'), k, eventHandler);
+						break;
+
+					default:
+						Event.add(s.content_editable ? t.getBody() : t.getDoc(), k, eventHandler);
+				}
+			});
+
+			Event.add(s.content_editable ? t.getBody() : (isGecko ? t.getDoc() : t.getWin()), 'focus', function(e) {
+				t.focus(true);
+			});
+
+			
+			// Fixes bug where a specified document_base_uri could result in broken images
+			// This will also fix drag drop of images in Gecko
+			if (tinymce.isGecko) {
+				// Convert all images to absolute URLs
+/*				t.onSetContent.add(function(ed, o) {
+					each(ed.dom.select('img'), function(e) {
+						var v;
+
+						if (v = e.getAttribute('mce_src'))
+							e.src = t.documentBaseURI.toAbsolute(v);
+					})
+				});*/
+
+				Event.add(t.getDoc(), 'DOMNodeInserted', function(e) {
+					var v;
+
+					e = e.target;
+
+					if (e.nodeType === 1 && e.nodeName === 'IMG' && (v = e.getAttribute('mce_src')))
+						e.src = t.documentBaseURI.toAbsolute(v);
+				});
+			}
+
+			// Set various midas options in Gecko
+			if (isGecko) {
+				function setOpts() {
+					var t = this, d = t.getDoc(), s = t.settings;
+
+					if (isGecko) {
+						if (t._isHidden()) {
+							try {
+								if (!s.content_editable)
+									d.designMode = 'On';
+							} catch (ex) {
+								// Fails if it's hidden
+							}
+						}
+
+						try {
+							// Try new Gecko method
+							d.execCommand("styleWithCSS", 0, false);
+						} catch (ex) {
+							// Use old method
+							if (!t._isHidden())
+								try {d.execCommand("useCSS", 0, true);} catch (ex) {}
+						}
+
+						if (!s.table_inline_editing)
+							try {d.execCommand('enableInlineTableEditing', false, false);} catch (ex) {}
+
+						if (!s.object_resizing)
+							try {d.execCommand('enableObjectResizing', false, false);} catch (ex) {}
+					}
+				};
+
+				t.onBeforeExecCommand.add(setOpts);
+				t.onMouseDown.add(setOpts);
+			}
+
+			// Add node change handlers
+			t.onMouseUp.add(t.nodeChanged);
+			t.onClick.add(t.nodeChanged);
+			t.onKeyUp.add(function(ed, e) {
+				if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45 || e.keyCode == 46 || e.keyCode == 8 || e.ctrlKey)
+					t.nodeChanged();
+			});
+
+			// Add reset handler
+			t.onReset.add(function() {
+				t.setContent(t.startContent, {format : 'raw'});
+			});
+
+			if (t.getParam('tab_focus')) {
+				function tabCancel(ed, e) {
+					if (e.keyCode === 9)
+						return Event.cancel(e);
+				};
+
+				function tabHandler(ed, e) {
+					var x, i, f, el, v;
+
+					function find(d) {
+						f = DOM.getParent(ed.id, 'form');
+						el = f.elements;
+
+						if (f) {
+							each(el, function(e, i) {
+								if (e.id == ed.id) {
+									x = i;
+									return false;
+								}
+							});
+
+							if (d > 0) {
+								for (i = x + 1; i < el.length; i++) {
+									if (el[i].type != 'hidden')
+										return el[i];
+								}
+							} else {
+								for (i = x - 1; i >= 0; i--) {
+									if (el[i].type != 'hidden')
+										return el[i];
+								}
+							}
+						}
+
+						return null;
+					};
+
+					if (e.keyCode === 9) {
+						v = explode(ed.getParam('tab_focus'));
+
+						if (v.length == 1) {
+							v[1] = v[0];
+							v[0] = ':prev';
+						}
+
+						// Find element to focus
+						if (e.shiftKey) {
+							if (v[0] == ':prev')
+								el = find(-1);
+							else
+								el = DOM.get(v[0]);
+						} else {
+							if (v[1] == ':next')
+								el = find(1);
+							else
+								el = DOM.get(v[1]);
+						}
+
+						if (el) {
+							if (ed = EditorManager.get(el.id || el.name))
+								ed.focus();
+							else
+								window.setTimeout(function() {window.focus();el.focus();}, 10);
+
+							return Event.cancel(e);
+						}
+					}
+				};
+
+				t.onKeyUp.add(tabCancel);
+
+				if (isGecko) {
+					t.onKeyPress.add(tabHandler);
+					t.onKeyDown.add(tabCancel);
+				} else
+					t.onKeyDown.add(tabHandler);
+			}
+
+			// Add shortcuts
+			if (s.custom_shortcuts) {
+				if (s.custom_undo_redo_keyboard_shortcuts) {
+					t.addShortcut('ctrl+z', t.getLang('undo_desc'), 'Undo');
+					t.addShortcut('ctrl+y', t.getLang('redo_desc'), 'Redo');
+				}
+
+				// Add default shortcuts for gecko
+				if (isGecko) {
+					t.addShortcut('ctrl+b', t.getLang('bold_desc'), 'Bold');
+					t.addShortcut('ctrl+i', t.getLang('italic_desc'), 'Italic');
+					t.addShortcut('ctrl+u', t.getLang('underline_desc'), 'Underline');
+				}
+
+				// BlockFormat shortcuts keys
+				for (i=1; i<=6; i++)
+					t.addShortcut('ctrl+' + i, '', ['FormatBlock', false, '<h' + i + '>']);
+
+				t.addShortcut('ctrl+7', '', ['FormatBlock', false, '<p>']);
+				t.addShortcut('ctrl+8', '', ['FormatBlock', false, '<div>']);
+				t.addShortcut('ctrl+9', '', ['FormatBlock', false, '<address>']);
+
+				function find(e) {
+					var v = null;
+
+					if (!e.altKey && !e.ctrlKey && !e.metaKey)
+						return v;
+
+					each(t.shortcuts, function(o) {
+						if (o.ctrl != e.ctrlKey && (!tinymce.isMac || o.ctrl == e.metaKey))
+							return;
+
+						if (o.alt != e.altKey)
+							return;
+
+						if (o.shift != e.shiftKey)
+							return;
+
+						if (e.keyCode == o.keyCode || (e.charCode && e.charCode == o.charCode)) {
+							v = o;
+							return false;
+						}
+					});
+
+					return v;
+				};
+
+				t.onKeyUp.add(function(ed, e) {
+					var o = find(e);
+
+					if (o)
+						return Event.cancel(e);
+				});
+
+				t.onKeyPress.add(function(ed, e) {
+					var o = find(e);
+
+					if (o)
+						return Event.cancel(e);
+				});
+
+				t.onKeyDown.add(function(ed, e) {
+					var o = find(e);
+
+					if (o) {
+						o.func.call(o.scope);
+						return Event.cancel(e);
+					}
+				});
+			}
+
+			if (tinymce.isIE) {
+				// Fix so resize will only update the width and height attributes not the styles of an image
+				// It will also block mceItemNoResize items
+				Event.add(t.getDoc(), 'controlselect', function(e) {
+					var re = t.resizeInfo, cb;
+
+					e = e.target;
+
+					// Don't do this action for non image elements
+					if (e.nodeName !== 'IMG')
+						return;
+
+					if (re)
+						Event.remove(re.node, re.ev, re.cb);
+
+					if (!t.dom.hasClass(e, 'mceItemNoResize')) {
+						ev = 'resizeend';
+						cb = Event.add(e, ev, function(e) {
+							var v;
+
+							e = e.target;
+
+							if (v = t.dom.getStyle(e, 'width')) {
+								t.dom.setAttrib(e, 'width', v.replace(/[^0-9%]+/g, ''));
+								t.dom.setStyle(e, 'width', '');
+							}
+
+							if (v = t.dom.getStyle(e, 'height')) {
+								t.dom.setAttrib(e, 'height', v.replace(/[^0-9%]+/g, ''));
+								t.dom.setStyle(e, 'height', '');
+							}
+						});
+					} else {
+						ev = 'resizestart';
+						cb = Event.add(e, 'resizestart', Event.cancel, Event);
+					}
+
+					re = t.resizeInfo = {
+						node : e,
+						ev : ev,
+						cb : cb
+					};
+				});
+
+				t.onKeyDown.add(function(ed, e) {
+					switch (e.keyCode) {
+						case 8:
+							// Fix IE control + backspace browser bug
+							if (t.selection.getRng().item) {
+								t.selection.getRng().item(0).removeNode();
+								return Event.cancel(e);
+							}
+					}
+				});
+			}
+
+			if (tinymce.isOpera) {
+				t.onClick.add(function(ed, e) {
+					Event.prevent(e);
+				});
+			}
+
+			// Add custom undo/redo handlers
+			if (s.custom_undo_redo) {
+				function addUndo() {
+					t.undoManager.typing = 0;
+					t.undoManager.add();
+				};
+
+				// Add undo level on editor blur
+				if (tinymce.isIE) {
+					Event.add(t.getWin(), 'blur', function(e) {
+						var n;
+
+						// Check added for fullscreen bug
+						if (t.selection) {
+							n = t.selection.getNode();
+
+							// Add undo level is selection was lost to another document
+							if (!t.removed && n.ownerDocument && n.ownerDocument != t.getDoc())
+								addUndo();
+						}
+					});
+				} else {
+					Event.add(t.getDoc(), 'blur', function() {
+						if (t.selection && !t.removed)
+							addUndo();
+					});
+				}
+
+				t.onMouseDown.add(addUndo);
+
+				t.onKeyUp.add(function(ed, e) {
+					if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45 || e.ctrlKey) {
+						t.undoManager.typing = 0;
+						t.undoManager.add();
+					}
+				});
+
+				t.onKeyDown.add(function(ed, e) {
+					// Is caracter positon keys
+					if ((e.keyCode >= 33 && e.keyCode <= 36) || (e.keyCode >= 37 && e.keyCode <= 40) || e.keyCode == 13 || e.keyCode == 45) {
+						if (t.undoManager.typing) {
+							t.undoManager.add();
+							t.undoManager.typing = 0;
+						}
+
+						return;
+					}
+
+					if (!t.undoManager.typing) {
+						t.undoManager.add();
+						t.undoManager.typing = 1;
+					}
+				});
+			}
+		},
+
+		_convertInlineElements : function() {
+			var t = this, s = t.settings, dom = t.dom, v, e, na, st, sp;
+
+			function convert(ed, o) {
+				if (!s.inline_styles)
+					return;
+
+				if (o.get) {
+					each(t.dom.select('table,u,strike', o.node), function(n) {
+						switch (n.nodeName) {
+							case 'TABLE':
+								if (v = dom.getAttrib(n, 'height')) {
+									dom.setStyle(n, 'height', v);
+									dom.setAttrib(n, 'height', '');
+								}
+								break;
+
+							case 'U':
+							case 'STRIKE':
+								//sp = dom.create('span', {style : dom.getAttrib(n, 'style')});
+								n.style.textDecoration = n.nodeName == 'U' ? 'underline' : 'line-through';
+								dom.setAttrib(n, 'mce_style', '');
+								dom.setAttrib(n, 'mce_name', 'span');
+								break;
+						}
+					});
+				} else if (o.set) {
+					each(t.dom.select('table,span', o.node).reverse(), function(n) {
+						if (n.nodeName == 'TABLE') {
+							if (v = dom.getStyle(n, 'height'))
+								dom.setAttrib(n, 'height', v.replace(/[^0-9%]+/g, ''));
+						} else {
+							// Convert spans to elements
+							if (n.style.textDecoration == 'underline')
+								na = 'u';
+							else if (n.style.textDecoration == 'line-through')
+								na = 'strike';
+							else
+								na = '';
+
+							if (na) {
+								n.style.textDecoration = '';
+								dom.setAttrib(n, 'mce_style', '');
+
+								e = dom.create(na, {
+									style : dom.getAttrib(n, 'style')
+								});
+
+								dom.replace(e, n, 1);
+							}
+						}
+					});
+				}
+			};
+
+			t.onPreProcess.add(convert);
+
+			if (!s.cleanup_on_startup) {
+				t.onSetContent.add(function(ed, o) {
+					if (o.initial)
+						convert(t, {node : t.getBody(), set : 1});
+				});
+			}
+		},
+
+		_convertFonts : function() {
+			var t = this, s = t.settings, dom = t.dom, fz, fzn, sl, cl;
+
+			// No need
+			if (!s.inline_styles)
+				return;
+
+			// Font pt values and font size names
+			fz = [8, 10, 12, 14, 18, 24, 36];
+			fzn = ['xx-small', 'x-small','small','medium','large','x-large', 'xx-large'];
+
+			if (sl = s.font_size_style_values)
+				sl = explode(sl);
+
+			if (cl = s.font_size_classes)
+				cl = explode(cl);
+
+			function convertToFonts(no) {
+				var n, f, nl, x, i, v, st;
+
+				// Convert spans to fonts on non WebKit browsers
+				if (tinymce.isWebKit || !s.inline_styles)
+					return;
+
+				nl = t.dom.select('span', no);
+				for (x = nl.length - 1; x >= 0; x--) {
+					n = nl[x];
+
+					f = dom.create('font', {
+						color : dom.toHex(dom.getStyle(n, 'color')),
+						face : dom.getStyle(n, 'fontFamily'),
+						style : dom.getAttrib(n, 'style'),
+						'class' : dom.getAttrib(n, 'class')
+					});
+
+					// Clear color and font family
+					st = f.style;
+					if (st.color || st.fontFamily) {
+						st.color = st.fontFamily = '';
+						dom.setAttrib(f, 'mce_style', ''); // Remove cached style data
+					}
+
+					if (sl) {
+						i = inArray(sl, dom.getStyle(n, 'fontSize'));
+
+						if (i != -1) {
+							dom.setAttrib(f, 'size', '' + (i + 1 || 1));
+							//f.style.fontSize = '';
+						}
+					} else if (cl) {
+						i = inArray(cl, dom.getAttrib(n, 'class'));
+						v = dom.getStyle(n, 'fontSize');
+
+						if (i == -1 && v.indexOf('pt') > 0)
+							i = inArray(fz, parseInt(v));
+
+						if (i == -1)
+							i = inArray(fzn, v);
+
+						if (i != -1) {
+							dom.setAttrib(f, 'size', '' + (i + 1 || 1));
+							f.style.fontSize = '';
+						}
+					}
+
+					if (f.color || f.face || f.size) {
+						f.style.fontFamily = '';
+						dom.setAttrib(f, 'mce_style', '');
+						dom.replace(f, n, 1);
+					}
+
+					f = n = null;
+				}
+			};
+
+			// Run on setup
+			t.onSetContent.add(function(ed, o) {
+				convertToFonts(ed.getBody());
+			});
+
+			// Run on cleanup
+			t.onPreProcess.add(function(ed, o) {
+				var n, sp, nl, x;
+
+				// Keep unit tests happy
+				if (!s.inline_styles)
+					return;
+
+				if (o.get) {
+					nl = t.dom.select('font', o.node);
+					for (x = nl.length - 1; x >= 0; x--) {
+						n = nl[x];
+
+						sp = dom.create('span', {
+							style : dom.getAttrib(n, 'style'),
+							'class' : dom.getAttrib(n, 'class')
+						});
+
+						dom.setStyles(sp, {
+							fontFamily : dom.getAttrib(n, 'face'),
+							color : dom.getAttrib(n, 'color'),
+							backgroundColor : n.style.backgroundColor
+						});
+
+						if (n.size) {
+							if (sl)
+								dom.setStyle(sp, 'fontSize', sl[parseInt(n.size) - 1]);
+							else
+								dom.setAttrib(sp, 'class', cl[parseInt(n.size) - 1]);
+						}
+
+						dom.setAttrib(sp, 'mce_style', '');
+						dom.replace(sp, n, 1);
+					}
+				}
+			});
+		},
+
+		_isHidden : function() {
+			var s;
+
+			if (!isGecko)
+				return 0;
+
+			// Weird, wheres that cursor selection?
+			s = this.selection.getSel();
+			return (!s || !s.rangeCount || s.rangeCount == 0);
+		},
+
+		// Fix for bug #1867292
+		_fixNesting : function(s) {
+			var d = [], i;
+
+			s = s.replace(/<(\/)?([^\s>]+)[^>]*?>/g, function(a, b, c) {
+				var e;
+
+				// Handle end element
+				if (b === '/') {
+					if (!d.length)
+						return '';
+
+					if (c !== d[d.length - 1].tag) {
+						for (i=d.length - 1; i>=0; i--) {
+							if (d[i].tag === c) {
+								d[i].close = 1;
+								break;
+							}
+						}
+
+						return '';
+					} else {
+						d.pop();
+
+						if (d.length && d[d.length - 1].close) {
+							a = a + '</' + d[d.length - 1].tag + '>';
+							d.pop();
+						}
+					}
+				} else {
+					// Ignore these
+					if (/^(br|hr|input|meta|img|link|param)$/i.test(c))
+						return a;
+
+					// Ignore closed ones
+					if (/\/>$/.test(a))
+						return a;
+
+					d.push({tag : c}); // Push start element
+				}
+
+				return a;
+			});
+
+			// End all open tags
+			for (i=d.length - 1; i>=0; i--)
+				s += '</' + d[i].tag + '>';
+
+			return s;
+		}
+
+		});
+})();
+
+/* file:jscripts/tiny_mce/classes/EditorCommands.js */
+
+(function() {
+	var each = tinymce.each, isIE = tinymce.isIE, isGecko = tinymce.isGecko, isOpera = tinymce.isOpera, isWebKit = tinymce.isWebKit;
+
+	tinymce.create('tinymce.EditorCommands', {
+		EditorCommands : function(ed) {
+			this.editor = ed;
+		},
+
+		execCommand : function(cmd, ui, val) {
+			var t = this, ed = t.editor, f;
+
+			switch (cmd) {
+				case 'Cut':
+				case 'Copy':
+				case 'Paste':
+					try {
+						ed.getDoc().execCommand(cmd, ui, val);
+					} catch (ex) {
+						if (isGecko) {
+							ed.windowManager.confirm(ed.getLang('clipboard_msg'), function(s) {
+								if (s)
+									window.open('http://www.mozilla.org/editor/midasdemo/securityprefs.html', 'mceExternal');
+							});
+						} else
+							ed.windowManager.alert(ed.getLang('clipboard_no_support'));
+					}
+
+					return true;
+
+				// Ignore these
+				case 'mceResetDesignMode':
+				case 'mceBeginUndoLevel':
+					return true;
+
+				// Ignore these
+				case 'unlink':
+					t.UnLink();
+					return true;
+
+				// Bundle these together
+				case 'JustifyLeft':
+				case 'JustifyCenter':
+				case 'JustifyRight':
+				case 'JustifyFull':
+					t.mceJustify(cmd, cmd.substring(7).toLowerCase());
+					return true;
+
+				case 'mceEndUndoLevel':
+				case 'mceAddUndoLevel':
+					ed.undoManager.add();
+					return true;
+
+				default:
+					f = this[cmd];
+
+					if (f) {
+						f.call(this, ui, val);
+						return true;
+					}
+			}
+
+			return false;
+		},
+
+		Indent : function() {
+			var ed = this.editor, d = ed.dom, s = ed.selection, e, iv, iu;
+
+			// Setup indent level
+			iv = ed.settings.indentation;
+			iu = /[a-z%]+$/i.exec(iv);
+			iv = parseInt(iv);
+
+			if (ed.settings.inline_styles && (!this.queryStateInsertUnorderedList() && !this.queryStateInsertOrderedList())) {
+				each(this._getSelectedBlocks(), function(e) {
+					d.setStyle(e, 'paddingLeft', (parseInt(e.style.paddingLeft || 0) + iv) + iu);
+				});
+
+				return;
+			}
+
+			ed.getDoc().execCommand('Indent', false, null);
+
+			if (isIE) {
+				d.getParent(s.getNode(), function(n) {
+					if (n.nodeName == 'BLOCKQUOTE') {
+						n.dir = n.style.cssText = '';
+					}
+				});
+			}
+		},
+
+		Outdent : function() {
+			var ed = this.editor, d = ed.dom, s = ed.selection, e, v, iv, iu;
+
+			// Setup indent level
+			iv = ed.settings.indentation;
+			iu = /[a-z%]+$/i.exec(iv);
+			iv = parseInt(iv);
+
+			if (ed.settings.inline_styles && (!this.queryStateInsertUnorderedList() && !this.queryStateInsertOrderedList())) {
+				each(this._getSelectedBlocks(), function(e) {
+					v = Math.max(0, parseInt(e.style.paddingLeft || 0) - iv);
+					d.setStyle(e, 'paddingLeft', v ? v + iu : '');
+				});
+
+				return;
+			}
+
+			ed.getDoc().execCommand('Outdent', false, null);
+		},
+
+		mceSetAttribute : function(u, v) {
+			var ed = this.editor, d = ed.dom, e;
+
+			if (e = d.getParent(ed.selection.getNode(), d.isBlock))
+				d.setAttrib(e, v.name, v.value);
+		},
+
+		mceSetContent : function(u, v) {
+			this.editor.setContent(v);
+		},
+
+		mceToggleVisualAid : function() {
+			var ed = this.editor;
+
+			ed.hasVisual = !ed.hasVisual;
+			ed.addVisual();
+		},
+
+		mceReplaceContent : function(u, v) {
+			var s = this.editor.selection;
+
+			s.setContent(v.replace(/\{\$selection\}/g, s.getContent({format : 'text'})));
+		},
+
+		mceInsertLink : function(u, v) {
+			var ed = this.editor, s = ed.selection, e = ed.dom.getParent(s.getNode(), 'A');
+
+			if (tinymce.is(v, 'string'))
+				v = {href : v};
+
+			function set(e) {
+				each(v, function(v, k) {
+					ed.dom.setAttrib(e, k, v);
+				});
+			};
+
+			if (!e) {
+				ed.execCommand('CreateLink', false, 'javascript:mctmp(0);');
+				each(ed.dom.select('a'), function(e) {
+					if (e.href == 'javascript:mctmp(0);')
+						set(e);
+				});
+			} else {
+				if (v.href)
+					set(e);
+				else
+					ed.dom.remove(e, 1);
+			}
+		},
+
+		UnLink : function() {
+			var ed = this.editor, s = ed.selection;
+
+			if (s.isCollapsed())
+				s.select(s.getNode());
+
+			ed.getDoc().execCommand('unlink', false, null);
+			s.collapse(0);
+		},
+
+		FontName : function(u, v) {
+			var t = this, ed = t.editor, s = ed.selection, e;
+
+			if (!v) {
+				if (s.isCollapsed())
+					s.select(s.getNode());
+
+				t.RemoveFormat();
+			} else
+				ed.getDoc().execCommand('FontName', false, v);
+		},
+
+		FontSize : function(u, v) {
+			var ed = this.editor, s = ed.settings, fz = tinymce.explode(s.font_size_style_values), fzc = tinymce.explode(s.font_size_classes), h, bm;
+
+			// Remove style sizes
+			each(ed.dom.select('font'), function(e) {
+				e.style.fontSize = '';
+			});
+
+			// Let the browser add new size it will remove unneded ones in some browsers
+			ed.getDoc().execCommand('FontSize', false, v);
+
+			// Add style values
+			if (s.inline_styles) {
+				each(ed.dom.select('font'), function(e) {
+					// Try remove redundant font elements
+					if (!e.size || e.parentNode.nodeName == 'FONT' && e.size == e.parentNode.size) {
+						if (!bm)
+							bm = ed.selection.getBookmark();
+
+						ed.dom.remove(e, 1);
+						return;
+					}
+
+					// Setup font size based on font size value
+					if (v = e.size) {
+						if (fzc && fzc.length > 0)
+							ed.dom.setAttrib(e, 'class', fzc[parseInt(v) - 1]);
+						else
+							ed.dom.setStyle(e, 'fontSize', fz[parseInt(v) - 1]);
+					}
+				});
+			}
+
+			ed.selection.moveToBookmark(bm);
+		},
+
+		queryCommandValue : function(c) {
+			var f = this['queryValue' + c];
+
+			if (f)
+				return f.call(this, c);
+
+			return false;
+		},
+
+		queryCommandState : function(cmd) {
+			var f;
+
+			switch (cmd) {
+				// Bundle these together
+				case 'JustifyLeft':
+				case 'JustifyCenter':
+				case 'JustifyRight':
+				case 'JustifyFull':
+					return this.queryStateJustify(cmd, cmd.substring(7).toLowerCase());
+
+				default:
+					if (f = this['queryState' + cmd])
+						return f.call(this, cmd);
+			}
+
+			return -1;
+		},
+
+		_queryState : function(c) {
+			try {
+				return this.editor.getDoc().queryCommandState(c);
+			} catch (ex) {
+				// Ignore exception
+			}
+		},
+
+		_queryVal : function(c) {
+			try {
+				return this.editor.getDoc().queryCommandValue(c);
+			} catch (ex) {
+				// Ignore exception
+			}
+		},
+
+		queryValueFontSize : function() {
+			var ed = this.editor, v = 0, p;
+
+			if (isOpera || isWebKit) {
+				if (p = ed.dom.getParent(ed.selection.getNode(), 'FONT'))
+					v = p.size;
+
+				return v;
+			}
+
+			return this._queryVal('FontSize');
+		},
+
+		queryValueFontName : function() {
+			var ed = this.editor, v = 0, p;
+
+			if (p = ed.dom.getParent(ed.selection.getNode(), 'FONT'))
+				v = p.face;
+
+			if (!v)
+				v = this._queryVal('FontName');
+
+			return v;
+		},
+
+		mceJustify : function(c, v) {
+			var ed = this.editor, se = ed.selection, n = se.getNode(), nn = n.nodeName, bl, nb, dom = ed.dom, rm;
+
+			if (ed.settings.inline_styles && this.queryStateJustify(c, v))
+				rm = 1;
+
+			bl = dom.getParent(n, ed.dom.isBlock);
+
+			if (nn == 'IMG') {
+				if (v == 'full')
+					return;
+
+				if (rm) {
+					if (v == 'center')
+						dom.setStyle(n.parentNode, 'textAlign', '');
+
+					dom.setStyle(n, 'float', '');
+					this.mceRepaint();
+					return;
+				}
+
+				if (v == 'center') {
+					// Do not change table elements
+					if (/^(TD|TH)$/.test(bl.nodeName))
+						bl = 0;
+
+					if (!bl || bl.childNodes.length > 1) {
+						nb = dom.create('p');
+						nb.appendChild(n.cloneNode(false));
+
+						if (bl)
+							dom.insertAfter(nb, bl);
+						else
+							dom.insertAfter(nb, n);
+
+						dom.remove(n);
+						n = nb.firstChild;
+						bl = nb;
+					}
+
+					dom.setStyle(bl, 'textAlign', v);
+					dom.setStyle(n, 'float', '');
+				} else {
+					dom.setStyle(n, 'float', v);
+					dom.setStyle(n.parentNode, 'textAlign', '');
+				}
+
+				this.mceRepaint();
+				return;
+			}
+
+			// Handle the alignment outselfs, less quirks in all browsers
+			if (ed.settings.inline_styles && ed.settings.forced_root_block) {
+				if (rm)
+					v = '';
+
+				each(this._getSelectedBlocks(dom.getParent(se.getStart(), dom.isBlock), dom.getParent(se.getEnd(), dom.isBlock)), function(e) {
+					dom.setAttrib(e, 'align', '');
+					dom.setStyle(e, 'textAlign', v == 'full' ? 'justify' : v);
+				});
+
+				return;
+			} else if (!rm)
+				ed.getDoc().execCommand(c, false, null);
+
+			if (ed.settings.inline_styles) {
+				if (rm) {
+					dom.getParent(ed.selection.getNode(), function(n) {
+						if (n.style && n.style.textAlign)
+							dom.setStyle(n, 'textAlign', '');
+					});
+
+					return;
+				}
+
+				each(dom.select('*'), function(n) {
+					var v = n.align;
+
+					if (v) {
+						if (v == 'full')
+							v = 'justify';
+
+						dom.setStyle(n, 'textAlign', v);
+						dom.setAttrib(n, 'align', '');
+					}
+				});
+			}
+		},
+
+		mceSetCSSClass : function(u, v) {
+			this.mceSetStyleInfo(0, {command : 'setattrib', name : 'class', value : v});
+		},
+
+		getSelectedElement : function() {
+			var t = this, ed = t.editor, dom = ed.dom, se = ed.selection, r = se.getRng(), r1, r2, sc, ec, so, eo, e, sp, ep, re;
+
+			if (se.isCollapsed() || r.item)
+				return se.getNode();
+
+			// Setup regexp
+			re = ed.settings.merge_styles_invalid_parents;
+			if (tinymce.is(re, 'string'))
+				re = new RegExp(re, 'i');
+
+			if (isIE) {
+				r1 = r.duplicate();
+				r1.collapse(true);
+				sc = r1.parentElement();
+
+				r2 = r.duplicate();
+				r2.collapse(false);
+				ec = r2.parentElement();
+
+				if (sc != ec) {
+					r1.move('character', 1);
+					sc = r1.parentElement();
+				}
+
+				if (sc == ec) {
+					r1 = r.duplicate();
+					r1.moveToElementText(sc);
+
+					if (r1.compareEndPoints('StartToStart', r) == 0 && r1.compareEndPoints('EndToEnd', r) == 0)
+						return re && re.test(sc.nodeName) ? null : sc;
+				}
+			} else {
+				function getParent(n) {
+					return dom.getParent(n, function(n) {return n.nodeType == 1;});
+				};
+
+				sc = r.startContainer;
+				ec = r.endContainer;
+				so = r.startOffset;
+				eo = r.endOffset;
+
+				if (!r.collapsed) {
+					if (sc == ec) {
+						if (so - eo < 2) {
+							if (sc.hasChildNodes()) {
+								sp = sc.childNodes[so];
+								return re && re.test(sp.nodeName) ? null : sp;
+							}
+						}
+					}
+				}
+
+				if (sc.nodeType != 3 || ec.nodeType != 3)
+					return null;
+
+				if (so == 0) {
+					sp = getParent(sc);
+
+					if (sp && sp.firstChild != sc)
+						sp = null;
+				}
+
+				if (so == sc.nodeValue.length) {
+					e = sc.nextSibling;
+
+					if (e && e.nodeType == 1)
+						sp = sc.nextSibling;
+				}
+
+				if (eo == 0) {
+					e = ec.previousSibling;
+
+					if (e && e.nodeType == 1)
+						ep = e;
+				}
+
+				if (eo == ec.nodeValue.length) {
+					ep = getParent(ec);
+
+					if (ep && ep.lastChild != ec)
+						ep = null;
+				}
+
+				// Same element
+				if (sp == ep)
+					return re && sp && re.test(sp.nodeName) ? null : sp;
+			}
+
+			return null;
+		},
+
+		InsertHorizontalRule : function() {
+			// Fix for Gecko <hr size="1" /> issue and IE bug rep(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");
+			if (isGecko || isIE)
+				this.editor.selection.setContent('<hr />');
+			else
+				this.editor.getDoc().execCommand('InsertHorizontalRule', false, '');
+		},
+
+		RemoveFormat : function() {
+			var t = this, ed = t.editor, s = ed.selection, b;
+
+			// Safari breaks tables
+			if (isWebKit)
+				s.setContent(s.getContent({format : 'raw'}).replace(/(<(span|b|i|strong|em|strike) [^>]+>|<(span|b|i|strong|em|strike)>|<\/(span|b|i|strong|em|strike)>|)/g, ''), {format : 'raw'});
+			else
+				ed.getDoc().execCommand('RemoveFormat', false, null);
+
+			t.mceSetStyleInfo(0, {command : 'removeformat'});
+			ed.addVisual();
+		},
+
+		mceSetStyleInfo : function(u, v) {
+			var t = this, ed = t.editor, d = ed.getDoc(), dom = ed.dom, e, b, s = ed.selection, nn = v.wrapper || 'span', b = s.getBookmark(), re;
+
+			function set(n, e) {
+				if (n.nodeType == 1) {
+					switch (v.command) {
+						case 'setattrib':
+							return dom.setAttrib(n, v.name, v.value);
+
+						case 'setstyle':
+							return dom.setStyle(n, v.name, v.value);
+
+						case 'removeformat':
+							return dom.setAttrib(n, 'class', '');
+					}
+				}
+			};
+
+			// Setup regexp
+			re = ed.settings.merge_styles_invalid_parents;
+			if (tinymce.is(re, 'string'))
+				re = new RegExp(re, 'i');
+
+			// Set style info on selected element
+			if (e = t.getSelectedElement())
+				set(e, 1);
+			else {
+				// Generate wrappers and set styles on them
+				d.execCommand('FontName', false, '__');
+				each(isWebKit ? dom.select('span') : dom.select('font'), function(n) {
+					var sp, e;
+
+					if (dom.getAttrib(n, 'face') == '__' || n.style.fontFamily === '__') {
+						sp = dom.create(nn, {mce_new : '1'});
+
+						set(sp);
+
+						each (n.childNodes, function(n) {
+							sp.appendChild(n.cloneNode(true));
+						});
+
+						dom.replace(sp, n);
+					}
+				});
+			}
+
+			// Remove wrappers inside new ones
+			each(dom.select(nn).reverse(), function(n) {
+				var p = n.parentNode;
+
+				// Check if it's an old span in a new wrapper
+				if (!dom.getAttrib(n, 'mce_new')) {
+					// Find new wrapper
+					p = dom.getParent(n, function(n) {
+						return n.nodeType == 1 && dom.getAttrib(n, 'mce_new');
+					});
+
+					if (p)
+						dom.remove(n, 1);
+				}
+			});
+
+			// Merge wrappers with parent wrappers
+			each(dom.select(nn).reverse(), function(n) {
+				var p = n.parentNode;
+
+				if (!p || !dom.getAttrib(n, 'mce_new'))
+					return;
+
+				// Has parent of the same type and only child
+				if (p.nodeName == nn.toUpperCase() && p.childNodes.length == 1)
+					return dom.remove(p, 1);
+
+				// Has parent that is more suitable to have the class and only child
+				if (n.nodeType == 1 && (!re || !re.test(p.nodeName)) && p.childNodes.length == 1) {
+					set(p); // Set style info on parent instead
+					dom.setAttrib(n, 'class', '');
+				}
+			});
+
+			// Remove empty wrappers
+			each(dom.select(nn).reverse(), function(n) {
+				if (dom.getAttrib(n, 'mce_new') || (dom.getAttribs(n).length <= 1 && n.className === '')) {
+					if (!dom.getAttrib(n, 'class') && !dom.getAttrib(n, 'style'))
+						return dom.remove(n, 1);
+
+					dom.setAttrib(n, 'mce_new', ''); // Remove mce_new marker
+				}
+			});
+
+			s.moveToBookmark(b);
+		},
+
+		queryStateJustify : function(c, v) {
+			var ed = this.editor, n = ed.selection.getNode(), dom = ed.dom;
+
+			if (n && n.nodeName == 'IMG') {
+				if (dom.getStyle(n, 'float') == v)
+					return 1;
+
+				return n.parentNode.style.textAlign == v;
+			}
+
+			n = dom.getParent(ed.selection.getStart(), function(n) {
+				return n.nodeType == 1 && n.style.textAlign;
+			});
+
+			if (v == 'full')
+				v = 'justify';
+
+			if (ed.settings.inline_styles)
+				return (n && n.style.textAlign == v);
+
+			return this._queryState(c);
+		},
+
+		HiliteColor : function(ui, val) {
+			var t = this, ed = t.editor, d = ed.getDoc();
+
+			function set(s) {
+				if (!isGecko)
+					return;
+
+				try {
+					// Try new Gecko method
+					d.execCommand("styleWithCSS", 0, s);
+				} catch (ex) {
+					// Use old
+					d.execCommand("useCSS", 0, !s);
+				}
+			};
+
+			if (isGecko || isOpera) {
+				set(true);
+				d.execCommand('hilitecolor', false, val);
+				set(false);
+			} else
+				d.execCommand('BackColor', false, val);
+		},
+
+		Undo : function() {
+			var ed = this.editor;
+
+			if (ed.settings.custom_undo_redo) {
+				ed.undoManager.undo();
+				ed.nodeChanged();
+			} else
+				ed.getDoc().execCommand('Undo', false, null);
+		},
+
+		Redo : function() {
+			var ed = this.editor;
+
+			if (ed.settings.custom_undo_redo) {
+				ed.undoManager.redo();
+				ed.nodeChanged();
+			} else
+				ed.getDoc().execCommand('Redo', false, null);
+		},
+
+		FormatBlock : function(ui, val) {
+			var t = this, ed = t.editor, s = ed.selection, dom = ed.dom, bl, nb, b;
+
+			function isBlock(n) {
+				return /^(P|DIV|H[1-6]|ADDRESS|BLOCKQUOTE|PRE)$/.test(n.nodeName);
+			};
+
+			bl = dom.getParent(s.getNode(), function(n) {
+				return isBlock(n);
+			});
+
+			// IE has an issue where it removes the parent div if you change format on the paragrah in <div><p>Content</p></div>
+			// FF and Opera doesn't change parent DIV elements if you switch format
+			if (bl) {
+				if ((isIE && isBlock(bl.parentNode)) || bl.nodeName == 'DIV') {
+					// Rename block element
+					nb = ed.dom.create(val);
+
+					each(dom.getAttribs(bl), function(v) {
+						dom.setAttrib(nb, v.nodeName, dom.getAttrib(bl, v.nodeName));
+					});
+
+					b = s.getBookmark();
+					dom.replace(nb, bl, 1);
+					s.moveToBookmark(b);
+					ed.nodeChanged();
+					return;
+				}
+			}
+
+			val = ed.settings.forced_root_block ? (val || '<p>') : val;
+
+			if (val.indexOf('<') == -1)
+				val = '<' + val + '>';
+
+			if (tinymce.isGecko)
+				val = val.replace(/<(div|blockquote|code|dt|dd|dl|samp)>/gi, '$1');
+
+			ed.getDoc().execCommand('FormatBlock', false, val);
+		},
+
+		mceCleanup : function() {
+			var ed = this.editor, s = ed.selection, b = s.getBookmark();
+			ed.setContent(ed.getContent());
+			s.moveToBookmark(b);
+		},
+
+		mceRemoveNode : function(ui, val) {
+			var ed = this.editor, s = ed.selection, b, n = val || s.getNode();
+
+			// Make sure that the body node isn't removed
+			if (n == ed.getBody())
+				return;
+
+			b = s.getBookmark();
+			ed.dom.remove(n, 1);
+			s.moveToBookmark(b);
+			ed.nodeChanged();
+		},
+
+		mceSelectNodeDepth : function(ui, val) {
+			var ed = this.editor, s = ed.selection, c = 0;
+
+			ed.dom.getParent(s.getNode(), function(n) {
+				if (n.nodeType == 1 && c++ == val) {
+					s.select(n);
+					ed.nodeChanged();
+					return false;
+				}
+			}, ed.getBody());
+		},
+
+		mceSelectNode : function(u, v) {
+			this.editor.selection.select(v);
+		},
+
+		mceInsertContent : function(ui, val) {
+			this.editor.selection.setContent(val);
+		},
+
+		mceInsertRawHTML : function(ui, val) {
+			var ed = this.editor;
+
+			ed.selection.setContent('tiny_mce_marker');
+			ed.setContent(ed.getContent().replace(/tiny_mce_marker/g, val));
+		},
+
+		mceRepaint : function() {
+			var s, b, e = this.editor;
+
+			if (tinymce.isGecko) {
+				try {
+					s = e.selection;
+					b = s.getBookmark(true);
+
+					if (s.getSel())
+						s.getSel().selectAllChildren(e.getBody());
+
+					s.collapse(true);
+					s.moveToBookmark(b);
+				} catch (ex) {
+					// Ignore
+				}
+			}
+		},
+
+		queryStateUnderline : function() {
+			var ed = this.editor, n = ed.selection.getNode();
+
+			if (n && n.nodeName == 'A')
+				return false;
+
+			return this._queryState('Underline');
+		},
+
+		queryStateOutdent : function() {
+			var ed = this.editor, n;
+
+			if (ed.settings.inline_styles) {
+				if ((n = ed.dom.getParent(ed.selection.getStart(), ed.dom.isBlock)) && parseInt(n.style.paddingLeft) > 0)
+					return true;
+
+				if ((n = ed.dom.getParent(ed.selection.getEnd(), ed.dom.isBlock)) && parseInt(n.style.paddingLeft) > 0)
+					return true;
+			} else
+				return !!ed.dom.getParent(ed.selection.getNode(), 'BLOCKQUOTE');
+
+			return this.queryStateInsertUnorderedList() || this.queryStateInsertOrderedList();
+		},
+
+		queryStateInsertUnorderedList : function() {
+			return this.editor.dom.getParent(this.editor.selection.getNode(), 'UL');
+		},
+
+		queryStateInsertOrderedList : function() {
+			return this.editor.dom.getParent(this.editor.selection.getNode(), 'OL');
+		},
+
+		queryStatemceBlockQuote : function() {
+			return !!this.editor.dom.getParent(this.editor.selection.getStart(), function(n) {return n.nodeName === 'BLOCKQUOTE';});
+		},
+
+		mceBlockQuote : function() {
+			var t = this, ed = t.editor, s = ed.selection, dom = ed.dom, sb, eb, n, bm, bq, r, bq2, i, nl;
+
+			function getBQ(e) {
+				return dom.getParent(e, function(n) {return n.nodeName === 'BLOCKQUOTE';});
+			};
+
+			// Get start/end block
+			sb = dom.getParent(s.getStart(), dom.isBlock);
+			eb = dom.getParent(s.getEnd(), dom.isBlock);
+
+			// Remove blockquote(s)
+			if (bq = getBQ(sb)) {
+				if (sb != eb || sb.childNodes.length > 1 || (sb.childNodes.length == 1 && sb.firstChild.nodeName != 'BR'))
+					bm = s.getBookmark();
+
+				// Move all elements after the end block into new bq
+				if (getBQ(eb)) {
+					bq2 = bq.cloneNode(false);
+
+					while (n = eb.nextSibling)
+						bq2.appendChild(n.parentNode.removeChild(n));
+				}
+
+				// Add new bq after
+				if (bq2)
+					dom.insertAfter(bq2, bq);
+
+				// Move all selected blocks after the current bq
+				nl = t._getSelectedBlocks(sb, eb);
+				for (i = nl.length - 1; i >= 0; i--) {
+					dom.insertAfter(nl[i], bq);
+				}
+
+				// Empty bq, then remove it
+				if (/^\s*$/.test(bq.innerHTML))
+					dom.remove(bq, 1); // Keep children so boomark restoration works correctly
+
+				// Empty bq, then remote it
+				if (bq2 && /^\s*$/.test(bq2.innerHTML))
+					dom.remove(bq2, 1); // Keep children so boomark restoration works correctly
+
+				if (!bm) {
+					// Move caret inside empty block element
+					if (!isIE) {
+						r = ed.getDoc().createRange();
+						r.setStart(sb, 0);
+						r.setEnd(sb, 0);
+						s.setRng(r);
+					} else {
+						s.select(sb);
+						s.collapse(0);
+
+						// IE misses the empty block some times element so we must move back the caret
+						if (dom.getParent(s.getStart(), dom.isBlock) != sb) {
+							r = s.getRng();
+							r.move('character', -1);
+							r.select();
+						}
+					}
+				} else
+					t.editor.selection.moveToBookmark(bm);
+
+				return;
+			}
+
+			// Since IE can start with a totally empty document we need to add the first bq and paragraph
+			if (isIE && !sb && !eb) {
+				t.editor.getDoc().execCommand('Indent');
+				n = getBQ(s.getNode());
+				n.style.margin = n.dir = ''; // IE adds margin and dir to bq
+				return;
+			}
+
+			if (!sb || !eb)
+				return;
+
+			// If empty paragraph node then do not use bookmark
+			if (sb != eb || sb.childNodes.length > 1 || (sb.childNodes.length == 1 && sb.firstChild.nodeName != 'BR'))
+				bm = s.getBookmark();
+
+			// Move selected block elements into a bq
+			each(t._getSelectedBlocks(getBQ(s.getStart()), getBQ(s.getEnd())), function(e) {
+				// Found existing BQ add to this one
+				if (e.nodeName == 'BLOCKQUOTE' && !bq) {
+					bq = e;
+					return;
+				}
+
+				// No BQ found, create one
+				if (!bq) {
+					bq = dom.create('blockquote');
+					e.parentNode.insertBefore(bq, e);
+				}
+
+				// Add children from existing BQ
+				if (e.nodeName == 'BLOCKQUOTE' && bq) {
+					n = e.firstChild;
+
+					while (n) {
+						bq.appendChild(n.cloneNode(true));
+						n = n.nextSibling;
+					}
+
+					dom.remove(e);
+					return;
+				}
+
+				// Add non BQ element to BQ
+				bq.appendChild(dom.remove(e));
+			});
+
+			if (!bm) {
+				// Move caret inside empty block element
+				if (!isIE) {
+					r = ed.getDoc().createRange();
+					r.setStart(sb, 0);
+					r.setEnd(sb, 0);
+					s.setRng(r);
+				} else {
+					s.select(sb);
+					s.collapse(1);
+				}
+			} else
+				s.moveToBookmark(bm);
+		},
+/*
+		_mceBlockQuote : function() {
+			var t = this, s = t.editor.selection, b = s.getBookmark(), bq, dom = t.editor.dom;
+
+			function findBQ(e) {
+				return dom.getParent(e, function(n) {return n.nodeName === 'BLOCKQUOTE';});
+			};
+
+			// Remove blockquote(s)
+			if (findBQ(s.getStart())) {
+				each(t._getSelectedBlocks(findBQ(s.getStart()), findBQ(s.getEnd())), function(e) {
+					// Found BQ lets remove it
+					if (e.nodeName == 'BLOCKQUOTE')
+						dom.remove(e, 1);
+				});
+
+				t.editor.selection.moveToBookmark(b);
+				return;
+			}
+
+			each(t._getSelectedBlocks(findBQ(s.getStart()), findBQ(s.getEnd())), function(e) {
+				var n;
+
+				// Found existing BQ add to this one
+				if (e.nodeName == 'BLOCKQUOTE' && !bq) {
+					bq = e;
+					return;
+				}
+
+				// No BQ found, create one
+				if (!bq) {
+					bq = dom.create('blockquote');
+					e.parentNode.insertBefore(bq, e);
+				}
+
+				// Add children from existing BQ
+				if (e.nodeName == 'BLOCKQUOTE' && bq) {
+					n = e.firstChild;
+
+					while (n) {
+						bq.appendChild(n.cloneNode(true));
+						n = n.nextSibling;
+					}
+
+					dom.remove(e);
+
+					return;
+				}
+
+				// Add non BQ element to BQ
+				bq.appendChild(dom.remove(e));
+			});
+
+			t.editor.selection.moveToBookmark(b);
+		},
+*/
+		_getSelectedBlocks : function(st, en) {
+			var ed = this.editor, dom = ed.dom, s = ed.selection, sb, eb, n, bl = [];
+
+			sb = dom.getParent(st || s.getStart(), dom.isBlock);
+			eb = dom.getParent(en || s.getEnd(), dom.isBlock);
+
+			if (sb)
+				bl.push(sb);
+
+			if (sb && eb && sb != eb) {
+				n = sb;
+
+				while ((n = n.nextSibling) && n != eb) {
+					if (dom.isBlock(n))
+						bl.push(n);
+				}
+			}
+
+			if (eb && sb != eb)
+				bl.push(eb);
+
+			return bl;
+		}
+	});
+})();
+
+
+/* file:jscripts/tiny_mce/classes/UndoManager.js */
+
+tinymce.create('tinymce.UndoManager', {
+	index : 0,
+	data : null,
+	typing : 0,
+
+	UndoManager : function(ed) {
+		var t = this, Dispatcher = tinymce.util.Dispatcher;
+
+		t.editor = ed;
+		t.data = [];
+		t.onAdd = new Dispatcher(this);
+		t.onUndo = new Dispatcher(this);
+		t.onRedo = new Dispatcher(this);
+	},
+
+	add : function(l) {
+		var t = this, i, ed = t.editor, b, s = ed.settings, la;
+
+		l = l || {};
+		l.content = l.content || ed.getContent({format : 'raw', no_events : 1});
+
+		// Add undo level if needed
+		l.content = l.content.replace(/^\s*|\s*$/g, '');
+		la = t.data[t.index > 0 && (t.index == 0 || t.index == t.data.length) ? t.index - 1 : t.index];
+		if (!l.initial && la && l.content == la.content)
+			return null;
+
+		// Time to compress
+		if (s.custom_undo_redo_levels) {
+			if (t.data.length > s.custom_undo_redo_levels) {
+				for (i = 0; i < t.data.length - 1; i++)
+					t.data[i] = t.data[i + 1];
+
+				t.data.length--;
+				t.index = t.data.length;
+			}
+		}
+
+		if (s.custom_undo_redo_restore_selection && !l.initial)
+			l.bookmark = b = l.bookmark || ed.selection.getBookmark();
+
+		if (t.index < t.data.length)
+			t.index++;
+
+		// Only initial marked undo levels should be allowed as first item
+		// This to workaround a bug with Firefox and the blur event
+		if (t.data.length === 0 && !l.initial)
+			return null;
+
+		// Add level
+		t.data.length = t.index + 1;
+		t.data[t.index++] = l;
+
+		if (l.initial)
+			t.index = 0;
+
+		// Set initial bookmark use first real undo level
+		if (t.data.length == 2 && t.data[0].initial)
+			t.data[0].bookmark = b;
+
+		t.onAdd.dispatch(t, l);
+		ed.isNotDirty = 0;
+
+		//console.dir(t.data);
+
+		return l;
+	},
+
+	undo : function() {
+		var t = this, ed = t.editor, l = l, i;
+
+		if (t.typing) {
+			t.add();
+			t.typing = 0;
+		}
+
+		if (t.index > 0) {
+			// If undo on last index then take snapshot
+			if (t.index == t.data.length && t.index > 1) {
+				i = t.index;
+				t.typing = 0;
+
+				if (!t.add())
+					t.index = i;
+
+				--t.index;
+			}
+
+			l = t.data[--t.index];
+			ed.setContent(l.content, {format : 'raw'});
+			ed.selection.moveToBookmark(l.bookmark);
+
+			t.onUndo.dispatch(t, l);
+		}
+
+		return l;
+	},
+
+	redo : function() {
+		var t = this, ed = t.editor, l = null;
+
+		if (t.index < t.data.length - 1) {
+			l = t.data[++t.index];
+			ed.setContent(l.content, {format : 'raw'});
+			ed.selection.moveToBookmark(l.bookmark);
+
+			t.onRedo.dispatch(t, l);
+		}
+
+		return l;
+	},
+
+	clear : function() {
+		var t = this;
+
+		t.data = [];
+		t.index = 0;
+		t.typing = 0;
+		t.add({initial : true});
+	},
+
+	hasUndo : function() {
+		return this.index != 0 || this.typing;
+	},
+
+	hasRedo : function() {
+		return this.index < this.data.length - 1;
+	}
+
+	});
+/* file:jscripts/tiny_mce/classes/ForceBlocks.js */
+
+(function() {
+	// Shorten names
+	var Event, isIE, isGecko, isOpera, each, extend;
+
+	Event = tinymce.dom.Event;
+	isIE = tinymce.isIE;
+	isGecko = tinymce.isGecko;
+	isOpera = tinymce.isOpera;
+	each = tinymce.each;
+	extend = tinymce.extend;
+
+	tinymce.create('tinymce.ForceBlocks', {
+		ForceBlocks : function(ed) {
+			var t = this, s = ed.settings, elm;
+
+			t.editor = ed;
+			t.dom = ed.dom;
+			elm = (s.forced_root_block || 'p').toLowerCase();
+			s.element = elm.toUpperCase();
+
+			ed.onPreInit.add(t.setup, t);
+
+			t.reOpera = new RegExp('(\\u00a0|&#160;|&nbsp;)<\/' + elm + '>', 'gi');
+			t.rePadd = new RegExp('<p( )([^>]+)><\\\/p>|<p( )([^>]+)\\\/>|<p( )([^>]+)>\\s+<\\\/p>|<p><\\\/p>|<p\\\/>|<p>\\s+<\\\/p>'.replace(/p/g, elm), 'gi');
+			t.reNbsp2BR1 = new RegExp('<p( )([^>]+)>[\\s\\u00a0]+<\\\/p>|<p>[\\s\\u00a0]+<\\\/p>'.replace(/p/g, elm), 'gi');
+			t.reNbsp2BR2 = new RegExp('<p( )([^>]+)>(&nbsp;|&#160;)<\\\/p>|<p>(&nbsp;|&#160;)<\\\/p>'.replace(/p/g, elm), 'gi');
+			t.reBR2Nbsp = new RegExp('<p( )([^>]+)>\\s*<br \\\/>\\s*<\\\/p>|<p>\\s*<br \\\/>\\s*<\\\/p>'.replace(/p/g, elm), 'gi');
+			t.reTrailBr = new RegExp('\\s*<br \\/>\\s*<\\\/p>'.replace(/p/g, elm), 'gi');
+
+			function padd(ed, o) {
+				if (isOpera)
+					o.content = o.content.replace(t.reOpera, '</' + elm + '>');
+
+				o.content = o.content.replace(t.rePadd, '<' + elm + '$1$2$3$4$5$6>\u00a0</' + elm + '>');
+
+				if (!isIE && !isOpera && o.set) {
+					// Use &nbsp; instead of BR in padded paragraphs
+					o.content = o.content.replace(t.reNbsp2BR1, '<' + elm + '$1$2><br /></' + elm + '>');
+					o.content = o.content.replace(t.reNbsp2BR2, '<' + elm + '$1$2><br /></' + elm + '>');
+				} else {
+					o.content = o.content.replace(t.reBR2Nbsp, '<' + elm + '$1$2>\u00a0</' + elm + '>');
+					o.content = o.content.replace(t.reTrailBr, '</' + elm + '>');
+				}
+			};
+
+			ed.onBeforeSetContent.add(padd);
+			ed.onPostProcess.add(padd);
+
+			if (s.forced_root_block) {
+				ed.onInit.add(t.forceRoots, t);
+				ed.onSetContent.add(t.forceRoots, t);
+				ed.onBeforeGetContent.add(t.forceRoots, t);
+			}
+		},
+
+		setup : function() {
+			var t = this, ed = t.editor, s = ed.settings;
+
+			// Force root blocks when typing and when getting output
+			if (s.forced_root_block) {
+				ed.onKeyUp.add(t.forceRoots, t);
+				ed.onPreProcess.add(t.forceRoots, t);
+			}
+
+			if (s.force_br_newlines) {
+				// Force IE to produce BRs on enter
+				if (isIE) {
+					ed.onKeyPress.add(function(ed, e) {
+						var n, s = ed.selection;
+
+						if (e.keyCode == 13 && s.getNode().nodeName != 'LI') {
+							s.setContent('<br id="__" /> ', {format : 'raw'});
+							n = ed.dom.get('__');
+							n.removeAttribute('id');
+							s.select(n);
+							s.collapse();
+							return Event.cancel(e);
+						}
+					});
+				}
+
+				return;
+			}
+
+			if (!isIE && s.force_p_newlines) {
+/*				ed.onPreProcess.add(function(ed, o) {
+					each(ed.dom.select('br', o.node), function(n) {
+						var p = n.parentNode;
+
+						// Replace <p><br /></p> with <p>&nbsp;</p>
+						if (p && p.nodeName == 'p' && (p.childNodes.length == 1 || p.lastChild == n)) {
+							p.replaceChild(ed.getDoc().createTextNode('\u00a0'), n);
+						}
+					});
+				});*/
+
+				ed.onKeyPress.add(function(ed, e) {
+					if (e.keyCode == 13 && !e.shiftKey) {
+						if (!t.insertPara(e))
+							Event.cancel(e);
+					}
+				});
+
+				if (isGecko) {
+					ed.onKeyDown.add(function(ed, e) {
+						if ((e.keyCode == 8 || e.keyCode == 46) && !e.shiftKey)
+							t.backspaceDelete(e, e.keyCode == 8);
+					});
+				}
+			}
+
+			function ren(rn, na) {
+				var ne = ed.dom.create(na);
+
+				each(rn.attributes, function(a) {
+					if (a.specified && a.nodeValue)
+						ne.setAttribute(a.nodeName.toLowerCase(), a.nodeValue);
+				});
+
+				each(rn.childNodes, function(n) {
+					ne.appendChild(n.cloneNode(true));
+				});
+
+				rn.parentNode.replaceChild(ne, rn);
+
+				return ne;
+			};
+
+			// Replaces IE:s auto generated paragraphs with the specified element name
+			if (isIE && s.element != 'P') {
+				ed.onKeyPress.add(function(ed, e) {
+					t.lastElm = ed.selection.getNode().nodeName;
+				});
+
+				ed.onKeyUp.add(function(ed, e) {
+					var bl, sel = ed.selection, n = sel.getNode(), b = ed.getBody();
+
+					if (b.childNodes.length === 1 && n.nodeName == 'P') {
+						n = ren(n, s.element);
+						sel.select(n);
+						sel.collapse();
+						ed.nodeChanged();
+					} else if (e.keyCode == 13 && !e.shiftKey && t.lastElm != 'P') {
+						bl = ed.dom.getParent(n, 'P');
+
+						if (bl) {
+							ren(bl, s.element);
+							ed.nodeChanged();
+						}
+					}
+				});
+			}
+		},
+
+		find : function(n, t, s) {
+			var ed = this.editor, w = ed.getDoc().createTreeWalker(n, 4, null, false), c = -1;
+
+			while (n = w.nextNode()) {
+				c++;
+
+				// Index by node
+				if (t == 0 && n == s)
+					return c;
+
+				// Node by index
+				if (t == 1 && c == s)
+					return n;
+			}
+
+			return -1;
+		},
+
+		forceRoots : function(ed, e) {
+			var t = this, ed = t.editor, b = ed.getBody(), d = ed.getDoc(), se = ed.selection, s = se.getSel(), r = se.getRng(), si = -2, ei, so, eo, tr, c = -0xFFFFFF;
+			var nx, bl, bp, sp, le, nl = b.childNodes, i;
+
+			// Fix for bug #1863847
+			if (e && e.keyCode == 13)
+				return true;
+
+			// Wrap non blocks into blocks
+			for (i = nl.length - 1; i >= 0; i--) {
+				nx = nl[i];
+
+				// Is text or non block element
+				if (nx.nodeType == 3 || (!t.dom.isBlock(nx) && nx.nodeType != 8)) {
+					if (!bl) {
+						// Create new block but ignore whitespace
+						if (nx.nodeType != 3 || /[^\s]/g.test(nx.nodeValue)) {
+							// Store selection
+							if (si == -2 && r) {
+								if (!isIE) {
+									// If element is inside body, might not be the case in contentEdiable mode
+									if (ed.dom.getParent(r.startContainer, function(e) {return e === b;})) {
+										so = r.startOffset;
+										eo = r.endOffset;
+										si = t.find(b, 0, r.startContainer);
+										ei = t.find(b, 0, r.endContainer);
+									}
+								} else {
+									tr = d.body.createTextRange();
+									tr.moveToElementText(b);
+									tr.collapse(1);
+									bp = tr.move('character', c) * -1;
+
+									tr = r.duplicate();
+									tr.collapse(1);
+									sp = tr.move('character', c) * -1;
+
+									tr = r.duplicate();
+									tr.collapse(0);
+									le = (tr.move('character', c) * -1) - sp;
+
+									si = sp - bp;
+									ei = le;
+								}
+							}
+
+							bl = ed.dom.create(ed.settings.forced_root_block);
+							bl.appendChild(nx.cloneNode(1));
+							nx.parentNode.replaceChild(bl, nx);
+						}
+					} else {
+						if (bl.hasChildNodes())
+							bl.insertBefore(nx, bl.firstChild);
+						else
+							bl.appendChild(nx);
+					}
+				} else
+					bl = null; // Time to create new block
+			}
+
+			// Restore selection
+			if (si != -2) {
+				if (!isIE) {
+					bl = b.getElementsByTagName(ed.settings.element)[0];
+					r = d.createRange();
+
+					// Select last location or generated block
+					if (si != -1)
+						r.setStart(t.find(b, 1, si), so);
+					else
+						r.setStart(bl, 0);
+
+					// Select last location or generated block
+					if (ei != -1)
+						r.setEnd(t.find(b, 1, ei), eo);
+					else
+						r.setEnd(bl, 0);
+
+					if (s) {
+						s.removeAllRanges();
+						s.addRange(r);
+					}
+				} else {
+					try {
+						r = s.createRange();
+						r.moveToElementText(b);
+						r.collapse(1);
+						r.moveStart('character', si);
+						r.moveEnd('character', ei);
+						r.select();
+					} catch (ex) {
+						// Ignore
+					}
+				}
+			}
+		},
+
+		getParentBlock : function(n) {
+			var d = this.dom;
+
+			return d.getParent(n, d.isBlock);
+		},
+
+		insertPara : function(e) {
+			var t = this, ed = t.editor, dom = ed.dom, d = ed.getDoc(), se = ed.settings, s = ed.selection.getSel(), r = s.getRangeAt(0), b = d.body;
+			var rb, ra, dir, sn, so, en, eo, sb, eb, bn, bef, aft, sc, ec, n, vp = dom.getViewPort(ed.getWin()), y, ch;
+
+			function isEmpty(n) {
+				n = n.innerHTML;
+				n = n.replace(/<(img|hr|table)/gi, '-'); // Keep these convert them to - chars
+				n = n.replace(/<[^>]+>/g, ''); // Remove all tags
+
+				return n.replace(/[ \t\r\n]+/g, '') == '';
+			};
+
+			// If root blocks are forced then use Operas default behavior since it's really good
+// Removed due to bug: #1853816
+//			if (se.forced_root_block && isOpera)
+//				return true;
+
+			// Setup before range
+			rb = d.createRange();
+
+			// If is before the first block element and in body, then move it into first block element
+			rb.setStart(s.anchorNode, s.anchorOffset);
+			rb.collapse(true);
+
+			// Setup after range
+			ra = d.createRange();
+
+			// If is before the first block element and in body, then move it into first block element
+			ra.setStart(s.focusNode, s.focusOffset);
+			ra.collapse(true);
+
+			// Setup start/end points
+			dir = rb.compareBoundaryPoints(rb.START_TO_END, ra) < 0;
+			sn = dir ? s.anchorNode : s.focusNode;
+			so = dir ? s.anchorOffset : s.focusOffset;
+			en = dir ? s.focusNode : s.anchorNode;
+			eo = dir ? s.focusOffset : s.anchorOffset;
+
+			// If selection is in empty table cell
+			if (sn === en && /^(TD|TH)$/.test(sn.nodeName)) {
+				dom.remove(sn.firstChild); // Remove BR
+
+				// Create two new block elements
+				ed.dom.add(sn, se.element, null, '<br />');
+				aft = ed.dom.add(sn, se.element, null, '<br />');
+
+				// Move caret into the last one
+				r = d.createRange();
+				r.selectNodeContents(aft);
+				r.collapse(1);
+				ed.selection.setRng(r);
+
+				return false;
+			}
+
+			// If the caret is in an invalid location in FF we need to move it into the first block
+			if (sn == b && en == b && b.firstChild && ed.dom.isBlock(b.firstChild)) {
+				sn = en = sn.firstChild;
+				so = eo = 0;
+				rb = d.createRange();
+				rb.setStart(sn, 0);
+				ra = d.createRange();
+				ra.setStart(en, 0);
+			}
+
+			// Never use body as start or end node
+			sn = sn.nodeName == "HTML" ? d.body : sn; // Fix for Opera bug: https://bugs.opera.com/show_bug.cgi?id=273224&comments=yes
+			sn = sn.nodeName == "BODY" ? sn.firstChild : sn;
+			en = en.nodeName == "HTML" ? d.body : en; // Fix for Opera bug: https://bugs.opera.com/show_bug.cgi?id=273224&comments=yes
+			en = en.nodeName == "BODY" ? en.firstChild : en;
+
+			// Get start and end blocks
+			sb = t.getParentBlock(sn);
+			eb = t.getParentBlock(en);
+			bn = sb ? sb.nodeName : se.element; // Get block name to create
+
+			// Return inside list use default browser behavior
+			if (t.dom.getParent(sb, function(n) { return /OL|UL|PRE/.test(n.nodeName); }))
+				return true;
+
+			// If caption or absolute layers then always generate new blocks within
+			if (sb && (sb.nodeName == 'CAPTION' || /absolute|relative|static/gi.test(sb.style.position))) {
+				bn = se.element;
+				sb = null;
+			}
+
+			// If caption or absolute layers then always generate new blocks within
+			if (eb && (eb.nodeName == 'CAPTION' || /absolute|relative|static/gi.test(eb.style.position))) {
+				bn = se.element;
+				eb = null;
+			}
+
+			// Use P instead
+			if (/(TD|TABLE|TH|CAPTION)/.test(bn) || (sb && bn == "DIV" && /left|right/gi.test(sb.style.cssFloat))) {
+				bn = se.element;
+				sb = eb = null;
+			}
+
+			// Setup new before and after blocks
+			bef = (sb && sb.nodeName == bn) ? sb.cloneNode(0) : ed.dom.create(bn);
+			aft = (eb && eb.nodeName == bn) ? eb.cloneNode(0) : ed.dom.create(bn);
+
+			// Remove id from after clone
+			aft.removeAttribute('id');
+
+			// Is header and cursor is at the end, then force paragraph under
+			if (/^(H[1-6])$/.test(bn) && sn.nodeValue && so == sn.nodeValue.length)
+				aft = ed.dom.create(se.element);
+
+			// Find start chop node
+			n = sc = sn;
+			do {
+				if (n == b || n.nodeType == 9 || t.dom.isBlock(n) || /(TD|TABLE|TH|CAPTION)/.test(n.nodeName))
+					break;
+
+				sc = n;
+			} while ((n = n.previousSibling ? n.previousSibling : n.parentNode));
+
+			// Find end chop node
+			n = ec = en;
+			do {
+				if (n == b || n.nodeType == 9 || t.dom.isBlock(n) || /(TD|TABLE|TH|CAPTION)/.test(n.nodeName))
+					break;
+
+				ec = n;
+			} while ((n = n.nextSibling ? n.nextSibling : n.parentNode));
+
+			// Place first chop part into before block element
+			if (sc.nodeName == bn)
+				rb.setStart(sc, 0);
+			else
+				rb.setStartBefore(sc);
+
+			rb.setEnd(sn, so);
+			bef.appendChild(rb.cloneContents() || d.createTextNode('')); // Empty text node needed for Safari
+
+			// Place secnd chop part within new block element
+			try {
+				ra.setEndAfter(ec);
+			} catch(ex) {
+				//console.debug(s.focusNode, s.focusOffset);
+			}
+
+			ra.setStart(en, eo);
+			aft.appendChild(ra.cloneContents() || d.createTextNode('')); // Empty text node needed for Safari
+
+			// Create range around everything
+			r = d.createRange();
+			if (!sc.previousSibling && sc.parentNode.nodeName == bn) {
+				r.setStartBefore(sc.parentNode);
+			} else {
+				if (rb.startContainer.nodeName == bn && rb.startOffset == 0)
+					r.setStartBefore(rb.startContainer);
+				else
+					r.setStart(rb.startContainer, rb.startOffset);
+			}
+
+			if (!ec.nextSibling && ec.parentNode.nodeName == bn)
+				r.setEndAfter(ec.parentNode);
+			else
+				r.setEnd(ra.endContainer, ra.endOffset);
+
+			// Delete and replace it with new block elements
+			r.deleteContents();
+
+			if (isOpera)
+				ed.getWin().scrollTo(0, vp.y);
+
+			// Never wrap blocks in blocks
+			if (bef.firstChild && bef.firstChild.nodeName == bn)
+				bef.innerHTML = bef.firstChild.innerHTML;
+
+			if (aft.firstChild && aft.firstChild.nodeName == bn)
+				aft.innerHTML = aft.firstChild.innerHTML;
+
+			// Padd empty blocks
+			if (isEmpty(bef))
+				bef.innerHTML = '<br />';
+
+			if (isEmpty(aft))
+				aft.innerHTML = isOpera ? '&nbsp;' : '<br />'; // Extra space for Opera so that the caret can move there
+
+			// Opera needs this one backwards
+			if (isOpera) {
+				r.insertNode(bef);
+				r.insertNode(aft);
+			} else {
+				r.insertNode(aft);
+				r.insertNode(bef);
+			}
+
+			// Normalize
+			aft.normalize();
+			bef.normalize();
+
+			function first(n) {
+				return d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false).nextNode() || n;
+			};
+
+			// Move cursor and scroll into view
+			r = d.createRange();
+			r.selectNodeContents(isGecko ? first(aft) : aft);
+			r.collapse(1);
+			s.removeAllRanges();
+			s.addRange(r);
+
+			// scrollIntoView seems to scroll the parent window in most browsers now including FF 3.0b4 so it's time to stop using it and do it our selfs
+			y = ed.dom.getPos(aft).y;
+			ch = aft.clientHeight;
+
+			// Is element within viewport
+			if (y < vp.y || y + ch > vp.y + vp.h) {
+				ed.getWin().scrollTo(0, y < vp.y ? y : y - vp.h + ch);
+				//console.debug('SCROLL!', 'vp.y: ' + vp.y, 'y' + y, 'vp.h' + vp.h, 'clientHeight' + aft.clientHeight, 'yyy: ' + (y < vp.y ? y : y - vp.h + aft.clientHeight));
+			}
+
+			return false;
+		},
+
+		backspaceDelete : function(e, bs) {
+			var t = this, ed = t.editor, b = ed.getBody(), n, se = ed.selection, r = se.getRng(), sc = r.startContainer, n, w, tn;
+
+			// The caret sometimes gets stuck in Gecko if you delete empty paragraphs
+			// This workaround removes the element by hand and moves the caret to the previous element
+			if (sc && ed.dom.isBlock(sc) && !/^(TD|TH)$/.test(sc.nodeName) && bs) {
+				if (sc.childNodes.length == 0 || (sc.childNodes.length == 1 && sc.firstChild.nodeName == 'BR')) {
+					// Find previous block element
+					n = sc;
+					while ((n = n.previousSibling) && !ed.dom.isBlock(n)) ;
+
+					if (n) {
+						if (sc != b.firstChild) {
+							// Find last text node
+							w = ed.dom.doc.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false);
+							while (tn = w.nextNode())
+								n = tn;
+
+							// Place caret at the end of last text node
+							r = ed.getDoc().createRange();
+							r.setStart(n, n.nodeValue ? n.nodeValue.length : 0);
+							r.setEnd(n, n.nodeValue ? n.nodeValue.length : 0);
+							se.setRng(r);
+
+							// Remove the target container
+							ed.dom.remove(sc);
+						}
+
+						return Event.cancel(e);
+					}
+				}
+			}
+
+			// Gecko generates BR elements here and there, we don't like those so lets remove them
+			function handler(e) {
+				e = e.target;
+
+				// A new BR was created in a block element, remove it
+				if (e && e.parentNode && e.nodeName == 'BR' && (n = t.getParentBlock(e))) {
+					Event.remove(b, 'DOMNodeInserted', handler);
+
+					// Only remove BR elements that got inserted in the middle of the text
+					if (e.previousSibling || e.nextSibling)
+						ed.dom.remove(e);
+				}
+			};
+
+			// Listen for new nodes
+			Event._add(b, 'DOMNodeInserted', handler);
+
+			// Remove listener
+			window.setTimeout(function() {
+				Event._remove(b, 'DOMNodeInserted', handler);
+			}, 1);
+		}
+	});
+})();
+
+/* file:jscripts/tiny_mce/classes/ControlManager.js */
+
+(function() {
+	// Shorten names
+	var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, extend = tinymce.extend;
+
+	tinymce.create('tinymce.ControlManager', {
+		ControlManager : function(ed, s) {
+			var t = this, i;
+
+			s = s || {};
+			t.editor = ed;
+			t.controls = {};
+			t.onAdd = new tinymce.util.Dispatcher(t);
+			t.onPostRender = new tinymce.util.Dispatcher(t);
+			t.prefix = s.prefix || ed.id + '_';
+			t._cls = {};
+
+			t.onPostRender.add(function() {
+				each(t.controls, function(c) {
+					c.postRender();
+				});
+			});
+		},
+
+		get : function(id) {
+			return this.controls[this.prefix + id] || this.controls[id];
+		},
+
+		setActive : function(id, s) {
+			var c = null;
+
+			if (c = this.get(id))
+				c.setActive(s);
+
+			return c;
+		},
+
+		setDisabled : function(id, s) {
+			var c = null;
+
+			if (c = this.get(id))
+				c.setDisabled(s);
+
+			return c;
+		},
+
+		add : function(c) {
+			var t = this;
+
+			if (c) {
+				t.controls[c.id] = c;
+				t.onAdd.dispatch(c, t);
+			}
+
+			return c;
+		},
+
+		createControl : function(n) {
+			var c, t = this, ed = t.editor;
+
+			each(ed.plugins, function(p) {
+				if (p.createControl) {
+					c = p.createControl(n, t);
+
+					if (c)
+						return false;
+				}
+			});
+
+			switch (n) {
+				case "|":
+				case "separator":
+					return t.createSeparator();
+			}
+
+			if (!c && ed.buttons && (c = ed.buttons[n]))
+				return t.createButton(n, c);
+
+			return t.add(c);
+		},
+
+		createDropMenu : function(id, s, cc) {
+			var t = this, ed = t.editor, c, bm, v, cls;
+
+			s = extend({
+				'class' : 'mceDropDown',
+				constrain : ed.settings.constrain_menus
+			}, s);
+
+			s['class'] = s['class'] + ' ' + ed.getParam('skin') + 'Skin';
+			if (v = ed.getParam('skin_variant'))
+				s['class'] += ' ' + ed.getParam('skin') + 'Skin' + v.substring(0, 1).toUpperCase() + v.substring(1);
+
+			id = t.prefix + id;
+			cls = cc || t._cls.dropmenu || tinymce.ui.DropMenu;
+			c = t.controls[id] = new cls(id, s);
+			c.onAddItem.add(function(c, o) {
+				var s = o.settings;
+
+				s.title = ed.getLang(s.title, s.title);
+
+				if (!s.onclick) {
+					s.onclick = function(v) {
+						ed.execCommand(s.cmd, s.ui || false, s.value);
+					};
+				}
+			});
+
+			ed.onRemove.add(function() {
+				c.destroy();
+			});
+
+			// Fix for bug #1897785, #1898007
+			if (tinymce.isIE) {
+				c.onShowMenu.add(function() {
+					bm = ed.selection.getBookmark(1);
+				});
+
+				c.onHideMenu.add(function() {
+					if (bm)
+						ed.selection.moveToBookmark(bm);
+				});
+			}
+
+			return t.add(c);
+		},
+
+		createListBox : function(id, s, cc) {
+			var t = this, ed = t.editor, cmd, c, cls;
+
+			if (t.get(id))
+				return null;
+
+			s.title = ed.translate(s.title);
+			s.scope = s.scope || ed;
+
+			if (!s.onselect) {
+				s.onselect = function(v) {
+					ed.execCommand(s.cmd, s.ui || false, v || s.value);
+				};
+			}
+
+			s = extend({
+				title : s.title,
+				'class' : 'mce_' + id,
+				scope : s.scope,
+				control_manager : t
+			}, s);
+
+			id = t.prefix + id;
+
+			if (ed.settings.use_native_selects)
+				c = new tinymce.ui.NativeListBox(id, s);
+			else {
+				cls = cc || t._cls.listbox || tinymce.ui.ListBox;
+				c = new cls(id, s);
+			}
+
+			t.controls[id] = c;
+
+			// Fix focus problem in Safari
+			if (tinymce.isWebKit) {
+				c.onPostRender.add(function(c, n) {
+					// Store bookmark on mousedown
+					Event.add(n, 'mousedown', function() {
+						ed.bookmark = ed.selection.getBookmark('simple');
+					});
+
+					// Restore on focus, since it might be lost
+					Event.add(n, 'focus', function() {
+						ed.selection.moveToBookmark(ed.bookmark);
+						ed.bookmark = null;
+					});
+				});
+			}
+
+			if (c.hideMenu)
+				ed.onMouseDown.add(c.hideMenu, c);
+
+			return t.add(c);
+		},
+
+		createButton : function(id, s, cc) {
+			var t = this, ed = t.editor, o, c, cls;
+
+			if (t.get(id))
+				return null;
+
+			s.title = ed.translate(s.title);
+			s.label = ed.translate(s.label);
+			s.scope = s.scope || ed;
+
+			if (!s.onclick && !s.menu_button) {
+				s.onclick = function() {
+					ed.execCommand(s.cmd, s.ui || false, s.value);
+				};
+			}
+
+			s = extend({
+				title : s.title,
+				'class' : 'mce_' + id,
+				unavailable_prefix : ed.getLang('unavailable', ''),
+				scope : s.scope,
+				control_manager : t
+			}, s);
+
+			id = t.prefix + id;
+
+			if (s.menu_button) {
+				cls = cc || t._cls.menubutton || tinymce.ui.MenuButton;
+				c = new cls(id, s);
+				ed.onMouseDown.add(c.hideMenu, c);
+			} else {
+				cls = t._cls.button || tinymce.ui.Button;
+				c = new cls(id, s);
+			}
+
+			return t.add(c);
+		},
+
+		createMenuButton : function(id, s) {
+			s = s || {};
+			s.menu_button = 1;
+
+			return this.createButton(id, s);
+		},
+
+		createSplitButton : function(id, s, cc) {
+			var t = this, ed = t.editor, cmd, c, cls;
+
+			if (t.get(id))
+				return null;
+
+			s.title = ed.translate(s.title);
+			s.scope = s.scope || ed;
+
+			if (!s.onclick) {
+				s.onclick = function(v) {
+					ed.execCommand(s.cmd, s.ui || false, v || s.value);
+				};
+			}
+
+			if (!s.onselect) {
+				s.onselect = function(v) {
+					ed.execCommand(s.cmd, s.ui || false, v || s.value);
+				};
+			}
+
+			s = extend({
+				title : s.title,
+				'class' : 'mce_' + id,
+				scope : s.scope,
+				control_manager : t
+			}, s);
+
+			id = t.prefix + id;
+			cls = cc || t._cls.splitbutton || tinymce.ui.SplitButton;
+			c = t.add(new cls(id, s));
+			ed.onMouseDown.add(c.hideMenu, c);
+
+			return c;
+		},
+
+		createColorSplitButton : function(id, s, cc) {
+			var t = this, ed = t.editor, cmd, c, cls, bm;
+
+			if (t.get(id))
+				return null;
+
+			s.title = ed.translate(s.title);
+			s.scope = s.scope || ed;
+
+			if (!s.onclick) {
+				s.onclick = function(v) {
+					ed.execCommand(s.cmd, s.ui || false, v || s.value);
+				};
+			}
+
+			if (!s.onselect) {
+				s.onselect = function(v) {
+					ed.execCommand(s.cmd, s.ui || false, v || s.value);
+				};
+			}
+
+			s = extend({
+				title : s.title,
+				'class' : 'mce_' + id,
+				'menu_class' : ed.getParam('skin') + 'Skin',
+				scope : s.scope,
+				more_colors_title : ed.getLang('more_colors')
+			}, s);
+
+			id = t.prefix + id;
+			cls = cc || t._cls.colorsplitbutton || tinymce.ui.ColorSplitButton;
+			c = new cls(id, s);
+			ed.onMouseDown.add(c.hideMenu, c);
+
+			// Remove the menu element when the editor is removed
+			ed.onRemove.add(function() {
+				c.destroy();
+			});
+
+			// Fix for bug #1897785, #1898007
+			if (tinymce.isIE) {
+				c.onShowMenu.add(function() {
+					bm = ed.selection.getBookmark(1);
+				});
+
+				c.onHideMenu.add(function() {
+					if (bm)
+						ed.selection.moveToBookmark(bm);
+				});
+			}
+
+			return t.add(c);
+		},
+
+		createToolbar : function(id, s, cc) {
+			var c, t = this, cls;
+
+			id = t.prefix + id;
+			cls = cc || t._cls.toolbar || tinymce.ui.Toolbar;
+			c = new cls(id, s);
+
+			if (t.get(id))
+				return null;
+
+			return t.add(c);
+		},
+
+		createSeparator : function(cc) {
+			var cls = cc || this._cls.separator || tinymce.ui.Separator;
+
+			return new cls();
+		},
+
+		setControlType : function(n, c) {
+			return this._cls[n.toLowerCase()] = c;
+		},
+
+		destroy : function() {
+			each(this.controls, function(c) {
+				c.destroy();
+			});
+
+			this.controls = null;
+		}
+
+		});
+})();
+
+/* file:jscripts/tiny_mce/classes/WindowManager.js */
+
+(function() {
+	var Dispatcher = tinymce.util.Dispatcher, each = tinymce.each, isIE = tinymce.isIE, isOpera = tinymce.isOpera;
+
+	tinymce.create('tinymce.WindowManager', {
+		WindowManager : function(ed) {
+			var t = this;
+
+			t.editor = ed;
+			t.onOpen = new Dispatcher(t);
+			t.onClose = new Dispatcher(t);
+			t.params = {};
+			t.features = {};
+		},
+
+		open : function(s, p) {
+			var t = this, f = '', x, y, mo = t.editor.settings.dialog_type == 'modal', w, sw, sh, vp = tinymce.DOM.getViewPort(), u;
+
+			// Default some options
+			s = s || {};
+			p = p || {};
+			sw = isOpera ? vp.w : screen.width; // Opera uses windows inside the Opera window
+			sh = isOpera ? vp.h : screen.height;
+			s.name = s.name || 'mc_' + new Date().getTime();
+			s.width = parseInt(s.width || 320);
+			s.height = parseInt(s.height || 240);
+			s.resizable = true;
+			s.left = s.left || parseInt(sw / 2.0) - (s.width / 2.0);
+			s.top = s.top || parseInt(sh / 2.0) - (s.height / 2.0);
+			p.inline = false;
+			p.mce_width = s.width;
+			p.mce_height = s.height;
+			p.mce_auto_focus = s.auto_focus;
+
+			if (mo) {
+				if (isIE) {
+					s.center = true;
+					s.help = false;
+					s.dialogWidth = s.width + 'px';
+					s.dialogHeight = s.height + 'px';
+					s.scroll = s.scrollbars || false;
+				}
+			}
+
+			// Build features string
+			each(s, function(v, k) {
+				if (tinymce.is(v, 'boolean'))
+					v = v ? 'yes' : 'no';
+
+				if (!/^(name|url)$/.test(k)) {
+					if (isIE && mo)
+						f += (f ? ';' : '') + k + ':' + v;
+					else
+						f += (f ? ',' : '') + k + '=' + v;
+				}
+			});
+
+			t.features = s;
+			t.params = p;
+			t.onOpen.dispatch(t, s, p);
+
+			u = s.url || s.file;
+			if (tinymce.relaxedDomain)
+				u += (u.indexOf('?') == -1 ? '?' : '&') + 'mce_rdomain=' + tinymce.relaxedDomain;
+
+			u = tinymce._addVer(u);
+
+			try {
+				if (isIE && mo) {
+					w = 1;
+					window.showModalDialog(u, window, f);
+				} else
+					w = window.open(u, s.name, f);
+			} catch (ex) {
+				// Ignore
+			}
+
+			if (!w)
+				alert(t.editor.getLang('popup_blocked'));
+		},
+
+		close : function(w) {
+			w.close();
+			this.onClose.dispatch(this);
+		},
+
+		createInstance : function(cl, a, b, c, d, e) {
+			var f = tinymce.resolve(cl);
+
+			return new f(a, b, c, d, e);
+		},
+
+		confirm : function(t, cb, s) {
+			cb.call(s || this, confirm(this._decode(this.editor.getLang(t, t))));
+		},
+
+		alert : function(tx, cb, s) {
+			var t = this;
+	
+			alert(t._decode(t.editor.getLang(tx, tx)));
+
+			if (cb)
+				cb.call(s || t);
+		},
+
+		// Internal functions
+
+		_decode : function(s) {
+			return tinymce.DOM.decode(s).replace(/\\n/g, '\n');
+		}
+
+		});
+}());

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/utils/editable_selects.js
@@ -1,1 +1,62 @@
+/**
+ * $Id: editable_selects.js 520 2008-01-07 16:30:32Z spocke $
+ *
+ * Makes select boxes editable.
+ *
+ * @author Moxiecode

+ */
 
+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].onchange = TinyMCE_EditableSelects.onChangeEditableSelect;
+			}
+		}
+	},
+
+	onChangeEditableSelect : function(e) {
+		var d = document, ne, se = window.event ? window.event.srcElement : e.target;
+
+		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.offsetWidth + 'px';
+			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;
+		}
+	}
+};
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/utils/form_utils.js
@@ -1,1 +1,200 @@
-
+/**
+ * $Id: form_utils.js 673 2008-03-06 13:26:20Z spocke $
+ *
+ * Various form utilitiy functions.
+ *
+ * @author Moxiecode

+ */
+
+var themeBaseURL = tinyMCEPopup.editor.baseURI.toAbsolute('themes/' + tinyMCEPopup.getParam("theme"));
+
+function getColorPickerHTML(id, target_form_element) {
+	var h = "";
+
+	h += '<a id="' + id + '_link" href="javascript:;" onclick="tinyMCEPopup.pickColor(event,\'' + target_form_element +'\');" onmousedown="return false;" class="pickcolor">';
+	h += '<span id="' + id + '" title="' + tinyMCEPopup.getLang('browse') + '"></span></a>';
+
+	return h;
+}
+
+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");
+			tinyMCEPopup.dom.addClass(img, 'disabled');
+		} else {
+			if (lnk.getAttribute("realhref"))
+				lnk.setAttribute("href", lnk.getAttribute("realhref"));
+
+			tinyMCEPopup.dom.removeClass(img, 'disabled');
+		}
+	}
+}
+
+function getBrowserHTML(id, target_form_element, type, prefix) {
+	var option = prefix + "_" + type + "_browser_callback", cb, html;
+
+	cb = tinyMCEPopup.getParam(option, tinyMCEPopup.getParam("file_browser_callback"));
+
+	if (!cb)
+		return "";
+
+	html = "";
+	html += '<a id="' + id + '_link" href="javascript:openBrowser(\'' + id + '\',\'' + target_form_element + '\', \'' + type + '\',\'' + option + '\');" onmousedown="return false;" class="browse">';
+	html += '<span id="' + id + '" title="' + tinyMCEPopup.getLang('browse') + '"></span></a>';
+
+	return html;
+}
+
+function openBrowser(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 = tinyMCEPopup.getParam('theme_advanced_styles', false);
+	styles = tinyMCEPopup.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 {
+		tinymce.each(tinyMCEPopup.editor.dom.getClasses(), function(o) {
+			styleSelectElm.options[styleSelectElm.length] = new Option(o.title || o['class'], o['class']);
+		});
+	}
+}
+
+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(/([0-9\.]+)px|(%|in|cm|mm|em|ex|pt|pc)/, '$1$2');
+}
+
+function getCSSSize(size) {
+	size = trimSize(size);
+
+	if (size == "")
+		return "";
+
+	// Add px
+	if (/^[0-9]+$/.test(size))
+		size += 'px';
+
+	return size;
+}
+
+function getStyle(elm, attrib, style) {
+	var val = tinyMCEPopup.dom.getAttrib(elm, attrib);
+
+	if (val != '')
+		return '' + val;
+
+	if (typeof(style) == 'undefined')
+		style = attrib;
+
+	return tinyMCEPopup.dom.getStyle(elm, style);
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/utils/mclayer.js
@@ -1,1 +1,211 @@
-
+/**
+ * $Id: mclayer.js 162 2007-01-03 16:16:52Z spocke $
+ *
+ * Moxiecode floating layer script.
+ *
+ * @author Moxiecode

+ */
+
+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);
+	}
+}
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/utils/mctabs.js
@@ -1,1 +1,77 @@
+/**
+ * $Id: mctabs.js 758 2008-03-30 13:53:29Z spocke $
+ *
+ * Moxiecode DHTML Tabs script.
+ *
+ * @author Moxiecode

+ */
 
+function MCTabs() {
+	this.settings = [];
+};
+
+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, panelContainerElm, tabElm, tabContainerElm, selectionClass, nodes, i;
+
+	panelElm= document.getElementById(panel_id);
+	panelContainerElm = panelElm ? panelElm.parentNode : null;
+	tabElm = document.getElementById(tab_id);
+	tabContainerElm = tabElm ? tabElm.parentNode : null;
+	selectionClass = this.getParam('selection_class', 'current');
+
+	if (tabElm && tabContainerElm) {
+		nodes = tabContainerElm.childNodes;
+
+		// Hide all other tabs
+		for (i = 0; i < nodes.length; i++) {
+			if (nodes[i].nodeName == "LI")
+				nodes[i].className = '';
+		}
+
+		// Show selected tab
+		tabElm.className = 'current';
+	}
+
+	if (panelElm && panelContainerElm) {
+		nodes = panelContainerElm.childNodes;
+
+		// Hide all other panels
+		for (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();
+

--- /dev/null
+++ b/tinymce/jscripts/tiny_mce/utils/validate.js
@@ -1,1 +1,220 @@
-
+/**
+ * $Id: validate.js 758 2008-03-30 13:53:29Z spocke $
+ *
+ * Various form validation methods.
+ *
+ * @author Moxiecode

+ */
+
+/**
+	// 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]+(%|in|cm|mm|em|ex|pt|pc|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 = ['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;
+	}
+};
+

file:b/tinymce/lgpl.txt (new)
--- /dev/null
+++ b/tinymce/lgpl.txt
@@ -1,1 +1,438 @@
-
+		  GNU LIBRARY GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+    		    59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL.  It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it.  You can use it for
+your libraries, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library.  If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+.
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software.  To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+  Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs.  This
+license, the GNU Library General Public License, applies to certain
+designated libraries.  This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+  The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it.  Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program.  However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+  Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries.  We
+concluded that weaker conditions might promote sharing better.
+
+  However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves.  This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them.  (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.)  The hope is that this
+will lead to faster development of free libraries.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+  Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+.
+		  GNU LIBRARY GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License").  Each licensee is
+addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+.
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+.
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+.
+  6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    c) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    d) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+.
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+.
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+.
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+

--- /dev/null
+++ b/tinymce4/LICENSE.TXT
@@ -1,1 +1,505 @@
-
+		  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!
+
+
+

--- /dev/null
+++ b/tinymce4/changelog.txt
@@ -1,1 +1,612 @@
+Version 4.5.3 (2017-02-01)
+	Added keyboard navigation for menu buttons when the menu is in focus.
+	Added api to the list plugin for setting custom classes/attributes on lists.
+	Added validation for the anchor plugin input field according to W3C id naming specifications.
+	Fixed bug where media placeholders were removed after resize with the forced_root_block setting set to false.
+	Fixed bug where deleting selections with similar sibling nodes sometimes deleted the whole document.
+	Fixed bug with inlite theme where several toolbars would appear scrolling when more than one instance of the editor was in use.
+	Fixed bug where the editor would throw error with the fontselect plugin on hidden editor instances in Firefox.
+	Fixed bug where the background color would not stretch to the font size.
+	Fixed bug where font size would be removed when changing background color.
+	Fixed bug where the undomanager trimmed away whitespace between nodes on undo/redo.
+	Fixed bug where media_dimensions=false in media plugin caused the editor to throw an error.
+	Fixed bug where IE was producing font/u elements within links on paste.
+	Fixed bug where some button tooltips were broken when compat3x was in use.
+	Fixed bug where backspace/delete/typeover would remove the caption element.
+	Fixed bug where powerspell failed to function when compat3x was enabled.
+	Fixed bug where it wasn't possible to apply sub/sup on text with large font size.
+	Fixed bug where pre tags with spaces weren't treated as content.
+	Fixed bug where Meta+A would select the entire document instead of all contents in nested ce=true elements.
+Version 4.5.2 (2017-01-04)
+	Added missing keyboard shortcut description for the underline menu item in the format menu.
+	Fixed bug where external blob urls wasn't properly handled by editor upload logic. Patch contributed by David Oviedo.
+	Fixed bug where urls wasn't treated as a single word by the wordcount plugin.
+	Fixed bug where nbsp characters wasn't treated as word delimiters by the wordcount plugin.
+	Fixed bug where editor instance wasn't properly passed to the format preview logic. Patch contributed by NullQuery.
+	Fixed bug where the fake caret wasn't hidden when you moved selection to a cE=false element.
+	Fixed bug where it wasn't possible to edit existing code sample blocks.
+	Fixed bug where it wasn't possible to delete editor contents if the selection included an empty block.
+	Fixed bug where the formatter wasn't expanding words on some international characters. Patch contributed by Martin Larochelle.
+	Fixed bug where the open link feature wasn't working correctly on IE 11.
+	Fixed bug where enter before/after a cE=false block wouldn't properly padd the paragraph with an br element.
+	Fixed so font size and font family select boxes always displays a value by using the runtime style as a fallback.
+	Fixed so missing plugins will be logged to console as warnings rather than halting the initialization of the editor.
+	Fixed so splitbuttons become normal buttons in advlist plugin if styles are empty. Patch contributed by René Schleusner.
+	Fixed so you can multi insert rows/cols by selecting table cells and using insert rows/columns.
+Version 4.5.1 (2016-12-07)
+	Fixed bug where the lists plugin wouldn't initialize without the advlist plugins if served from cdn.
+	Fixed bug where selectors with "*" would cause the style format preview to throw an error.
+	Fixed bug with toggling lists off on lists with empty list items would throw an error.
+	Fixed bug where editing images would produce non existing blob uris.
+	Fixed bug where the offscreen toc selection would be treated as the real toc element.
+	Fixed bug where the aria level attribute for element path would have an incorrect start index.
+	Fixed bug where the offscreen selection of cE=false that where very wide would be shown onscreen. Patch contributed by Steven Bufton.
+	Fixed so the default_link_target gets applied to links created by the autolink plugin.
+	Fixed so that the name attribute gets removed by the anchor plugin if editing anchors.
+Version 4.5.0 (2016-11-23)
+	Added new toc plugin allows you to insert table of contents based on editor headings.
+	Added new auto complete menu to all url fields. Adds history, link to anchors etc.
+	Added new sidebar api that allows you to add custom sidebar panels and buttons to toggle these.
+	Added new insert menu button that allows you to have multiple insert functions under the same menu button.
+	Added new open link feature to ctrl+click, alt+enter and context menu.
+	Added new media_embed_handler option to allow the media plugin to be populated with custom embeds.
+	Added new support for editing transparent images using the image tools dialog.
+	Added new images_reuse_filename option to allow filenames of images to be retained for upload.
+	Added new security feature where links with target="_blank" will by default get rel="noopener noreferrer".
+	Added new allow_unsafe_link_target to allow you to opt-out of the target="_blank" security feature.
+	Added new style_formats_autohide option to automatically hide styles based on context.
+	Added new codesample_content_css option to specify where the code sample prism css is loaded from.
+	Added new support for Japanese/Chinese word count following the unicode standards on this.
+	Added new fragmented undo levels this dramatically reduces flicker on contents with iframes.
+	Added new live previews for complex elements like table or lists.
+	Fixed bug where it wasn't possible to properly tab between controls in a dialog with a disabled form item control.
+	Fixed bug where firefox would generate a rectangle on elements produced after/before a cE=false elements.
+	Fixed bug with advlist plugin not switching list element format properly in some edge cases.
+	Fixed bug where col/rowspans wasn't correctly computed by the table plugin in some cases.
+	Fixed bug where the table plugin would thrown an error if object_resizing was disabled.
+	Fixed bug where some invalid markup would cause issues when running in XHTML mode. Patch contributed by Charles Bourasseau.
+	Fixed bug where the fullscreen class wouldn't be removed properly when closing dialogs.
+	Fixed bug where the PastePlainTextToggle event wasn't fired by the paste plugin when the state changed.
+	Fixed bug where table the row type wasn't properly updated in table row dialog. Patch contributed by Matthias Balmer.
+	Fixed bug where select all and cut wouldn't place caret focus back to the editor in WebKit. Patch contributed by Daniel Jalkut.
+	Fixed bug where applying cell/row properties to multiple cells/rows would reset other unchanged properties.
+	Fixed bug where some elements in the schema would have redundant/incorrect children.
+	Fixed bug where selector and target options would cause issues if used together.
+	Fixed bug where drag/drop of images from desktop on chrome would thrown an error.
+	Fixed bug where cut on WebKit/Blink wouldn't add an undo level.
+	Fixed bug where IE 11 would scroll to the cE=false elements when they where selected.
+	Fixed bug where keys like F5 wouldn't work when a cE=false element was selected.
+	Fixed bug where the undo manager wouldn't stop the typing state when commands where executed.
+	Fixed bug where unlink on wrapped links wouldn't work properly.
+	Fixed bug with drag/drop of images on WebKit where the image would be deleted form the source editor.
+	Fixed bug where the visual characters mode would be disabled when contents was extracted from the editor.
+	Fixed bug where some browsers would toggle of formats applied to the caret when clicking in the editor toolbar.
+	Fixed bug where the custom theme function wasn't working correctly.
+	Fixed bug where image option for custom buttons required you to have icon specified as well.
+	Fixed bug where the context menu and contextual toolbars would be visible at the same time and sometimes overlapping.
+	Fixed bug where the noneditable plugin would double wrap elements when using the noneditable_regexp option.
+	Fixed bug where tables would get padding instead of margin when you used the indent button.
+	Fixed bug where the charmap plugin wouldn't properly insert non breaking spaces.
+	Fixed bug where the color previews in color input boxes wasn't properly updated.
+	Fixed bug where the list items of previous lists wasn't merged in the right order.
+	Fixed bug where it wasn't possible to drag/drop inline-block cE=false elements on IE 11.
+	Fixed bug where some table cell merges would produce incorrect rowspan/colspan.
+	Fixed so the font size of the editor defaults to 14px instead of 11px this can be overridden by custom css.
+	Fixed so wordcount is debounced to reduce cpu hogging on larger texts.
+	Fixed so tinymce global gets properly exported as a module when used with some module bundlers.
+	Fixed so it's possible to specify what css properties you want to preview on specific formats.
+	Fixed so anchors are contentEditable=false while within the editor.
+	Fixed so selected contents gets wrapped in a inline code element by the codesample plugin.
+	Fixed so conditional comments gets properly stripped independent of case. Patch contributed by Georgii Dolzhykov.
+	Fixed so some escaped css sequences gets properly handled. Patch contributed by Georgii Dolzhykov.
+	Fixed so notifications with the same message doesn't get displayed at the same time.
+	Fixed so F10 can be used as an alternative key to focus to the toolbar.
+	Fixed various api documentation issues and typos.
+	Removed layer plugin since it wasn't really ported from 3.x and there doesn't seem to be much use for it.
+	Removed moxieplayer.swf from the media plugin since it wasn't used by the media plugin.
+	Removed format state from the advlist plugin to be more consistent with common word processors.  
+Version 4.4.3 (2016-09-01)
+	Fixed bug where copy would produce an exception on Chrome.
+	Fixed bug where deleting lists on IE 11 would merge in correct text nodes.
+	Fixed bug where deleting partial lists with indentation wouldn't cause proper normalization.
+Version 4.4.2 (2016-08-25)
+	Added new importcss_exclusive option to disable unique selectors per group.
+	Added new group specific selector_converter option to importcss plugin.
+	Added new codesample_languages option to apply custom languages to codesample plugin.
+	Added new codesample_dialog_width/codesample_dialog_height options.
+	Fixed bug where fullscreen button had an incorrect keyboard shortcut.
+	Fixed bug where backspace/delete wouldn't work correctly from a block to a cE=false element.
+	Fixed bug where smartpaste wasn't detecting links with special characters in them like tilde.
+	Fixed bug where the editor wouldn't get proper focus if you clicked on a cE=false element.
+	Fixed bug where it wasn't possible to copy/paste table rows that had merged cells.
+	Fixed bug where merging cells could some times produce invalid col/rowspan attibute values.
+	Fixed bug where getBody would sometimes thrown an exception now it just returns null if the iframe is clobbered.
+	Fixed bug where drag/drop of cE=false element wasn't properly constrained to viewport.
+	Fixed bug where contextmenu on Mac would collapse any selection to a caret.
+	Fixed bug where rtl mode wasn't rendered properly when loading a language pack with the rtl flag.
+	Fixed bug where Kamer word bounderies would be stripped from contents.
+	Fixed bug where lists would sometimes render two dots or numbers on the same line.
+	Fixed bug where the skin_url wasn't used by the inlite theme.
+	Fixed so data attributes are ignored when comparing formats in the formatter.
+	Fixed so it's possible to disable inline toolbars in the inlite theme.
+	Fixed so template dialog gets resized if it doesn't fit the window viewport.
+Version 4.4.1 (2016-07-26)
+	Added smart_paste option to paste plugin to allow disabling the paste behavior if needed.
+	Fixed bug where png urls wasn't properly detected by the smart paste logic.
+	Fixed bug where the element path wasn't working properly when multiple editor instances where used.
+	Fixed bug with creating lists out of multiple paragraphs would just create one list item instead of multiple.
+	Fixed bug where scroll position wasn't properly handled by the inlite theme to place the toolbar properly.
+	Fixed bug where multiple instances of the editor using the inlite theme didn't render the toolbar properly.
+	Fixed bug where the shortcut label for fullscreen mode didn't match the actual shortcut key.
+	Fixed bug where it wasn't possible to select cE=false blocks using touch devices on for example iOS.
+	Fixed bug where it was possible to select the child image within a cE=false on IE 11.
+	Fixed so inserts of html containing lists doesn't merge with any existing lists unless it's a paste operation.
+Version 4.4.0 (2016-06-30)
+	Added new inlite theme this is a more lightweight inline UI.
+	Added smarter paste logic that auto detects urls in the clipboard and inserts images/links based on that.
+	Added a better image resize algorithm for better image quality in the imagetools plugin.
+	Fixed bug where it wasn't possible to drag/dropping cE=false elements on FF.
+	Fixed bug where backspace/delete before/after a cE=false block would produce a new paragraph.
+	Fixed bug where list style type css property wasn't preserved when indenting lists.
+	Fixed bug where merging of lists where done even if the list style type was different.
+	Fixed bug where the image_dataimg_filter function wasn't used when pasting images.
+	Fixed bug where nested editable within a non editable element would cause scroll on focus in Chrome.
+	Fixed so invalid targets for inline mode is blocked on initialization. We only support elements that can have children.
+Version 4.3.13 (2016-06-08)
+	Added characters with a diacritical mark to charmap plugin. Patch contributed by Dominik Schilling.
+	Added better error handling if the image proxy service would produce errors.
+	Fixed issue with pasting list items into list items would produce nested list rather than a merged list.
+	Fixed bug where table selection could get stuck in selection mode for inline editors.
+	Fixed bug where it was possible to place the caret inside the resize grid elements.
+	Fixed bug where it wasn't possible to place in elements horizontally adjacent cE=false blocks.
+	Fixed bug where multiple notifications wouldn't be properly placed on screen.
+	Fixed bug where multiple editor instance of the same id could be produces in some specific integrations.
+Version 4.3.12 (2016-05-10)
+	Fixed bug where focus calls couldn't be made inside the editors PostRender event handler.
+	Fixed bug where some translations wouldn't work as expected due to a bug in editor.translate.
+	Fixed bug where the node change event could fire with a node out side the root of the editor.
+	Fixed bug where Chrome wouldn't properly present the keyboard paste clipboard details when paste was clicked.
+	Fixed bug where merged cells in tables couldn't be selected from right to left.
+	Fixed bug where insert row wouldn't properly update a merged cells rowspan property.
+	Fixed bug where the color input boxes preview field wasn't properly set on initialization.
+	Fixed bug where IME composition inside table cells wouldn't work as expected on IE 11.
+	Fixed so all shadow dom support is under and experimental flag due to flaky browser support.
+Version 4.3.11 (2016-04-25)
+	Fixed bug where it wasn't possible to insert empty blocks though the API unless they where padded.
+	Fixed bug where you couldn't type the Euro character on Windows.
+	Fixed bug where backspace/delete from a cE=false element to a text block didn't work properly.
+	Fixed bug where the text color default grid would render incorrectly.
+	Fixed bug where the codesample plugin wouldn't load the css in the editor for multiple editors.
+	Fixed so the codesample plugin textarea gets focused by default.
+Version 4.3.10 (2016-04-12)
+	Fixed bug where the key "y" on WebKit couldn't be entered due to conflict with keycode for F10 on keypress.
+Version 4.3.9 (2016-04-12)
+	Added support for focusing the contextual toolbars using keyboard.
+	Added keyboard support for slider UI controls. You can no increase/decrease using arrow keys.
+	Added url pattern matching for Dailymotion to media plugin. Patch contributed by Bertrand Darbon.
+	Added body_class to template plugin preview. Patch contributed by Milen Petrinski.
+	Added options to better override textcolor pickers with custom colors. Patch contributed by Xavier Boubert.
+	Added visual arrows to inline contextual toolbars so that they point to the element being active.
+	Fixed so toolbars for tables or other larger elements get better positioned below the scrollable viewport.
+	Fixed bug where it was possible to click links inside cE=false blocks.
+	Fixed bug where event targets wasn't properly handled in Safari Technical Preview.
+	Fixed bug where drag/drop text in FF 45 would make the editor caret invisible.
+	Fixed bug where the remove state wasn't properly set on editor instances when detected as clobbered.
+	Fixed bug where offscreen selection of some cE=false elements would render onscreen. Patch contributed by Steven Bufton
+	Fixed bug where enter would clone styles out side the root on editors inside a span. Patch contributed by ChristophKaser.
+	Fixed bug where drag/drop of images into the editor didn't work correctly in FF.
+	Fixed so the first item in panels for the imagetools dialog gets proper keyboard focus.
+	Changed the Meta+Shift+F shortcut to Ctrl+Shift+F since Czech, Slovak, Polish languages used the first one for input.
+Version 4.3.8 (2016-03-15)
+	Fixed bug where inserting HR at the end of a block element would produce an extra empty block.
+	Fixed bug where links would be clickable when readonly mode was enabled.
+	Fixed bug where the formatter would normalize to the wrong node on very specific content.
+	Fixed bug where some nested list items couldn't be indented properly.
+	Fixed bug where links where clickable in the preview dialog.
+	Fixed so the alt attribute doesn't get padded with an empty value by default.
+	Fixed so nested alignment works more correctly. You will now alter the alignment to the closest block parent.
+Version 4.3.7 (2016-03-02)
+	Fixed bug where incorrect icons would be rendered for imagetools edit and color levels.
+	Fixed bug where navigation using arrow keys inside a SelectBox didn't move up/down.
+	Fixed bug where the visualblocks plugin would render borders round internal UI elements.
+Version 4.3.6 (2016-03-01)
+	Added new paste_remember_plaintext_info option to allow a global disable of the plain text mode notification.
+	Added new PastePlainTextToggle event that fires when plain text mode toggles on/off.
+	Fixed bug where it wasn't possible to select media elements since the drag logic would snap it to mouse cursor.
+	Fixed bug where it was hard to place the caret inside nested cE=true elements when the outer cE=false element was focused.
+	Fixed bug where editors wouldn't properly initialize if both selector and mode where used.
+	Fixed bug where IME input inside table cells would switch the IME off.
+	Fixed bug where selection inside the first table cell would cause the whole table cell to get selected.
+	Fixed bug where error handling of images being uploaded wouldn't properly handle faulty statuses.
+	Fixed bug where inserting contents before a HR would cause an exception to be thrown.
+	Fixed bug where copy/paste of Excel data would be inserted as an image.
+	Fixed caret position issues with copy/paste of inline block cE=false elements.
+	Fixed issues with various menu item focus bugs in Chrome. Where the focused menu bar item wasn't properly blurred.
+	Fixed so the notifications have a solid background since it would be hard to read if there where text under it.
+	Fixed so notifications gets animated similar to the ones used by dialogs.
+	Fixed so larger images that gets pasted is handled better.
+	Fixed so the window close button is more uniform on various platform and also increased it's hit area.
+Version 4.3.5 (2016-02-11)
+	Npm version bump due to package not being fully updated.
+Version 4.3.4 (2016-02-11)
+	Added new OpenWindow/CloseWindow events that gets fired when windows open/close.
+	Added new NewCell/NewRow events that gets fired when table cells/rows are created.
+	Added new Promise return value to tinymce.init makes it easier to handle initialization.
+	Removed the jQuery version the jQuery plugin is now moved into the main package.
+	Removed jscs from build process since eslint can now handle code style checking.
+	Fixed various bugs with drag/drop of contentEditable:false elements.
+	Fixed bug where deleting of very specific nested list items would result in an odd list.
+	Fixed bug where lists would get merged with adjacent lists outside the editable inline root.
+	Fixed bug where MS Edge would crash when closing a dialog then clicking a menu item.
+	Fixed bug where table cell selection would add undo levels.
+	Fixed bug where table cell selection wasn't removed when inline editor where removed.
+	Fixed bug where table cell selection wouldn't work properly on nested tables.
+	Fixed bug where table merge menu would be available when merging between thead and tbody.
+	Fixed bug where table row/column resize wouldn't get properly removed when the editor was removed.
+	Fixed bug where Chrome would scroll to the editor if there where a empty hash value in document url.
+	Fixed bug where the cache suffix wouldn't work correctly with the importcss plugin.
+	Fixed bug where selection wouldn't work properly on MS Edge on Windows Phone 10.
+	Fixed so adjacent pre blocks gets joined into one pre block since that seems like the user intent.
+	Fixed so events gets properly dispatched in shadow dom. Patch provided by Nazar Mokrynskyi.
+Version 4.3.3 (2016-01-14)
+	Added new table_resize_bars configuration setting.  This setting allows you to disable the table resize bars.
+	Added new beforeInitialize event to tinymce.util.XHR lets you modify XHR properties before open. Patch contributed by Brent Clintel.
+	Added new autolink_pattern setting to autolink plugin. Enables you to override the default autolink formats. Patch contributed by Ben Tiedt.
+	Added new charmap option that lets you override the default charmap of the charmap plugin.
+	Added new charmap_append option that lets you add new characters to the default charmap of the charmap plugin.
+	Added new insertCustomChar event that gets fired when a character is inserted by the charmap plugin.
+	Fixed bug where table cells started with a superfluous &nbsp; in IE10+.
+	Fixed bug where table plugin would retain all BR tags when cells were merged.
+	Fixed bug where media plugin would strip underscores from youtube urls.
+	Fixed bug where IME input would fail on IE 11 if you typed within a table.
+	Fixed bug where double click selection of a word would remove the space before the word on insert contents.
+	Fixed bug where table plugin would produce exceptions when hovering tables with invalid structure.
+	Fixed bug where fullscreen wouldn't scroll back to it's original position when untoggled.
+	Fixed so the template plugins templates setting can be a function that gets a callback that can provide templates.
+Version 4.3.2 (2015-12-14)
+	Fixed bug where the resize bars for table cells were not affected by the object_resizing property.
+	Fixed bug where the contextual table toolbar would appear incorrectly if TinyMCE was initialized inline inside a table.
+	Fixed bug where resizing table cells did not fire a node change event or add an undo level.
+	Fixed bug where double click selection of text on IE 11 wouldn't work properly.
+	Fixed bug where codesample plugin would incorrectly produce br elements inside code elements.
+	Fixed bug where media plugin would strip dashes from youtube urls.
+	Fixed bug where it was possible to move the caret into the table resize bars.
+	Fixed bug where drag/drop into a cE=false element was possible on IE.
+Version 4.3.1 (2015-11-30)
+	Fixed so it's possible to disable the table inline toolbar by setting it to false or an empty string.
+	Fixed bug where it wasn't possible to resize some tables using the drag handles.
+	Fixed bug where unique id:s would clash for multiple editor instances and cE=false selections.
+	Fixed bug where the same plugin could be initialized multiple times.
+	Fixed bug where the table inline toolbars would be displayed at the same time as the image toolbars.
+	Fixed bug where the table selection rect wouldn't be removed when selecting another control element.
+Version 4.3.0 (2015-11-23)
+	Added new table column/row resize support. Makes it a lot more easy to resize the columns/rows in a table.
+	Added new table inline toolbar. Makes it easier to for example add new rows or columns to a table.
+	Added new notification API. Lets you display floating notifications to the end user.
+	Added new codesample plugin that lets you insert syntax highlighted pre elements into the editor.
+	Added new image_caption to images. Lets you create images with captions using a HTML5 figure/figcaption elements.
+	Added new live previews of embeded videos. Lets you play the video right inside the editor.
+	Added new setDirty method and "dirty" event to the editor. Makes it easier to track the dirty state change.
+	Added new setMode method to Editor instances that lets you dynamically switch between design/readonly.
+	Added new core support for contentEditable=false elements within the editor overrides the browsers broken behavior.
+	Rewrote the noneditable plugin to use the new contentEditable false core logic.
+	Fixed so the dirty state doesn't set set to false automatically when the undo index is set to 0.
+	Fixed the Selection.placeCaretAt so it works better on IE when the coordinate is between paragraphs.
+	Fixed bug where data-mce-bogus="all" element contents where counted by the word count plugin.
+	Fixed bug where contentEditable=false elements would be indented by the indent buttons.
+	Fixed bug where images within contentEditable=false would be selected in WebKit on mouse click.
+	Fixed bug in DOMUntils split method where the replacement parameter wouldn't work on specific cases.
+	Fixed bug where the importcss plugin would import classes from the skin content css file.
+	Fixed so all button variants have a wrapping span for it's text to make it easier to skin.
+	Fixed so it's easier to exit pre block using the arrow keys.
+	Fixed bug where listboxes with fix widths didn't render correctly.
+Version 4.2.8 (2015-11-13)
+	Fixed bug where it was possible to delete tables as the inline root element if all columns where selected.
+	Fixed bug where the UI buttons active state wasn't properly updated due to recent refactoring of that logic.
+Version 4.2.7 (2015-10-27)
+	Fixed bug where backspace/delete would remove all formats on the last paragraph character in WebKit/Blink.
+	Fixed bug where backspace within a inline format element with a bogus caret container would move the caret.
+	Fixed bug where backspace/delete on selected table cells wouldn't add an undo level.
+	Fixed bug where script tags embedded within the editor could sometimes get a mce- prefix prepended to them
+	Fixed bug where validate: false option could produce an error to be thrown from the Serialization step.
+	Fixed bug where inline editing of a table as the root element could let the user delete that table.
+	Fixed bug where inline editing of a table as the root element wouldn't properly handle enter key.
+	Fixed bug where inline editing of a table as the root element would normalize the selection incorrectly.
+	Fixed bug where inline editing of a list as the root element could let the user delete that list.
+	Fixed bug where inline editing of a list as the root element could let the user split that list.
+	Fixed bug where resize handles would be rendered on editable root elements such as table.
+Version 4.2.6 (2015-09-28)
+	Added capability to set request headers when using XHRs.
+	Added capability to upload local images automatically default delay is set to 30 seconds after editing images.
+	Added commands ids mceEditImage, mceAchor and mceMedia to be avaiable from execCommand.
+	Added Edge browser to saucelabs grunt task. Patch contributed by John-David Dalton.
+	Fixed bug where blob uris not produced by tinymce would produce HTML invalid markup.
+	Fixed bug where selection of contents of a nearly empty editor in Edge would sometimes fail.
+	Fixed bug where color styles woudln't be retained on copy/paste in Blink/Webkit.
+	Fixed bug where the table plugin would throw an error when inserting rows after a child table.
+	Fixed bug where the template plugin wouldn't handle functions as variable replacements.
+	Fixed bug where undo/redo sometimes wouldn't work properly when applying formatting collapsed ranges.
+	Fixed bug where shift+delete wouldn't do a cut operation on Blink/WebKit.
+	Fixed bug where cut action wouldn't properly store the before selection bookmark for the undo level.
+	Fixed bug where backspace in side an empty list element on IE would loose editor focus.
+	Fixed bug where the save plugin wouldn't enable the buttons when a change occurred.
+	Fixed bug where Edge wouldn't initialize the editor if a document.domain was specified.
+	Fixed bug where enter key before nested images would sometimes not properly expand the previous block.
+	Fixed bug where the inline toolbars wouldn't get properly hidden when blurring the editor instance.
+	Fixed bug where Edge would paste Chinese characters on some Windows 10 installations.
+	Fixed bug where IME would loose focus on IE 11 due to the double trailing br bug fix.
+	Fixed bug where the proxy url in imagetools was incorrect. Patch contributed by Wong Ho Wang.
+Version 4.2.5 (2015-08-31)
+	Added fullscreen capability to embedded youtube and vimeo videos.
+	Fixed bug where the uploadImages call didn't work on IE 10.
+	Fixed bug where image place holders would be uploaded by uploadImages call.
+	Fixed bug where images marked with bogus would be uploaded by the uploadImages call.
+	Fixed bug where multiple calls to uploadImages would result in decreased performance.
+	Fixed bug where pagebreaks were editable to imagetools patch contributed by Rasmus Wallin.
+	Fixed bug where the element path could cause too much recursion exception.
+	Fixed bug for domains containing ".min". Patch contributed by Loïc Février.
+	Fixed so validation of external links to accept a number after www. Patch contributed by Victor Carvalho.
+	Fixed so the charmap is exposed though execCommand. Patch contributed by Matthew Will.
+	Fixed so that the image uploads are concurrent for improved performance.
+	Fixed various grammar problems in inline documentation. Patches provided by nikolas.
+Version 4.2.4 (2015-08-17)
+	Added picture as a valid element to the HTML 5 schema. Patch contributed by Adam Taylor.
+	Fixed bug where contents would be duplicated on drag/drop within the same editor.
+	Fixed bug where floating/alignment of images on Edge wouldn't work properly.
+	Fixed bug where it wasn't possible to drag images on IE 11.
+	Fixed bug where image selection on Edge would sometimes fail.
+	Fixed bug where contextual toolbars icons wasn't rendered properly when using the toolbar_items_size.
+	Fixed bug where searchreplace dialog doesn't get prefilled with the selected text.
+	Fixed bug where fragmented matches wouldn't get properly replaced by the searchreplace plugin.
+	Fixed bug where enter key wouldn't place the caret if was after a trailing space within an inline element.
+	Fixed bug where the autolink plugin could produce multiple links for the same text on Gecko.
+	Fixed bug where EditorUpload could sometimes throw an exception if the blob wasn't found.
+	Fixed xss issues with media plugin not properly filtering out some script attributes.
+Version 4.2.3 (2015-07-30)
+	Fixed bug where image selection wasn't possible on Edge due to incompatible setBaseAndExtend API.
+	Fixed bug where image blobs urls where not properly destroyed by the imagetools plugin.
+	Fixed bug where keyboard shortcuts wasn't working correctly on IE 8.
+	Fixed skin issue where the borders of panels where not visible on IE 8.
+Version 4.2.2 (2015-07-22)
+	Fixed bug where float panels were not being hidden on inline editor blur when fixed_toolbar_container config option was in use.
+	Fixed bug where combobox states wasn't properly updated if contents where updated without keyboard.
+	Fixed bug where pasting into textbox or combobox would move the caret to the end of text.
+	Fixed bug where removal of bogus span elements before block elements would remove whitespace between nodes.
+	Fixed bug where repositioning of inline toolbars where async and producing errors if the editor was removed from DOM to early. Patch by iseulde.
+	Fixed bug where element path wasn't working correctly. Patch contributed by iseulde.
+	Fixed bug where menus wasn't rendered correctly when custom images where added to a menu. Patch contributed by Naim Hammadi.
+Version 4.2.1 (2015-06-29)
+	Fixed bug where back/forward buttons in the browser would render blob images as broken images.
+	Fixed bug where Firefox would throw regexp to big error when replacing huge base64 chunks.
+	Fixed bug rendering issues with resize and context toolbars not being placed properly until next animation frame.
+	Fixed bug where the rendering of the image while cropping would some times not be centered correctly.
+	Fixed bug where listbox items with submenus would me selected as active.
+	Fixed bug where context menu where throwing an error when rendering.
+	Fixed bug where resize both option wasn't working due to resent addClass API change. Patch contributed by Jogai.
+	Fixed bug where a hideAll call for container rendered inline toolbars would throw an error.
+	Fixed bug where onclick event handler on combobox could cause issues if element.id was a function by some polluting libraries.
+	Fixed bug where listboxes wouldn't get proper selected sub menu item when using link_list or image_list.
+	Fixed so the UI controls are as wide as 4.1.x to avoid wrapping controls in toolbars.
+	Fixed so the imagetools dialog is adaptive for smaller screen sizes.
+Version 4.2.0 (2015-06-25)
+	Added new flat default skin to make the UI more modern.
+	Added new imagetools plugin, lets you crop/resize and apply filters to images.
+	Added new contextual toolbars support to the API lets you add floating toolbars for specific CSS selectors.
+	Added new promise feature fill as tinymce.util.Promise.
+	Added new built in image upload feature lets you upload any base64 encoded image within the editor as files.
+	Fixed bug where resize handles would appear in the right position in the wrong editor when switching between resizable content in different inline editors.
+	Fixed bug where tables would not be inserted in inline mode due to previous float panel fix.
+	Fixed bug where floating panels would remain open when focus was lost on inline editors.
+	Fixed bug where cut command on Chrome would thrown a browser security exception.
+	Fixed bug where IE 11 sometimes would report an incorrect size for images in the image dialog.
+	Fixed bug where it wasn't possible to remove inline formatting at the end of block elements.
+	Fixed bug where it wasn't possible to delete table cell contents when cell selection was vertical.
+	Fixed bug where table cell wasn't emptied from block elements if delete/backspace where pressed in empty cell.
+	Fixed bug where cmd+shift+arrow didn't work correctly on Firefox mac when selecting to start/end of line.
+	Fixed bug where removal of bogus elements would sometimes remove whitespace between nodes.
+	Fixed bug where the resize handles wasn't updated when the main window was resized.
+	Fixed so script elements gets removed by default to prevent possible XSS issues in default config implementations.
+	Fixed so the UI doesn't need manual reflows when using non native layout managers.
+	Fixed so base64 encoded images doesn't slow down the editor on modern browsers while editing.
+	Fixed so all UI elements uses touch events to improve mobile device support.
+	Removed the touch click quirks patch for iOS since it did more harm than good.
+	Removed the non proportional resize handles since. Unproportional resize can still be done by holding the shift key.
+Version 4.1.10 (2015-05-05)
+	Fixed bug where plugins loaded with compat3x would sometimes throw errors when loading using the jQuery version.
+	Fixed bug where extra empty paragraphs would get deleted in WebKit/Blink due to recent Quriks fix.
+	Fixed bug where the editor wouldn't work properly on IE 12 due to some required browser sniffing.
+	Fixed bug where formatting shortcut keys where interfering with Mac OS X screenshot keys.
+	Fixed bug where the caret wouldn't move to the next/previous line boundary on Cmd+Left/Right on Gecko.
+	Fixed bug where it wasn't possible to remove formats from very specific nested contents.
+	Fixed bug where undo levels wasn't produced when typing letters using the shift or alt+ctrl modifiers.
+	Fixed bug where the dirty state wasn't properly updated when typing using the shift or alt+ctrl modifiers.
+	Fixed bug where an error would be thrown if an autofocused editor was destroyed quickly after its initialization. Patch provided by thorn0.
+	Fixed issue with dirty state not being properly updated on redo operation.
+	Fixed issue with entity decoder not handling incorrectly written numeric entities.
+	Fixed issue where some PI element values wouldn't be properly encoded.
+Version 4.1.9 (2015-03-10)
+	Fixed bug where indentation wouldn't work properly for non list elements.
+	Fixed bug with image plugin not pulling the image dimensions out correctly if a custom document_base_url was used.
+	Fixed bug where ctrl+alt+[1-9] would conflict with the AltGr+[1-9] on Windows. New shortcuts is ctrl+shift+[1-9].
+	Fixed bug with removing formatting on nodes in inline mode would sometimes include nodes outside the editor body.
+	Fixed bug where extra nbsp:s would be inserted when you replaced a word surrounded by spaces using insertContent.
+	Fixed bug with pasting from Google Docs would produce extra strong elements and line feeds.
+Version 4.1.8 (2015-03-05)
+	Added new html5 sizes attribute to img elements used together with srcset.
+	Added new elementpath option that makes it possible to disable the element path but keep the statusbar.
+	Added new option table_style_by_css for the table plugin to set table styling with css rather than table attributes.
+	Added new link_assume_external_targets option to prompt the user to prepend http:// prefix if the supplied link does not contain a protocol prefix.
+	Added new image_prepend_url option to allow a custom base path/url to be added to images.
+	Added new table_appearance_options option to make it possible to disable some options.
+	Added new image_title option to make it possible to alter the title of the image, disabled by default.
+	Fixed bug where selection starting from out side of the body wouldn't produce a proper selection range on IE 11.
+	Fixed bug where pressing enter twice before a table moves the cursor in the table and causes a javascript error.
+	Fixed bug where advanced image styles were not respected.
+	Fixed bug where the less common Shift+Delete didn't produce a proper cut operation on WebKit browsers.
+	Fixed bug where image/media size constrain logic would produce NaN when handling non number values.
+	Fixed bug where internal classes where removed by the removeformat command.
+	Fixed bug with creating links table cell contents with a specific selection would throw a exceptions on WebKit/Blink.
+	Fixed bug where valid_classes option didn't work as expected according to docs. Patch provided by thorn0.
+	Fixed bug where jQuery plugin would patch the internal methods multiple times. Patch provided by Drew Martin.
+	Fixed bug where backspace key wouldn't delete the current selection of newly formatted content.
+	Fixed bug where type over of inline formatting elements wouldn't properly keep the format on WebKit/Blink.
+	Fixed bug where selection needed to be properly normalized on modern IE versions.
+	Fixed bug where Command+Backspace didn't properly delete the whole line of text but the previous word.
+	Fixed bug where UI active states wheren't properly updated on IE if you placed caret within the current range.
+	Fixed bug where delete/backspace on WebKit/Blink would remove span elements created by the user.
+	Fixed bug where delete/backspace would produce incorrect results when deleting between two text blocks with br elements.
+	Fixed bug where captions where removed when pasting from MS Office.
+	Fixed bug where lists plugin wouldn't properly remove fully selected nested lists.
+	Fixed bug where the ttf font used for icons would throw an warning message on Gecko on Mac OS X.
+	Fixed a bug where applying a color to text did not update the undo/redo history.
+	Fixed so shy entities gets displayed when using the visualchars plugin.
+	Fixed so removeformat removes ins/del by default since these might be used for strikethough.
+	Fixed so multiple language packs can be loaded and added to the global I18n data structure.
+	Fixed so transparent color selection gets treated as a normal color selection. Patch contributed by Alexander Hofbauer.
+	Fixed so it's possible to disable autoresize_overflow_padding, autoresize_bottom_margin options by setting them to false.
+	Fixed so the charmap plugin shows the description of the character in the dialog. Patch contributed by Jelle Hissink.
+	Removed address from the default list of block formats since it tends to be missused.
+	Fixed so the pre block format is called preformatted to make it more verbose.
+	Fixed so it's possible to context scope translation strings this isn't needed most of the time.
+	Fixed so the max length of the width/height input fields of the media dialog is 5 instead of 3.
+	Fixed so drag/dropped contents gets properly processed by paste plugin since it's basically a paste. Patch contributed by Greg Fairbanks.
+	Fixed so shortcut keys for headers is ctrl+alt+[1-9] instead of ctrl+[1-9] since these are for switching tabs in the browsers.
+	Fixed so "u" doesn't get converted into a span element by the legacy input filter. Since this is now a valid HTML5 element.
+	Fixed font families in order to provide appropriate web-safe fonts.
+Version 4.1.7 (2014-11-27)
+	Added HTML5 schema support for srcset, source and picture. Patch contributed by mattheu.
+	Added new cache_suffix setting to enable cache busting by producing unique urls.
+	Added new paste_convert_word_fake_lists option to enable users to disable the fake lists convert logic.
+	Fixed so advlist style changes adds undo levels for each change.
+	Fixed bug where WebKit would sometimes produce an exception when the autolink plugin where looking for URLs.
+	Fixed bug where IE 7 wouldn't be rendered properly due to to aggressive css compression.
+	Fixed bug where DomQuery wouldn't accept window as constructor element.
+	Fixed bug where the color picker in 3.x dialogs wouldn't work properly. Patch contributed by Callidior.
+	Fixed bug where the image plugin wouldn't respect the document_base_url.
+	Fixed bug where the jQuery plugin would fail to append to elements named array prototype names.
+Version 4.1.6 (2014-10-08)
+	Fixed bug with clicking on the scrollbar of the iframe would cause a JS error to be thrown.
+	Fixed bug where null would produce an exception if you passed it to selection.setRng.
+	Fixed bug where Ctrl/Cmd+Tab would indent the current list item if you switched tabs in the browser.
+	Fixed bug where pasting empty cells from Excel would result in a broken table.
+	Fixed bug where it wasn't possible to switch back to default list style type.
+	Fixed issue where the select all quirk fix would fire for other modifiers than Ctrl/Cmd combinations.
+	Replaced jake with grunt since it is more mainstream and has better plugin support.
+Version 4.1.5 (2014-09-09)
+	Fixed bug where sometimes the resize rectangles wouldn't properly render on images on WebKit/Blink.
+	Fixed bug in list plugin where delete/backspace would merge empty LI elements in lists incorrectly.
+	Fixed bug where empty list elements would result in empty LI elements without it's parent container.
+	Fixed bug where backspace in empty caret formatted element could produce an type error exception of Gecko.
+	Fixed bug where lists pasted from word with a custom start index above 9 wouldn't be properly handled.
+	Fixed bug where tabfocus plugin would tab out of the editor instance even if the default action was prevented.
+	Fixed bug where tabfocus wouldn't tab properly to other adjacent editor instances.
+	Fixed bug where the DOMUtils setStyles wouldn't properly removed or update the data-mce-style attribute.
+	Fixed bug where dialog select boxes would be placed incorrectly if document.body wasn't statically positioned.
+	Fixed bug where pasting would sometimes scroll to the top of page if the user was using the autoresize plugin.
+	Fixed bug where caret wouldn't be properly rendered by Chrome when clicking on the iframes documentElement.
+	Fixed so custom images for menubutton/splitbutton can be provided. Patch contributed by Naim Hammadi.
+	Fixed so the default action of windows closing can be prevented by blocking the default action of the close event.
+	Fixed so nodeChange and focus of the editor isn't automatically performed when opening sub dialogs.
+Version 4.1.4 (2014-08-21)
+	Added new media_filter_html option to media plugin that blocks any conditional comments, scripts etc within a video element.
+	Added new content_security_policy option allows you to set custom policy for iframe contents. Patch contributed by Francois Chagnon.
+	Fixed bug where activate/deactivate events wasn't firing properly when switching between editors.
+	Fixed bug where placing the caret on iOS was difficult due to a WebKit bug with touch events.
+	Fixed bug where the resize helper wouldn't render properly on older IE versions.
+	Fixed bug where resizing images inside tables on older IE versions would sometimes fail depending mouse position.
+	Fixed bug where editor.insertContent would produce an exception when inserting select/option elements.
+	Fixed bug where extra empty paragraphs would be produced if block elements where inserted inside span elements.
+	Fixed bug where the spellchecker menu item wouldn't be properly checked if spell checking was started before it was rendered.
+	Fixed bug where the DomQuery filter function wouldn't remove non elements from collection.
+	Fixed bug where document with custom document.domain wouldn't properly render the editor.
+	Fixed bug where IE 8 would throw exception when trying to enter invalid color values into colorboxes.
+	Fixed bug where undo manager could incorrectly add an extra undo level when custom resize handles was removed.
+	Fixed bug where it wouldn't be possible to alter cell properties properly on table cells on IE 8.
+	Fixed so the color picker button in table dialog isn't shown unless you include the colorpicker plugin or add your own custom color picker.
+	Fixed so activate/deactivate events fire when windowManager opens a window since.
+	Fixed so the table advtab options isn't separated by an underscore to normalize naming with image_advtab option.
+	Fixed so the table cell dialog has proper padding when the advanced tab in disabled.
+Version 4.1.3 (2014-07-29)
+	Added event binding logic to tinymce.util.XHR making it possible to override headers and settings before any request is made.
+	Fixed bug where drag events wasn't fireing properly on older IE versions since the event handlers where bound to document.
+	Fixed bug where drag/dropping contents within the editor on IE would force the contents into plain text mode even if it was internal content.
+	Fixed bug where IE 7 wouldn't open menus properly due to a resize bug in the browser auto closing them immediately.
+	Fixed bug where the DOMUtils getPos logic wouldn't produce a valid coordinate inside the body if the body was positioned non static.
+	Fixed bug where the element path and format state wasn't properly updated if you had the wordcount plugin enabled.
+	Fixed bug where a comment at the beginning of source would produce an exception in the formatter logic.
+	Fixed bug where setAttrib/getAttrib on null would throw exception together with any hooked attributes like style.
+	Fixed bug where table sizes wasn't properly retained when copy/pasting on WebKit/Blink.
+	Fixed bug where WebKit/Blink would produce colors in RGB format instead of the forced HEX format when deleting contents.
+	Fixed bug where the width attribute wasn't updated on tables if you changed the size inside the table dialog.
+	Fixed bug where control selection wasn't properly handled when the caret was placed directly after an image.
+	Fixed bug where selecting the contents of table cells using the selection.select method wouldn't place the caret properly.
+	Fixed bug where the selection state for images wasn't removed when placing the caret right after an image on WebKit/Blink.
+	Fixed bug where all events wasn't properly unbound when and editor instance was removed or destroyed by some external innerHTML call.
+	Fixed bug where it wasn't possible or very hard to select images on iOS when the onscreen keyboard was visible.
+	Fixed so auto_focus can take a boolean argument this will auto focus the last initialized editor might be useful for single inits.
+	Fixed so word auto detect lists logic works better for faked lists that doesn't have specific markup.
+	Fixed so nodeChange gets fired on mouseup as it used to before 4.1.1 we optimized that event to fire less often.
+	Removed the finish menu item from spellchecker menu since it's redundant you can stop spellchecking by toggling menu item or button.
+Version 4.1.2 (2014-07-15)
+	Added offset/grep to DomQuery class works basically the same as it's jQuery equivalent.
+	Fixed bug where backspace/delete or setContent with an empty string would remove header data when using the fullpage plugin.
+	Fixed bug where tinymce.remove with a selector not matching any editors would remove all editors.
+	Fixed bug where resizing of the editor didn't work since the theme was calling setStyles instead of setStyle.
+	Fixed bug where IE 7 would fail to append html fragments to iframe document when using DomQuery.
+	Fixed bug where the getStyle DOMUtils method would produce an exception if it was called with null as it's element.
+	Fixed bug where the paste plugin would remove the element if the none of the paste_webkit_styles rules matched the current style.
+	Fixed bug where contextmenu table items wouldn't work properly on IE since it would some times fire an incorrect selection change.
+	Fixed bug where the padding/border values wasn't used in the size calculation for the body size when using autoresize. Patch contributed by Matt Whelan.
+	Fixed bug where conditional word comments wouldn't be properly removed when pasting plain text.
+	Fixed bug where resizing would sometime fail on IE 11 when the mouseup occurred inside the resizable element.
+	Fixed so the iframe gets initialized without any inline event handlers for better CSP support. Patch contributed by Matt Whelan.
+	Fixed so the tinymce.dom.Sizzle is the latest version of sizzle this resolves the document context bug.
+Version 4.1.1 (2014-07-08)
+	Fixed bug where pasting plain text on some WebKit versions would result in an empty line.
+	Fixed bug where resizing images inside tables on IE 11 wouldn't work properly.
+	Fixed bug where IE 11 would sometimes throw "Invalid argument" exception when editor contents was set to an empty string.
+	Fixed bug where document.activeElement would throw exceptions on IE 9 when that element was hidden or removed from dom.
+	Fixed bug where WebKit/Blink sometimes produced br elements with the Apple-interchange-newline class.
+	Fixed bug where table cell selection wasn't properly removed when copy/pasting table cells.
+	Fixed bug where pasting nested list items from Word wouldn't produce proper semantic nested lists.
+	Fixed bug where right clicking using the contextmenu plugin on WebKit/Blink on Mac OS X would select the target current word or line.
+	Fixed bug where it wasn't possible to alter table cell properties on IE 8 using the context menu.
+	Fixed bug where the resize helper wouldn't be correctly positioned on older IE versions.
+	Fixed bug where fullpage plugin would produce an error if you didn't specify a doctype encoding.
+	Fixed bug where anchor plugin would get the name/id of the current element even if it wasn't anchor element.
+	Fixed bug where visual aids for tables wouldn't be properly disabled when changing the border size.
+	Fixed bug where some control selection events wasn't properly fired on older IE versions.
+	Fixed bug where table cell selection on older IE versions would prevent resizing of images.
+	Fixed bug with paste_data_images paste option not working properly on modern IE versions.
+	Fixed bug where custom elements with underscores in the name wasn't properly parsed/serialized.
+	Fixed bug where applying inline formats to nested list elements would produce an incorrect formatting result.
+	Fixed so it's possible to hide items from elements path by using preventDefault/stopPropagation.
+	Fixed so inline mode toolbar gets rendered right aligned if the editable element positioned to the documents right edge.
+	Fixed so empty inline elements inside empty block elements doesn't get removed if configured to be kept intact.
+	Fixed so DomQuery parentsUntil/prevUntil/nextUntil supports selectors/elements/filters etc.
+	Fixed so legacyoutput plugin overrides fontselect and fontsizeselect controls and handles font elements properly.
+Version 4.1.0 (2014-06-18)
+	Added new file_picker_callback option to replace the old file_browser_callback the latter will still work though.
+	Added new custom colors to textcolor plugin will be displayed if a color picker is provided also shows the latest colors.
+	Added new color_picker_callback option to enable you to add custom color pickers to the editor.
+	Added new advanced tabs to table/cell/row dialogs to enable you to select colors for border/background.
+	Added new colorpicker plugin that lets you select colors from a hsv color picker.
+	Added new tinymce.util.Color class to handle color parsing and converting.
+	Added new colorpicker UI widget element lets you add a hsv color picker to any form/window.
+	Added new textpattern plugin that allows you to use markdown like text patterns to format contents.
+	Added new resize helper element that shows the current width & height while resizing.
+	Added new "once" method to Editor and EventDispatcher enables since callback execution events.
+	Added new jQuery like class under tinymce.dom.DomQuery it's exposed on editor instances (editor.$) and globally under (tinymce.$).
+	Fixed so the default resize method for images are proportional shift/ctrl can be used to make an unproportional size.
+	Fixed bug where the image_dimensions option of the image plugin would cause exceptions when it tried to update the size.
+	Fixed bug where table cell dialog class field wasn't properly updated when editing an a table cell with an existing class.
+	Fixed bug where Safari on Mac would produce webkit-fake-url for pasted images so these are now removed.
+	Fixed bug where the nodeChange event would get fired before the selection was changed when clicking inside the current selection range.
+	Fixed bug where valid_classes option would cause exception when it removed internal prefixed classes like mce-item-.
+	Fixed bug where backspace would cause navigation in IE 8 on an inline element and after a caret formatting was applied.
+	Fixed so placeholder images produced by the media plugin gets selected when inserted/edited.
+	Fixed so it's possible to drag in images when the paste_data_images option is enabled. Might be useful for mail clients.
+	Fixed so images doesn't get a width/height applied if the image_dimensions option is set to false useful for responsive contents.
+	Fixed so it's possible to pass in an optional arguments object for the nodeChanged function to be passed to all nodechange event listeners.
+	Fixed bug where media plugin embed code didn't update correctly.
 

file:b/tinymce4/init.php (new)
--- /dev/null
+++ b/tinymce4/init.php
@@ -1,1 +1,77 @@
+<?php
 
+echo "
+	<script language=\"javascript\" type=\"text/javascript\"><!--";
+	$tinylanguage = $language;
+	if (!file_exists(_BASEDIR . "tinymce/js/tinymce/langs/{$language}.js"))
+	{
+		$tinylanguage = "en";
+	} 
+	$tinymessage = dbquery("SELECT message_text FROM ".TABLEPREFIX."fanfiction_messages WHERE message_name = 'tinyMCE' LIMIT 1");
+	list($tinysettings) = dbrow($tinymessage);
+	if(!empty($tinysettings) && $current != "adminarea") {
+		echo $tinysettings;
+	}
+	else {
+		echo "
+	tinymce.init({
+  		selector: 'textarea:not(.mceNoEditor)',
+  		menubar: false,
+		language: '$tinylanguage',
+  		theme: 'modern',
+		skin: 'lightgray',
+		min_height: 200,
+		plugins: [
+		    'autolink lists link image charmap paste preview hr anchor pagebreak',
+		    'searchreplace wordcount visualblocks visualchars code fullscreen',
+		    'insertdatetime media nonbreaking save table contextmenu directionality',
+		    'emoticons template textcolor colorpicker textpattern imagetools toc textcolor table'
+		],
+		paste_word_valid_elements: 'b,strong,i,em,h1,h2,u,p,ol,ul,li,a[href],span,color,font-size,font-color,font-family,mark,table,tr,td',
+		paste_retain_style_properties : 'all',
+		paste_strip_class_attributes: 'none',
+		toolbar1: 'undo redo | insert styleselect | bold italic underline strikethrough | link image | alignleft aligncenter alignright alignjustify code pastetext',
+		toolbar2: 'preview | bullist numlist | forecolor backcolor emoticons | fontselect |  fontsizeselect wordcount', 
+		image_advtab: true,
+		templates: [
+		    { title: 'Test template 1', content: 'Test 1' },
+		    { title: 'Test template 2', content: 'Test 2' }
+		],
+		content_css: [
+		    '//fonts.googleapis.com/css?family=Lato:300,300i,400,400i',
+		    '//www.tinymce.com/css/codepen.min.css'
+		],";
+		if(USERUID) 
+			echo "		external_image_list_url : '".STORIESPATH."/".USERUID."/images/imagelist.js',";
+		echo "
+		theme_modern_resizing: true,".($current == "adminarea" ? "\n\t\tentity_encoding: 'raw'" : "\n\t\tinvalid_elements: 'script,object,applet,iframe'")."
+   });
+	
+";
+	}
+	echo "
+var tinyMCEmode = true;
+	function toogleEditorMode(id) {
+		var elm = document.getElementById(id);
+
+		if (tinyMCE.get(id) == null)
+		tinymce.EditorManager.execCommand('mceAddEditor',true, id);
+		//tinyMCE.execCommand('mceAddControl', false, id);
+		else
+		tinymce.EditorManager.execCommand('mceRemoveEditor', true, id);
+		//	tinyMCE.execCommand('mceRemoveControl', false, id);
+	}
+";
+/*echo "
+var tinyMCEmode = true;
+	function toogleEditorMode(id) {
+		var elm = document.getElementById(id);
+
+		if (tinyMCE.get(id) == null)
+			tinyMCE.execCommand('mceAddControl', false, id);
+		else
+			tinyMCE.execCommand('mceRemoveControl', false, id);
+	}
+";*/
+echo " --></script>";
+

--- /dev/null
+++ b/tinymce4/js/tinymce/jquery.tinymce.min.js
@@ -1,1 +1,1 @@
-
+!function(e){function t(){function t(e){"remove"===e&&this.each(function(e,t){var n=i(t);n&&n.remove()}),this.find("span.mceEditor,div.mceEditor").each(function(e,t){var n=tinymce.get(t.id.replace(/_parent$/,""));n&&n.remove()})}function r(e){var n,r=this;if(null!=e)t.call(r),r.each(function(t,n){var r;(r=tinymce.get(n.id))&&r.setContent(e)});else if(r.length>0&&(n=tinymce.get(r[0].id)))return n.getContent()}function i(e){var t=null;return e&&e.id&&a.tinymce&&(t=tinymce.get(e.id)),t}function o(e){return!!(e&&e.length&&a.tinymce&&e.is(":tinymce"))}var s={};e.each(["text","html","val"],function(t,a){var l=s[a]=e.fn[a],c="text"===a;e.fn[a]=function(t){var a=this;if(!o(a))return l.apply(a,arguments);if(t!==n)return r.call(a.filter(":tinymce"),t),l.apply(a.not(":tinymce"),arguments),a;var s="",u=arguments;return(c?a:a.eq(0)).each(function(t,n){var r=i(n);s+=r?c?r.getContent().replace(/<(?:"[^"]*"|'[^']*'|[^'">])*>/g,""):r.getContent({save:!0}):l.apply(e(n),u)}),s}}),e.each(["append","prepend"],function(t,r){var a=s[r]=e.fn[r],l="prepend"===r;e.fn[r]=function(e){var t=this;return o(t)?e!==n?("string"==typeof e&&t.filter(":tinymce").each(function(t,n){var r=i(n);r&&r.setContent(l?e+r.getContent():r.getContent()+e)}),a.apply(t.not(":tinymce"),arguments),t):void 0:a.apply(t,arguments)}}),e.each(["remove","replaceWith","replaceAll","empty"],function(n,r){var i=s[r]=e.fn[r];e.fn[r]=function(){return t.call(this,r),i.apply(this,arguments)}}),s.attr=e.fn.attr,e.fn.attr=function(t,a){var l=this,c=arguments;if(!t||"value"!==t||!o(l))return a!==n?s.attr.apply(l,c):s.attr.apply(l,c);if(a!==n)return r.call(l.filter(":tinymce"),a),s.attr.apply(l.not(":tinymce"),c),l;var u=l[0],d=i(u);return d?d.getContent({save:!0}):s.attr.apply(e(u),c)}}var n,r,i,o=[],a=window;e.fn.tinymce=function(n){function s(){var r=[],o=0;i||(t(),i=!0),d.each(function(e,t){var i,a=t.id,s=n.oninit;a||(t.id=a=tinymce.DOM.uniqueId()),tinymce.get(a)||(i=new tinymce.Editor(a,n,tinymce.EditorManager),r.push(i),i.on("init",function(){var e,t=s;d.css("visibility",""),s&&++o==r.length&&("string"==typeof t&&(e=t.indexOf(".")===-1?null:tinymce.resolve(t.replace(/\.\w+$/,"")),t=tinymce.resolve(t)),t.apply(e||tinymce,r))}))}),e.each(r,function(e,t){t.render()})}var l,c,u,d=this,f="";if(!d.length)return d;if(!n)return window.tinymce?tinymce.get(d[0].id):null;if(d.css("visibility","hidden"),a.tinymce||r||!(l=n.script_url))1===r?o.push(s):s();else{r=1,c=l.substring(0,l.lastIndexOf("/")),l.indexOf(".min")!=-1&&(f=".min"),a.tinymce=a.tinyMCEPreInit||{base:c,suffix:f},l.indexOf("gzip")!=-1&&(u=n.language||"en",l=l+(/\?/.test(l)?"&":"?")+"js=true&core=true&suffix="+escape(f)+"&themes="+escape(n.theme||"modern")+"&plugins="+escape(n.plugins||"")+"&languages="+(u||""),a.tinyMCE_GZ||(a.tinyMCE_GZ={start:function(){function t(e){tinymce.ScriptLoader.markDone(tinymce.baseURI.toAbsolute(e))}t("langs/"+u+".js"),t("themes/"+n.theme+"/theme"+f+".js"),t("themes/"+n.theme+"/langs/"+u+".js"),e.each(n.plugins.split(","),function(e,n){n&&(t("plugins/"+n+"/plugin"+f+".js"),t("plugins/"+n+"/langs/"+u+".js"))})},end:function(){}}));var p=document.createElement("script");p.type="text/javascript",p.onload=p.onreadystatechange=function(t){t=t||window.event,2===r||"load"!=t.type&&!/complete|loaded/.test(p.readyState)||(tinymce.dom.Event.domLoaded=1,r=2,n.script_loaded&&n.script_loaded(),s(),e.each(o,function(e,t){t()}))},p.src=l,document.body.appendChild(p)}return d},e.extend(e.expr[":"],{tinymce:function(e){var t;return!!(e.id&&"tinymce"in window&&(t=tinymce.get(e.id),t&&t.editorManager===tinymce))}})}(jQuery);

--- /dev/null
+++ b/tinymce4/js/tinymce/langs/it.js
@@ -1,1 +1,219 @@
-
+tinymce.addI18n('it',{
+"Cut": "Taglia",
+"Heading 5": "Intestazione 5",
+"Header 2": "Header 2",
+"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X\/C\/V keyboard shortcuts instead.": "Il tuo browser non supporta l'accesso diretto negli Appunti. Per favore usa i tasti di scelta rapida Ctrl+X\/C\/V.",
+"Heading 4": "Intestazione 4",
+"Div": "Div",
+"Heading 2": "Intestazione 2",
+"Paste": "Incolla",
+"Close": "Chiudi",
+"Font Family": "Famiglia font",
+"Pre": "Pre",
+"Align right": "Allinea a Destra",
+"New document": "Nuovo Documento",
+"Blockquote": "Blockquote",
+"Numbered list": "Elenchi Numerati",
+"Heading 1": "Intestazione 1",
+"Headings": "Intestazioni",
+"Increase indent": "Aumenta Rientro",
+"Formats": "Formattazioni",
+"Headers": "Intestazioni",
+"Select all": "Seleziona Tutto",
+"Header 3": "Intestazione 3",
+"Blocks": "Blocchi",
+"Undo": "Indietro",
+"Strikethrough": "Barrato",
+"Bullet list": "Elenchi Puntati",
+"Header 1": "Intestazione 1",
+"Superscript": "Apice",
+"Clear formatting": "Cancella Formattazione",
+"Font Sizes": "Dimensioni font",
+"Subscript": "Pedice",
+"Header 6": "Intestazione 6",
+"Redo": "Ripeti",
+"Paragraph": "Paragrafo",
+"Ok": "Ok",
+"Bold": "Grassetto",
+"Code": "Codice",
+"Italic": "Corsivo",
+"Align center": "Allinea al Cento",
+"Header 5": "Intestazione 5",
+"Heading 6": "Intestazione 6",
+"Heading 3": "Intestazione 3",
+"Decrease indent": "Riduci Rientro",
+"Header 4": "Intestazione 4",
+"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.": "Incolla \u00e8 in modalit\u00e0 testo normale. I contenuti sono incollati come testo normale se non disattivi l'opzione.",
+"Underline": "Sottolineato",
+"Cancel": "Annulla",
+"Justify": "Giustifica",
+"Inline": "Inlinea",
+"Copy": "Copia",
+"Align left": "Allinea a Sinistra",
+"Visual aids": "Elementi Visivi",
+"Lower Greek": "Greek Minore",
+"Square": "Quadrato",
+"Default": "Default",
+"Lower Alpha": "Alpha Minore",
+"Circle": "Cerchio",
+"Disc": "Disco",
+"Upper Alpha": "Alpha Superiore",
+"Upper Roman": "Roman Superiore",
+"Lower Roman": "Roman Minore",
+"Name": "Nome",
+"Anchor": "Fissa",
+"You have unsaved changes are you sure you want to navigate away?": "Non hai salvato delle modifiche, sei sicuro di andartene?",
+"Restore last draft": "Ripristina l'ultima bozza.",
+"Special character": "Carattere Speciale",
+"Source code": "Codice Sorgente",
+"B": "B",
+"R": "R",
+"G": "G",
+"Color": "Colore",
+"Right to left": "Da Destra a Sinistra",
+"Left to right": "Da Sinistra a Destra",
+"Emoticons": "Emoction",
+"Robots": "Robot",
+"Document properties": "Propriet\u00e0 Documento",
+"Title": "Titolo",
+"Keywords": "Parola Chiave",
+"Encoding": "Codifica",
+"Description": "Descrizione",
+"Author": "Autore",
+"Fullscreen": "Schermo Intero",
+"Horizontal line": "Linea Orizzontale",
+"Horizontal space": "Spazio Orizzontale",
+"Insert\/edit image": "Aggiungi\/Modifica Immagine",
+"General": "Generale",
+"Advanced": "Avanzato",
+"Source": "Fonte",
+"Border": "Bordo",
+"Constrain proportions": "Mantieni Proporzioni",
+"Vertical space": "Spazio Verticale",
+"Image description": "Descrizione Immagine",
+"Style": "Stile",
+"Dimensions": "Dimenzioni",
+"Insert image": "Inserisci immagine",
+"Zoom in": "Ingrandisci",
+"Contrast": "Contrasto",
+"Back": "Indietro",
+"Gamma": "Gamma",
+"Flip horizontally": "Rifletti orizzontalmente",
+"Resize": "Ridimensiona",
+"Sharpen": "Contrasta",
+"Zoom out": "Rimpicciolisci",
+"Image options": "Opzioni immagine",
+"Apply": "Applica",
+"Brightness": "Luminosit\u00e0",
+"Rotate clockwise": "Ruota in senso orario",
+"Rotate counterclockwise": "Ruota in senso antiorario",
+"Edit image": "Modifica immagine",
+"Color levels": "Livelli colore",
+"Crop": "Taglia",
+"Orientation": "Orientamento",
+"Flip vertically": "Rifletti verticalmente",
+"Invert": "Inverti",
+"Insert date\/time": "Inserisci Data\/Ora",
+"Remove link": "Rimuovi link",
+"Url": "Url",
+"Text to display": "Testo da Visualizzare",
+"Anchors": "Anchors",
+"Insert link": "Inserisci il Link",
+"New window": "Nuova Finestra",
+"None": "No",
+"The URL you entered seems to be an external link. Do you want to add the required http:\/\/ prefix?": "L'URL inserito sembra essere un collegamento esterno. Vuoi aggiungere il prefisso necessario http:\/\/?",
+"Target": "Target",
+"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?": "L'URL inserito sembra essere un indirizzo email. Vuoi aggiungere il prefisso necessario mailto:?",
+"Insert\/edit link": "Inserisci\/Modifica Link",
+"Insert\/edit video": "Inserisci\/Modifica Video",
+"Poster": "Anteprima",
+"Alternative source": "Alternativo",
+"Paste your embed code below:": "Incolla il codice d'incorporamento qui:",
+"Insert video": "Inserisci Video",
+"Embed": "Incorporare",
+"Nonbreaking space": "Spazio unificatore",
+"Page break": "Interruzione di pagina",
+"Paste as text": "incolla come testo",
+"Preview": "Anteprima",
+"Print": "Stampa",
+"Save": "Salva",
+"Could not find the specified string.": "Impossibile trovare la parola specifica.",
+"Replace": "Sostituisci",
+"Next": "Successivo",
+"Whole words": "Parole Sbagliate",
+"Find and replace": "Trova e Sostituisci",
+"Replace with": "Sostituisci Con",
+"Find": "Trova",
+"Replace all": "Sostituisci Tutto",
+"Match case": "Maiuscole\/Minuscole ",
+"Prev": "Precedente",
+"Spellcheck": "Controllo ortografico",
+"Finish": "Termina",
+"Ignore all": "Ignora Tutto",
+"Ignore": "Ignora",
+"Add to Dictionary": "Aggiungi al Dizionario",
+"Insert row before": "Inserisci una Riga Prima",
+"Rows": "Righe",
+"Height": "Altezza",
+"Paste row after": "Incolla una Riga Dopo",
+"Alignment": "Allineamento",
+"Border color": "Colore bordo",
+"Column group": "Gruppo di Colonne",
+"Row": "Riga",
+"Insert column before": "Inserisci una Colonna Prima",
+"Split cell": "Dividi Cella",
+"Cell padding": "Padding della Cella",
+"Cell spacing": "Spaziatura della Cella",
+"Row type": "Tipo di Riga",
+"Insert table": "Inserisci Tabella",
+"Body": "Body",
+"Caption": "Didascalia",
+"Footer": "Footer",
+"Delete row": "Cancella Riga",
+"Paste row before": "Incolla una Riga Prima",
+"Scope": "Campo",
+"Delete table": "Cancella Tabella",
+"H Align": "Allineamento H",
+"Top": "In alto",
+"Header cell": "cella d'intestazione",
+"Column": "Colonna",
+"Row group": "Gruppo di Righe",
+"Cell": "Cella",
+"Middle": "In mezzo",
+"Cell type": "Tipo di Cella",
+"Copy row": "Copia Riga",
+"Row properties": "Propriet\u00e0 della Riga",
+"Table properties": "Propiet\u00e0 della Tabella",
+"Bottom": "In fondo",
+"V Align": "Allineamento V",
+"Header": "Header",
+"Right": "Destra",
+"Insert column after": "Inserisci una Colonna Dopo",
+"Cols": "Colonne",
+"Insert row after": "Inserisci una Riga Dopo",
+"Width": "Larghezza",
+"Cell properties": "Propiet\u00e0 della Cella",
+"Left": "Sinistra",
+"Cut row": "Taglia Riga",
+"Delete column": "Cancella Colonna",
+"Center": "Centro",
+"Merge cells": "Unisci Cella",
+"Insert template": "Inserisci Template",
+"Templates": "Template",
+"Background color": "Colore Background",
+"Custom...": "Personalizzato...",
+"Custom color": "Colore personalizzato",
+"No color": "Nessun colore",
+"Text color": "Colore Testo",
+"Show blocks": "Mostra Blocchi",
+"Show invisible characters": "Mostra Caratteri Invisibili",
+"Words: {0}": "Parole: {0}",
+"Insert": "Inserisci",
+"File": "File",
+"Edit": "Modifica",
+"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help": "Rich Text Area. Premi ALT-F9 per il men\u00f9. Premi ALT-F10 per la barra degli strumenti. Premi ALT-0 per l'aiuto.",
+"Tools": "Strumenti",
+"View": "Visualizza",
+"Table": "Tabella",
+"Format": "Formato"
+});

--- /dev/null
+++ b/tinymce4/js/tinymce/langs/readme.md
@@ -1,1 +1,4 @@
+This is where language files should be placed.
 
+Please DO NOT translate these directly use this service: https://www.transifex.com/projects/p/tinymce/
+

--- /dev/null
+++ b/tinymce4/js/tinymce/license.txt
@@ -1,1 +1,505 @@
-
+		  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!
+
+
+

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/advlist/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("advlist",function(e){function t(t){return e.$.contains(e.getBody(),t)}function n(e){return e&&/^(OL|UL|DL)$/.test(e.nodeName)&&t(e)}function r(e,t){var n=[];return t&&tinymce.each(t.split(/[ ,]/),function(e){n.push({text:e.replace(/\-/g," ").replace(/\b\w/g,function(e){return e.toUpperCase()}),data:"default"==e?"":e})}),n}function i(t,n){e.undoManager.transact(function(){var r,i=e.dom,o=e.selection;if(r=i.getParent(o.getNode(),"ol,ul"),!r||r.nodeName!=t||n===!1){var a={"list-style-type":n?n:""};e.execCommand("UL"==t?"InsertUnorderedList":"InsertOrderedList",!1,a)}r=i.getParent(o.getNode(),"ol,ul"),r&&tinymce.util.Tools.each(i.select("ol,ul",r).concat([r]),function(e){e.nodeName!==t&&n!==!1&&(e=i.rename(e,t)),i.setStyle(e,"listStyleType",n?n:null),e.removeAttribute("data-mce-style")}),e.focus()})}function o(t){var n=e.dom.getStyle(e.dom.getParent(e.selection.getNode(),"ol,ul"),"listStyleType")||"";t.control.items().each(function(e){e.active(e.settings.data===n)})}var a,s,l=function(e,t){var n=e.settings.plugins?e.settings.plugins:"";return tinymce.util.Tools.inArray(n.split(/[ ,]/),t)!==-1};a=r("OL",e.getParam("advlist_number_styles","default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman")),s=r("UL",e.getParam("advlist_bullet_styles","default,circle,disc,square"));var c=function(t){return function(){var r=this;e.on("NodeChange",function(e){var i=tinymce.util.Tools.grep(e.parents,n);r.active(i.length>0&&i[0].nodeName===t)})}};l(e,"lists")&&(e.addCommand("ApplyUnorderedListStyle",function(e,t){i("UL",t["list-style-type"])}),e.addCommand("ApplyOrderedListStyle",function(e,t){i("OL",t["list-style-type"])}),e.addButton("numlist",{type:a.length>0?"splitbutton":"button",tooltip:"Numbered list",menu:a,onPostRender:c("OL"),onshow:o,onselect:function(e){i("OL",e.control.settings.data)},onclick:function(){i("OL",!1)}}),e.addButton("bullist",{type:s.length>0?"splitbutton":"button",tooltip:"Bullet list",onPostRender:c("UL"),menu:s,onshow:o,onselect:function(e){i("UL",e.control.settings.data)},onclick:function(){i("UL",!1)}}))});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/anchor/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("anchor",function(e){var t=function(e){return!e.attr("href")&&(e.attr("id")||e.attr("name"))&&!e.firstChild},n=function(e){return function(n){for(var r=0;r<n.length;r++)t(n[r])&&n[r].attr("contenteditable",e)}},r=function(e){return/^[A-Za-z][A-Za-z0-9\-:._]*$/.test(e)},i=function(){var t=e.selection.getNode(),n="A"==t.tagName&&""===e.dom.getAttrib(t,"href"),i="";n&&(i=t.id||t.name||""),e.windowManager.open({title:"Anchor",body:{type:"textbox",name:"id",size:40,label:"Id",value:i},onsubmit:function(i){var o=i.data.id;return r(o)?void(n?(t.removeAttribute("name"),t.id=o):(e.selection.collapse(!0),e.execCommand("mceInsertContent",!1,e.dom.createHTML("a",{id:o})))):(i.preventDefault(),void e.windowManager.alert("Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores."))}})};tinymce.Env.ceFalse&&e.on("PreInit",function(){e.parser.addNodeFilter("a",n("false")),e.serializer.addNodeFilter("a",n(null))}),e.addCommand("mceAnchor",i),e.addButton("anchor",{icon:"anchor",tooltip:"Anchor",onclick:i,stateSelector:"a:not([href])"}),e.addMenuItem("anchor",{icon:"anchor",text:"Anchor",context:"insert",onclick:i})});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/autolink/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("autolink",function(e){function t(e){i(e,-1,"(",!0)}function n(e){i(e,0,"",!0)}function r(e){i(e,-1,"",!1)}function i(e,t,n){function r(e,t){if(t<0&&(t=0),3==e.nodeType){var n=e.data.length;t>n&&(t=n)}return t}function i(e,t){1!=e.nodeType||e.hasChildNodes()?s.setStart(e,r(e,t)):s.setStartBefore(e)}function o(e,t){1!=e.nodeType||e.hasChildNodes()?s.setEnd(e,r(e,t)):s.setEndAfter(e)}var s,l,c,u,d,f,p,m,h,g;if("A"!=e.selection.getNode().tagName){if(s=e.selection.getRng(!0).cloneRange(),s.startOffset<5){if(m=s.endContainer.previousSibling,!m){if(!s.endContainer.firstChild||!s.endContainer.firstChild.nextSibling)return;m=s.endContainer.firstChild.nextSibling}if(h=m.length,i(m,h),o(m,h),s.endOffset<5)return;l=s.endOffset,u=m}else{if(u=s.endContainer,3!=u.nodeType&&u.firstChild){for(;3!=u.nodeType&&u.firstChild;)u=u.firstChild;3==u.nodeType&&(i(u,0),o(u,u.nodeValue.length))}l=1==s.endOffset?2:s.endOffset-1-t}c=l;do i(u,l>=2?l-2:0),o(u,l>=1?l-1:0),l-=1,g=s.toString();while(" "!=g&&""!==g&&160!=g.charCodeAt(0)&&l-2>=0&&g!=n);s.toString()==n||160==s.toString().charCodeAt(0)?(i(u,l),o(u,c),l+=1):0===s.startOffset?(i(u,0),o(u,c)):(i(u,l),o(u,c)),f=s.toString(),"."==f.charAt(f.length-1)&&o(u,c-1),f=s.toString(),p=f.match(a),p&&("www."==p[1]?p[1]="http://www.":/@$/.test(p[1])&&!/^mailto:/.test(p[1])&&(p[1]="mailto:"+p[1]),d=e.selection.getBookmark(),e.selection.setRng(s),e.execCommand("createlink",!1,p[1]+p[2]),e.settings.default_link_target&&e.dom.setAttrib(e.selection.getNode(),"target",e.settings.default_link_target),e.selection.moveToBookmark(d),e.nodeChanged())}}var o,a=/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.|(?:mailto:)?[A-Z0-9._%+\-]+@)(.+)$/i;return e.settings.autolink_pattern&&(a=e.settings.autolink_pattern),e.on("keydown",function(t){if(13==t.keyCode)return r(e)}),tinymce.Env.ie?void e.on("focus",function(){if(!o){o=!0;try{e.execCommand("AutoUrlDetect",!1,!0)}catch(e){}}}):(e.on("keypress",function(n){if(41==n.keyCode)return t(e)}),void e.on("keyup",function(t){if(32==t.keyCode)return n(e)}))});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/autoresize/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("autoresize",function(e){function t(){return e.plugins.fullscreen&&e.plugins.fullscreen.isFullscreen()}function n(r){var a,s,l,c,u,d,f,p,m,h,g,v,b=tinymce.DOM;if(s=e.getDoc()){if(l=s.body,c=s.documentElement,u=i.autoresize_min_height,!l||r&&"setcontent"===r.type&&r.initial||t())return void(l&&c&&(l.style.overflowY="auto",c.style.overflowY="auto"));f=e.dom.getStyle(l,"margin-top",!0),p=e.dom.getStyle(l,"margin-bottom",!0),m=e.dom.getStyle(l,"padding-top",!0),h=e.dom.getStyle(l,"padding-bottom",!0),g=e.dom.getStyle(l,"border-top-width",!0),v=e.dom.getStyle(l,"border-bottom-width",!0),d=l.offsetHeight+parseInt(f,10)+parseInt(p,10)+parseInt(m,10)+parseInt(h,10)+parseInt(g,10)+parseInt(v,10),(isNaN(d)||d<=0)&&(d=tinymce.Env.ie?l.scrollHeight:tinymce.Env.webkit&&0===l.clientHeight?0:l.offsetHeight),d>i.autoresize_min_height&&(u=d),i.autoresize_max_height&&d>i.autoresize_max_height?(u=i.autoresize_max_height,l.style.overflowY="auto",c.style.overflowY="auto"):(l.style.overflowY="hidden",c.style.overflowY="hidden",l.scrollTop=0),u!==o&&(a=u-o,b.setStyle(e.iframeElement,"height",u+"px"),o=u,tinymce.isWebKit&&a<0&&n(r))}}function r(t,i,o){tinymce.util.Delay.setEditorTimeout(e,function(){n({}),t--?r(t,i,o):o&&o()},i)}var i=e.settings,o=0;e.settings.inline||(i.autoresize_min_height=parseInt(e.getParam("autoresize_min_height",e.getElement().offsetHeight),10),i.autoresize_max_height=parseInt(e.getParam("autoresize_max_height",0),10),e.on("init",function(){var t,n;t=e.getParam("autoresize_overflow_padding",1),n=e.getParam("autoresize_bottom_margin",50),t!==!1&&e.dom.setStyles(e.getBody(),{paddingLeft:t,paddingRight:t}),n!==!1&&e.dom.setStyles(e.getBody(),{paddingBottom:n})}),e.on("nodechange setcontent keyup FullscreenStateChanged",n),e.getParam("autoresize_on_init",!0)&&e.on("init",function(){r(20,100,function(){r(5,1e3)})}),e.addCommand("mceAutoResize",n))});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/autosave/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce._beforeUnloadHandler=function(){var e;return tinymce.each(tinymce.editors,function(t){t.plugins.autosave&&t.plugins.autosave.storeDraft(),!e&&t.isDirty()&&t.getParam("autosave_ask_before_unload",!0)&&(e=t.translate("You have unsaved changes are you sure you want to navigate away?"))}),e},tinymce.PluginManager.add("autosave",function(e){function t(e,t){var n={s:1e3,m:6e4};return e=/^(\d+)([ms]?)$/.exec(""+(e||t)),(e[2]?n[e[2]]:1)*parseInt(e,10)}function n(){var e=parseInt(p.getItem(u+"time"),10)||0;return!((new Date).getTime()-e>f.autosave_retention)||(r(!1),!1)}function r(t){p.removeItem(u+"draft"),p.removeItem(u+"time"),t!==!1&&e.fire("RemoveDraft")}function i(){!c()&&e.isDirty()&&(p.setItem(u+"draft",e.getContent({format:"raw",no_events:!0})),p.setItem(u+"time",(new Date).getTime()),e.fire("StoreDraft"))}function o(){n()&&(e.setContent(p.getItem(u+"draft"),{format:"raw"}),e.fire("RestoreDraft"))}function a(){d||(setInterval(function(){e.removed||i()},f.autosave_interval),d=!0)}function s(){var t=this;t.disabled(!n()),e.on("StoreDraft RestoreDraft RemoveDraft",function(){t.disabled(!n())}),a()}function l(){e.undoManager.beforeChange(),o(),r(),e.undoManager.add()}function c(t){var n=e.settings.forced_root_block;return t=tinymce.trim("undefined"==typeof t?e.getBody().innerHTML:t),""===t||new RegExp("^<"+n+"[^>]*>((\xa0|&nbsp;|[ \t]|<br[^>]*>)+?|)</"+n+">|<br>$","i").test(t)}var u,d,f=e.settings,p=tinymce.util.LocalStorage;u=f.autosave_prefix||"tinymce-autosave-{path}{query}-{id}-",u=u.replace(/\{path\}/g,document.location.pathname),u=u.replace(/\{query\}/g,document.location.search),u=u.replace(/\{id\}/g,e.id),f.autosave_interval=t(f.autosave_interval,"30s"),f.autosave_retention=t(f.autosave_retention,"20m"),e.addButton("restoredraft",{title:"Restore last draft",onclick:l,onPostRender:s}),e.addMenuItem("restoredraft",{text:"Restore last draft",onclick:l,onPostRender:s,context:"file"}),e.settings.autosave_restore_when_empty!==!1&&(e.on("init",function(){n()&&c()&&o()}),e.on("saveContent",function(){r()})),window.onbeforeunload=tinymce._beforeUnloadHandler,this.hasDraft=n,this.storeDraft=i,this.restoreDraft=o,this.removeDraft=r,this.isEmpty=c});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/bbcode/plugin.min.js
@@ -1,1 +1,1 @@
-
+!function(){tinymce.create("tinymce.plugins.BBCodePlugin",{init:function(e){var t=this,n=e.getParam("bbcode_dialect","punbb").toLowerCase();e.on("beforeSetContent",function(e){e.content=t["_"+n+"_bbcode2html"](e.content)}),e.on("postProcess",function(e){e.set&&(e.content=t["_"+n+"_bbcode2html"](e.content)),e.get&&(e.content=t["_"+n+"_html2bbcode"](e.content))})},getInfo:function(){return{longname:"BBCode Plugin",author:"Ephox Corp",authorurl:"http://www.tinymce.com",infourl:"http://www.tinymce.com/wiki.php/Plugin:bbcode"}},_punbb_html2bbcode:function(e){function t(t,n){e=e.replace(t,n)}return e=tinymce.trim(e),t(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]"),t(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),t(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),t(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]"),t(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]"),t(/<span style=\"color: ?(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]"),t(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]"),t(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]"),t(/<font>(.*?)<\/font>/gi,"$1"),t(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]"),t(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]"),t(/<span class=\"quoteStyle\">(.*?)<\/span>/gi,"[quote]$1[/quote]"),t(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]"),t(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]"),t(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]"),t(/<em class=\"quoteStyle\">(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]"),t(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]"),t(/<u class=\"quoteStyle\">(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]"),t(/<\/(strong|b)>/gi,"[/b]"),t(/<(strong|b)>/gi,"[b]"),t(/<\/(em|i)>/gi,"[/i]"),t(/<(em|i)>/gi,"[i]"),t(/<\/u>/gi,"[/u]"),t(/<span style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]"),t(/<u>/gi,"[u]"),t(/<blockquote[^>]*>/gi,"[quote]"),t(/<\/blockquote>/gi,"[/quote]"),t(/<br \/>/gi,"\n"),t(/<br\/>/gi,"\n"),t(/<br>/gi,"\n"),t(/<p>/gi,""),t(/<\/p>/gi,"\n"),t(/&nbsp;|\u00a0/gi," "),t(/&quot;/gi,'"'),t(/&lt;/gi,"<"),t(/&gt;/gi,">"),t(/&amp;/gi,"&"),e},_punbb_bbcode2html:function(e){function t(t,n){e=e.replace(t,n)}return e=tinymce.trim(e),t(/\n/gi,"<br />"),t(/\[b\]/gi,"<strong>"),t(/\[\/b\]/gi,"</strong>"),t(/\[i\]/gi,"<em>"),t(/\[\/i\]/gi,"</em>"),t(/\[u\]/gi,"<u>"),t(/\[\/u\]/gi,"</u>"),t(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'<a href="$1">$2</a>'),t(/\[url\](.*?)\[\/url\]/gi,'<a href="$1">$1</a>'),t(/\[img\](.*?)\[\/img\]/gi,'<img src="$1" />'),t(/\[color=(.*?)\](.*?)\[\/color\]/gi,'<font color="$1">$2</font>'),t(/\[code\](.*?)\[\/code\]/gi,'<span class="codeStyle">$1</span>&nbsp;'),t(/\[quote.*?\](.*?)\[\/quote\]/gi,'<span class="quoteStyle">$1</span>&nbsp;'),e}}),tinymce.PluginManager.add("bbcode",tinymce.plugins.BBCodePlugin)}();

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/charmap/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("charmap",function(e){function t(){return[["160","no-break space"],["173","soft hyphen"],["34","quotation mark"],["162","cent sign"],["8364","euro sign"],["163","pound sign"],["165","yen sign"],["169","copyright sign"],["174","registered sign"],["8482","trade mark sign"],["8240","per mille sign"],["181","micro sign"],["183","middle dot"],["8226","bullet"],["8230","three dot leader"],["8242","minutes / feet"],["8243","seconds / inches"],["167","section sign"],["182","paragraph sign"],["223","sharp s / ess-zed"],["8249","single left-pointing angle quotation mark"],["8250","single right-pointing angle quotation mark"],["171","left pointing guillemet"],["187","right pointing guillemet"],["8216","left single quotation mark"],["8217","right single quotation mark"],["8220","left double quotation mark"],["8221","right double quotation mark"],["8218","single low-9 quotation mark"],["8222","double low-9 quotation mark"],["60","less-than sign"],["62","greater-than sign"],["8804","less-than or equal to"],["8805","greater-than or equal to"],["8211","en dash"],["8212","em dash"],["175","macron"],["8254","overline"],["164","currency sign"],["166","broken bar"],["168","diaeresis"],["161","inverted exclamation mark"],["191","turned question mark"],["710","circumflex accent"],["732","small tilde"],["176","degree sign"],["8722","minus sign"],["177","plus-minus sign"],["247","division sign"],["8260","fraction slash"],["215","multiplication sign"],["185","superscript one"],["178","superscript two"],["179","superscript three"],["188","fraction one quarter"],["189","fraction one half"],["190","fraction three quarters"],["402","function / florin"],["8747","integral"],["8721","n-ary sumation"],["8734","infinity"],["8730","square root"],["8764","similar to"],["8773","approximately equal to"],["8776","almost equal to"],["8800","not equal to"],["8801","identical to"],["8712","element of"],["8713","not an element of"],["8715","contains as member"],["8719","n-ary product"],["8743","logical and"],["8744","logical or"],["172","not sign"],["8745","intersection"],["8746","union"],["8706","partial differential"],["8704","for all"],["8707","there exists"],["8709","diameter"],["8711","backward difference"],["8727","asterisk operator"],["8733","proportional to"],["8736","angle"],["180","acute accent"],["184","cedilla"],["170","feminine ordinal indicator"],["186","masculine ordinal indicator"],["8224","dagger"],["8225","double dagger"],["192","A - grave"],["193","A - acute"],["194","A - circumflex"],["195","A - tilde"],["196","A - diaeresis"],["197","A - ring above"],["256","A - macron"],["198","ligature AE"],["199","C - cedilla"],["200","E - grave"],["201","E - acute"],["202","E - circumflex"],["203","E - diaeresis"],["274","E - macron"],["204","I - grave"],["205","I - acute"],["206","I - circumflex"],["207","I - diaeresis"],["298","I - macron"],["208","ETH"],["209","N - tilde"],["210","O - grave"],["211","O - acute"],["212","O - circumflex"],["213","O - tilde"],["214","O - diaeresis"],["216","O - slash"],["332","O - macron"],["338","ligature OE"],["352","S - caron"],["217","U - grave"],["218","U - acute"],["219","U - circumflex"],["220","U - diaeresis"],["362","U - macron"],["221","Y - acute"],["376","Y - diaeresis"],["562","Y - macron"],["222","THORN"],["224","a - grave"],["225","a - acute"],["226","a - circumflex"],["227","a - tilde"],["228","a - diaeresis"],["229","a - ring above"],["257","a - macron"],["230","ligature ae"],["231","c - cedilla"],["232","e - grave"],["233","e - acute"],["234","e - circumflex"],["235","e - diaeresis"],["275","e - macron"],["236","i - grave"],["237","i - acute"],["238","i - circumflex"],["239","i - diaeresis"],["299","i - macron"],["240","eth"],["241","n - tilde"],["242","o - grave"],["243","o - acute"],["244","o - circumflex"],["245","o - tilde"],["246","o - diaeresis"],["248","o slash"],["333","o macron"],["339","ligature oe"],["353","s - caron"],["249","u - grave"],["250","u - acute"],["251","u - circumflex"],["252","u - diaeresis"],["363","u - macron"],["253","y - acute"],["254","thorn"],["255","y - diaeresis"],["563","y - macron"],["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","final sigma"],["963","sigma"],["964","tau"],["965","upsilon"],["966","phi"],["967","chi"],["968","psi"],["969","omega"],["8501","alef symbol"],["982","pi symbol"],["8476","real part symbol"],["978","upsilon - hook symbol"],["8472","Weierstrass p"],["8465","imaginary part"],["8592","leftwards arrow"],["8593","upwards arrow"],["8594","rightwards arrow"],["8595","downwards arrow"],["8596","left right arrow"],["8629","carriage return"],["8656","leftwards double arrow"],["8657","upwards double arrow"],["8658","rightwards double arrow"],["8659","downwards double arrow"],["8660","left right double arrow"],["8756","therefore"],["8834","subset of"],["8835","superset of"],["8836","not a subset of"],["8838","subset of or equal to"],["8839","superset of or equal to"],["8853","circled plus"],["8855","circled times"],["8869","perpendicular"],["8901","dot operator"],["8968","left ceiling"],["8969","right ceiling"],["8970","left floor"],["8971","right floor"],["9001","left-pointing angle bracket"],["9002","right-pointing angle bracket"],["9674","lozenge"],["9824","black spade suit"],["9827","black club suit"],["9829","black heart suit"],["9830","black diamond suit"],["8194","en space"],["8195","em space"],["8201","thin space"],["8204","zero width non-joiner"],["8205","zero width joiner"],["8206","left-to-right mark"],["8207","right-to-left mark"]]}function n(e){return tinymce.util.Tools.grep(e,function(e){return l(e)&&2==e.length})}function r(e){return l(e)?[].concat(n(e)):"function"==typeof e?e():[]}function i(t){var n=e.settings;return n.charmap&&(t=r(n.charmap)),n.charmap_append?[].concat(t).concat(r(n.charmap_append)):t}function o(){return i(t())}function a(t){e.fire("insertCustomChar",{chr:t}).chr,e.execCommand("mceInsertContent",!1,t)}function s(){function t(e){for(;e;){if("TD"==e.nodeName)return e;e=e.parentNode}}var n,r,i,s;n='<table role="presentation" cellspacing="0" class="mce-charmap"><tbody>';var l=o(),c=Math.min(l.length,25),u=Math.ceil(l.length/c);for(i=0;i<u;i++){for(n+="<tr>",r=0;r<c;r++){var d=i*c+r;if(d<l.length){var f=l[d],p=f?String.fromCharCode(parseInt(f[0],10)):"&nbsp;";n+='<td title="'+f[1]+'"><div tabindex="-1" title="'+f[1]+'" role="button" data-chr="'+p+'">'+p+"</div></td>"}else n+="<td />"}n+="</tr>"}n+="</tbody></table>";var m={type:"container",html:n,onclick:function(e){var n=e.target;/^(TD|DIV)$/.test(n.nodeName)&&t(n).firstChild&&(a(n.getAttribute("data-chr")),e.ctrlKey||s.close())},onmouseover:function(e){var n=t(e.target);n&&n.firstChild?(s.find("#preview").text(n.firstChild.firstChild.data),s.find("#previewTitle").text(n.title)):(s.find("#preview").text(" "),s.find("#previewTitle").text(" "))}};s=e.windowManager.open({title:"Special character",spacing:10,padding:10,items:[m,{type:"container",layout:"flex",direction:"column",align:"center",spacing:5,minWidth:160,minHeight:160,items:[{type:"label",name:"preview",text:" ",style:"font-size: 40px; text-align: center",border:1,minWidth:140,minHeight:80},{type:"label",name:"previewTitle",text:" ",style:"text-align: center",border:1,minWidth:140,minHeight:80}]}],buttons:[{text:"Close",onclick:function(){s.close()}}]})}var l=tinymce.util.Tools.isArray;return e.addCommand("mceShowCharmap",s),e.addButton("charmap",{icon:"charmap",tooltip:"Special character",cmd:"mceShowCharmap"}),e.addMenuItem("charmap",{icon:"charmap",text:"Special character",cmd:"mceShowCharmap",context:"insert"}),{getCharMap:o,insertChar:a}});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/code/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("code",function(e){function t(){var t=e.windowManager.open({title:"Source code",body:{type:"textbox",name:"code",multiline:!0,minWidth:e.getParam("code_dialog_width",600),minHeight:e.getParam("code_dialog_height",Math.min(tinymce.DOM.getViewPort().h-200,500)),spellcheck:!1,style:"direction: ltr; text-align: left"},onSubmit:function(t){e.focus(),e.undoManager.transact(function(){e.setContent(t.data.code)}),e.selection.setCursorLocation(),e.nodeChanged()}});t.find("#code").value(e.getContent({source_view:!0}))}e.addCommand("mceCodeEditor",t),e.addButton("code",{icon:"code",tooltip:"Source code",onclick:t}),e.addMenuItem("code",{icon:"code",text:"Source code",context:"tools",onclick:t})});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/codesample/css/prism.css
@@ -1,1 +1,139 @@
+/* http://prismjs.com/download.html?themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
 
+code[class*="language-"],
+pre[class*="language-"] {
+	color: black;
+	text-shadow: 0 1px white;
+	font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+	direction: ltr;
+	text-align: left;
+	white-space: pre;
+	word-spacing: normal;
+	word-break: normal;
+	word-wrap: normal;
+	line-height: 1.5;
+
+	-moz-tab-size: 4;
+	-o-tab-size: 4;
+	tab-size: 4;
+
+	-webkit-hyphens: none;
+	-moz-hyphens: none;
+	-ms-hyphens: none;
+	hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection {
+	text-shadow: none;
+	background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection, pre[class*="language-"] ::selection,
+code[class*="language-"]::selection, code[class*="language-"] ::selection {
+	text-shadow: none;
+	background: #b3d4fc;
+}
+
+@media print {
+	code[class*="language-"],
+	pre[class*="language-"] {
+		text-shadow: none;
+	}
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+	padding: 1em;
+	margin: .5em 0;
+	overflow: auto;
+}
+
+:not(pre) > code[class*="language-"],
+pre[class*="language-"] {
+	background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre) > code[class*="language-"] {
+	padding: .1em;
+	border-radius: .3em;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+	color: slategray;
+}
+
+.token.punctuation {
+	color: #999;
+}
+
+.namespace {
+	opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+	color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+	color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+	color: #a67f59;
+	background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+	color: #07a;
+}
+
+.token.function {
+	color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+	color: #e90;
+}
+
+.token.important,
+.token.bold {
+	font-weight: bold;
+}
+.token.italic {
+	font-style: italic;
+}
+
+.token.entity {
+	cursor: help;
+}
+
+

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/codesample/plugin.min.js
@@ -1,1 +1,1 @@
-
+!function(e,t){"use strict";function n(e,t){for(var n,r=[],o=0;o<e.length;++o){if(n=a[e[o]]||i(e[o]),!n)throw"module definition dependecy not found: "+e[o];r.push(n)}t.apply(null,r)}function r(e,r,i){if("string"!=typeof e)throw"invalid module definition, module id must be defined and be a string";if(r===t)throw"invalid module definition, dependencies must be specified";if(i===t)throw"invalid module definition, definition function must be specified";n(r,function(){a[e]=i.apply(null,arguments)})}function i(t){for(var n=e,r=t.split(/[.\/]/),i=0;i<r.length;++i){if(!n[r[i]])return;n=n[r[i]]}return n}function o(n){var r,i,o,s,l;for(r=0;r<n.length;r++){i=e,o=n[r],s=o.split(/[.\/]/);for(var c=0;c<s.length-1;++c)i[s[c]]===t&&(i[s[c]]={}),i=i[s[c]];i[s[s.length-1]]=a[o]}if(e.AMDLC_TESTS){l=e.privateModules||{};for(o in a)l[o]=a[o];for(r=0;r<n.length;r++)delete l[n[r]];e.privateModules=l}}var a={};r("tinymce/codesampleplugin/Prism",[],function(){var e={},t="undefined"!=typeof e?e:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},n=function(){var e=/\blang(?:uage)?-(?!\*)(\w+)\b/i,n=t.Prism={util:{encode:function(e){return e instanceof r?new r(e.type,n.util.encode(e.content),e.alias):"Array"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).match(/\[object (\w+)\]/)[1]},clone:function(e){var t=n.util.type(e);switch(t){case"Object":var r={};for(var i in e)e.hasOwnProperty(i)&&(r[i]=n.util.clone(e[i]));return r;case"Array":return e.map&&e.map(function(e){return n.util.clone(e)})}return e}},languages:{extend:function(e,t){var r=n.util.clone(n.languages[e]);for(var i in t)r[i]=t[i];return r},insertBefore:function(e,t,r,i){i=i||n.languages;var o=i[e];if(2==arguments.length){r=arguments[1];for(var a in r)r.hasOwnProperty(a)&&(o[a]=r[a]);return o}var s={};for(var l in o)if(o.hasOwnProperty(l)){if(l==t)for(var a in r)r.hasOwnProperty(a)&&(s[a]=r[a]);s[l]=o[l]}return n.languages.DFS(n.languages,function(t,n){n===i[e]&&t!=e&&(this[t]=s)}),i[e]=s},DFS:function(e,t,r){for(var i in e)e.hasOwnProperty(i)&&(t.call(e,i,e[i],r||i),"Object"===n.util.type(e[i])?n.languages.DFS(e[i],t):"Array"===n.util.type(e[i])&&n.languages.DFS(e[i],t,i))}},plugins:{},highlightAll:function(e,t){for(var r,i=document.querySelectorAll('code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'),o=0;r=i[o++];)n.highlightElement(r,e===!0,t)},highlightElement:function(r,i,o){for(var a,s,l=r;l&&!e.test(l.className);)l=l.parentNode;l&&(a=(l.className.match(e)||[,""])[1],s=n.languages[a]),r.className=r.className.replace(e,"").replace(/\s+/g," ")+" language-"+a,l=r.parentNode,/pre/i.test(l.nodeName)&&(l.className=l.className.replace(e,"").replace(/\s+/g," ")+" language-"+a);var c=r.textContent,u={element:r,language:a,grammar:s,code:c};if(!c||!s)return void n.hooks.run("complete",u);if(n.hooks.run("before-highlight",u),i&&t.Worker){var d=new Worker(n.filename);d.onmessage=function(e){u.highlightedCode=e.data,n.hooks.run("before-insert",u),u.element.innerHTML=u.highlightedCode,o&&o.call(u.element),n.hooks.run("after-highlight",u),n.hooks.run("complete",u)},d.postMessage(JSON.stringify({language:u.language,code:u.code,immediateClose:!0}))}else u.highlightedCode=n.highlight(u.code,u.grammar,u.language),n.hooks.run("before-insert",u),u.element.innerHTML=u.highlightedCode,o&&o.call(r),n.hooks.run("after-highlight",u),n.hooks.run("complete",u)},highlight:function(e,t,i){var o=n.tokenize(e,t);return r.stringify(n.util.encode(o),i)},tokenize:function(e,t,r){var i=n.Token,o=[e],a=t.rest;if(a){for(var s in a)t[s]=a[s];delete t.rest}e:for(var s in t)if(t.hasOwnProperty(s)&&t[s]){var l=t[s];l="Array"===n.util.type(l)?l:[l];for(var c=0;c<l.length;++c){var u=l[c],d=u.inside,f=!!u.lookbehind,p=0,m=u.alias;u=u.pattern||u;for(var h=0;h<o.length;h++){var g=o[h];if(o.length>e.length)break e;if(!(g instanceof i)){u.lastIndex=0;var v=u.exec(g);if(v){f&&(p=v[1].length);var b=v.index-1+p,v=v[0].slice(p),y=v.length,C=b+y,x=g.slice(0,b+1),w=g.slice(C+1),N=[h,1];x&&N.push(x);var E=new i(s,d?n.tokenize(v,d):v,m);N.push(E),w&&N.push(w),Array.prototype.splice.apply(o,N)}}}}}return o},hooks:{all:{},add:function(e,t){var r=n.hooks.all;r[e]=r[e]||[],r[e].push(t)},run:function(e,t){var r=n.hooks.all[e];if(r&&r.length)for(var i,o=0;i=r[o++];)i(t)}}},r=n.Token=function(e,t,n){this.type=e,this.content=t,this.alias=n};if(r.stringify=function(e,t,i){if("string"==typeof e)return e;if("Array"===n.util.type(e))return e.map(function(n){return r.stringify(n,t,e)}).join("");var o={type:e.type,content:r.stringify(e.content,t,i),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:i};if("comment"==o.type&&(o.attributes.spellcheck="true"),e.alias){var a="Array"===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(o.classes,a)}n.hooks.run("wrap",o);var s="";for(var l in o.attributes)s+=(s?" ":"")+l+'="'+(o.attributes[l]||"")+'"';return"<"+o.tag+' class="'+o.classes.join(" ")+'" '+s+">"+o.content+"</"+o.tag+">"},!t.document)return t.addEventListener?(t.addEventListener("message",function(e){var r=JSON.parse(e.data),i=r.language,o=r.code,a=r.immediateClose;t.postMessage(n.highlight(o,n.languages[i],i)),a&&t.close()},!1),t.Prism):t.Prism}();return"undefined"!=typeof module&&module.exports&&(module.exports=n),"undefined"!=typeof global&&(global.Prism=n),n.languages.markup={comment:/<!--[\w\W]*?-->/,prolog:/<\?[\w\W]+?\?>/,doctype:/<!DOCTYPE[\w\W]+?>/,cdata:/<!\[CDATA\[[\w\W]*?]]>/i,tag:{pattern:/<\/?[^\s>\/=.]+(?:\s+[^\s>\/=]+(?:=(?:("|')(?:\\\1|\\?(?!\1)[\w\W])*\1|[^\s'">=]+))?)*\s*\/?>/i,inside:{tag:{pattern:/^<\/?[^\s>\/]+/i,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"attr-value":{pattern:/=(?:('|")[\w\W]*?(\1)|[^\s>]+)/i,inside:{punctuation:/[=>"']/}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:/&#?[\da-z]{1,8};/i},n.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&amp;/,"&"))}),n.languages.xml=n.languages.markup,n.languages.html=n.languages.markup,n.languages.mathml=n.languages.markup,n.languages.svg=n.languages.markup,n.languages.css={comment:/\/\*[\w\W]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^\{\}\s][^\{\};]*?(?=\s*\{)/,string:/("|')(\\(?:\r\n|[\w\W])|(?!\1)[^\\\r\n])*\1/,property:/(\b|\B)[\w-]+(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},n.languages.css.atrule.inside.rest=n.util.clone(n.languages.css),n.languages.markup&&(n.languages.insertBefore("markup","tag",{style:{pattern:/<style[\w\W]*?>[\w\W]*?<\/style>/i,inside:{tag:{pattern:/<style[\w\W]*?>|<\/style>/i,inside:n.languages.markup.tag.inside},rest:n.languages.css},alias:"language-css"}}),n.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|').*?\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:n.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:n.languages.css}},alias:"language-css"}},n.languages.markup.tag)),n.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\w\W]*?\*\//,lookbehind:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0}],string:/(["'])(\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,"class-name":{pattern:/((?:\b(?:class|interface|extends|implements|trait|instanceof|new)\s+)|(?:catch\s+\())[a-z0-9_\.\\]+/i,lookbehind:!0,inside:{punctuation:/(\.|\\)/}},keyword:/\b(if|else|while|do|for|return|in|instanceof|function|new|try|throw|catch|finally|null|break|continue)\b/,"boolean":/\b(true|false)\b/,"function":/[a-z0-9_]+(?=\()/i,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)\b/i,operator:/--?|\+\+?|!=?=?|<=?|>=?|==?=?|&&?|\|\|?|\?|\*|\/|~|\^|%/,punctuation:/[{}[\];(),.:]/},n.languages.javascript=n.languages.extend("clike",{keyword:/\b(as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/,number:/\b-?(0x[\dA-Fa-f]+|0b[01]+|0o[0-7]+|\d*\.?\d+([Ee][+-]?\d+)?|NaN|Infinity)\b/,"function":/[_$a-zA-Z\xA0-\uFFFF][_$a-zA-Z0-9\xA0-\uFFFF]*(?=\()/i}),n.languages.insertBefore("javascript","keyword",{regex:{pattern:/(^|[^\/])\/(?!\/)(\[.+?]|\\.|[^\/\\\r\n])+\/[gimyu]{0,5}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}}),n.languages.insertBefore("javascript","class-name",{"template-string":{pattern:/`(?:\\`|\\?[^`])*`/,inside:{interpolation:{pattern:/\$\{[^}]+\}/,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:n.languages.javascript}},string:/[\s\S]+/}}}),n.languages.markup&&n.languages.insertBefore("markup","tag",{script:{pattern:/<script[\w\W]*?>[\w\W]*?<\/script>/i,inside:{tag:{pattern:/<script[\w\W]*?>|<\/script>/i,inside:n.languages.markup.tag.inside},rest:n.languages.javascript},alias:"language-javascript"}}),n.languages.js=n.languages.javascript,n.languages.c=n.languages.extend("clike",{keyword:/\b(asm|typeof|inline|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while)\b/,operator:/\-[>-]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|?\||[~^%?*\/]/,number:/\b-?(?:0x[\da-f]+|\d*\.?\d+(?:e[+-]?\d+)?)[ful]*\b/i}),n.languages.insertBefore("c","string",{macro:{pattern:/(^\s*)#\s*[a-z]+([^\r\n\\]|\\.|\\(?:\r\n?|\n))*/im,lookbehind:!0,alias:"property",inside:{string:{pattern:/(#\s*include\s*)(<.+?>|("|')(\\?.)+?\3)/,lookbehind:!0}}}}),delete n.languages.c["class-name"],delete n.languages.c["boolean"],n.languages.csharp=n.languages.extend("clike",{keyword:/\b(abstract|as|async|await|base|bool|break|byte|case|catch|char|checked|class|const|continue|decimal|default|delegate|do|double|else|enum|event|explicit|extern|false|finally|fixed|float|for|foreach|goto|if|implicit|in|int|interface|internal|is|lock|long|namespace|new|null|object|operator|out|override|params|private|protected|public|readonly|ref|return|sbyte|sealed|short|sizeof|stackalloc|static|string|struct|switch|this|throw|true|try|typeof|uint|ulong|unchecked|unsafe|ushort|using|virtual|void|volatile|while|add|alias|ascending|async|await|descending|dynamic|from|get|global|group|into|join|let|orderby|partial|remove|select|set|value|var|where|yield)\b/,string:[/@("|')(\1\1|\\\1|\\?(?!\1)[\s\S])*\1/,/("|')(\\?.)*?\1/],number:/\b-?(0x[\da-f]+|\d*\.?\d+)\b/i}),n.languages.insertBefore("csharp","keyword",{preprocessor:{pattern:/(^\s*)#.*/m,lookbehind:!0}}),n.languages.cpp=n.languages.extend("c",{keyword:/\b(alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|class|compl|const|constexpr|const_cast|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|float|for|friend|goto|if|inline|int|long|mutable|namespace|new|noexcept|nullptr|operator|private|protected|public|register|reinterpret_cast|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,"boolean":/\b(true|false)\b/,operator:/[-+]{1,2}|!=?|<{1,2}=?|>{1,2}=?|\->|:{1,2}|={1,2}|\^|~|%|&{1,2}|\|?\||\?|\*|\/|\b(and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/}),n.languages.insertBefore("cpp","keyword",{"class-name":{pattern:/(class\s+)[a-z0-9_]+/i,lookbehind:!0}}),n.languages.java=n.languages.extend("clike",{keyword:/\b(abstract|continue|for|new|switch|assert|default|goto|package|synchronized|boolean|do|if|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while)\b/,number:/\b0b[01]+\b|\b0x[\da-f]*\.?[\da-fp\-]+\b|\b\d*\.?\d+(?:e[+-]?\d+)?[df]?\b/i,operator:{pattern:/(^|[^.])(?:\+[+=]?|-[-=]?|!=?|<<?=?|>>?>?=?|==?|&[&=]?|\|[|=]?|\*=?|\/=?|%=?|\^=?|[?:~])/m,lookbehind:!0}}),n.languages.php=n.languages.extend("clike",{keyword:/\b(and|or|xor|array|as|break|case|cfunction|class|const|continue|declare|default|die|do|else|elseif|enddeclare|endfor|endforeach|endif|endswitch|endwhile|extends|for|foreach|function|include|include_once|global|if|new|return|static|switch|use|require|require_once|var|while|abstract|interface|public|implements|private|protected|parent|throw|null|echo|print|trait|namespace|final|yield|goto|instanceof|finally|try|catch)\b/i,constant:/\b[A-Z0-9_]{2,}\b/,comment:{pattern:/(^|[^\\])(?:\/\*[\w\W]*?\*\/|\/\/.*)/,lookbehind:!0}}),n.languages.insertBefore("php","class-name",{"shell-comment":{pattern:/(^|[^\\])#.*/,lookbehind:!0,alias:"comment"}}),n.languages.insertBefore("php","keyword",{delimiter:/\?>|<\?(?:php)?/i,variable:/\$\w+\b/i,"package":{pattern:/(\\|namespace\s+|use\s+)[\w\\]+/,lookbehind:!0,inside:{punctuation:/\\/}}}),n.languages.insertBefore("php","operator",{property:{pattern:/(->)[\w]+/,lookbehind:!0}}),n.languages.markup&&(n.hooks.add("before-highlight",function(e){"php"===e.language&&(e.tokenStack=[],e.backupCode=e.code,e.code=e.code.replace(/(?:<\?php|<\?)[\w\W]*?(?:\?>)/gi,function(t){return e.tokenStack.push(t),"{{{PHP"+e.tokenStack.length+"}}}"}))}),n.hooks.add("before-insert",function(e){"php"===e.language&&(e.code=e.backupCode,delete e.backupCode)}),n.hooks.add("after-highlight",function(e){if("php"===e.language){for(var t,r=0;t=e.tokenStack[r];r++)e.highlightedCode=e.highlightedCode.replace("{{{PHP"+(r+1)+"}}}",n.highlight(t,e.grammar,"php").replace(/\$/g,"$$$$"));e.element.innerHTML=e.highlightedCode}}),n.hooks.add("wrap",function(e){"php"===e.language&&"markup"===e.type&&(e.content=e.content.replace(/(\{\{\{PHP[0-9]+\}\}\})/g,'<span class="token php">$1</span>'))}),n.languages.insertBefore("php","comment",{markup:{pattern:/<[^?]\/?(.*?)>/,inside:n.languages.markup},php:/\{\{\{PHP[0-9]+\}\}\}/})),n.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0},string:/"""[\s\S]+?"""|'''[\s\S]+?'''|("|')(?:\\?.)*?\1/,"function":{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_][a-zA-Z0-9_]*(?=\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)[a-z0-9_]+/i,lookbehind:!0},keyword:/\b(?:as|assert|async|await|break|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|pass|print|raise|return|try|while|with|yield)\b/,"boolean":/\b(?:True|False)\b/,number:/\b-?(?:0[bo])?(?:(?:\d|0x[\da-f])[\da-f]*\.?\d*|\.\d+)(?:e[+-]?\d+)?j?\b/i,operator:/[-+%=]=?|!=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]|\b(?:or|and|not)\b/,punctuation:/[{}[\];(),.:]/},function(e){e.languages.ruby=e.languages.extend("clike",{comment:/#(?!\{[^\r\n]*?\}).*/,keyword:/\b(alias|and|BEGIN|begin|break|case|class|def|define_method|defined|do|each|else|elsif|END|end|ensure|false|for|if|in|module|new|next|nil|not|or|raise|redo|require|rescue|retry|return|self|super|then|throw|true|undef|unless|until|when|while|yield)\b/});var t={pattern:/#\{[^}]+\}/,inside:{delimiter:{pattern:/^#\{|\}$/,alias:"tag"},rest:e.util.clone(e.languages.ruby)}};e.languages.insertBefore("ruby","keyword",{regex:[{pattern:/%r([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1[gim]{0,3}/,inside:{interpolation:t}},{pattern:/%r\((?:[^()\\]|\\[\s\S])*\)[gim]{0,3}/,inside:{interpolation:t}},{pattern:/%r\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}[gim]{0,3}/,inside:{interpolation:t}},{pattern:/%r\[(?:[^\[\]\\]|\\[\s\S])*\][gim]{0,3}/,inside:{interpolation:t}},{pattern:/%r<(?:[^<>\\]|\\[\s\S])*>[gim]{0,3}/,inside:{interpolation:t}},{pattern:/(^|[^\/])\/(?!\/)(\[.+?]|\\.|[^\/\r\n])+\/[gim]{0,3}(?=\s*($|[\r\n,.;})]))/,lookbehind:!0}],variable:/[@$]+[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/,symbol:/:[a-zA-Z_][a-zA-Z_0-9]*(?:[?!]|\b)/}),e.languages.insertBefore("ruby","number",{builtin:/\b(Array|Bignum|Binding|Class|Continuation|Dir|Exception|FalseClass|File|Stat|File|Fixnum|Fload|Hash|Integer|IO|MatchData|Method|Module|NilClass|Numeric|Object|Proc|Range|Regexp|String|Struct|TMS|Symbol|ThreadGroup|Thread|Time|TrueClass)\b/,constant:/\b[A-Z][a-zA-Z_0-9]*(?:[?!]|\b)/}),e.languages.ruby.string=[{pattern:/%[qQiIwWxs]?([^a-zA-Z0-9\s\{\(\[<])(?:[^\\]|\\[\s\S])*?\1/,inside:{interpolation:t}},{pattern:/%[qQiIwWxs]?\((?:[^()\\]|\\[\s\S])*\)/,inside:{interpolation:t}},{pattern:/%[qQiIwWxs]?\{(?:[^#{}\\]|#(?:\{[^}]+\})?|\\[\s\S])*\}/,inside:{interpolation:t}},{pattern:/%[qQiIwWxs]?\[(?:[^\[\]\\]|\\[\s\S])*\]/,inside:{interpolation:t}},{pattern:/%[qQiIwWxs]?<(?:[^<>\\]|\\[\s\S])*>/,inside:{interpolation:t}},{pattern:/("|')(#\{[^}]+\}|\\(?:\r?\n|\r)|\\?.)*?\1/,inside:{interpolation:t}}]}(n),n}),r("tinymce/codesampleplugin/Utils",[],function(){function e(e){return e&&"PRE"==e.nodeName&&e.className.indexOf("language-")!==-1}function t(e){return function(t,n){return e(n)}}return{isCodeSample:e,trimArg:t}}),r("tinymce/codesampleplugin/Dialog",["tinymce/dom/DOMUtils","tinymce/codesampleplugin/Utils","tinymce/codesampleplugin/Prism"],function(e,t,n){function r(e){var t=[{text:"HTML/XML",value:"markup"},{text:"JavaScript",value:"javascript"},{text:"CSS",value:"css"},{text:"PHP",value:"php"},{text:"Ruby",value:"ruby"},{text:"Python",value:"python"},{text:"Java",value:"java"},{text:"C",value:"c"},{text:"C#",value:"csharp"},{text:"C++",value:"cpp"}],n=e.settings.codesample_languages;return n?n:t}function i(e,t,r){e.undoManager.transact(function(){var i=o(e);r=l.encode(r),i?(e.dom.setAttrib(i,"class","language-"+t),i.innerHTML=r,n.highlightElement(i),e.selection.select(i)):(e.insertContent('<pre id="__new" class="language-'+t+'">'+r+"</pre>"),e.selection.select(e.$("#__new").removeAttr("id")[0]))})}function o(e){var n=e.selection.getNode();return t.isCodeSample(n)?n:null}function a(e){var t=o(e);return t?t.textContent:""}function s(e){var t,n=o(e);return n?(t=n.className.match(/language-(\w+)/),t?t[1]:""):""}var l=e.DOM;return{open:function(e){e.windowManager.open({title:"Insert/Edit code sample",minWidth:Math.min(l.getViewPort().w,e.getParam("codesample_dialog_width",800)),minHeight:Math.min(l.getViewPort().h,e.getParam("codesample_dialog_height",650)),layout:"flex",direction:"column",align:"stretch",body:[{type:"listbox",name:"language",label:"Language",maxWidth:200,value:s(e),values:r(e)},{type:"textbox",name:"code",multiline:!0,spellcheck:!1,ariaLabel:"Code view",flex:1,style:"direction: ltr; text-align: left",classes:"monospace",value:a(e),autofocus:!0}],onSubmit:function(t){i(e,t.data.language,t.data.code)}})}}}),r("tinymce/codesampleplugin/Plugin",["tinymce/Env","tinymce/PluginManager","tinymce/codesampleplugin/Prism","tinymce/codesampleplugin/Dialog","tinymce/codesampleplugin/Utils"],function(e,t,n,r,i){var o,a=i.trimArg;t.add("codesample",function(t,s){function l(){var e,n=t.settings.codesample_content_css;t.inline&&o||!t.inline&&c||(t.inline?o=!0:c=!0,n!==!1&&(e=t.dom.create("link",{rel:"stylesheet",href:n?n:s+"/css/prism.css"}),t.getDoc().getElementsByTagName("head")[0].appendChild(e)))}var c,u=t.$;e.ceFalse&&(t.on("PreProcess",function(e){u("pre[contenteditable=false]",e.node).filter(a(i.isCodeSample)).each(function(e,t){var n=u(t),r=t.textContent;n.attr("class",u.trim(n.attr("class"))),n.removeAttr("contentEditable"),n.empty().append(u("<code></code>").each(function(){this.textContent=r}))})}),t.on("SetContent",function(){var e=u("pre").filter(a(i.isCodeSample)).filter(function(e,t){return"false"!==t.contentEditable});e.length&&t.undoManager.transact(function(){e.each(function(e,r){u(r).find("br").each(function(e,n){n.parentNode.replaceChild(t.getDoc().createTextNode("\n"),n)}),r.contentEditable=!1,r.innerHTML=t.dom.encode(r.textContent),n.highlightElement(r),r.className=u.trim(r.className)})})}),t.addCommand("codesample",function(){var e=t.selection.getNode();t.selection.isCollapsed()||i.isCodeSample(e)?r.open(t):t.formatter.toggle("code")}),t.addButton("codesample",{cmd:"codesample",title:"Insert/Edit code sample"}),t.on("init",l))})}),o(["tinymce/codesampleplugin/Prism","tinymce/codesampleplugin/Utils","tinymce/codesampleplugin/Dialog","tinymce/codesampleplugin/Plugin"])}(window);

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/colorpicker/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("colorpicker",function(e){function t(t,n){function r(e){var t=new tinymce.util.Color(e),n=t.toRgb();o.fromJSON({r:n.r,g:n.g,b:n.b,hex:t.toHex().substr(1)}),i(t.toHex())}function i(e){o.find("#preview")[0].getEl().style.background=e}var o=e.windowManager.open({title:"Color",items:{type:"container",layout:"flex",direction:"row",align:"stretch",padding:5,spacing:10,items:[{type:"colorpicker",value:n,onchange:function(){var e=this.rgb();o&&(o.find("#r").value(e.r),o.find("#g").value(e.g),o.find("#b").value(e.b),o.find("#hex").value(this.value().substr(1)),i(this.value()))}},{type:"form",padding:0,labelGap:5,defaults:{type:"textbox",size:7,value:"0",flex:1,spellcheck:!1,onchange:function(){var e,t,n=o.find("colorpicker")[0];return e=this.name(),t=this.value(),"hex"==e?(t="#"+t,r(t),void n.value(t)):(t={r:o.find("#r").value(),g:o.find("#g").value(),b:o.find("#b").value()},n.value(t),void r(t))}},items:[{name:"r",label:"R",autofocus:1},{name:"g",label:"G"},{name:"b",label:"B"},{name:"hex",label:"#",value:"000000"},{name:"preview",type:"container",border:1}]}]},onSubmit:function(){t("#"+this.toJSON().hex)}});r(n)}e.settings.color_picker_callback||(e.settings.color_picker_callback=t)});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/contextmenu/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("contextmenu",function(e){var t,n,r=e.settings.contextmenu_never_use_native,i=function(e){return e.ctrlKey&&!r},o=function(){return tinymce.Env.mac&&tinymce.Env.webkit},a=function(){return n===!0};return e.on("mousedown",function(t){o()&&2===t.button&&!i(t)&&e.selection.isCollapsed()&&e.once("contextmenu",function(t){e.selection.placeCaretAt(t.clientX,t.clientY)})}),e.on("contextmenu",function(r){var o;if(!i(r)){if(r.preventDefault(),o=e.settings.contextmenu||"link openlink image inserttable | cell row column deletetable",t)t.show();else{var a=[];tinymce.each(o.split(/[ ,]/),function(t){var n=e.menuItems[t];"|"==t&&(n={text:t}),n&&(n.shortcut="",a.push(n))});for(var s=0;s<a.length;s++)"|"==a[s].text&&(0!==s&&s!=a.length-1||a.splice(s,1));t=new tinymce.ui.Menu({items:a,context:"contextmenu",classes:"contextmenu"}).renderTo(),t.on("hide",function(e){e.control===this&&(n=!1)}),e.on("remove",function(){t.remove(),t=null})}var l={x:r.pageX,y:r.pageY};e.inline||(l=tinymce.DOM.getPos(e.getContentAreaContainer()),l.x+=r.clientX,l.y+=r.clientY),t.moveTo(l.x,l.y),n=!0}}),{isContextMenuVisible:a}});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/directionality/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("directionality",function(e){function t(t){var n,r=e.dom,i=e.selection.getSelectedBlocks();i.length&&(n=r.getAttrib(i[0],"dir"),tinymce.each(i,function(e){r.getParent(e.parentNode,"*[dir='"+t+"']",r.getRoot())||(n!=t?r.setAttrib(e,"dir",t):r.setAttrib(e,"dir",null))}),e.nodeChanged())}function n(e){var t=[];return tinymce.each("h1 h2 h3 h4 h5 h6 div p".split(" "),function(n){t.push(n+"[dir="+e+"]")}),t.join(",")}e.addCommand("mceDirectionLTR",function(){t("ltr")}),e.addCommand("mceDirectionRTL",function(){t("rtl")}),e.addButton("ltr",{title:"Left to right",cmd:"mceDirectionLTR",stateSelector:n("ltr")}),e.addButton("rtl",{title:"Right to left",cmd:"mceDirectionRTL",stateSelector:n("rtl")})});

 Binary files /dev/null and b/tinymce4/js/tinymce/plugins/emoticons/img/smiley-cool.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/plugins/emoticons/img/smiley-cry.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/plugins/emoticons/img/smiley-embarassed.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/plugins/emoticons/img/smiley-foot-in-mouth.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/plugins/emoticons/img/smiley-frown.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/plugins/emoticons/img/smiley-innocent.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/plugins/emoticons/img/smiley-kiss.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/plugins/emoticons/img/smiley-laughing.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/plugins/emoticons/img/smiley-money-mouth.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/plugins/emoticons/img/smiley-sealed.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/plugins/emoticons/img/smiley-smile.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/plugins/emoticons/img/smiley-surprised.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/plugins/emoticons/img/smiley-tongue-out.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/plugins/emoticons/img/smiley-undecided.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/plugins/emoticons/img/smiley-wink.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/plugins/emoticons/img/smiley-yell.gif differ
--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/emoticons/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("emoticons",function(e,t){function n(){var e;return e='<table role="list" class="mce-grid">',tinymce.each(r,function(n){e+="<tr>",tinymce.each(n,function(n){var r=t+"/img/smiley-"+n+".gif";e+='<td><a href="#" data-mce-url="'+r+'" data-mce-alt="'+n+'" tabindex="-1" role="option" aria-label="'+n+'"><img src="'+r+'" style="width: 18px; height: 18px" role="presentation" /></a></td>'}),e+="</tr>"}),e+="</table>"}var r=[["cool","cry","embarassed","foot-in-mouth"],["frown","innocent","kiss","laughing"],["money-mouth","sealed","smile","surprised"],["tongue-out","undecided","wink","yell"]];e.addButton("emoticons",{type:"panelbutton",panel:{role:"application",autohide:!0,html:n,onclick:function(t){var n=e.dom.getParent(t.target,"a");n&&(e.insertContent('<img src="'+n.getAttribute("data-mce-url")+'" alt="'+n.getAttribute("data-mce-alt")+'" />'),this.hide())}},tooltip:"Emoticons"})});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/example/dialog.html
@@ -1,1 +1,8 @@
-
+<!DOCTYPE html>
+<html>
+<body>
+	<h3>Custom dialog</h3>
+	Input some text: <input id="content">
+	<button onclick="top.tinymce.activeEditor.windowManager.getWindows()[0].close();">Close window</button>
+</body>
+</html>

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/example/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("example",function(e,t){e.addButton("example",{text:"My button",icon:!1,onclick:function(){e.windowManager.open({title:"Example plugin",body:[{type:"textbox",name:"title",label:"Title"}],onsubmit:function(t){e.insertContent("Title: "+t.data.title)}})}}),e.addMenuItem("example",{text:"Example plugin",context:"tools",onclick:function(){e.windowManager.open({title:"TinyMCE site",url:t+"/dialog.html",width:600,height:400,buttons:[{text:"Insert",onclick:function(){var t=e.windowManager.getWindows()[0];e.insertContent(t.getContentWindow().document.getElementById("content").value),t.close()}},{text:"Close",onclick:"close"}]})}})});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/example_dependency/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("example_dependency",function(){},["example"]);

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/fullpage/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("fullpage",function(e){function t(){var t=n();e.windowManager.open({title:"Document properties",data:t,defaults:{type:"textbox",size:40},body:[{name:"title",label:"Title"},{name:"keywords",label:"Keywords"},{name:"description",label:"Description"},{name:"robots",label:"Robots"},{name:"author",label:"Author"},{name:"docencoding",label:"Encoding"}],onSubmit:function(e){r(tinymce.extend(t,e.data))}})}function n(){function t(e,t){var n=e.attr(t);return n||""}var n,r,o=i(),a={};return a.fontface=e.getParam("fullpage_default_fontface",""),a.fontsize=e.getParam("fullpage_default_fontsize",""),n=o.firstChild,7==n.type&&(a.xml_pi=!0,r=/encoding="([^"]+)"/.exec(n.value),r&&(a.docencoding=r[1])),n=o.getAll("#doctype")[0],n&&(a.doctype="<!DOCTYPE"+n.value+">"),n=o.getAll("title")[0],n&&n.firstChild&&(a.title=n.firstChild.value),u(o.getAll("meta"),function(e){var t,n=e.attr("name"),r=e.attr("http-equiv");n?a[n.toLowerCase()]=e.attr("content"):"Content-Type"==r&&(t=/charset\s*=\s*(.*)\s*/gi.exec(e.attr("content")),t&&(a.docencoding=t[1]))}),n=o.getAll("html")[0],n&&(a.langcode=t(n,"lang")||t(n,"xml:lang")),a.stylesheets=[],tinymce.each(o.getAll("link"),function(e){"stylesheet"==e.attr("rel")&&a.stylesheets.push(e.attr("href"))}),n=o.getAll("body")[0],n&&(a.langdir=t(n,"dir"),a.style=t(n,"style"),a.visited_color=t(n,"vlink"),a.link_color=t(n,"link"),a.active_color=t(n,"alink")),a}function r(t){function n(e,t,n){e.attr(t,n?n:void 0)}function r(e){a.firstChild?a.insert(e,a.firstChild):a.append(e)}var o,a,s,c,f,p=e.dom;o=i(),a=o.getAll("head")[0],a||(c=o.getAll("html")[0],a=new d("head",1),c.firstChild?c.insert(a,c.firstChild,!0):c.append(a)),c=o.firstChild,t.xml_pi?(f='version="1.0"',t.docencoding&&(f+=' encoding="'+t.docencoding+'"'),7!=c.type&&(c=new d("xml",7),o.insert(c,o.firstChild,!0)),c.value=f):c&&7==c.type&&c.remove(),c=o.getAll("#doctype")[0],t.doctype?(c||(c=new d("#doctype",10),t.xml_pi?o.insert(c,o.firstChild):r(c)),c.value=t.doctype.substring(9,t.doctype.length-1)):c&&c.remove(),c=null,u(o.getAll("meta"),function(e){"Content-Type"==e.attr("http-equiv")&&(c=e)}),t.docencoding?(c||(c=new d("meta",1),c.attr("http-equiv","Content-Type"),c.shortEnded=!0,r(c)),c.attr("content","text/html; charset="+t.docencoding)):c&&c.remove(),c=o.getAll("title")[0],t.title?(c?c.empty():(c=new d("title",1),r(c)),c.append(new d("#text",3)).value=t.title):c&&c.remove(),u("keywords,description,author,copyright,robots".split(","),function(e){var n,i,a=o.getAll("meta"),s=t[e];for(n=0;n<a.length;n++)if(i=a[n],i.attr("name")==e)return void(s?i.attr("content",s):i.remove());s&&(c=new d("meta",1),c.attr("name",e),c.attr("content",s),c.shortEnded=!0,r(c))});var m={};tinymce.each(o.getAll("link"),function(e){"stylesheet"==e.attr("rel")&&(m[e.attr("href")]=e)}),tinymce.each(t.stylesheets,function(e){m[e]||(c=new d("link",1),c.attr({rel:"stylesheet",text:"text/css",href:e}),c.shortEnded=!0,r(c)),delete m[e]}),tinymce.each(m,function(e){e.remove()}),c=o.getAll("body")[0],c&&(n(c,"dir",t.langdir),n(c,"style",t.style),n(c,"vlink",t.visited_color),n(c,"link",t.link_color),n(c,"alink",t.active_color),p.setAttribs(e.getBody(),{style:t.style,dir:t.dir,vLink:t.visited_color,link:t.link_color,aLink:t.active_color})),c=o.getAll("html")[0],c&&(n(c,"lang",t.langcode),n(c,"xml:lang",t.langcode)),a.firstChild||a.remove(),s=new tinymce.html.Serializer({validate:!1,indent:!0,apply_source_formatting:!0,indent_before:"head,html,body,meta,title,script,link,style",indent_after:"head,html,body,meta,title,script,link,style"}).serialize(o),l=s.substring(0,s.indexOf("</body>"))}function i(){return new tinymce.html.DomParser({validate:!1,root_name:"#document"}).parse(l)}function o(t){function n(e){return e.replace(/<\/?[A-Z]+/g,function(e){return e.toLowerCase()})}var r,o,s,d,f=t.content,p="",m=e.dom;if(!t.selection&&!("raw"==t.format&&l||t.source_view&&e.getParam("fullpage_hide_in_source_view"))){0!==f.length||t.source_view||(f=tinymce.trim(l)+"\n"+tinymce.trim(f)+"\n"+tinymce.trim(c)),f=f.replace(/<(\/?)BODY/gi,"<$1body"),r=f.indexOf("<body"),r!=-1?(r=f.indexOf(">",r),l=n(f.substring(0,r+1)),o=f.indexOf("</body",r),o==-1&&(o=f.length),t.content=f.substring(r+1,o),c=n(f.substring(o))):(l=a(),c="\n</body>\n</html>"),s=i(),u(s.getAll("style"),function(e){e.firstChild&&(p+=e.firstChild.value)}),d=s.getAll("body")[0],d&&m.setAttribs(e.getBody(),{style:d.attr("style")||"",dir:d.attr("dir")||"",vLink:d.attr("vlink")||"",link:d.attr("link")||"",aLink:d.attr("alink")||""}),m.remove("fullpage_styles");var h=e.getDoc().getElementsByTagName("head")[0];p&&(m.add(h,"style",{id:"fullpage_styles"},p),d=m.get("fullpage_styles"),d.styleSheet&&(d.styleSheet.cssText=p));var g={};tinymce.each(h.getElementsByTagName("link"),function(e){"stylesheet"==e.rel&&e.getAttribute("data-mce-fullpage")&&(g[e.href]=e)}),tinymce.each(s.getAll("link"),function(e){var t=e.attr("href");return!t||(g[t]||"stylesheet"!=e.attr("rel")||m.add(h,"link",{rel:"stylesheet",text:"text/css",href:t,"data-mce-fullpage":"1"}),void delete g[t])}),tinymce.each(g,function(e){e.parentNode.removeChild(e)})}}function a(){var t,n="",r="";return e.getParam("fullpage_default_xml_pi")&&(n+='<?xml version="1.0" encoding="'+e.getParam("fullpage_default_encoding","ISO-8859-1")+'" ?>\n'),n+=e.getParam("fullpage_default_doctype","<!DOCTYPE html>"),n+="\n<html>\n<head>\n",(t=e.getParam("fullpage_default_title"))&&(n+="<title>"+t+"</title>\n"),(t=e.getParam("fullpage_default_encoding"))&&(n+='<meta http-equiv="Content-Type" content="text/html; charset='+t+'" />\n'),(t=e.getParam("fullpage_default_font_family"))&&(r+="font-family: "+t+";"),(t=e.getParam("fullpage_default_font_size"))&&(r+="font-size: "+t+";"),(t=e.getParam("fullpage_default_text_color"))&&(r+="color: "+t+";"),n+="</head>\n<body"+(r?' style="'+r+'"':"")+">\n"}function s(t){t.selection||t.source_view&&e.getParam("fullpage_hide_in_source_view")||(t.content=tinymce.trim(l)+"\n"+tinymce.trim(t.content)+"\n"+tinymce.trim(c))}var l,c,u=tinymce.each,d=tinymce.html.Node;e.addCommand("mceFullPageProperties",t),e.addButton("fullpage",{title:"Document properties",cmd:"mceFullPageProperties"}),e.addMenuItem("fullpage",{text:"Document properties",cmd:"mceFullPageProperties",context:"file"}),e.on("BeforeSetContent",o),e.on("GetContent",s)});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/fullscreen/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("fullscreen",function(e){function t(){var e,t,n=window,r=document,i=r.body;return i.offsetWidth&&(e=i.offsetWidth,t=i.offsetHeight),n.innerWidth&&n.innerHeight&&(e=n.innerWidth,t=n.innerHeight),{w:e,h:t}}function n(){var e=tinymce.DOM.getViewPort();return{x:e.x,y:e.y}}function r(e){scrollTo(e.x,e.y)}function i(){function i(){f.setStyle(h,"height",t().h-(m.clientHeight-h.clientHeight))}var p,m,h,g,v=document.body,b=document.documentElement;d=!d,m=e.getContainer(),p=m.style,h=e.getContentAreaContainer().firstChild,g=h.style,d?(u=n(),o=g.width,a=g.height,g.width=g.height="100%",l=p.width,c=p.height,p.width=p.height="",f.addClass(v,"mce-fullscreen"),f.addClass(b,"mce-fullscreen"),f.addClass(m,"mce-fullscreen"),f.bind(window,"resize",i),i(),s=i):(g.width=o,g.height=a,l&&(p.width=l),c&&(p.height=c),f.removeClass(v,"mce-fullscreen"),f.removeClass(b,"mce-fullscreen"),f.removeClass(m,"mce-fullscreen"),f.unbind(window,"resize",s),r(u)),e.fire("FullscreenStateChanged",{state:d})}var o,a,s,l,c,u,d=!1,f=tinymce.DOM;if(!e.settings.inline)return e.on("init",function(){e.addShortcut("Ctrl+Shift+F","",i)}),e.on("remove",function(){s&&f.unbind(window,"resize",s)}),e.addCommand("mceFullScreen",i),e.addMenuItem("fullscreen",{text:"Fullscreen",shortcut:"Ctrl+Shift+F",selectable:!0,onClick:function(){i(),e.focus()},onPostRender:function(){var t=this;e.on("FullscreenStateChanged",function(e){t.active(e.state)})},context:"view"}),e.addButton("fullscreen",{tooltip:"Fullscreen",shortcut:"Ctrl+Shift+F",onClick:i,onPostRender:function(){var t=this;e.on("FullscreenStateChanged",function(e){t.active(e.state)})}}),{isFullscreen:function(){return d}}});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/hr/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("hr",function(e){e.addCommand("InsertHorizontalRule",function(){e.execCommand("mceInsertContent",!1,"<hr />")}),e.addButton("hr",{icon:"hr",tooltip:"Horizontal line",cmd:"InsertHorizontalRule"}),e.addMenuItem("hr",{icon:"hr",text:"Horizontal line",cmd:"InsertHorizontalRule",context:"insert"})});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/image/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("image",function(e){function t(e,t){function n(e,n){r.parentNode&&r.parentNode.removeChild(r),t({width:e,height:n})}var r=document.createElement("img");r.onload=function(){n(Math.max(r.width,r.clientWidth),Math.max(r.height,r.clientHeight))},r.onerror=function(){n()};var i=r.style;i.visibility="hidden",i.position="fixed",i.bottom=i.left=0,i.width=i.height="auto",document.body.appendChild(r),r.src=e}function n(e,t,n){function r(e,n){return n=n||[],tinymce.each(e,function(e){var i={text:e.text||e.title};e.menu?i.menu=r(e.menu):(i.value=e.value,t(i)),n.push(i)}),n}return r(e,n||[])}function r(t){return function(){var n=e.settings.image_list;"string"==typeof n?tinymce.util.XHR.send({url:n,success:function(e){t(tinymce.util.JSON.parse(e))}}):"function"==typeof n?n(t):t(n)}}function i(r){function i(){var e,t,n,r;e=f.find("#width")[0],t=f.find("#height")[0],e&&t&&(n=e.value(),r=t.value(),f.find("#constrain")[0].checked()&&h&&g&&n&&r&&(h!=n?(r=Math.round(n/h*r),isNaN(r)||t.value(r)):(n=Math.round(r/g*n),isNaN(n)||e.value(n))),h=n,g=r)}function o(){function t(t){function n(){t.onload=t.onerror=null,e.selection&&(e.selection.select(t),e.nodeChanged())}t.onload=function(){y.width||y.height||!x||C.setAttribs(t,{width:t.clientWidth,height:t.clientHeight}),n()},t.onerror=n}var n,r;u(),i(),y=tinymce.extend(y,f.toJSON()),y.alt||(y.alt=""),y.title||(y.title=""),""===y.width&&(y.width=null),""===y.height&&(y.height=null),y.style||(y.style=null),y={src:y.src,alt:y.alt,title:y.title,width:y.width,height:y.height,style:y.style,caption:y.caption,"class":y["class"]},e.undoManager.transact(function(){function i(t){return e.schema.getTextBlockElements()[t.nodeName]}if(!y.src)return void(p&&(C.remove(p),e.focus(),e.nodeChanged()));if(""===y.title&&(y.title=null),p?C.setAttribs(p,y):(y.id="__mcenew",e.focus(),e.selection.setContent(C.createHTML("img",y)),p=C.get("__mcenew"),C.setAttrib(p,"id",null)),e.editorUpload.uploadImagesAuto(),y.caption===!1&&C.is(p.parentNode,"figure.image")&&(n=p.parentNode,C.insertAfter(p,n),C.remove(n)),y.caption!==!0)t(p);else if(!C.is(p.parentNode,"figure.image")){r=p,p=p.cloneNode(!0),n=C.create("figure",{"class":"image"}),n.appendChild(p),n.appendChild(C.create("figcaption",{contentEditable:!0},"Caption")),n.contentEditable=!1;var o=C.getParent(r,i);o?C.split(o,r,n):C.replace(n,r),e.selection.select(n)}})}function a(e){return e&&(e=e.replace(/px$/,"")),e}function s(n){var r,i,o,a=n.meta||{};v&&v.value(e.convertURL(this.value(),"src")),tinymce.each(a,function(e,t){f.find("#"+t).value(e)}),a.width||a.height||(r=e.convertURL(this.value(),"src"),i=e.settings.image_prepend_url,o=new RegExp("^(?:[a-z]+:)?//","i"),i&&!o.test(r)&&r.substring(0,i.length)!==i&&(r=i+r),this.value(r),t(e.documentBaseURI.toAbsolute(this.value()),function(e){e.width&&e.height&&x&&(h=e.width,g=e.height,f.find("#width").value(h),f.find("#height").value(g))}))}function l(e){e.meta=f.toJSON()}function c(e){if(e.margin){var t=e.margin.split(" ");switch(t.length){case 1:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[0],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[0];break;case 2:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[0],e["margin-left"]=e["margin-left"]||t[1];break;case 3:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[1];break;case 4:e["margin-top"]=e["margin-top"]||t[0],e["margin-right"]=e["margin-right"]||t[1],e["margin-bottom"]=e["margin-bottom"]||t[2],e["margin-left"]=e["margin-left"]||t[3]}delete e.margin}return e}function u(){function t(e){return e.length>0&&/^[0-9]+$/.test(e)&&(e+="px"),e}if(e.settings.image_advtab){var n=f.toJSON(),r=C.parseStyle(n.style);r=c(r),n.vspace&&(r["margin-top"]=r["margin-bottom"]=t(n.vspace)),n.hspace&&(r["margin-left"]=r["margin-right"]=t(n.hspace)),n.border&&(r["border-width"]=t(n.border)),f.find("#style").value(C.serializeStyle(C.parseStyle(C.serializeStyle(r))))}}function d(){if(e.settings.image_advtab){var t=f.toJSON(),n=C.parseStyle(t.style);f.find("#vspace").value(""),f.find("#hspace").value(""),n=c(n),(n["margin-top"]&&n["margin-bottom"]||n["margin-right"]&&n["margin-left"])&&(n["margin-top"]===n["margin-bottom"]?f.find("#vspace").value(a(n["margin-top"])):f.find("#vspace").value(""),n["margin-right"]===n["margin-left"]?f.find("#hspace").value(a(n["margin-right"])):f.find("#hspace").value("")),n["border-width"]&&f.find("#border").value(a(n["border-width"])),f.find("#style").value(C.serializeStyle(C.parseStyle(C.serializeStyle(n))))}}var f,p,m,h,g,v,b,y={},C=e.dom,x=e.settings.image_dimensions!==!1;p=e.selection.getNode(),m=C.getParent(p,"figure.image"),m&&(p=C.select("img",m)[0]),p&&("IMG"!=p.nodeName||p.getAttribute("data-mce-object")||p.getAttribute("data-mce-placeholder"))&&(p=null),p&&(h=C.getAttrib(p,"width"),g=C.getAttrib(p,"height"),y={src:C.getAttrib(p,"src"),alt:C.getAttrib(p,"alt"),title:C.getAttrib(p,"title"),"class":C.getAttrib(p,"class"),width:h,height:g,caption:!!m}),r&&(v={type:"listbox",label:"Image list",values:n(r,function(t){t.value=e.convertURL(t.value||t.url,"src")},[{text:"None",value:""}]),value:y.src&&e.convertURL(y.src,"src"),onselect:function(e){var t=f.find("#alt");(!t.value()||e.lastControl&&t.value()==e.lastControl.text())&&t.value(e.control.text()),f.find("#src").value(e.control.value()).fire("change")},onPostRender:function(){v=this}}),e.settings.image_class_list&&(b={name:"class",type:"listbox",label:"Class",values:n(e.settings.image_class_list,function(t){t.value&&(t.textStyle=function(){return e.formatter.getCssText({inline:"img",classes:[t.value]})})})});var w=[{name:"src",type:"filepicker",filetype:"image",label:"Source",autofocus:!0,onchange:s,onbeforecall:l},v];e.settings.image_description!==!1&&w.push({name:"alt",type:"textbox",label:"Image description"}),e.settings.image_title&&w.push({name:"title",type:"textbox",label:"Image Title"}),x&&w.push({type:"container",label:"Dimensions",layout:"flex",direction:"row",align:"center",spacing:5,items:[{name:"width",type:"textbox",maxLength:5,size:3,onchange:i,ariaLabel:"Width"},{type:"label",text:"x"},{name:"height",type:"textbox",maxLength:5,size:3,onchange:i,ariaLabel:"Height"},{name:"constrain",type:"checkbox",checked:!0,text:"Constrain proportions"}]}),w.push(b),e.settings.image_caption&&tinymce.Env.ceFalse&&w.push({name:"caption",type:"checkbox",label:"Caption"}),e.settings.image_advtab?(p&&(p.style.marginLeft&&p.style.marginRight&&p.style.marginLeft===p.style.marginRight&&(y.hspace=a(p.style.marginLeft)),p.style.marginTop&&p.style.marginBottom&&p.style.marginTop===p.style.marginBottom&&(y.vspace=a(p.style.marginTop)),p.style.borderWidth&&(y.border=a(p.style.borderWidth)),y.style=e.dom.serializeStyle(e.dom.parseStyle(e.dom.getAttrib(p,"style")))),f=e.windowManager.open({title:"Insert/edit image",data:y,bodyType:"tabpanel",body:[{title:"General",type:"form",items:w},{title:"Advanced",type:"form",pack:"start",items:[{label:"Style",name:"style",type:"textbox",onchange:d},{type:"form",layout:"grid",packV:"start",columns:2,padding:0,alignH:["left","right"],defaults:{type:"textbox",maxWidth:50,onchange:u},items:[{label:"Vertical space",name:"vspace"},{label:"Horizontal space",name:"hspace"},{label:"Border",name:"border"}]}]}],onSubmit:o})):f=e.windowManager.open({title:"Insert/edit image",data:y,body:w,onSubmit:o})}e.on("preInit",function(){function t(e){var t=e.attr("class");return t&&/\bimage\b/.test(t)}function n(e){return function(n){function r(t){t.attr("contenteditable",e?"true":null)}for(var i,o=n.length;o--;)i=n[o],t(i)&&(i.attr("contenteditable",e?"false":null),tinymce.each(i.getAll("figcaption"),r))}}e.parser.addNodeFilter("figure",n(!0)),e.serializer.addNodeFilter("figure",n(!1))}),e.addButton("image",{icon:"image",tooltip:"Insert/edit image",onclick:r(i),stateSelector:"img:not([data-mce-object],[data-mce-placeholder]),figure.image"}),e.addMenuItem("image",{icon:"image",text:"Image",onclick:r(i),context:"insert",prependToContext:!0}),e.addCommand("mceImage",r(i))});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/imagetools/plugin.min.js
@@ -1,1 +1,1 @@
-
+!function(){var e={},t=function(t){for(var n=e[t],i=n.deps,o=n.defn,a=i.length,s=new Array(a),l=0;l<a;++l)s[l]=r(i[l]);var c=o.apply(null,s);if(void 0===c)throw"module ["+t+"] returned undefined";n.instance=c},n=function(t,n,r){if("string"!=typeof t)throw"module id must be a string";if(void 0===n)throw"no dependencies for "+t;if(void 0===r)throw"no definition function for "+t;e[t]={deps:n,defn:r,instance:void 0}},r=function(n){var r=e[n];if(void 0===r)throw"module ["+n+"] was undefined";return void 0===r.instance&&t(n),r.instance},i=function(e,t){for(var n=e.length,i=new Array(n),o=0;o<n;++o)i.push(r(e[o]));t.apply(null,t)},o={};o.bolt={module:{api:{define:n,require:i,demand:r}}};var a=n,s=function(e,t){a(e,[],function(){return t})};s("1",tinymce.PluginManager),s("2",tinymce.Env),s("3",tinymce.util.Promise),s("4",tinymce.util.URI),s("5",tinymce.util.Tools),s("6",tinymce.util.Delay),a("m",[],function(){function e(e,t){return r(document.createElement("canvas"),e,t)}function t(e){return e.getContext("2d")}function n(e){var t=null;try{t=e.getContext("webgl")||e.getContext("experimental-webgl")}catch(e){}return t||(t=null),t}function r(e,t,n){return e.width=t,e.height=n,e}return{create:e,resize:r,get2dContext:t,get3dContext:n}}),a("n",[],function(){function e(e){return e.naturalWidth||e.width}function t(e){return e.naturalHeight||e.height}return{getWidth:e,getHeight:t}}),a("o",[],function(){function e(e,t){return function(){e.apply(t,arguments)}}function t(t){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],s(t,e(r,this),e(i,this))}function n(e){var t=this;return null===this._state?void this._deferreds.push(e):void l(function(){var n=t._state?e.onFulfilled:e.onRejected;if(null===n)return void(t._state?e.resolve:e.reject)(t._value);var r;try{r=n(t._value)}catch(t){return void e.reject(t)}e.resolve(r)})}function r(t){try{if(t===this)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"==typeof t||"function"==typeof t)){var n=t.then;if("function"==typeof n)return void s(e(n,t),e(r,this),e(i,this))}this._state=!0,this._value=t,o.call(this)}catch(e){i.call(this,e)}}function i(e){this._state=!1,this._value=e,o.call(this)}function o(){for(var e=0,t=this._deferreds.length;e<t;e++)n.call(this,this._deferreds[e]);this._deferreds=null}function a(e,t,n,r){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.resolve=n,this.reject=r}function s(e,t,n){var r=!1;try{e(function(e){r||(r=!0,t(e))},function(e){r||(r=!0,n(e))})}catch(e){if(r)return;r=!0,n(e)}}if(window.Promise)return window.Promise;var l=t.immediateFn||"function"==typeof setImmediate&&setImmediate||function(e){setTimeout(e,1)},c=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)};return t.prototype["catch"]=function(e){return this.then(null,e)},t.prototype.then=function(e,r){var i=this;return new t(function(t,o){n.call(i,new a(e,r,t,o))})},t.all=function(){var e=Array.prototype.slice.call(1===arguments.length&&c(arguments[0])?arguments[0]:arguments);return new t(function(t,n){function r(o,a){try{if(a&&("object"==typeof a||"function"==typeof a)){var s=a.then;if("function"==typeof s)return void s.call(a,function(e){r(o,e)},n)}e[o]=a,0===--i&&t(e)}catch(e){n(e)}}if(0===e.length)return t([]);for(var i=e.length,o=0;o<e.length;o++)r(o,e[o])})},t.resolve=function(e){return e&&"object"==typeof e&&e.constructor===t?e:new t(function(t){t(e)})},t.reject=function(e){return new t(function(t,n){n(e)})},t.race=function(e){return new t(function(t,n){for(var r=0,i=e.length;r<i;r++)e[r].then(t,n)})},t}),a("p",[],function(){function e(e){var t=document.createElement("a");return t.href=e,t.pathname}function t(t){var n=e(t).split("."),r=n[n.length-1],i={jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png"};return r&&(r=r.toLowerCase()),i[r]}return{guessMimeType:t}}),a("e",["o","m","p","n"],function(e,t,n,r){function i(t){return new e(function(e){function n(){t.removeEventListener("load",n),e(t)}t.complete?e(t):t.addEventListener("load",n)})}function o(e){return i(e).then(function(e){var n,i;return i=t.create(r.getWidth(e),r.getHeight(e)),n=t.get2dContext(i),n.drawImage(e,0,0),i})}function a(e){return i(e).then(function(e){var t=e.src;return 0===t.indexOf("blob:")?l(t):0===t.indexOf("data:")?c(t):o(e).then(function(e){return c(e.toDataURL(n.guessMimeType(t)))})})}function s(t){return new e(function(e){function n(){r.removeEventListener("load",n),e(r)}var r=new Image;r.addEventListener("load",n),r.src=URL.createObjectURL(t),r.complete&&n()})}function l(t){return new e(function(e){var n=new XMLHttpRequest;n.open("GET",t,!0),n.responseType="blob",n.onload=function(){200==this.status&&e(this.response)},n.send()})}function c(t){return new e(function(e){var n,r,i,o,a,s;if(t=t.split(","),o=/data:([^;]+)/.exec(t[0]),o&&(a=o[1]),n=atob(t[1]),window.WebKitBlobBuilder){for(s=new WebKitBlobBuilder,r=new ArrayBuffer(n.length),i=0;i<r.length;i++)r[i]=n.charCodeAt(i);return s.append(r),void e(s.getBlob(a))}for(r=new Uint8Array(n.length),i=0;i<r.length;i++)r[i]=n.charCodeAt(i);e(new Blob([r],{type:a}))})}function u(e){return 0===e.indexOf("blob:")?l(e):0===e.indexOf("data:")?c(e):null}function d(e,t){return c(e.toDataURL(t))}function f(t){return new e(function(e){var n=new FileReader;n.onloadend=function(){e(n.result)},n.readAsDataURL(t)})}function p(e){return f(e).then(function(e){return e.split(",")[1]})}function m(e){URL.revokeObjectURL(e.src)}return{blobToImage:s,imageToBlob:a,blobToDataUri:f,blobToBase64:p,imageToCanvas:o,canvasToBlob:d,revokeImageUrl:m,uriToBlob:u}}),a("q",[],function(){function e(e,t,n){return e=parseFloat(e),e>n?e=n:e<t&&(e=t),e}function t(){return[1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1]}function n(e,t){var n,r,i,o,a=[],s=new Array(10);for(n=0;n<5;n++){for(r=0;r<5;r++)a[r]=t[r+5*n];for(r=0;r<5;r++){for(o=0,i=0;i<5;i++)o+=e[r+5*i]*a[i];s[r+5*n]=o}}return s}function r(t,n){return n=e(n,0,1),t.map(function(t,r){return r%6===0?t=1-(1-t)*n:t*=n,e(t,0,1)})}function i(t,r){var i;return r=e(r,-1,1),r*=100,r<0?i=127+r/100*127:(i=r%1,i=0===i?d[r]:d[Math.floor(r)]*(1-i)+d[Math.floor(r)+1]*i,i=127*i+127),n(t,[i/127,0,0,0,.5*(127-i),0,i/127,0,0,.5*(127-i),0,0,i/127,0,.5*(127-i),0,0,0,1,0,0,0,0,0,1])}function o(t,r){var i,o,a,s;return r=e(r,-1,1),i=1+(r>0?3*r:r),o=.3086,a=.6094,s=.082,n(t,[o*(1-i)+i,a*(1-i),s*(1-i),0,0,o*(1-i),a*(1-i)+i,s*(1-i),0,0,o*(1-i),a*(1-i),s*(1-i)+i,0,0,0,0,0,1,0,0,0,0,0,1])}function a(t,r){var i,o,a,s,l;return r=e(r,-180,180)/180*Math.PI,i=Math.cos(r),o=Math.sin(r),a=.213,s=.715,l=.072,n(t,[a+i*(1-a)+o*-a,s+i*-s+o*-s,l+i*-l+o*(1-l),0,0,a+i*-a+.143*o,s+i*(1-s)+.14*o,l+i*-l+o*-.283,0,0,a+i*-a+o*-(1-a),s+i*-s+o*s,l+i*(1-l)+o*l,0,0,0,0,0,1,0,0,0,0,0,1])}function s(t,r){return r=e(255*r,-255,255),n(t,[1,0,0,0,r,0,1,0,0,r,0,0,1,0,r,0,0,0,1,0,0,0,0,0,1])}function l(t,r,i,o){return r=e(r,0,2),i=e(i,0,2),o=e(o,0,2),n(t,[r,0,0,0,0,0,i,0,0,0,0,0,o,0,0,0,0,0,1,0,0,0,0,0,1])}function c(t,i){return i=e(i,0,1),n(t,r([.393,.769,.189,0,0,.349,.686,.168,0,0,.272,.534,.131,0,0,0,0,0,1,0,0,0,0,0,1],i))}function u(t,i){return i=e(i,0,1),n(t,r([.33,.34,.33,0,0,.33,.34,.33,0,0,.33,.34,.33,0,0,0,0,0,1,0,0,0,0,0,1],i))}var d=[0,.01,.02,.04,.05,.06,.07,.08,.1,.11,.12,.14,.15,.16,.17,.18,.2,.21,.22,.24,.25,.27,.28,.3,.32,.34,.36,.38,.4,.42,.44,.46,.48,.5,.53,.56,.59,.62,.65,.68,.71,.74,.77,.8,.83,.86,.89,.92,.95,.98,1,1.06,1.12,1.18,1.24,1.3,1.36,1.42,1.48,1.54,1.6,1.66,1.72,1.78,1.84,1.9,1.96,2,2.12,2.25,2.37,2.5,2.62,2.75,2.87,3,3.2,3.4,3.6,3.8,4,4.3,4.7,4.9,5,5.5,6,6.5,6.8,7,7.3,7.5,7.8,8,8.4,8.7,9,9.4,9.6,9.8,10];return{identity:t,adjust:r,multiply:n,adjustContrast:i,adjustBrightness:s,adjustSaturation:o,adjustHue:a,adjustColors:l,adjustSepia:c,adjustGrayscale:u}}),a("c",["m","n","e","q"],function(e,t,n,r){function i(r,i){return n.blobToImage(r).then(function(r){function o(e,t){var n,r,i,o,a,s=e.data,l=t[0],c=t[1],u=t[2],d=t[3],f=t[4],p=t[5],m=t[6],h=t[7],g=t[8],v=t[9],b=t[10],y=t[11],C=t[12],x=t[13],w=t[14],N=t[15],E=t[16],S=t[17],_=t[18],k=t[19];for(a=0;a<s.length;a+=4)n=s[a],r=s[a+1],i=s[a+2],o=s[a+3],s[a]=n*l+r*c+i*u+o*d+f,s[a+1]=n*p+r*m+i*h+o*g+v,s[a+2]=n*b+r*y+i*C+o*x+w,s[a+3]=n*N+r*E+i*S+o*_+k;return e}var a,s=e.create(t.getWidth(r),t.getHeight(r)),l=e.get2dContext(s);return l.drawImage(r,0,0),u(r),a=o(l.getImageData(0,0,s.width,s.height),i),l.putImageData(a,0,0),n.canvasToBlob(s)})}function o(r,i){return n.blobToImage(r).then(function(r){function o(e,t,n){function r(e,t,n){return e>n?e=n:e<t&&(e=t),e}var i,o,a,s,l,c,u,d,f,p,m,h,g,v,b,y,C;for(a=Math.round(Math.sqrt(n.length)),s=Math.floor(a/2),i=e.data,o=t.data,y=e.width,C=e.height,c=0;c<C;c++)for(l=0;l<y;l++){for(u=d=f=0,m=0;m<a;m++)for(p=0;p<a;p++)h=r(l+p-s,0,y-1),g=r(c+m-s,0,C-1),v=4*(g*y+h),b=n[m*a+p],u+=i[v]*b,d+=i[v+1]*b,f+=i[v+2]*b;v=4*(c*y+l),o[v]=r(u,0,255),o[v+1]=r(d,0,255),o[v+2]=r(f,0,255)}return t}var a,s,l=e.create(t.getWidth(r),t.getHeight(r)),c=e.get2dContext(l);return c.drawImage(r,0,0),u(r),a=c.getImageData(0,0,l.width,l.height),s=c.getImageData(0,0,l.width,l.height),s=o(a,s,i),c.putImageData(s,0,0),n.canvasToBlob(l)})}function a(r){return function(i,o){return n.blobToImage(i).then(function(i){function a(e,t){var n,r=e.data;for(n=0;n<r.length;n+=4)r[n]=t[r[n]],r[n+1]=t[r[n+1]],r[n+2]=t[r[n+2]];return e}var s,l,c=e.create(t.getWidth(i),t.getHeight(i)),d=e.get2dContext(c),f=new Array(256);for(l=0;l<f.length;l++)f[l]=r(l,o);return d.drawImage(i,0,0),u(i),s=a(d.getImageData(0,0,c.width,c.height),f),d.putImageData(s,0,0),n.canvasToBlob(c)})}}function s(e){return function(t,n){return i(t,e(r.identity(),n))}}function l(e){return function(t){return i(t,e)}}function c(e){return function(t){return o(t,e)}}var u=n.revokeImageUrl;return{invert:l([-1,0,0,0,255,0,-1,0,0,255,0,0,-1,0,255,0,0,0,1,0]),brightness:s(r.adjustBrightness),hue:s(r.adjustHue),saturate:s(r.adjustSaturation),contrast:s(r.adjustContrast),grayscale:s(r.adjustGrayscale),sepia:s(r.adjustSepia),colorize:function(e,t,n,o){return i(e,r.adjustColors(r.identity(),t,n,o))},sharpen:c([0,-1,0,-1,5,-1,0,-1,0]),emboss:c([-2,-1,0,-1,1,1,0,1,2]),gamma:a(function(e,t){return 255*Math.pow(e/255,1-t)}),exposure:a(function(e,t){return 255*(1-Math.exp(-(e/255)*t))}),colorFilter:i,convoluteFilter:o}}),a("r",["o","e","m","n"],function(e,t,n,r){function i(e,t,n){var a=r.getWidth(e),s=r.getHeight(e),l=t/a,c=n/s,u=!1;(l<.5||l>2)&&(l=l<.5?.5:2,u=!0),(c<.5||c>2)&&(c=c<.5?.5:2,u=!0);var d=o(e,l,c);return u?d.then(function(e){return i(e,t,n)}):d}function o(t,i,o){return new e(function(e){var a=r.getWidth(t),s=r.getHeight(t),l=Math.floor(a*i),c=Math.floor(s*o),u=n.create(l,c),d=n.get2dContext(u);d.drawImage(t,0,0,a,s,0,0,l,c),e(u)})}return{scale:i}}),a("d",["e","m","n","r"],function(e,t,n,r){function i(r,i){return e.blobToImage(r).then(function(o){var a=t.create(n.getWidth(o),n.getHeight(o)),s=t.get2dContext(a),c=0,u=0;return i=i<0?360+i:i,90!=i&&270!=i||t.resize(a,a.height,a.width),90!=i&&180!=i||(c=a.width),270!=i&&180!=i||(u=a.height),s.translate(c,u),s.rotate(i*Math.PI/180),s.drawImage(o,0,0),l(o),e.canvasToBlob(a,r.type)})}function o(r,i){return e.blobToImage(r).then(function(r){var o=t.create(n.getWidth(r),n.getHeight(r)),a=t.get2dContext(o);return"v"==i?(a.scale(1,-1),a.drawImage(r,0,-o.height)):(a.scale(-1,1),a.drawImage(r,-o.width,0)),l(r),e.canvasToBlob(o)})}function a(n,r,i,o,a){return e.blobToImage(n).then(function(n){var s=t.create(o,a),c=t.get2dContext(s);return c.drawImage(n,-r,-i),l(n),e.canvasToBlob(s)})}function s(t,n,i){return e.blobToImage(t).then(function(o){var a;return a=r.scale(o,n,i).then(function(n){return e.canvasToBlob(n,t.type)}).then(c(o))["catch"](c(o))})}var l=e.revokeImageUrl,c=function(e){return function(t){return l(e),t}};return{rotate:i,flip:o,crop:a,resize:s}}),a("7",["c","d"],function(e,t){var n=function(t){return e.invert(t)},r=function(t){return e.sharpen(t)},i=function(t){return e.emboss(t)},o=function(t,n){return e.gamma(t,n)},a=function(t,n){return e.exposure(t,n)},s=function(t,n,r,i){return e.colorize(t,n,r,i)},l=function(t,n){return e.brightness(t,n)},c=function(t,n){return e.hue(t,n)},u=function(t,n){return e.saturate(t,n)},d=function(t,n){return e.contrast(t,n)},f=function(t,n){return e.grayscale(t,n)},p=function(t,n){return e.sepia(t,n)},m=function(e,n){return t.flip(e,n)},h=function(e,n,r,i,o){return t.crop(e,n,r,i,o)},g=function(e,n,r){return t.resize(e,n,r)},v=function(e,n){return t.rotate(e,n)};return{invert:n,sharpen:r,emboss:i,brightness:l,hue:c,saturate:u,contrast:d,grayscale:f,sepia:p,colorize:s,gamma:o,exposure:a,flip:m,crop:h,resize:g,rotate:v}}),a("8",["e"],function(e){var t=function(t){return e.blobToImage(t)},n=function(t){return e.imageToBlob(t)},r=function(t){return e.blobToDataUri(t)},i=function(t){return e.blobToBase64(t)};return{blobToImage:t,imageToBlob:n,blobToDataUri:r,blobToBase64:i}}),s("f",tinymce.dom.DOMUtils),s("g",tinymce.ui.Factory),s("h",tinymce.ui.Form),s("i",tinymce.ui.Container),s("s",tinymce.ui.Control),s("t",tinymce.ui.DragHelper),s("u",tinymce.geom.Rect),s("w",tinymce.dom.DomQuery),s("x",tinymce.util.Observable),s("y",tinymce.util.VK),a("v",["w","t","u","5","x","y"],function(e,t,n,r,i,o){var a=0;return function(s,l,c,u,d){function f(e,t){return{x:t.x+e.x,y:t.y+e.y,w:t.w,h:t.h}}function p(e,t){return{x:t.x-e.x,y:t.y-e.y,w:t.w,h:t.h}}function m(){return p(c,s)}function h(e,t,r,i){var o,a,l,u,d;o=t.x,a=t.y,l=t.w,u=t.h,o+=r*e.deltaX,a+=i*e.deltaY,l+=r*e.deltaW,u+=i*e.deltaH,l<20&&(l=20),u<20&&(u=20),d=s=n.clamp({x:o,y:a,w:l,h:u},c,"move"==e.name),d=p(c,d),E.fire("updateRect",{rect:d}),x(d)}function g(){function n(e){var n;return new t(R,{document:u.ownerDocument,handle:R+"-"+e.name,start:function(){n=s},drag:function(t){h(e,n,t.deltaX,t.deltaY)}})}e('<div id="'+R+'" class="'+T+'croprect-container" role="grid" aria-dropeffect="execute">').appendTo(u),r.each(k,function(t){e("#"+R,u).append('<div id="'+R+"-"+t+'"class="'+T+'croprect-block" style="display: none" data-mce-bogus="all">')}),r.each(S,function(t){e("#"+R,u).append('<div id="'+R+"-"+t.name+'" class="'+T+"croprect-handle "+T+"croprect-handle-"+t.name+'"style="display: none" data-mce-bogus="all" role="gridcell" tabindex="-1" aria-label="'+t.label+'" aria-grabbed="false">')}),_=r.map(S,n),b(s),e(u).on("focusin focusout",function(t){e(t.target).attr("aria-grabbed","focus"===t.type)}),e(u).on("keydown",function(e){function t(e,t,r,i,o){e.stopPropagation(),e.preventDefault(),h(n,r,i,o)}var n;switch(r.each(S,function(t){if(e.target.id==R+"-"+t.name)return n=t,!1}),e.keyCode){case o.LEFT:t(e,n,s,-10,0);break;case o.RIGHT:t(e,n,s,10,0);break;case o.UP:t(e,n,s,0,-10);break;case o.DOWN:t(e,n,s,0,10);break;case o.ENTER:case o.SPACEBAR:e.preventDefault(),d()}})}function v(t){var n;n=r.map(S,function(e){return"#"+R+"-"+e.name}).concat(r.map(k,function(e){return"#"+R+"-"+e})).join(","),t?e(n,u).show():e(n,u).hide()}function b(t){function n(t,n){n.h<0&&(n.h=0),n.w<0&&(n.w=0),e("#"+R+"-"+t,u).css({left:n.x,top:n.y,width:n.w,height:n.h})}r.each(S,function(n){e("#"+R+"-"+n.name,u).css({left:t.w*n.xMul+t.x,top:t.h*n.yMul+t.y})}),n("top",{x:l.x,y:l.y,w:l.w,h:t.y-l.y}),n("right",{x:t.x+t.w,y:t.y,w:l.w-t.x-t.w+l.x,h:t.h}),n("bottom",{x:l.x,y:t.y+t.h,w:l.w,h:l.h-t.y-t.h+l.y}),n("left",{x:l.x,y:t.y,w:t.x-l.x,h:t.h}),n("move",t)}function y(e){s=e,b(s)}function C(e){l=e,b(s)}function x(e){y(f(c,e))}function w(e){c=e,b(s)}function N(){r.each(_,function(e){e.destroy()}),_=[]}var E,S,_,k,T="mce-",R=T+"crid-"+a++;return S=[{name:"move",xMul:0,yMul:0,deltaX:1,deltaY:1,deltaW:0,deltaH:0,label:"Crop Mask"},{name:"nw",xMul:0,yMul:0,deltaX:1,deltaY:1,deltaW:-1,deltaH:-1,label:"Top Left Crop Handle"},{name:"ne",xMul:1,yMul:0,deltaX:0,deltaY:1,deltaW:1,deltaH:-1,label:"Top Right Crop Handle"},{name:"sw",xMul:0,yMul:1,deltaX:1,deltaY:0,deltaW:-1,deltaH:1,label:"Bottom Left Crop Handle"},{name:"se",xMul:1,yMul:1,deltaX:0,deltaY:0,deltaW:1,deltaH:1,label:"Bottom Right Crop Handle"}],k=["top","right","bottom","left"],g(u),E=r.extend({toggleVisibility:v,setClampRect:w,setRect:y,getInnerRect:m,setInnerRect:x,setViewPortRect:C,destroy:N},i)}}),a("j",["s","t","u","5","3","v"],function(e,t,n,r,i,o){function a(e){return new i(function(t){function n(){e.removeEventListener("load",n),t(e)}e.complete?t(e):e.addEventListener("load",n)})}return e.extend({Defaults:{classes:"imagepanel"},selection:function(e){return arguments.length?(this.state.set("rect",e),this):this.state.get("rect")},imageSize:function(){var e=this.state.get("viewRect");return{w:e.w,h:e.h}},toggleCropRect:function(e){this.state.set("cropEnabled",e)},imageSrc:function(e){var t=this,r=new Image;r.src=e,a(r).then(function(){var e,i,o=t.state.get("viewRect");if(i=t.$el.find("img"),i[0])i.replaceWith(r);else{var a=document.createElement("div");a.className="mce-imagepanel-bg",t.getEl().appendChild(a),t.getEl().appendChild(r)}e={x:0,y:0,w:r.naturalWidth,h:r.naturalHeight},t.state.set("viewRect",e),t.state.set("rect",n.inflate(e,-20,-20)),o&&o.w==e.w&&o.h==e.h||t.zoomFit(),t.repaintImage(),t.fire("load")})},zoom:function(e){return arguments.length?(this.state.set("zoom",e),this):this.state.get("zoom")},postRender:function(){return this.imageSrc(this.settings.imageSrc),this._super()},zoomFit:function(){var e,t,n,r,i,o,a,s=this;a=10,e=s.$el.find("img"),t=s.getEl().clientWidth,n=s.getEl().clientHeight,r=e[0].naturalWidth,i=e[0].naturalHeight,o=Math.min((t-a)/r,(n-a)/i),o>=1&&(o=1),s.zoom(o)},repaintImage:function(){var e,t,n,r,i,o,a,s,l,c,u;u=this.getEl(),l=this.zoom(),c=this.state.get("rect"),a=this.$el.find("img"),s=this.$el.find(".mce-imagepanel-bg"),i=u.offsetWidth,o=u.offsetHeight,n=a[0].naturalWidth*l,r=a[0].naturalHeight*l,e=Math.max(0,i/2-n/2),t=Math.max(0,o/2-r/2),a.css({left:e,top:t,width:n,height:r}),s.css({left:e,top:t,width:n,height:r}),this.cropRect&&(this.cropRect.setRect({x:c.x*l+e,y:c.y*l+t,w:c.w*l,h:c.h*l}),this.cropRect.setClampRect({x:e,y:t,w:n,h:r}),this.cropRect.setViewPortRect({x:0,y:0,w:i,h:o}))},bindStates:function(){function e(e){t.cropRect=new o(e,t.state.get("viewRect"),t.state.get("viewRect"),t.getEl(),function(){t.fire("crop")}),t.cropRect.on("updateRect",function(e){var n=e.rect,r=t.zoom();n={x:Math.round(n.x/r),y:Math.round(n.y/r),w:Math.round(n.w/r),h:Math.round(n.h/r)},t.state.set("rect",n)}),t.on("remove",t.cropRect.destroy)}var t=this;t.state.on("change:cropEnabled",function(e){t.cropRect.toggleVisibility(e.value),t.repaintImage()}),t.state.on("change:zoom",function(){t.repaintImage()}),t.state.on("change:rect",function(n){var r=n.value;t.cropRect||e(r),t.cropRect.setRect(r)})}})}),a("k",[],function(){return function(){function e(e){var t;return t=o.splice(++a),o.push(e),{state:e,removed:t}}function t(){if(r())return o[--a]}function n(){if(i())return o[++a]}function r(){return a>0}function i(){return a!=-1&&a<o.length-1}var o=[],a=-1;return{data:o,add:e,undo:t,redo:n,canUndo:r,canRedo:i}}}),a("9",["f","5","3","g","h","i","j","7","8","k"],function(e,t,n,r,i,o,a,s,l,c){function u(e){return{blob:e,url:URL.createObjectURL(e)}}function d(e){e&&URL.revokeObjectURL(e.url)}function f(e){t.each(e,d)}function p(n,l,p){function m(e){var t,n,r,i;t=O.find("#w")[0],n=O.find("#h")[0],r=parseInt(t.value(),10),i=parseInt(n.value(),10),O.find("#constrain")[0].checked()&&ae&&se&&r&&i&&("w"==e.control.settings.name?(i=Math.round(r*le),n.value(i)):(r=Math.round(i*ce),t.value(r))),ae=r,se=i}function h(e){return Math.round(100*e)+"%"}function g(){O.find("#undo").disabled(!ue.canUndo()),O.find("#redo").disabled(!ue.canRedo()),O.statusbar.find("#save").disabled(!ue.canUndo())}function v(){O.find("#undo").disabled(!0),O.find("#redo").disabled(!0)}function b(e){e&&$.imageSrc(e.url)}function y(e){return function(){var n=t.grep(oe,function(t){return t.settings.name!=e});t.each(n,function(e){e.hide()}),e.show(),e.focus()}}function C(e){z=u(e),b(z)}function x(e){n=u(e),b(n),f(ue.add(n).removed),g()}function w(){var e=$.selection();s.crop(n.blob,e.x,e.y,e.w,e.h).then(function(e){x(e),S()})}function N(e){var t=[].slice.call(arguments,1);return function(){var r=z||n;e.apply(this,[r.blob].concat(t)).then(C)}}function E(e){var t=[].slice.call(arguments,1);return function(){e.apply(this,[n.blob].concat(t)).then(x)}}function S(){b(n),d(z),y(H)(),g()}function _(){z&&(x(z.blob),S())}function k(){var e=$.zoom();e<2&&(e+=.1),$.zoom(e)}function T(){var e=$.zoom();e>.1&&(e-=.1),$.zoom(e)}function R(){n=ue.undo(),b(n),g()}function A(){n=ue.redo(),b(n),g()}function B(){l(n.blob),O.close()}function P(e){return new i({layout:"flex",direction:"row",labelGap:5,border:"0 0 1 0",align:"center",pack:"center",padding:"0 10 0 10",spacing:5,flex:0,minHeight:60,defaults:{classes:"imagetool",type:"button"},items:e})}function D(e,t){return P([{text:"Back",onclick:S},{type:"spacer",flex:1},{text:"Apply",subtype:"primary",onclick:_}]).hide().on("show",function(){v(),t(n.blob).then(function(e){var t=u(e);b(t),d(z),z=t})})}function M(e,t,r,i,o){function a(e){t(n.blob,e).then(function(e){var t=u(e);b(t),d(z),z=t})}return P([{text:"Back",onclick:S},{type:"spacer",flex:1},{type:"slider",flex:1,ondragend:function(e){a(e.value)},minValue:i,maxValue:o,value:r,previewFilter:h},{type:"spacer",flex:1},{text:"Apply",subtype:"primary",onclick:_}]).hide().on("show",function(){this.find("slider").value(r),v()})}function L(e,t){function r(){var e,r,i;e=O.find("#r")[0].value(),r=O.find("#g")[0].value(),i=O.find("#b")[0].value(),t(n.blob,e,r,i).then(function(e){var t=u(e);b(t),d(z),z=t})}return P([{text:"Back",onclick:S},{type:"spacer",flex:1},{type:"slider",label:"R",name:"r",minValue:0,value:1,maxValue:2,ondragend:r,previewFilter:h},{type:"slider",label:"G",name:"g",minValue:0,value:1,maxValue:2,ondragend:r,previewFilter:h},{type:"slider",label:"B",name:"b",minValue:0,value:1,maxValue:2,ondragend:r,previewFilter:h},{type:"spacer",flex:1},{text:"Apply",subtype:"primary",onclick:_}]).hide().on("show",function(){O.find("#r,#g,#b").value(1),v()})}function I(e){e.control.value()===!0&&(le=se/ae,ce=ae/se)}var O,H,F,z,W,U,V,$,j,q,Y,X,K,G,J,Q,Z,ee,te,ne,re,ie,oe,ae,se,le,ce,ue=new c;W=P([{text:"Back",onclick:S},{type:"spacer",flex:1},{text:"Apply",subtype:"primary",onclick:w}]).hide().on("show hide",function(e){$.toggleCropRect("show"==e.type)}).on("show",v),U=P([{text:"Back",onclick:S},{type:"spacer",flex:1},{type:"textbox",name:"w",label:"Width",size:4,onkeyup:m},{type:"textbox",name:"h",label:"Height",size:4,onkeyup:m},{type:"checkbox",name:"constrain",text:"Constrain proportions",checked:!0,onchange:I},{type:"spacer",flex:1},{text:"Apply",subtype:"primary",onclick:"submit"}]).hide().on("submit",function(e){var t=parseInt(O.find("#w").value(),10),n=parseInt(O.find("#h").value(),10);e.preventDefault(),E(s.resize,t,n)(),S()}).on("show",v),V=P([{text:"Back",onclick:S},{type:"spacer",flex:1},{icon:"fliph",tooltip:"Flip horizontally",onclick:N(s.flip,"h")},{icon:"flipv",tooltip:"Flip vertically",onclick:N(s.flip,"v")},{icon:"rotateleft",tooltip:"Rotate counterclockwise",onclick:N(s.rotate,-90)},{icon:"rotateright",tooltip:"Rotate clockwise",onclick:N(s.rotate,90)},{type:"spacer",flex:1},{text:"Apply",subtype:"primary",onclick:_}]).hide().on("show",v),Y=D("Invert",s.invert),te=D("Sharpen",s.sharpen),ne=D("Emboss",s.emboss),X=M("Brightness",s.brightness,0,-1,1),K=M("Hue",s.hue,180,0,360),G=M("Saturate",s.saturate,0,-1,1),J=M("Contrast",s.contrast,0,-1,1),Q=M("Grayscale",s.grayscale,0,0,1),Z=M("Sepia",s.sepia,0,0,1),ee=L("Colorize",s.colorize),re=M("Gamma",s.gamma,0,-1,1),ie=M("Exposure",s.exposure,1,0,2),F=P([{text:"Back",onclick:S},{type:"spacer",flex:1},{text:"hue",icon:"hue",onclick:y(K)},{text:"saturate",icon:"saturate",onclick:y(G)},{text:"sepia",icon:"sepia",onclick:y(Z)},{text:"emboss",icon:"emboss",onclick:y(ne)},{text:"exposure",icon:"exposure",onclick:y(ie)},{type:"spacer",flex:1}]).hide(),H=P([{tooltip:"Crop",icon:"crop",onclick:y(W)},{tooltip:"Resize",icon:"resize2",onclick:y(U)},{tooltip:"Orientation",icon:"orientation",onclick:y(V)},{tooltip:"Brightness",icon:"sun",onclick:y(X)},{tooltip:"Sharpen",icon:"sharpen",onclick:y(te)},{tooltip:"Contrast",icon:"contrast",onclick:y(J)},{tooltip:"Color levels",icon:"drop",onclick:y(ee)},{tooltip:"Gamma",icon:"gamma",onclick:y(re)},{tooltip:"Invert",icon:"invert",onclick:y(Y)}]),$=new a({flex:1,imageSrc:n.url}),j=new o({layout:"flex",direction:"column",border:"0 1 0 0",padding:5,spacing:5,items:[{type:"button",icon:"undo",tooltip:"Undo",name:"undo",onclick:R},{type:"button",icon:"redo",tooltip:"Redo",name:"redo",onclick:A},{type:"button",icon:"zoomin",tooltip:"Zoom in",onclick:k},{type:"button",icon:"zoomout",tooltip:"Zoom out",onclick:T}]}),q=new o({type:"container",layout:"flex",direction:"row",align:"stretch",flex:1,items:[j,$]}),oe=[H,W,U,V,F,Y,X,K,G,J,Q,Z,ee,te,ne,re,ie],O=r.create("window",{layout:"flex",direction:"column",align:"stretch",minWidth:Math.min(e.DOM.getViewPort().w,800),minHeight:Math.min(e.DOM.getViewPort().h,650),title:"Edit image",items:oe.concat([q]),buttons:[{text:"Save",name:"save",subtype:"primary",onclick:B},{text:"Cancel",onclick:"close"}]}),O.renderTo(document.body).reflow(),O.on("close",function(){p(),f(ue.data),ue=null,z=null}),ue.add(n),g(),$.on("load",function(){ae=$.imageSize().w,se=$.imageSize().h,le=se/ae,ce=ae/se,O.find("#w").value(ae),O.find("#h").value(se)}),$.on("crop",w)}function m(e){return new n(function(t,n){p(u(e),t,n)})}return{edit:m}}),a("a",[],function(){function e(e){function t(e){return/^[0-9\.]+px$/.test(e)}var n,r;return n=e.style.width,r=e.style.height,n||r?t(n)&&t(r)?{w:parseInt(n,10),h:parseInt(r,10)}:null:(n=e.width,r=e.height,n&&r?{w:parseInt(n,10),h:parseInt(r,10)}:null)}function t(e,t){var n,r;t&&(n=e.style.width,r=e.style.height,(n||r)&&(e.style.width=t.w+"px",e.style.height=t.h+"px",e.removeAttribute("data-mce-style")),n=e.width,r=e.height,(n||r)&&(e.setAttribute("width",t.w),e.setAttribute("height",t.h)))}function n(e){return{w:e.naturalWidth,h:e.naturalHeight}}return{getImageSize:e,setImageSize:t,getNaturalImageSize:n}}),a("l",["3","5"],function(e,t){var n=function(e){return null!==e&&void 0!==e},r=function(e,t){var r;return r=t.reduce(function(e,t){return n(e)?e[t]:void 0},e),n(r)?r:null},i=function(n,r){return new e(function(e){var i;i=new XMLHttpRequest,i.onreadystatechange=function(){4===i.readyState&&e({status:i.status,blob:this.response})},i.open("GET",n,!0),t.each(r,function(e,t){i.setRequestHeader(t,e)}),i.responseType="blob",i.send()})},o=function(t){return new e(function(e){var n=new FileReader;n.onload=function(t){var n=t.target;e(n.result)},n.readAsText(t)})},a=function(e){var t;try{t=JSON.parse(e)}catch(e){}return t};return{traverse:r,readBlob:o,requestUrlAsBlob:i,parseJson:a}}),a("b",["3","5","l"],function(e,t,n){function r(t){return n.requestUrlAsBlob(t,{}).then(function(t){return t.status>=400?o(t.status):e.resolve(t.blob)})}var i=function(e){return 400===e||403===e||500===e},o=function(t){return e.reject("ImageProxy HTTP error: "+t)},a=function(t){e.reject("ImageProxy Service error: "+t)},s=function(e,t){return n.readBlob(t).then(function(e){var t=n.parseJson(e),r=n.traverse(t,["error","type"]);return a(r?r:"Invalid JSON")})},l=function(e,t){return i(e)?s(e,t):o(e)},c=function(t,r){return n.requestUrlAsBlob(t,{"Content-Type":"application/json;charset=UTF-8","tiny-api-key":r}).then(function(t){return t.status>=400?l(t.status,t.blob):e.resolve(t.blob)})},u=function(e,t){return t?c(e,t):r(e)};return{getUrl:u}}),a("0",["1","2","3","4","5","6","7","8","9","a","b"],function(e,t,n,r,i,o,a,s,l,c,u){var d=function(e){function d(t){e.notificationManager.open({text:t,type:"error"})}function f(){return e.selection.getNode()}function p(t){var n=t.match(/\/([^\/\?]+)?\.(?:jpeg|jpg|png|gif)(?:\?|$)/i);return n?e.dom.encode(n[1]):null}function m(){return"imagetools"+D++}function h(t){var n=t.src;return 0===n.indexOf("data:")||0===n.indexOf("blob:")||new r(n).host===e.documentBaseURI.host}function g(t){return i.inArray(e.settings.imagetools_cors_hosts,new r(t.src).host)!==-1}function v(){return e.settings.api_key||e.settings.imagetools_api_key}function b(t){var n,r=t.src;return g(t)?u.getUrl(t.src,null):h(t)?s.imageToBlob(t):(r=e.settings.imagetools_proxy,r+=(r.indexOf("?")===-1?"?":"&")+"url="+encodeURIComponent(t.src),n=v(),u.getUrl(r,n))}function y(){var t;return t=e.editorUpload.blobCache.getByUri(f().src),t?t.blob():b(f())}function C(){B=o.setEditorTimeout(e,function(){e.editorUpload.uploadImagesAuto()},e.settings.images_upload_timeout||3e4)}function x(){clearTimeout(B)}function w(t,n){return s.blobToDataUri(t).then(function(i){var o,a,s,l,c,u;return u=f(),l=e.editorUpload.blobCache,c=l.getByUri(u.src),s=r.parseDataUri(i).data,o=m(),e.settings.images_reuse_filename&&(a=c?c.filename():p(u.src)),c=l.create(o,t,s,a),l.add(c),e.undoManager.transact(function(){function t(){e.$(u).off("load",t),e.nodeChanged(),n?e.editorUpload.uploadImagesAuto():(x(),C())}e.$(u).on("load",t),e.$(u).attr({src:c.blobUri()}).removeAttr("data-mce-src")}),c})}function N(t){return function(){return e._scanForImages().then(y).then(t).then(w,d)}}function E(e){return function(){return N(function(t){var n=c.getImageSize(f());return n&&c.setImageSize(f(),{w:n.h,h:n.w}),a.rotate(t,e)})()}}function S(e){return function(){return N(function(t){return a.flip(t,e)})()}}function _(){var e=f(),t=c.getNaturalImageSize(e),r=function(r){return new n(function(n){s.blobToImage(r).then(function(i){var o=c.getNaturalImageSize(i);t.w==o.w&&t.h==o.h||c.getImageSize(e)&&c.setImageSize(e,o),URL.revokeObjectURL(i.src),n(r)})})},i=function(e){return l.edit(e).then(r).then(function(e){w(e,!0)},function(){})};e&&b(e).then(i,d)}function k(){e.addButton("rotateleft",{title:"Rotate counterclockwise",cmd:"mceImageRotateLeft"}),e.addButton("rotateright",{title:"Rotate clockwise",cmd:"mceImageRotateRight"}),e.addButton("flipv",{title:"Flip vertically",cmd:"mceImageFlipVertical"}),e.addButton("fliph",{title:"Flip horizontally",cmd:"mceImageFlipHorizontal"}),e.addButton("editimage",{title:"Edit image",cmd:"mceEditImage"}),e.addButton("imageoptions",{title:"Image options",icon:"options",cmd:"mceImage"})}function T(){e.on("NodeChange",function(t){P&&P.src!=t.element.src&&(x(),e.editorUpload.uploadImagesAuto(),P=void 0),R(t.element)&&(P=t.element)})}function R(t){var n=e.dom.is(t,"img:not([data-mce-object],[data-mce-placeholder])");return n&&(h(t)||g(t)||e.settings.imagetools_proxy)}function A(){var t=e.settings.imagetools_toolbar;t||(t="rotateleft rotateright | flipv fliph | crop editimage imageoptions"),e.addContextToolbar(R,t)}var B,P,D=0;t.fileApi&&(i.each({mceImageRotateLeft:E(-90),mceImageRotateRight:E(90),mceImageFlipVertical:S("v"),mceImageFlipHorizontal:S("h"),mceEditImage:_},function(t,n){e.addCommand(n,t)}),k(),A(),T())};return e.add("imagetools",d),function(){}}),r("0")()}();

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/importcss/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("importcss",function(e){function t(e){var t=tinymce.Env.cacheSuffix;return"string"==typeof e&&(e=e.replace("?"+t,"").replace("&"+t,"")),e}function n(t){var n=e.settings,r=n.skin!==!1&&(n.skin||"lightgray");if(r){var i=n.skin_url;return i=i?e.documentBaseURI.toAbsolute(i):tinymce.baseURL+"/skins/"+r,t===i+"/content"+(e.inline?".inline":"")+".min.css"}return!1}function r(e){return"string"==typeof e?function(t){return t.indexOf(e)!==-1}:e instanceof RegExp?function(t){return e.test(t)}:e}function i(r,i){function o(e,r){var s,l=e.href;if(l=t(l),l&&i(l,r)&&!n(l)){p(e.imports,function(e){o(e,!0)});try{s=e.cssRules||e.rules}catch(e){}p(s,function(e){e.styleSheet?o(e.styleSheet,!0):e.selectorText&&p(e.selectorText.split(","),function(e){a.push(tinymce.trim(e))})})}}var a=[],s={};p(e.contentCSS,function(e){s[e]=!0}),i||(i=function(e,t){return t||s[e]});try{p(r.styleSheets,function(e){o(e)})}finally{}return a}function o(t){var n,r=/^(?:([a-z0-9\-_]+))?(\.[a-z0-9_\-\.]+)$/i.exec(t);if(r){var i=r[1],o=r[2].substr(1).split(".").join(" "),a=tinymce.makeMap("a,img");return r[1]?(n={title:t},e.schema.getTextBlockElements()[i]?n.block=i:e.schema.getBlockElements()[i]||a[i.toLowerCase()]?n.selector=i:n.inline=i):r[2]&&(n={inline:"span",title:t.substr(1),classes:o}),e.settings.importcss_merge_classes!==!1?n.classes=o:n.attributes={"class":o},n}}function a(e,t){return tinymce.util.Tools.grep(e,function(e){return!e.filter||e.filter(t)})}function s(e){return tinymce.util.Tools.map(e,function(e){return tinymce.util.Tools.extend({},e,{original:e,selectors:{},filter:r(e.filter),item:{text:e.title,menu:[]}})})}function l(e,t){return null===t||e.settings.importcss_exclusive!==!1}function c(t,n,r){return!(l(e,n)?t in r:t in n.selectors)}function u(t,n,r){l(e,n)?r[t]=!0:n.selectors[t]=!0}function d(t,n,r){var i,a=e.settings;return i=r&&r.selector_converter?r.selector_converter:a.importcss_selector_converter?a.importcss_selector_converter:o,i.call(t,n,r)}var f=this,p=tinymce.each;e.on("renderFormatsMenu",function(t){var n=e.settings,o={},l=r(n.importcss_selector_filter),m=t.control,h=s(n.importcss_groups),g=function(t,n){if(c(t,n,o)){u(t,n,o);var r=d(f,t,n);if(r){var i=r.name||tinymce.DOM.uniqueId();return e.formatter.register(i,r),tinymce.extend({},m.settings.itemDefaults,{text:r.title,format:i})}}return null};e.settings.importcss_append||m.items().remove(),p(i(t.doc||e.getDoc(),r(n.importcss_file_filter)),function(e){if(e.indexOf(".mce-")===-1&&(!l||l(e))){var t=a(h,e);if(t.length>0)tinymce.util.Tools.each(t,function(t){var n=g(e,t);n&&t.item.menu.push(n)});else{var n=g(e,null);n&&m.add(n)}}}),p(h,function(e){e.item.menu.length>0&&m.add(e.item)}),t.control.renderNew()}),f.convertSelectorToFormat=o});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/insertdatetime/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("insertdatetime",function(e){function t(t,n){function r(e,t){if(e=""+e,e.length<t)for(var n=0;n<t-e.length;n++)e="0"+e;return e}return n=n||new Date,t=t.replace("%D","%m/%d/%Y"),t=t.replace("%r","%I:%M:%S %p"),t=t.replace("%Y",""+n.getFullYear()),t=t.replace("%y",""+n.getYear()),t=t.replace("%m",r(n.getMonth()+1,2)),t=t.replace("%d",r(n.getDate(),2)),t=t.replace("%H",""+r(n.getHours(),2)),t=t.replace("%M",""+r(n.getMinutes(),2)),t=t.replace("%S",""+r(n.getSeconds(),2)),t=t.replace("%I",""+((n.getHours()+11)%12+1)),t=t.replace("%p",""+(n.getHours()<12?"AM":"PM")),t=t.replace("%B",""+e.translate(l[n.getMonth()])),t=t.replace("%b",""+e.translate(s[n.getMonth()])),t=t.replace("%A",""+e.translate(a[n.getDay()])),t=t.replace("%a",""+e.translate(o[n.getDay()])),t=t.replace("%%","%")}function n(n){var r=t(n);if(e.settings.insertdatetime_element){var i;i=t(/%[HMSIp]/.test(n)?"%Y-%m-%dT%H:%M":"%Y-%m-%d"),r='<time datetime="'+i+'">'+r+"</time>";var o=e.dom.getParent(e.selection.getStart(),"time");if(o)return void e.dom.setOuterHTML(o,r)}e.insertContent(r)}var r,i,o="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),a="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),s="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),l="January February March April May June July August September October November December".split(" "),c=[];e.addCommand("mceInsertDate",function(){n(e.getParam("insertdatetime_dateformat",e.translate("%Y-%m-%d")))}),e.addCommand("mceInsertTime",function(){n(e.getParam("insertdatetime_timeformat",e.translate("%H:%M:%S")))}),e.addButton("insertdatetime",{type:"splitbutton",title:"Insert date/time",onclick:function(){n(r||i)},menu:c}),tinymce.each(e.settings.insertdatetime_formats||["%H:%M:%S","%Y-%m-%d","%I:%M:%S %p","%D"],function(e){i||(i=e),c.push({text:t(e),onclick:function(){r=e,n(e)}})}),e.addMenuItem("insertdatetime",{icon:"date",text:"Date/time",menu:c,context:"insert"})});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/legacyoutput/plugin.min.js
@@ -1,1 +1,1 @@
-
+!function(e){e.PluginManager.add("legacyoutput",function(t,n,r){t.settings.inline_styles=!1,t.on("init",function(){var n="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img",r=e.explode(t.settings.font_size_style_values),i=t.schema;t.formatter.register({alignleft:{selector:n,attributes:{align:"left"}},aligncenter:{selector:n,attributes:{align:"center"}},alignright:{selector:n,attributes:{align:"right"}},alignjustify:{selector:n,attributes:{align:"justify"}},bold:[{inline:"b",remove:"all"},{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}}],italic:[{inline:"i",remove:"all"},{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}}],underline:[{inline:"u",remove:"all"},{inline:"span",styles:{textDecoration:"underline"},exact:!0}],strikethrough:[{inline:"strike",remove:"all"},{inline:"span",styles:{textDecoration:"line-through"},exact:!0}],fontname:{inline:"font",attributes:{face:"%value"}},fontsize:{inline:"font",attributes:{size:function(t){return e.inArray(r,t.value)+1}}},forecolor:{inline:"font",attributes:{color:"%value"}},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"}}}),e.each("b,i,u,strike".split(","),function(e){i.addValidElements(e+"[*]")}),i.getElementRule("font")||i.addValidElements("font[face|size|color|style]"),e.each(n.split(","),function(e){var t=i.getElementRule(e);t&&(t.attributes.align||(t.attributes.align={},t.attributesOrder.push("align")))})}),t.addButton("fontsizeselect",function(){var e=[],n="8pt=1 10pt=2 12pt=3 14pt=4 18pt=5 24pt=6 36pt=7",r=t.settings.fontsize_formats||n;return t.$.each(r.split(" "),function(t,n){var r=n,i=n,o=n.split("=");o.length>1&&(r=o[0],i=o[1]),e.push({text:r,value:i})}),{type:"listbox",text:"Font Sizes",tooltip:"Font Sizes",values:e,fixedWidth:!0,onPostRender:function(){var e=this;t.on("NodeChange",function(){var n;n=t.dom.getParent(t.selection.getNode(),"font"),n?e.value(n.size):e.value("")})},onclick:function(e){e.control.settings.value&&t.execCommand("FontSize",!1,e.control.settings.value)}}}),t.addButton("fontselect",function(){function e(e){e=e.replace(/;$/,"").split(";");for(var t=e.length;t--;)e[t]=e[t].split("=");return e}var n="Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats",i=[],o=e(t.settings.font_formats||n);return r.each(o,function(e,t){i.push({text:{raw:t[0]},value:t[1],textStyle:t[1].indexOf("dings")==-1?"font-family:"+t[1]:""})}),{type:"listbox",text:"Font Family",tooltip:"Font Family",values:i,fixedWidth:!0,onPostRender:function(){var e=this;t.on("NodeChange",function(){var n;n=t.dom.getParent(t.selection.getNode(),"font"),n?e.value(n.face):e.value("")})},onselect:function(e){e.control.settings.value&&t.execCommand("FontName",!1,e.control.settings.value)}}})})}(tinymce);

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/link/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("link",function(e){function t(e){return e&&"A"===e.nodeName&&e.href}function n(e){return tinymce.util.Tools.grep(e,t).length>0}function r(t){return e.dom.getParent(t,"a[href]")}function i(){return r(e.selection.getStart())}function o(e){var t=e.getAttribute("data-mce-href");return t?t:e.getAttribute("href")}function a(){var t=e.plugins.contextmenu;return!!t&&t.isContextMenuVisible()}function s(n){var r,i,o;return!!(e.settings.link_context_toolbar&&!a()&&t(n)&&(r=e.selection,i=r.getRng(),o=i.startContainer,3==o.nodeType&&r.isCollapsed()&&i.startOffset>0&&i.startOffset<o.data.length))}function l(e,t){document.body.appendChild(e),e.dispatchEvent(t),document.body.removeChild(e)}function c(e){if(!tinymce.Env.ie||tinymce.Env.ie>10){var t=document.createElement("a");t.target="_blank",t.href=e,t.rel="noreferrer noopener";var n=document.createEvent("MouseEvents");n.initMouseEvent("click",!0,!0,window,0,0,0,0,0,!1,!1,!1,!1,0,null),l(t,n)}else{var r=window.open("","_blank");if(r){r.opener=null;var i=r.document;i.open(),i.write('<meta http-equiv="refresh" content="0; url='+tinymce.DOM.encode(e)+'">'),i.close()}}}function u(t){if(t){var n=o(t);if(/^#/.test(n)){var r=e.$(n);r.length&&e.selection.scrollIntoView(r[0],!0)}else c(t.href)}}function d(){u(i())}function f(){var t=this,r=function(e){n(e.parents)?t.show():t.hide()};n(e.dom.getParents(e.selection.getStart()))||t.hide(),e.on("nodechange",r),t.on("remove",function(){e.off("nodechange",r)})}function p(t){return function(){var n=e.settings.link_list;"string"==typeof n?tinymce.util.XHR.send({url:n,success:function(e){t(tinymce.util.JSON.parse(e))}}):"function"==typeof n?n(t):t(n)}}function m(e,t,n){function r(e,n){return n=n||[],tinymce.each(e,function(e){var i={text:e.text||e.title};e.menu?i.menu=r(e.menu):(i.value=e.value,t&&t(i)),n.push(i)}),n}return r(e,n||[])}function h(t){function n(e){var t=d.find("#text");(!t.value()||e.lastControl&&t.value()==e.lastControl.text())&&t.value(e.control.text()),d.find("#href").value(e.control.value())}function r(t){var r=[];if(tinymce.each(e.dom.select("a:not([href])"),function(e){var n=e.name||e.id;n&&r.push({text:n,value:"#"+n,selected:t.indexOf("#"+n)!=-1})}),r.length)return r.unshift({text:"None",value:""}),{name:"anchor",type:"listbox",label:"Anchors",values:r,onselect:n}}function i(){!u&&0===w.text.length&&f&&this.parent().parent().find("#text")[0].value(this.value())}function o(t){var n=t.meta||{};h&&h.value(e.convertURL(this.value(),"href")),tinymce.each(t.meta,function(e,t){var n=d.find("#"+t);"text"===t?0===u.length&&(n.value(e),w.text=e):n.value(e)}),n.attach&&(g={href:this.value(),attach:n.attach}),n.text||i.call(this)}function a(e){var t=N.getContent();if(/</.test(t)&&(!/^<a [^>]+>[^<]+<\/a>$/.test(t)||t.indexOf("href=")==-1))return!1;if(e){var n,r=e.childNodes;if(0===r.length)return!1;for(n=r.length-1;n>=0;n--)if(3!=r[n].nodeType)return!1}return!0}function s(e){e.meta=d.toJSON()}var l,c,u,d,f,p,h,v,b,y,C,x,w={},N=e.selection,E=e.dom;l=N.getNode(),c=E.getParent(l,"a[href]"),f=a(),w.text=u=c?c.innerText||c.textContent:N.getContent({format:"text"}),w.href=c?E.getAttrib(c,"href"):"",c?w.target=E.getAttrib(c,"target"):e.settings.default_link_target&&(w.target=e.settings.default_link_target),(x=E.getAttrib(c,"rel"))&&(w.rel=x),(x=E.getAttrib(c,"class"))&&(w["class"]=x),(x=E.getAttrib(c,"title"))&&(w.title=x),f&&(p={name:"text",type:"textbox",size:40,label:"Text to display",onchange:function(){w.text=this.value()}}),t&&(h={type:"listbox",label:"Link list",values:m(t,function(t){t.value=e.convertURL(t.value||t.url,"href")},[{text:"None",value:""}]),onselect:n,value:e.convertURL(w.href,"href"),onPostRender:function(){h=this}}),e.settings.target_list!==!1&&(e.settings.target_list||(e.settings.target_list=[{text:"None",value:""},{text:"New window",value:"_blank"}]),b={name:"target",type:"listbox",label:"Target",values:m(e.settings.target_list)}),e.settings.rel_list&&(v={name:"rel",type:"listbox",label:"Rel",values:m(e.settings.rel_list)}),e.settings.link_class_list&&(y={name:"class",type:"listbox",label:"Class",values:m(e.settings.link_class_list,function(t){t.value&&(t.textStyle=function(){return e.formatter.getCssText({inline:"a",classes:[t.value]})})})}),e.settings.link_title!==!1&&(C={name:"title",type:"textbox",label:"Title",value:w.title}),d=e.windowManager.open({title:"Insert link",data:w,body:[{name:"href",type:"filepicker",filetype:"file",size:40,autofocus:!0,label:"Url",onchange:o,onkeyup:i,onbeforecall:s},p,C,r(w.href),h,v,b,y],onSubmit:function(t){function n(t,n){var r=e.selection.getRng();tinymce.util.Delay.setEditorTimeout(e,function(){e.windowManager.confirm(t,function(t){e.selection.setRng(r),n(t)})})}function r(e,t){function n(e){return e=r(e),e?[e,i].join(" "):i}function r(e){var t=new RegExp("("+i.replace(" ","|")+")","g");return e&&(e=tinymce.trim(e.replace(t,""))),e?e:null}var i="noopener noreferrer";return t?n(e):r(e)}function i(){var t={href:a,target:w.target?w.target:null,rel:w.rel?w.rel:null,"class":w["class"]?w["class"]:null,title:w.title?w.title:null};e.settings.allow_unsafe_link_target||(t.rel=r(t.rel,"_blank"==t.target)),a===g.href&&(g.attach(),g={}),c?(e.focus(),f&&w.text!=u&&("innerText"in c?c.innerText=w.text:c.textContent=w.text),E.setAttribs(c,t),N.select(c),e.undoManager.add()):f?e.insertContent(E.createHTML("a",t,E.encode(w.text))):e.execCommand("mceInsertLink",!1,t)}function o(){e.undoManager.transact(i)}var a;return w=tinymce.extend(w,t.data),(a=w.href)?a.indexOf("@")>0&&a.indexOf("//")==-1&&a.indexOf("mailto:")==-1?void n("The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",function(e){e&&(a="mailto:"+a),o()}):e.settings.link_assume_external_targets&&!/^\w+:/i.test(a)||!e.settings.link_assume_external_targets&&/^\s*www[\.|\d\.]/i.test(a)?void n("The URL you entered seems to be an external link. Do you want to add the required http:// prefix?",function(e){e&&(a="http://"+a),o()}):void o():void e.execCommand("unlink")}})}var g={},v=function(e){return e.altKey===!0&&e.shiftKey===!1&&e.ctrlKey===!1&&e.metaKey===!1};e.addButton("link",{icon:"link",tooltip:"Insert/edit link",shortcut:"Meta+K",onclick:p(h),stateSelector:"a[href]"}),e.addButton("unlink",{icon:"unlink",tooltip:"Remove link",cmd:"unlink",stateSelector:"a[href]"}),e.addContextToolbar&&(e.addButton("openlink",{icon:"newtab",tooltip:"Open link",onclick:d}),e.addContextToolbar(s,"openlink | link unlink")),e.addShortcut("Meta+K","",p(h)),e.addCommand("mceLink",p(h)),e.on("click",function(e){var t=r(e.target);t&&tinymce.util.VK.metaKeyPressed(e)&&(e.preventDefault(),u(t))}),e.on("keydown",function(e){var t=i();t&&13===e.keyCode&&v(e)&&(e.preventDefault(),u(t))}),this.showDialog=h,e.addMenuItem("openlink",{text:"Open link",icon:"newtab",onclick:d,onPostRender:f,prependToContext:!0}),e.addMenuItem("link",{icon:"link",text:"Link",shortcut:"Meta+K",onclick:p(h),stateSelector:"a[href]",context:"insert",prependToContext:!0})});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/lists/plugin.min.js
@@ -1,1 +1,1 @@
-
+!function(){var e={},t=function(t){for(var n=e[t],i=n.deps,o=n.defn,a=i.length,s=new Array(a),l=0;l<a;++l)s[l]=r(i[l]);var c=o.apply(null,s);if(void 0===c)throw"module ["+t+"] returned undefined";n.instance=c},n=function(t,n,r){if("string"!=typeof t)throw"module id must be a string";if(void 0===n)throw"no dependencies for "+t;if(void 0===r)throw"no definition function for "+t;e[t]={deps:n,defn:r,instance:void 0}},r=function(n){var r=e[n];if(void 0===r)throw"module ["+n+"] was undefined";return void 0===r.instance&&t(n),r.instance},i=function(e,t){for(var n=e.length,i=new Array(n),o=0;o<n;++o)i.push(r(e[o]));t.apply(null,t)},o={};o.bolt={module:{api:{define:n,require:i,demand:r}}};var a=n,s=function(e,t){a(e,[],function(){return t})};s("1",tinymce.PluginManager),s("2",tinymce.util.Tools),s("3",tinymce.util.VK),a("4",[],function(){var e=function(e){return e&&3===e.nodeType},t=function(e){return e&&/^(OL|UL|DL)$/.test(e.nodeName)},n=function(e){return e&&/^(LI|DT|DD)$/.test(e.nodeName)},r=function(e){return e&&"BR"===e.nodeName},i=function(e){return e.parentNode.firstChild===e},o=function(e){return e.parentNode.lastChild===e},a=function(e,t){return t&&!!e.schema.getTextBlockElements()[t.nodeName]},s=function(e,t){return!!r(t)&&!(!e.isBlock(t.nextSibling)||r(t.previousSibling))},l=function(e,t,n){var r=e.isEmpty(t);return!(n&&e.select("span[data-mce-type=bookmark]",t).length>0)&&r},c=function(e,t){return e.isChildOf(t,e.getRoot())};return{isTextNode:e,isListNode:t,isListItemNode:n,isBr:r,isFirstChild:i,isLastChild:o,isTextBlock:a,isBogusBr:s,isEmpty:l,isChildOfBody:c}}),s("9",tinymce.dom.TreeWalker),s("a",tinymce.dom.RangeUtils),a("b",["2","4"],function(e,t){var n=function(n){return e.grep(n.selection.getSelectedBlocks(),function(e){return t.isListItemNode(e)})};return{getSelectedListItems:n}}),s("h",tinymce.dom.DOMUtils.DOM),a("d",["a","4"],function(e,t){var n=function(n,r){var i=e.getNode(n,r);if(t.isListItemNode(n)&&t.isTextNode(i)){var o=r>=n.childNodes.length?i.data.length:0;return{container:i,offset:o}}return{container:n,offset:r}},r=function(e){var t=e.cloneRange(),r=n(e.startContainer,e.startOffset);t.setStart(r.container,r.offset);var i=n(e.endContainer,e.endOffset);return t.setEnd(i.container,i.offset),t};return{getNormalizedEndPoint:n,normalizeRange:r}}),a("c",["h","4","d"],function(e,t,n){var r=function(t){var n={},r=function(r){var i,o,a;o=t[r?"startContainer":"endContainer"],a=t[r?"startOffset":"endOffset"],1===o.nodeType&&(i=e.create("span",{"data-mce-type":"bookmark"}),o.hasChildNodes()?(a=Math.min(a,o.childNodes.length-1),r?o.insertBefore(i,o.childNodes[a]):e.insertAfter(i,o.childNodes[a])):o.appendChild(i),o=i,a=0),n[r?"startContainer":"endContainer"]=o,n[r?"startOffset":"endOffset"]=a};return r(!0),t.collapsed||r(),n},i=function(t){function r(n){var r,i,o,a=function(e){for(var t=e.parentNode.firstChild,n=0;t;){if(t===e)return n;1===t.nodeType&&"bookmark"===t.getAttribute("data-mce-type")||n++,t=t.nextSibling}return-1};r=o=t[n?"startContainer":"endContainer"],i=t[n?"startOffset":"endOffset"],r&&(1===r.nodeType&&(i=a(r),r=r.parentNode,e.remove(o)),t[n?"startContainer":"endContainer"]=r,t[n?"startOffset":"endOffset"]=i)}r(!0),r();var i=e.createRng();return i.setStart(t.startContainer,t.startOffset),t.endContainer&&i.setEnd(t.endContainer,t.endOffset),n.normalizeRange(i)};return{createBookmark:r,resolveBookmark:i}}),a("e",["h","2","4"],function(e,t,n){var r=function(t,r){var i,o=r.parentNode;"LI"===o.nodeName&&o.firstChild===r&&(i=o.previousSibling,i&&"LI"===i.nodeName?(i.appendChild(r),n.isEmpty(t,o)&&e.remove(o)):e.setStyle(o,"listStyleType","none")),n.isListNode(o)&&(i=o.previousSibling,i&&"LI"===i.nodeName&&i.appendChild(r))},i=function(e,n){t.each(t.grep(e.select("ol,ul",n)),function(t){r(e,t)})};return{normalizeList:r,normalizeLists:i}}),s("f",tinymce.dom.BookmarkManager),s("j",tinymce.Env),a("i",["h","j"],function(e,t){var n=function(n,r,i){var o,a,s,l=e.createFragment(),c=n.schema.getBlockElements();if(n.settings.forced_root_block&&(i=i||n.settings.forced_root_block),i&&(a=e.create(i),a.tagName===n.settings.forced_root_block&&e.setAttribs(a,n.settings.forced_root_block_attrs),l.appendChild(a)),r)for(;o=r.firstChild;){var u=o.nodeName;s||"SPAN"===u&&"bookmark"===o.getAttribute("data-mce-type")||(s=!0),c[u]?(l.appendChild(o),a=null):i?(a||(a=e.create(i),l.appendChild(a)),a.appendChild(o)):l.appendChild(o)}return n.settings.forced_root_block?s||t.ie&&!(t.ie>10)||a.appendChild(e.create("br",{"data-mce-bogus":"1"})):l.appendChild(e.create("br")),l};return{createNewTextBlock:n}}),a("g",["h","2","i","4"],function(e,t,n,r){var i=function(i,o,a,s){var l,c,u,d,f=function(n){t.each(u,function(e){n.parentNode.insertBefore(e,a.parentNode)}),e.remove(n)};for(u=e.select('span[data-mce-type="bookmark"]',o),s=s||n.createNewTextBlock(i,a),l=e.createRng(),l.setStartAfter(a),l.setEndAfter(o),c=l.extractContents(),d=c.firstChild;d;d=d.firstChild)if("LI"===d.nodeName&&i.dom.isEmpty(d)){e.remove(d);break}i.dom.isEmpty(c)||e.insertAfter(c,o),e.insertAfter(s,o),r.isEmpty(i.dom,a.parentNode)&&f(a.parentNode),e.remove(a),r.isEmpty(i.dom,o)&&e.remove(o)};return{splitList:i}}),a("7",["h","4","c","b","g","e","i"],function(e,t,n,r,i,o,a){var s=function(n,r){t.isEmpty(n,r)&&e.remove(r)},l=function(n,r){var l,c=r.parentNode,u=c.parentNode;return c===n.getBody()||("DD"===r.nodeName?(e.rename(r,"DT"),!0):t.isFirstChild(r)&&t.isLastChild(r)?("LI"===u.nodeName?(e.insertAfter(r,u),s(n.dom,u),e.remove(c)):t.isListNode(u)?e.remove(c,!0):(u.insertBefore(a.createNewTextBlock(n,r),c),e.remove(c)),!0):t.isFirstChild(r)?("LI"===u.nodeName?(e.insertAfter(r,u),r.appendChild(c),s(n.dom,u)):t.isListNode(u)?u.insertBefore(r,c):(u.insertBefore(a.createNewTextBlock(n,r),c),e.remove(r)),!0):t.isLastChild(r)?("LI"===u.nodeName?e.insertAfter(r,u):t.isListNode(u)?e.insertAfter(r,c):(e.insertAfter(a.createNewTextBlock(n,r),c),e.remove(r)),!0):("LI"===u.nodeName?(c=u,l=a.createNewTextBlock(n,r,"LI")):l=t.isListNode(u)?a.createNewTextBlock(n,r,"LI"):a.createNewTextBlock(n,r),i.splitList(n,c,r,l),o.normalizeLists(n.dom,c.parentNode),!0))},c=function(e){var t=r.getSelectedListItems(e);if(t.length){var i,o,a=n.createBookmark(e.selection.getRng(!0)),s=e.getBody();for(i=t.length;i--;)for(var c=t[i].parentNode;c&&c!==s;){for(o=t.length;o--;)if(t[o]===c){t.splice(i,1);break}c=c.parentNode}for(i=0;i<t.length&&(l(e,t[i])||0!==i);i++);return e.selection.setRng(n.resolveBookmark(a)),e.nodeChanged(),!0}};return{outdent:l,outdentSelection:c}}),a("8",["2","f","b","4","c","g","e","7"],function(e,t,n,r,i,o,a,s){var l=function(e,t,n){var r=n["list-style-type"]?n["list-style-type"]:null;e.setStyle(t,"list-style-type",r)},c=function(t,n){e.each(n,function(e,n){t.setAttribute(n,e)})},u=function(t,n,r){c(n,r["list-attributes"]),e.each(t.select("li",n),function(e){c(e,r["list-item-attributes"])})},d=function(e,t,n){l(e,t,n),u(e,t,n)},f=function(e,t,n){var i,o,a=e.getBody();for(i=t[n?"startContainer":"endContainer"],o=t[n?"startOffset":"endOffset"],1===i.nodeType&&(i=i.childNodes[Math.min(o,i.childNodes.length-1)]||i);i.parentNode!==a;){if(r.isTextBlock(e,i))return i;if(/^(TD|TH)$/.test(i.parentNode.nodeName))return i;i=i.parentNode}return i},p=function(n,i){for(var o,a=[],s=n.getBody(),l=n.dom,c=f(n,i,!0),u=f(n,i,!1),d=[],p=c;p&&(d.push(p),p!==u);p=p.nextSibling);return e.each(d,function(e){if(r.isTextBlock(n,e))return a.push(e),void(o=null);if(l.isBlock(e)||r.isBr(e))return r.isBr(e)&&l.remove(e),void(o=null);var i=e.nextSibling;return t.isBookmarkNode(e)&&(r.isTextBlock(n,i)||!i&&e.parentNode===s)?void(o=null):(o||(o=l.create("p"),e.parentNode.insertBefore(o,e),a.push(o)),void o.appendChild(e))}),a},m=function(t,n,o){var a,s=t.selection.getRng(!0),l="LI",c=t.dom;o=o?o:{},"false"!==c.getContentEditable(t.selection.getNode())&&(n=n.toUpperCase(),"DL"===n&&(l="DT"),a=i.createBookmark(s),e.each(p(t,s),function(e){var i,a,s=function(e){var t=c.getStyle(e,"list-style-type"),n=o?o["list-style-type"]:"";return n=null===n?"":n,t===n};a=e.previousSibling,a&&r.isListNode(a)&&a.nodeName===n&&s(a)?(i=a,e=c.rename(e,l),a.appendChild(e)):(i=c.create(n),e.parentNode.insertBefore(i,e),i.appendChild(e),e=c.rename(e,l)),d(c,i,o),C(t.dom,i)}),t.selection.setRng(i.resolveBookmark(a)))},h=function(t){var l=i.createBookmark(t.selection.getRng(!0)),c=t.getBody(),u=n.getSelectedListItems(t),d=e.grep(u,function(e){return t.dom.isEmpty(e)});u=e.grep(u,function(e){return!t.dom.isEmpty(e)}),e.each(d,function(e){if(r.isEmpty(t.dom,e))return void s.outdent(t,e)}),e.each(u,function(e){var n,i;if(e.parentNode!==t.getBody()){for(n=e;n&&n!==c;n=n.parentNode)r.isListNode(n)&&(i=n);o.splitList(t,i,e),a.normalizeLists(t.dom,i.parentNode)}}),t.selection.setRng(i.resolveBookmark(l))},g=function(e,t){return e&&t&&r.isListNode(e)&&e.nodeName===t.nodeName},v=function(e,t,n){var r=e.getStyle(t,"list-style-type",!0),i=e.getStyle(n,"list-style-type",!0);return r===i},b=function(e,t){return e.className===t.className},y=function(e,t,n){return g(t,n)&&v(e,t,n)&&b(t,n)},C=function(e,t){var n,r;if(n=t.nextSibling,y(e,t,n)){for(;r=n.firstChild;)t.appendChild(r);e.remove(n)}if(n=t.previousSibling,y(e,t,n)){for(;r=n.lastChild;)t.insertBefore(r,t.firstChild);e.remove(n)}},x=function(e,t,n){var r=e.dom.getParent(e.selection.getStart(),"OL,UL,DL");if(n=n?n:{},r!==e.getBody())if(r)if(r.nodeName===t)h(e,t);else{var o=i.createBookmark(e.selection.getRng(!0));d(e.dom,r,n),C(e.dom,e.dom.rename(r,t)),e.selection.setRng(i.resolveBookmark(o))}else m(e,t,n)};return{toggleList:x,removeList:h,mergeWithAdjacentLists:C}}),a("5",["9","a","3","b","4","c","d","e","8"],function(e,t,n,r,i,o,a,s,l){var c=function(n,r,o){var a,s,l=r.startContainer,c=r.startOffset;if(3===l.nodeType&&(o?c<l.data.length:c>0))return l;for(a=n.schema.getNonEmptyElements(),1===l.nodeType&&(l=t.getNode(l,c)),s=new e(l,n.getBody()),o&&i.isBogusBr(n.dom,l)&&s.next();l=s[o?"next":"prev2"]();){if("LI"===l.nodeName&&!l.hasChildNodes())return l;if(a[l.nodeName])return l;if(3===l.nodeType&&l.data.length>0)return l}},u=function(e,t,n){var r,o,a=t.parentNode;if(i.isChildOfBody(e,t)&&i.isChildOfBody(e,n)){if(i.isListNode(n.lastChild)&&(o=n.lastChild),a===n.lastChild&&i.isBr(a.previousSibling)&&e.remove(a.previousSibling),r=n.lastChild,r&&i.isBr(r)&&t.hasChildNodes()&&e.remove(r),i.isEmpty(e,n,!0)&&e.$(n).empty(),!i.isEmpty(e,t,!0))for(;r=t.firstChild;)n.appendChild(r);o&&n.appendChild(o),e.remove(t),i.isEmpty(e,a)&&a!==e.getRoot()&&e.remove(a)}},d=function(e,t){var n,r,s,d=e.dom,f=e.selection,p=d.getParent(f.getStart(),"LI");if(p){if(n=p.parentNode,n===e.getBody()&&i.isEmpty(d,n))return!0;if(r=a.normalizeRange(f.getRng(!0)),s=d.getParent(c(e,r,t),"LI"),s&&s!==p){var m=o.createBookmark(r);return t?u(d,s,p):u(d,p,s),e.selection.setRng(o.resolveBookmark(m)),!0}if(!s&&!t&&l.removeList(e,n.nodeName))return!0}return!1},f=function(e,t){var n=e.dom,r=n.getParent(e.selection.getStart(),n.isBlock);if(r&&n.isEmpty(r)){var i=a.normalizeRange(e.selection.getRng(!0)),o=n.getParent(c(e,i,t),"LI");if(o)return e.undoManager.transact(function(){n.remove(r),l.mergeWithAdjacentLists(n,o.parentNode),e.selection.select(o,!0),e.selection.collapse(t)}),!0}return!1},p=function(e,t){return d(e,t)||f(e,t)},m=function(e){var t=e.dom.getParent(e.selection.getStart(),"LI,DT,DD");return!!(t||r.getSelectedListItems(e).length>0)&&(e.undoManager.transact(function(){e.execCommand("Delete"),s.normalizeLists(e.dom,e.getBody())}),!0)},h=function(e,t){return e.selection.isCollapsed()?p(e,t):m(e)},g=function(e){e.on("keydown",function(t){t.keyCode===n.BACKSPACE?h(e,!1)&&t.preventDefault():t.keyCode===n.DELETE&&h(e,!0)&&t.preventDefault()})};return{setup:g,backspaceDelete:h}}),a("6",["h","4","c","b"],function(e,t,n,r){var i=function(n,r){var i;if(t.isListNode(n)){for(;i=n.firstChild;)r.appendChild(i);e.remove(n)}},o=function(n){var r,o,a;return"DT"===n.nodeName?(e.rename(n,"DD"),!0):(r=n.previousSibling,r&&t.isListNode(r)?(r.appendChild(n),!0):r&&"LI"===r.nodeName&&t.isListNode(r.lastChild)?(r.lastChild.appendChild(n),i(n.lastChild,r.lastChild),!0):(r=n.nextSibling,r&&t.isListNode(r)?(r.insertBefore(n,r.firstChild),!0):(r=n.previousSibling,!(!r||"LI"!==r.nodeName)&&(o=e.create(n.parentNode.nodeName),a=e.getStyle(n.parentNode,"listStyleType"),a&&e.setStyle(o,"listStyleType",a),r.appendChild(o),o.appendChild(n),i(n.lastChild,o),!0))))},a=function(e){var t=r.getSelectedListItems(e);if(t.length){for(var i=n.createBookmark(e.selection.getRng(!0)),a=0;a<t.length&&(o(t[a])||0!==a);a++);return e.selection.setRng(n.resolveBookmark(i)),e.nodeChanged(),!0}};return{indentSelection:a}}),a("0",["1","2","3","4","5","6","7","8"],function(e,t,n,r,i,o,a,s){var l=function(e,t){return function(){var n=e.dom.getParent(e.selection.getStart(),"UL,OL,DL");return n&&n.nodeName===t}},c=function(e){e.on("BeforeExecCommand",function(t){var n,r=t.command.toLowerCase();if("indent"===r?o.indentSelection(e)&&(n=!0):"outdent"===r&&a.outdentSelection(e)&&(n=!0),n)return e.fire("ExecCommand",{command:t.command}),t.preventDefault(),!0}),e.addCommand("InsertUnorderedList",function(t,n){s.toggleList(e,"UL",n)}),e.addCommand("InsertOrderedList",function(t,n){s.toggleList(e,"OL",n)}),e.addCommand("InsertDefinitionList",function(t,n){s.toggleList(e,"DL",n)})},u=function(e){e.addQueryStateHandler("InsertUnorderedList",l(e,"UL")),e.addQueryStateHandler("InsertOrderedList",l(e,"OL")),e.addQueryStateHandler("InsertDefinitionList",l(e,"DL"))},d=function(e){e.on("keydown",function(t){9!==t.keyCode||n.metaKeyPressed(t)||e.dom.getParent(e.selection.getStart(),"LI,DT,DD")&&(t.preventDefault(),t.shiftKey?a.outdentSelection(e):o.indentSelection(e))})},f=function(e){var n=function(n){return function(){var i=this;e.on("NodeChange",function(e){var o=t.grep(e.parents,r.isListNode);i.active(o.length>0&&o[0].nodeName===n)})}},i=function(e,n){var r=e.settings.plugins?e.settings.plugins:"";return t.inArray(r.split(/[ ,]/),n)!==-1};i(e,"advlist")||(e.addButton("numlist",{title:"Numbered list",cmd:"InsertOrderedList",onPostRender:n("OL")}),e.addButton("bullist",{title:"Bullet list",cmd:"InsertUnorderedList",onPostRender:n("UL")})),e.addButton("indent",{icon:"indent",title:"Increase indent",cmd:"Indent",onPostRender:function(t){var n=t.control;e.on("nodechange",function(){for(var t=e.selection.getSelectedBlocks(),i=!1,o=0,a=t.length;!i&&o<a;o++){var s=t[o].nodeName;i="LI"===s&&r.isFirstChild(t[o])||"UL"===s||"OL"===s||"DD"===s}n.disabled(i)})}})};return e.add("lists",function(e){return f(e),i.setup(e),e.on("init",function(){c(e),u(e),d(e)}),{backspaceDelete:function(t){i.backspaceDelete(e,t)}}}),function(){}}),r("0")()}();

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/media/plugin.min.js
@@ -1,1 +1,1 @@
-
+!function(){var e={},t=function(t){for(var n=e[t],i=n.deps,o=n.defn,a=i.length,s=new Array(a),l=0;l<a;++l)s[l]=r(i[l]);var c=o.apply(null,s);if(void 0===c)throw"module ["+t+"] returned undefined";n.instance=c},n=function(t,n,r){if("string"!=typeof t)throw"module id must be a string";if(void 0===n)throw"no dependencies for "+t;if(void 0===r)throw"no definition function for "+t;e[t]={deps:n,defn:r,instance:void 0}},r=function(n){var r=e[n];if(void 0===r)throw"module ["+n+"] was undefined";return void 0===r.instance&&t(n),r.instance},i=function(e,t){for(var n=e.length,i=new Array(n),o=0;o<n;++o)i.push(r(e[o]));t.apply(null,t)},o={};o.bolt={module:{api:{define:n,require:i,demand:r}}};var a=n,s=function(e,t){a(e,[],function(){return t})};s("1",tinymce.PluginManager),s("6",tinymce.util.Delay),s("e",tinymce.util.Tools),s("9",tinymce.html.SaxParser),s("a",tinymce.html.Schema),s("b",tinymce.dom.DOMUtils.DOM),a("h",[],function(){var e=function(e,t){if(e)for(var n=0;n<e.length;n++)if(t.indexOf(e[n].filter)!==-1)return e[n]};return{getVideoScriptMatch:e}}),a("c",[],function(){var e=function(e){return e.replace(/px$/,"")},t=function(e){return/^[0-9.]+$/.test(e)?e+"px":e},n=function(t){return function(n){return n?e(n.style[t]):""}},r=function(e){return function(n,r){n&&(n.style[e]=t(r))}};return{getMaxWidth:n("maxWidth"),getMaxHeight:n("maxHeight"),setMaxWidth:r("maxWidth"),setMaxHeight:r("maxHeight")}}),a("7",["e","9","a","b","h","c"],function(e,t,n,r,i,o){var a=function(e){return r.getAttrib(e,"data-ephox-embed-iri")},s=function(e){var t=r.createFragment(e);return""!==a(t.firstChild)},l=function(n,r){var o={};return new t({validate:!1,allow_conditional_comments:!0,special:"script,noscript",start:function(t,r){if(o.source1||"param"!==t||(o.source1=r.map.movie),"iframe"!==t&&"object"!==t&&"embed"!==t&&"video"!==t&&"audio"!==t||(o.type||(o.type=t),o=e.extend(r.map,o)),"script"===t){var a=i.getVideoScriptMatch(n,r.map.src);if(!a)return;o={type:"script",source1:r.map.src,width:a.width,height:a.height}}"source"===t&&(o.source1?o.source2||(o.source2=r.map.src):o.source1=r.map.src),"img"!==t||o.poster||(o.poster=r.map.src)}}).parse(r),o.source1=o.source1||o.src||o.data,o.source2=o.source2||"",o.poster=o.poster||"",o},c=function(e){var t=r.createFragment(e),n=t.firstChild;return{type:"ephox-embed-iri",source1:a(n),source2:"",poster:"",width:o.getMaxWidth(n),height:o.getMaxHeight(n)}},u=function(e,t){return s(t)?c(t):l(e,t)};return{htmlToData:u}}),s("8",tinymce.html.Writer),a("4",["8","9","a","b","c"],function(e,t,n,r,i){var o=function(e,t){var n,r,i,o;for(n in t)if(i=""+t[n],e.map[n])for(r=e.length;r--;)o=e[r],o.name===n&&(i?(e.map[n]=i,o.value=i):(delete e.map[n],e.splice(r,1)));else i&&(e.push({name:n,value:i}),e.map[n]=i)},a=function(n){var r=new e,i=new t(r);return i.parse(n),r.getContent()},s=function(r,i,a){var s,l=new e,c=0;return new t({validate:!1,allow_conditional_comments:!0,special:"script,noscript",comment:function(e){l.comment(e)},cdata:function(e){l.cdata(e)},text:function(e,t){l.text(e,t)},start:function(e,t,n){switch(e){case"video":case"object":case"embed":case"img":case"iframe":o(t,{width:i.width,height:i.height})}if(a)switch(e){case"video":o(t,{poster:i.poster,src:""}),i.source2&&o(t,{src:""});break;case"iframe":o(t,{src:i.source1});break;case"source":if(c++,c<=2&&(o(t,{src:i["source"+c],type:i["source"+c+"mime"]}),!i["source"+c]))return;break;case"img":if(!i.poster)return;s=!0}l.start(e,t,n)},end:function(e){if("video"===e&&a)for(var t=1;t<=2;t++)if(i["source"+t]){var n=[];n.map={},c<t&&(o(n,{src:i["source"+t],type:i["source"+t+"mime"]}),l.start("source",n,!0))}if(i.poster&&"object"===e&&a&&!s){var r=[];r.map={},o(r,{src:i.poster,width:i.width,height:i.height}),l.start("img",r,!0)}l.end(e)}},new n({})).parse(r),l.getContent()},l=function(e){var t=r.createFragment(e);return""!==r.getAttrib(t.firstChild,"data-ephox-embed-iri")},c=function(e,t){var n=r.createFragment(e),o=n.firstChild;return i.setMaxWidth(o,t.width),i.setMaxHeight(o,t.height),a(o.outerHTML)},u=function(e,t,n){return l(e)?c(e,t):s(e,t,n)};return{updateHtml:u}}),a("l",[],function(){var e=function(e){var t={mp3:"audio/mpeg",wav:"audio/wav",mp4:"video/mp4",webm:"video/webm",ogg:"video/ogg",swf:"application/x-shockwave-flash"},n=e.toLowerCase().split(".").pop(),r=t[n];return r?r:""};return{guess:e}}),a("m",[],function(){var e=[{regex:/youtu\.be\/([\w\-.]+)/,type:"iframe",w:560,h:314,url:"//www.youtube.com/embed/$1",allowFullscreen:!0},{regex:/youtube\.com(.+)v=([^&]+)/,type:"iframe",w:560,h:314,url:"//www.youtube.com/embed/$2",allowFullscreen:!0},{regex:/youtube.com\/embed\/([a-z0-9\-_]+(?:\?.+)?)/i,type:"iframe",w:560,h:314,url:"//www.youtube.com/embed/$1",allowFullscreen:!0},{regex:/vimeo\.com\/([0-9]+)/,type:"iframe",w:425,h:350,url:"//player.vimeo.com/video/$1?title=0&byline=0&portrait=0&color=8dc7dc",allowfullscreen:!0},{regex:/vimeo\.com\/(.*)\/([0-9]+)/,type:"iframe",w:425,h:350,url:"//player.vimeo.com/video/$2?title=0&amp;byline=0",allowfullscreen:!0},{regex:/maps\.google\.([a-z]{2,3})\/maps\/(.+)msid=(.+)/,type:"iframe",w:425,h:350,url:'//maps.google.com/maps/ms?msid=$2&output=embed"',allowFullscreen:!1},{regex:/dailymotion\.com\/video\/([^_]+)/,type:"iframe",w:480,h:270,url:"//www.dailymotion.com/embed/video/$1",allowFullscreen:!0}];return{urlPatterns:e}}),a("j",["l","7","m","h","4","e"],function(e,t,n,r,i,o){var a=function(a,s){var l="",c=o.extend({},s);if(!c.source1&&(o.extend(c,t.htmlToData(a.settings.media_scripts,c.embed)),!c.source1))return"";if(c.source2||(c.source2=""),c.poster||(c.poster=""),c.source1=a.convertURL(c.source1,"source"),c.source2=a.convertURL(c.source2,"source"),c.source1mime=e.guess(c.source1),c.source2mime=e.guess(c.source2),c.poster=a.convertURL(c.poster,"poster"),o.each(n.urlPatterns,function(e){var t,n,r=e.regex.exec(c.source1);if(r){for(n=e.url,t=0;r[t];t++)n=n.replace("$"+t,function(){return r[t]});c.source1=n,c.type=e.type,c.allowFullscreen=e.allowFullscreen,c.width=c.width||e.w,c.height=c.height||e.h}}),c.embed)l=i.updateHtml(c.embed,c,!0);else{var u=r.getVideoScriptMatch(a.settings.media_scripts,c.source1);if(u&&(c.type="script",c.width=u.width,c.height=u.height),c.width=c.width||300,c.height=c.height||150,o.each(c,function(e,t){c[t]=a.dom.encode(e)}),"iframe"===c.type){var d=c.allowFullscreen?' allowFullscreen="1"':"";l+='<iframe src="'+c.source1+'" width="'+c.width+'" height="'+c.height+'"'+d+"></iframe>"}else"application/x-shockwave-flash"===c.source1mime?(l+='<object data="'+c.source1+'" width="'+c.width+'" height="'+c.height+'" type="application/x-shockwave-flash">',c.poster&&(l+='<img src="'+c.poster+'" width="'+c.width+'" height="'+c.height+'" />'),l+="</object>"):c.source1mime.indexOf("audio")!==-1?a.settings.audio_template_callback?l=a.settings.audio_template_callback(c):l+='<audio controls="controls" src="'+c.source1+'">'+(c.source2?'\n<source src="'+c.source2+'"'+(c.source2mime?' type="'+c.source2mime+'"':"")+" />\n":"")+"</audio>":"script"===c.type?l+='<script src="'+c.source1+'"></script>':l=a.settings.video_template_callback?a.settings.video_template_callback(c):'<video width="'+c.width+'" height="'+c.height+'"'+(c.poster?' poster="'+c.poster+'"':"")+' controls="controls">\n<source src="'+c.source1+'"'+(c.source1mime?' type="'+c.source1mime+'"':"")+" />\n"+(c.source2?'<source src="'+c.source2+'"'+(c.source2mime?' type="'+c.source2mime+'"':"")+" />\n":"")+"</video>"}return l};return{dataToHtml:a}}),s("k",tinymce.util.Promise),a("d",["j","k"],function(e,t){var n=function(e,n,r){var i={};return new t(function(t,o){var a=function(r){return r.html&&(i[e.source1]=r),t({url:e.source1,html:r.html?r.html:n(e)})};i[e.source1]?a(i[e.source1]):r({url:e.source1},a,o)})},r=function(e,n){return new t(function(t){t({html:n(e),url:e.source1})})},i=function(t){return function(n){return e.dataToHtml(t,n)}},o=function(e,t){var o=e.settings.media_url_resolver;return o?n(t,i(e),o):r(t,i(e))};return{getEmbedHtml:o}}),s("f",tinymce.Env),a("g",[],function(){var e=function(e,t){e.state.set("oldVal",e.value()),t.state.set("oldVal",t.value())},t=function(e,t){var n=e.find("#width")[0],r=e.find("#height")[0],i=e.find("#constrain")[0];n&&r&&i&&t(n,r,i.checked())},n=function(t,n,r){var i=t.state.get("oldVal"),o=n.state.get("oldVal"),a=t.value(),s=n.value();r&&i&&o&&a&&s&&(a!==i?(s=Math.round(a/i*s),isNaN(s)||n.value(s)):(a=Math.round(s/o*a),isNaN(a)||t.value(a))),e(t,n)},r=function(n){t(n,e)},i=function(e){t(e,n)},o=function(e){var t=function(){e(function(e){i(e)})};return{type:"container",label:"Dimensions",layout:"flex",align:"center",spacing:5,items:[{name:"width",type:"textbox",maxLength:5,size:5,onchange:t,ariaLabel:"Width"},{type:"label",text:"x"},{name:"height",type:"textbox",maxLength:5,size:5,onchange:t,ariaLabel:"Height"},{name:"constrain",type:"checkbox",checked:!0,text:"Constrain proportions"}]}};return{createUi:o,syncSize:r,updateSize:i}}),a("2",["6","7","4","d","c","e","f","g"],function(e,t,n,r,i,o,a,s){var l=a.ie&&a.ie<=8?"onChange":"onInput",c=function(e){return function(t){var n=t&&t.msg?"Media embed handler error: "+t.msg:"Media embed handler threw unknown error.";e.notificationManager.open({type:"error",text:n})}},u=function(e){var n=e.selection.getNode(),r=n.getAttribute("data-ephox-embed-iri");return r?{source1:r,"data-ephox-embed-iri":r,width:i.getMaxWidth(n),height:i.getMaxHeight(n)}:n.getAttribute("data-mce-object")?t.htmlToData(e.settings.media_scripts,e.serializer.serialize(n,{selection:!0})):{}},d=function(e){var t=e.selection.getNode();if(t.getAttribute("data-mce-object")||t.getAttribute("data-ephox-embed-iri"))return e.selection.getContent()},f=function(e,n){return function(r){var i=r.html,a=e.find("#embed")[0],l=o.extend(t.htmlToData(n.settings.media_scripts,i),{source1:r.url});e.fromJSON(l),a&&(a.value(i),s.updateSize(e))}},p=function(e,t){var n,r,i=e.dom.select("img[data-mce-object]");for(n=0;n<t.length;n++)for(r=i.length-1;r>=0;r--)t[n]===i[r]&&i.splice(r,1);e.selection.select(i[0])},m=function(e,t){var n=e.dom.select("img[data-mce-object]");e.insertContent(t),p(e,n),e.nodeChanged()},h=function(e,t){var i=e.toJSON();i.embed=n.updateHtml(i.embed,i),i.embed?m(t,i.embed):r.getEmbedHtml(t,i).then(function(e){m(t,e.html)})["catch"](c(t))},g=function(e,t){o.each(t,function(t,n){e.find("#"+n).value(t)})},v=function(e){var i,a,p=[{name:"source1",type:"filepicker",filetype:"media",size:40,autofocus:!0,label:"Source",onpaste:function(){setTimeout(function(){r.getEmbedHtml(e,i.toJSON()).then(f(i,e))["catch"](c(e))},1)},onchange:function(t){r.getEmbedHtml(e,i.toJSON()).then(f(i,e))["catch"](c(e)),g(i,t.meta)},onbeforecall:function(e){e.meta=i.toJSON()}}],m=[],v=function(e){e(i),a=i.toJSON(),i.find("#embed").value(n.updateHtml(a.embed,a))};if(e.settings.media_alt_source!==!1&&m.push({name:"source2",type:"filepicker",filetype:"media",size:40,label:"Alternative source"}),e.settings.media_poster!==!1&&m.push({name:"poster",type:"filepicker",filetype:"image",size:40,label:"Poster"}),e.settings.media_dimensions!==!1){var b=s.createUi(v);p.push(b)}a=u(e);var y={id:"mcemediasource",type:"textbox",flex:1,name:"embed",value:d(e),multiline:!0,rows:5,label:"Source"},C=function(){a=o.extend({},t.htmlToData(e.settings.media_scripts,this.value())),this.parent().parent().fromJSON(a)};y[l]=C,i=e.windowManager.open({title:"Insert/edit media",data:a,bodyType:"tabpanel",body:[{title:"General",type:"form",items:p},{title:"Embed",type:"container",layout:"flex",direction:"column",align:"stretch",padding:10,spacing:10,items:[{type:"label",text:"Paste your embed code below:",forId:"mcemediasource"},y]},{title:"Advanced",type:"form",items:m}],onSubmit:function(){s.updateSize(i),h(i,e)}}),s.syncSize(i)};return{showDialog:v}}),a("3",["e","8","9","a"],function(e,t,n,r){var i=function(e,i){if(e.settings.media_filter_html===!1)return i;var o,a=new t;return new n({validate:!1,allow_conditional_comments:!1,special:"script,noscript",comment:function(e){a.comment(e)},cdata:function(e){a.cdata(e)},text:function(e,t){a.text(e,t)},start:function(t,n,r){if(o=!0,"script"!==t&&"noscript"!==t){for(var i=0;i<n.length;i++){if(0===n[i].name.indexOf("on"))return;"style"===n[i].name&&(n[i].value=e.dom.serializeStyle(e.dom.parseStyle(n[i].value),t))}a.start(t,n,r),o=!1}},end:function(e){o||a.end(e)}},new r({})).parse(i),a.getContent()};return{sanitize:i}}),s("i",tinymce.html.Node),a("5",["3","h","i","f"],function(e,t,n,r){var i=function(e,t){var i,o=t.name;return i=new n("img",1),i.shortEnded=!0,a(e,t,i),i.attr({width:t.attr("width")||"300",height:t.attr("height")||("audio"===o?"30":"150"),style:t.attr("style"),src:r.transparentSrc,"data-mce-object":o,"class":"mce-object mce-object-"+o}),i},o=function(e,t){var r,i,o,s=t.name;return r=new n("span",1),r.attr({contentEditable:"false",style:t.attr("style"),"data-mce-object":s,"class":"mce-preview-object mce-object-"+s}),a(e,t,r),i=new n(s,1),i.attr({src:t.attr("src"),allowfullscreen:t.attr("allowfullscreen"),width:t.attr("width")||"300",height:t.attr("height")||("audio"===s?"30":"150"),frameborder:"0"}),o=new n("span",1),o.attr("class","mce-shim"),r.append(i),r.append(o),r},a=function(t,n,r){var i,o,a,s,l;for(a=n.attributes,s=a.length;s--;)i=a[s].name,o=a[s].value,"width"!==i&&"height"!==i&&"style"!==i&&("data"!==i&&"src"!==i||(o=t.convertURL(o,i)),r.attr("data-mce-p-"+i,o));l=n.firstChild&&n.firstChild.value,l&&(r.attr("data-mce-html",escape(e.sanitize(t,l))),r.firstChild=null)},s=function(e){for(;e=e.parent;)if(e.attr("data-ephox-embed-iri"))return!0;return!1},l=function(e){return function(n){for(var a,l,c=n.length;c--;)a=n[c],a.parent&&(a.parent.attr("data-mce-object")||("script"!==a.name||(l=t.getVideoScriptMatch(e.settings.media_scripts,a.attr("src"))))&&(l&&(l.width&&a.attr("width",l.width.toString()),l.height&&a.attr("height",l.height.toString())),"iframe"===a.name&&e.settings.media_live_embeds!==!1&&r.ceFalse?s(a)||a.replace(o(e,a)):s(a)||a.replace(i(e,a))))}};return{createPreviewIframeNode:o,createPlaceholderNode:i,placeHolderConverter:l}}),a("0",["1","2","3","4","5"],function(e,t,n,r,i){var o=function(e){e.on("ResolveName",function(e){var t;1===e.target.nodeType&&(t=e.target.getAttribute("data-mce-object"))&&(e.name=t)}),e.on("preInit",function(){var t=e.schema.getSpecialElements();tinymce.each("video audio iframe object".split(" "),function(e){t[e]=new RegExp("</"+e+"[^>]*>","gi")});var r=e.schema.getBoolAttrs();tinymce.each("webkitallowfullscreen mozallowfullscreen allowfullscreen".split(" "),function(e){r[e]={}}),e.parser.addNodeFilter("iframe,video,audio,object,embed,script",i.placeHolderConverter(e)),e.serializer.addAttributeFilter("data-mce-object",function(t,r){for(var i,o,a,s,l,c,u,d,f=t.length;f--;)if(i=t[f],i.parent){for(u=i.attr(r),o=new tinymce.html.Node(u,1),"audio"!==u&&"script"!==u&&(d=i.attr("class"),d&&d.indexOf("mce-preview-object")!==-1?o.attr({width:i.firstChild.attr("width"),height:i.firstChild.attr("height")}):o.attr({width:i.attr("width"),height:i.attr("height")})),o.attr({style:i.attr("style")}),s=i.attributes,a=s.length;a--;){var p=s[a].name;0===p.indexOf("data-mce-p-")&&o.attr(p.substr(11),s[a].value)}"script"===u&&o.attr("type","text/javascript"),l=i.attr("data-mce-html"),l&&(c=new tinymce.html.Node("#text",3),c.raw=!0,c.value=n.sanitize(e,unescape(l)),o.append(c)),i.replace(o)}})}),e.on("click keyup",function(){var t=e.selection.getNode();t&&e.dom.hasClass(t,"mce-preview-object")&&e.dom.getAttrib(t,"data-mce-selected")&&t.setAttribute("data-mce-selected","2")}),e.on("ObjectSelected",function(e){var t=e.target.getAttribute("data-mce-object");"audio"!==t&&"script"!==t||e.preventDefault()}),e.on("objectResized",function(e){var t,n=e.target;n.getAttribute("data-mce-object")&&(t=n.getAttribute("data-mce-html"),t&&(t=unescape(t),n.setAttribute("data-mce-html",escape(r.updateHtml(t,{width:e.width,height:e.height})))))}),this.showDialog=function(){t.showDialog(e)},e.addButton("media",{tooltip:"Insert/edit media",onclick:this.showDialog,stateSelector:["img[data-mce-object]","span[data-mce-object]","div[data-ephox-embed-iri]"]}),e.addMenuItem("media",{icon:"media",text:"Media",onclick:this.showDialog,context:"insert",prependToContext:!0}),e.on("setContent",function(){e.$("span.mce-preview-object").each(function(t,n){var r=e.$(n);0===r.find("span.mce-shim",n).length&&r.append('<span class="mce-shim"></span>')})}),e.addCommand("mceMedia",this.showDialog)};return e.add("media",o),function(){}}),r("0")()}();

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/nonbreaking/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("nonbreaking",function(e){var t=e.getParam("nonbreaking_force_tab");if(e.addCommand("mceNonBreaking",function(){e.insertContent(e.plugins.visualchars&&e.plugins.visualchars.state?'<span class="mce-nbsp">&nbsp;</span>':"&nbsp;"),e.dom.setAttrib(e.dom.select("span.mce-nbsp"),"data-mce-bogus","1")}),e.addButton("nonbreaking",{title:"Nonbreaking space",cmd:"mceNonBreaking"}),e.addMenuItem("nonbreaking",{text:"Nonbreaking space",cmd:"mceNonBreaking",context:"insert"}),t){var n=+t>1?+t:3;e.on("keydown",function(t){if(9==t.keyCode){if(t.shiftKey)return;t.preventDefault();for(var r=0;r<n;r++)e.execCommand("mceNonBreaking")}})}});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/noneditable/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("noneditable",function(e){function t(e){return function(t){return(" "+t.attr("class")+" ").indexOf(e)!==-1}}function n(t){function n(t){var n=arguments,r=n[n.length-2],i=r>0?a.charAt(r-1):"";if('"'===i)return t;if(">"===i){var o=a.lastIndexOf("<",r);if(o!==-1){var l=a.substring(o,r);if(l.indexOf('contenteditable="false"')!==-1)return t}}return'<span class="'+s+'" data-mce-content="'+e.dom.encode(n[0])+'">'+e.dom.encode("string"==typeof n[1]?n[1]:n[0])+"</span>"}var r=o.length,a=t.content,s=tinymce.trim(i);if("raw"!=t.format){for(;r--;)a=a.replace(o[r],n);t.content=a}}var r,i,o,a="contenteditable";r=" "+tinymce.trim(e.getParam("noneditable_editable_class","mceEditable"))+" ",i=" "+tinymce.trim(e.getParam("noneditable_noneditable_class","mceNonEditable"))+" ";var s=t(r),l=t(i);o=e.getParam("noneditable_regexp"),o&&!o.length&&(o=[o]),e.on("PreInit",function(){o&&e.on("BeforeSetContent",n),e.parser.addAttributeFilter("class",function(e){for(var t,n=e.length;n--;)t=e[n],s(t)?t.attr(a,"true"):l(t)&&t.attr(a,"false")}),e.serializer.addAttributeFilter(a,function(e){for(var t,n=e.length;n--;)t=e[n],(s(t)||l(t))&&(o&&t.attr("data-mce-content")?(t.name="#text",t.type=3,t.raw=!0,t.value=t.attr("data-mce-content")):t.attr(a,null))})})});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/pagebreak/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("pagebreak",function(e){var t="mce-pagebreak",n=e.getParam("pagebreak_separator","<!-- pagebreak -->"),r=new RegExp(n.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,function(e){return"\\"+e}),"gi"),i='<img src="'+tinymce.Env.transparentSrc+'" class="'+t+'" data-mce-resize="false" data-mce-placeholder />';e.addCommand("mcePageBreak",function(){e.settings.pagebreak_split_block?e.insertContent("<p>"+i+"</p>"):e.insertContent(i)}),e.addButton("pagebreak",{title:"Page break",cmd:"mcePageBreak"}),e.addMenuItem("pagebreak",{text:"Page break",icon:"pagebreak",cmd:"mcePageBreak",context:"insert"}),e.on("ResolveName",function(n){"IMG"==n.target.nodeName&&e.dom.hasClass(n.target,t)&&(n.name="pagebreak")}),e.on("click",function(n){n=n.target,"IMG"===n.nodeName&&e.dom.hasClass(n,t)&&e.selection.select(n)}),e.on("BeforeSetContent",function(e){e.content=e.content.replace(r,i)}),e.on("PreInit",function(){e.serializer.addNodeFilter("img",function(t){for(var r,i,o=t.length;o--;)if(r=t[o],i=r.attr("class"),i&&i.indexOf("mce-pagebreak")!==-1){var a=r.parent;if(e.schema.getBlockElements()[a.name]&&e.settings.pagebreak_split_block){a.type=3,a.value=n,a.raw=!0,r.remove();continue}r.type=3,r.value=n,r.raw=!0}})})});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/paste/plugin.min.js
@@ -1,1 +1,1 @@
-
+!function(e,t){"use strict";function n(e,t){for(var n,r=[],o=0;o<e.length;++o){if(n=a[e[o]]||i(e[o]),!n)throw"module definition dependecy not found: "+e[o];r.push(n)}t.apply(null,r)}function r(e,r,i){if("string"!=typeof e)throw"invalid module definition, module id must be defined and be a string";if(r===t)throw"invalid module definition, dependencies must be specified";if(i===t)throw"invalid module definition, definition function must be specified";n(r,function(){a[e]=i.apply(null,arguments)})}function i(t){for(var n=e,r=t.split(/[.\/]/),i=0;i<r.length;++i){if(!n[r[i]])return;n=n[r[i]]}return n}function o(n){var r,i,o,s,l;for(r=0;r<n.length;r++){i=e,o=n[r],s=o.split(/[.\/]/);for(var c=0;c<s.length-1;++c)i[s[c]]===t&&(i[s[c]]={}),i=i[s[c]];i[s[s.length-1]]=a[o]}if(e.AMDLC_TESTS){l=e.privateModules||{};for(o in a)l[o]=a[o];for(r=0;r<n.length;r++)delete l[n[r]];e.privateModules=l}}var a={};r("tinymce/pasteplugin/Utils",["tinymce/util/Tools","tinymce/html/DomParser","tinymce/html/Schema"],function(e,t,n){function r(t,n){return e.each(n,function(e){t=e.constructor==RegExp?t.replace(e,""):t.replace(e[0],e[1])}),t}function i(i){function o(e){var t=e.name,n=e;if("br"===t)return void(l+="\n");if(c[t]&&(l+=" "),u[t])return void(l+=" ");if(3==e.type&&(l+=e.value),!e.shortEnded&&(e=e.firstChild))do o(e);while(e=e.next);d[t]&&n.next&&(l+="\n","p"==t&&(l+="\n"))}var a=new n,s=new t({},a),l="",c=a.getShortEndedElements(),u=e.makeMap("script noscript style textarea video audio iframe object"," "),d=a.getBlockElements();return i=r(i,[/<!\[[^\]]+\]>/g]),o(s.parse(i)),l}function o(e){function t(e,t,n){return t||n?"\xa0":" "}return e=r(e,[/^[\s\S]*<body[^>]*>\s*|\s*<\/body[^>]*>[\s\S]*$/g,/<!--StartFragment-->|<!--EndFragment-->/g,[/( ?)<span class="Apple-converted-space">\u00a0<\/span>( ?)/g,t],/<br class="Apple-interchange-newline">/g,/<br>$/i])}function a(e){var t=0;return function(){return e+t++}}return{filter:r,innerText:i,trimHtml:o,createIdGenerator:a}}),r("tinymce/pasteplugin/SmartPaste",["tinymce/util/Tools"],function(e){var t=function(e){return/^https?:\/\/[\w\?\-\/+=.&%@~#]+$/i.test(e)},n=function(e){return t(e)&&/.(gif|jpe?g|png)$/.test(e)},r=function(e,t,n){return e.undoManager.extra(function(){n(e,t)},function(){e.insertContent('<img src="'+t+'">')}),!0},i=function(e,t,n){return e.undoManager.extra(function(){n(e,t)},function(){e.execCommand("mceInsertLink",!1,t)}),!0},o=function(e,n,r){return!(e.selection.isCollapsed()!==!1||!t(n))&&i(e,n,r)},a=function(e,t,i){return!!n(t)&&r(e,t,i)},s=function(e,t){return e.insertContent(t,{merge:e.settings.paste_merge_formats!==!1,paste:!0}),!0},l=function(t,n){e.each([o,a,s],function(e){return e(t,n,s)!==!0})},c=function(e,t){e.settings.smart_paste===!1?s(e,t):l(e,t)};return{isImageUrl:n,isAbsoluteUrl:t,insertContent:c}}),r("tinymce/pasteplugin/Clipboard",["tinymce/Env","tinymce/dom/RangeUtils","tinymce/util/VK","tinymce/pasteplugin/Utils","tinymce/pasteplugin/SmartPaste","tinymce/util/Delay"],function(e,t,n,r,i,o){return function(a){function s(e){var t,n=a.dom;if(t=a.fire("BeforePastePreProcess",{content:e}),t=a.fire("PastePreProcess",t),e=t.content,!t.isDefaultPrevented()){if(a.hasEventListeners("PastePostProcess")&&!t.isDefaultPrevented()){var r=n.add(a.getBody(),"div",{style:"display:none"},e);t=a.fire("PastePostProcess",{node:r}),n.remove(r),e=t.node.innerHTML}t.isDefaultPrevented()||i.insertContent(a,e)}}function l(e){e=a.dom.encode(e).replace(/\r\n/g,"\n");var t,n=a.dom.getParent(a.selection.getStart(),a.dom.isBlock),i=a.settings.forced_root_block;i&&(t=a.dom.createHTML(i,a.settings.forced_root_block_attrs),t=t.substr(0,t.length-3)+">"),n&&/^(PRE|DIV)$/.test(n.nodeName)||!i?e=r.filter(e,[[/\n/g,"<br>"]]):(e=r.filter(e,[[/\n\n/g,"</p>"+t],[/^(.*<\/p>)(<p>)$/,t+"$1"],[/\n/g,"<br />"]]),e.indexOf("<p>")!=-1&&(e=t+e)),s(e)}function c(){function t(e){var t,n,i,o=e.startContainer;if(t=e.getClientRects(),t.length)return t[0];if(e.collapsed&&1==o.nodeType){for(i=o.childNodes[S.startOffset];i&&3==i.nodeType&&!i.data.length;)i=i.nextSibling;if(i)return"BR"==i.tagName&&(n=r.doc.createTextNode("\ufeff"),i.parentNode.insertBefore(n,i),e=r.createRng(),e.setStartBefore(n),e.setEndAfter(n),t=e.getClientRects(),r.remove(n)),t.length?t[0]:void 0}}var n,r=a.dom,i=a.getBody(),o=a.dom.getViewPort(a.getWin()),s=o.y,l=20;if(S=a.selection.getRng(),a.inline&&(n=a.selection.getScrollContainer(),n&&n.scrollTop>0&&(s=n.scrollTop)),S.getClientRects){var c=t(S);if(c)l=s+(c.top-r.getPos(i).y);else{l=s;var u=S.startContainer;u&&(3==u.nodeType&&u.parentNode!=i&&(u=u.parentNode),1==u.nodeType&&(l=r.getPos(u,n||i).y))}}E=r.add(a.getBody(),"div",{id:"mcepastebin",contentEditable:!0,"data-mce-bogus":"all",style:"position: absolute; top: "+l+"px;width: 10px; height: 10px; overflow: hidden; opacity: 0"},A),(e.ie||e.gecko)&&r.setStyle(E,"left","rtl"==r.getStyle(i,"direction",!0)?65535:-65535),r.bind(E,"beforedeactivate focusin focusout",function(e){e.stopPropagation()}),E.focus(),a.selection.select(E,!0)}function u(){if(E){for(var e;e=a.dom.get("mcepastebin");)a.dom.remove(e),a.dom.unbind(e);S&&a.selection.setRng(S)}E=S=null}function d(){var e,t,n,r,i="";for(e=a.dom.select("div[id=mcepastebin]"),t=0;t<e.length;t++)n=e[t],n.firstChild&&"mcepastebin"==n.firstChild.id&&(n=n.firstChild),r=n.innerHTML,i!=A&&(i+=r);return i}function f(e){var t={};if(e){if(e.getData){var n=e.getData("Text");n&&n.length>0&&n.indexOf(B)==-1&&(t["text/plain"]=n)}if(e.types)for(var r=0;r<e.types.length;r++){var i=e.types[r];t[i]=e.getData(i)}}return t}function p(e){return f(e.clipboardData||a.getDoc().dataTransfer)}function m(e){return x(e,"text/html")||x(e,"text/plain")}function h(e){var t;return t=e.indexOf(","),t!==-1?e.substr(t+1):null}function g(e,t){return!e.images_dataimg_filter||e.images_dataimg_filter(t)}function v(e,t,n){e&&(a.selection.setRng(e),e=null);var r=t.result,i=h(r),o=new Image;if(o.src=r,g(a.settings,o)){var l,c,u=a.editorUpload.blobCache;c=u.findFirst(function(e){return e.base64()===i}),c?l=c:(l=u.create(P(),n,i),u.add(l)),s('<img src="'+l.blobUri()+'">')}else s('<img src="'+r+'">')}function b(e,t){function n(n){var r,i,o,a=!1;if(n)for(r=0;r<n.length;r++)if(i=n[r],/^image\/(jpeg|png|gif|bmp)$/.test(i.type)){var s=i.getAsFile?i.getAsFile():i;o=new FileReader,o.onload=v.bind(null,t,o,s),o.readAsDataURL(s),e.preventDefault(),a=!0}return a}var r=e.clipboardData||e.dataTransfer;if(a.settings.paste_data_images&&r)return n(r.items)||n(r.files)}function y(e){var t=e.clipboardData;return navigator.userAgent.indexOf("Android")!=-1&&t&&t.items&&0===t.items.length}function C(e){return t.getCaretRangeFromPoint(e.clientX,e.clientY,a.getDoc())}function x(e,t){return t in e&&e[t].length>0}function w(e){return n.metaKeyPressed(e)&&86==e.keyCode||e.shiftKey&&45==e.keyCode}function N(){function t(e,t,n){var i;return x(e,"text/html")?i=e["text/html"]:(i=d(),i==A&&(n=!0)),i=r.trimHtml(i),E&&E.firstChild&&"mcepastebin"===E.firstChild.id&&(n=!0),u(),i.length||(n=!0),n&&(i=x(e,"text/plain")&&i.indexOf("</p>")==-1?e["text/plain"]:r.innerText(i)),i==A?void(t||a.windowManager.alert("Please use Ctrl+V/Cmd+V keyboard shortcuts to paste contents.")):void(n?l(i):s(i))}function n(e){var t=e["text/plain"];return!!t&&0===t.indexOf("file://")}a.on("keydown",function(t){function n(e){w(e)&&!e.isDefaultPrevented()&&u()}if(w(t)&&!t.isDefaultPrevented()){if(_=t.shiftKey&&86==t.keyCode,_&&e.webkit&&navigator.userAgent.indexOf("Version/")!=-1)return;if(t.stopImmediatePropagation(),T=(new Date).getTime(),e.ie&&_)return t.preventDefault(),void a.fire("paste",{ieFake:!0});u(),c(),a.once("keyup",n),a.once("paste",function(){a.off("keyup",n)})}});var i=function(){return S||a.selection.getRng()};a.on("paste",function(n){var r=(new Date).getTime(),s=p(n),l=(new Date).getTime()-r,f=(new Date).getTime()-T-l<1e3,h="text"==k.pasteFormat||_;return _=!1,n.isDefaultPrevented()||y(n)?void u():!m(s)&&b(n,i())?void u():(f||n.preventDefault(),!e.ie||f&&!n.ieFake||(c(),a.dom.bind(E,"paste",function(e){e.stopPropagation()}),a.getDoc().execCommand("Paste",!1,null),s["text/html"]=d()),void(x(s,"text/html")?(n.preventDefault(),t(s,f,h)):o.setEditorTimeout(a,function(){t(s,f,h)},0)))}),a.on("dragstart dragend",function(e){R="dragstart"==e.type}),a.on("drop",function(e){var t,i;if(i=C(e),!e.isDefaultPrevented()&&!R&&(t=f(e.dataTransfer),(m(t)&&!n(t)||!b(e,i))&&i&&a.settings.paste_filter_drop!==!1)){var c=t["mce-internal"]||t["text/html"]||t["text/plain"];c&&(e.preventDefault(),o.setEditorTimeout(a,function(){a.undoManager.transact(function(){t["mce-internal"]&&a.execCommand("Delete"),a.selection.setRng(i),c=r.trimHtml(c),t["text/html"]?s(c):l(c)})}))}}),a.on("dragover dragend",function(e){a.settings.paste_data_images&&e.preventDefault()})}var E,S,_,k=this,T=0,R=!1,A="%MCEPASTEBIN%",B="data:text/mce-internal,",P=r.createIdGenerator("mceclip");k.pasteHtml=s,k.pasteText=l,k.pasteImageData=b,a.on("preInit",function(){N(),a.parser.addNodeFilter("img",function(t,n,r){function i(e){return e.data&&e.data.paste===!0}function o(t){t.attr("data-mce-object")||u===e.transparentSrc||t.remove()}function s(e){return 0===e.indexOf("webkit-fake-url")}function l(e){return 0===e.indexOf("data:")}if(!a.settings.paste_data_images&&i(r))for(var c=t.length;c--;){var u=t[c].attributes.map.src;u&&(s(u)?o(t[c]):!a.settings.allow_html_data_urls&&l(u)&&o(t[c]))}})})}}),r("tinymce/pasteplugin/WordFilter",["tinymce/util/Tools","tinymce/html/DomParser","tinymce/html/Schema","tinymce/html/Serializer","tinymce/html/Node","tinymce/pasteplugin/Utils"],function(e,t,n,r,i,o){function a(e){return/<font face="Times New Roman"|class="?Mso|style="[^"]*\bmso-|style='[^'']*\bmso-|w:WordDocument/i.test(e)||/class="OutlineElement/.test(e)||/id="?docs\-internal\-guid\-/.test(e)}function s(t){var n,r;return r=[/^[IVXLMCD]{1,2}\.[ \u00a0]/,/^[ivxlmcd]{1,2}\.[ \u00a0]/,/^[a-z]{1,2}[\.\)][ \u00a0]/,/^[A-Z]{1,2}[\.\)][ \u00a0]/,/^[0-9]+\.[ \u00a0]/,/^[\u3007\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d]+\.[ \u00a0]/,/^[\u58f1\u5f10\u53c2\u56db\u4f0d\u516d\u4e03\u516b\u4e5d\u62fe]+\.[ \u00a0]/],t=t.replace(/^[\u00a0 ]+/,""),e.each(r,function(e){if(e.test(t))return n=!0,!1}),n}function l(e){return/^[\s\u00a0]*[\u2022\u00b7\u00a7\u25CF]\s*/.test(e)}function c(c){var u=c.settings;c.on("BeforePastePreProcess",function(d){function f(e){function t(e){var n="";if(3===e.type)return e.value;if(e=e.firstChild)do n+=t(e);while(e=e.next);return n}function n(e,t){if(3===e.type&&t.test(e.value))return e.value=e.value.replace(t,""),!1;if(e=e.firstChild)do if(!n(e,t))return!1;while(e=e.next);return!0}function r(e){if(e._listIgnore)return void e.remove();if(e=e.firstChild)do r(e);while(e=e.next)}function o(e,t,o){var s=e._listLevel||u;s!=u&&(s<u?a&&(a=a.parent.parent):(c=a,a=null)),a&&a.name==t?a.append(e):(c=c||a,a=new i(t,1),o>1&&a.attr("start",""+o),e.wrap(a)),e.name="li",s>u&&c&&c.lastChild.append(a),u=s,r(e),n(e,/^\u00a0+/),n(e,/^\s*([\u2022\u00b7\u00a7\u25CF]|\w+\.)/),n(e,/^\u00a0+/)}for(var a,c,u=1,d=[],f=e.firstChild;"undefined"!=typeof f&&null!==f;)if(d.push(f),f=f.walk(),null!==f)for(;"undefined"!=typeof f&&f.parent!==e;)f=f.walk();for(var p=0;p<d.length;p++)if(e=d[p],"p"==e.name&&e.firstChild){var m=t(e);if(l(m)){o(e,"ul");continue}if(s(m)){var h=/([0-9]+)\./.exec(m),g=1;h&&(g=parseInt(h[1],10)),o(e,"ol",g);continue}if(e._listLevel){o(e,"ul",1);continue}a=null}else c=a,a=null}function p(t,n){var r,o={},a=c.dom.parseStyle(n);return e.each(a,function(e,i){switch(i){case"mso-list":r=/\w+ \w+([0-9]+)/i.exec(n),r&&(t._listLevel=parseInt(r[1],10)),/Ignore/i.test(e)&&t.firstChild&&(t._listIgnore=!0,t.firstChild._listIgnore=!0);break;case"horiz-align":i="text-align";break;case"vert-align":i="vertical-align";break;case"font-color":case"mso-foreground":i="color";break;case"mso-background":case"mso-highlight":i="background";break;case"font-weight":case"font-style":return void("normal"!=e&&(o[i]=e));case"mso-element":if(/^(comment|comment-list)$/i.test(e))return void t.remove()}return 0===i.indexOf("mso-comment")?void t.remove():void(0!==i.indexOf("mso-")&&("all"==m||h&&h[i])&&(o[i]=e))}),/(bold)/i.test(o["font-weight"])&&(delete o["font-weight"],t.wrap(new i("b",1))),/(italic)/i.test(o["font-style"])&&(delete o["font-style"],t.wrap(new i("i",1))),o=c.dom.serializeStyle(o,t.name),o?o:null}var m,h,g=d.content;if(g=g.replace(/<b[^>]+id="?docs-internal-[^>]*>/gi,""),g=g.replace(/<br class="?Apple-interchange-newline"?>/gi,""),m=u.paste_retain_style_properties,m&&(h=e.makeMap(m.split(/[, ]/))),u.paste_enable_default_filters!==!1&&a(d.content)){d.wordContent=!0,g=o.filter(g,[/<!--[\s\S]+?-->/gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/&nbsp;/gi,"\xa0"],[/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\s\u00a0]*)<\/span>/gi,function(e,t){return t.length>0?t.replace(/./," ").slice(Math.floor(t.length/2)).split("").join("\xa0"):""}]]);var v=u.paste_word_valid_elements;v||(v="-strong/b,-em/i,-u,-span,-p,-ol,-ul,-li,-h1,-h2,-h3,-h4,-h5,-h6,-p/div,-a[href|name],sub,sup,strike,br,del,table[width],tr,td[colspan|rowspan|width],th[colspan|rowspan|width],thead,tfoot,tbody");var b=new n({valid_elements:v,valid_children:"-li[p]"});e.each(b.elements,function(e){e.attributes["class"]||(e.attributes["class"]={},e.attributesOrder.push("class")),e.attributes.style||(e.attributes.style={},e.attributesOrder.push("style"))});var y=new t({},b);y.addAttributeFilter("style",function(e){for(var t,n=e.length;n--;)t=e[n],t.attr("style",p(t,t.attr("style"))),"span"==t.name&&t.parent&&!t.attributes.length&&t.unwrap()}),y.addAttributeFilter("class",function(e){for(var t,n,r=e.length;r--;)t=e[r],n=t.attr("class"),/^(MsoCommentReference|MsoCommentText|msoDel)$/i.test(n)&&t.remove(),t.attr("class",null)}),y.addNodeFilter("del",function(e){for(var t=e.length;t--;)e[t].remove()}),y.addNodeFilter("a",function(e){for(var t,n,r,i=e.length;i--;)if(t=e[i],n=t.attr("href"),r=t.attr("name"),n&&n.indexOf("#_msocom_")!=-1)t.remove();else if(n&&0===n.indexOf("file://")&&(n=n.split("#")[1],n&&(n="#"+n)),n||r){if(r&&!/^_?(?:toc|edn|ftn)/i.test(r)){t.unwrap();continue}t.attr({href:n,name:r})}else t.unwrap()});var C=y.parse(g);u.paste_convert_word_fake_lists!==!1&&f(C),d.content=new r({validate:u.validate},b).serialize(C)}})}return c.isWordContent=a,c}),r("tinymce/pasteplugin/Quirks",["tinymce/Env","tinymce/util/Tools","tinymce/pasteplugin/WordFilter","tinymce/pasteplugin/Utils"],function(e,t,n,r){return function(i){function o(e){i.on("BeforePastePreProcess",function(t){t.content=e(t.content)})}function a(e){i.on("PastePostProcess",function(t){e(t.node)})}function s(e){if(!n.isWordContent(e))return e;var o=[];t.each(i.schema.getBlockElements(),function(e,t){o.push(t)});var a=new RegExp("(?:<br>&nbsp;[\\s\\r\\n]+|<br>)*(<\\/?("+o.join("|")+")[^>]*>)(?:<br>&nbsp;[\\s\\r\\n]+|<br>)*","g");return e=r.filter(e,[[a,"$1"]]),e=r.filter(e,[[/<br><br>/g,"<BR><BR>"],[/<br>/g," "],[/<BR><BR>/g,"<br>"]])}function l(e){if(n.isWordContent(e))return e;var t=i.settings.paste_webkit_styles;if(i.settings.paste_remove_styles_if_webkit===!1||"all"==t)return e;if(t&&(t=t.split(/[, ]/)),t){var r=i.dom,o=i.selection.getNode();e=e.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi,function(e,n,i,a){var s=r.parseStyle(i,"span"),l={};if("none"===t)return n+a;for(var c=0;c<t.length;c++){var u=s[t[c]],d=r.getStyle(o,t[c],!0);/color/.test(t[c])&&(u=r.toHex(u),d=r.toHex(d)),d!=u&&(l[t[c]]=u)}return l=r.serializeStyle(l,"span"),l?n+' style="'+l+'"'+a:n+a})}else e=e.replace(/(<[^>]+) style="([^"]*)"([^>]*>)/gi,"$1$3");return e=e.replace(/(<[^>]+) data-mce-style="([^"]+)"([^>]*>)/gi,function(e,t,n,r){return t+' style="'+n+'"'+r})}function c(e){i.$("a",e).find("font,u").each(function(e,t){i.dom.remove(t,!0)})}e.webkit&&o(l),e.ie&&(o(s),a(c))}}),r("tinymce/pasteplugin/Plugin",["tinymce/PluginManager","tinymce/pasteplugin/Clipboard","tinymce/pasteplugin/WordFilter","tinymce/pasteplugin/Quirks"],function(e,t,n,r){var i;e.add("paste",function(o){function a(){return i||o.settings.paste_plaintext_inform===!1}function s(){if("text"==c.pasteFormat)c.pasteFormat="html",o.fire("PastePlainTextToggle",{state:!1});else if(c.pasteFormat="text",o.fire("PastePlainTextToggle",{state:!0}),!a()){var e=o.translate("Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.");o.notificationManager.open({text:e,type:"info"}),i=!0}o.focus()}function l(){var e=this;e.active("text"===c.pasteFormat),o.on("PastePlainTextToggle",function(t){e.active(t.state)})}var c,u=this,d=o.settings;return/(^|[ ,])powerpaste([, ]|$)/.test(d.plugins)&&e.get("powerpaste")?void("undefined"!=typeof console&&console.log&&console.log("PowerPaste is incompatible with Paste plugin! Remove 'paste' from the 'plugins' option.")):(u.clipboard=c=new t(o),u.quirks=new r(o),u.wordFilter=new n(o),o.settings.paste_as_text&&(u.clipboard.pasteFormat="text"),d.paste_preprocess&&o.on("PastePreProcess",function(e){d.paste_preprocess.call(u,u,e)}),d.paste_postprocess&&o.on("PastePostProcess",function(e){d.paste_postprocess.call(u,u,e)}),o.addCommand("mceInsertClipboardContent",function(e,t){t.content&&u.clipboard.pasteHtml(t.content),t.text&&u.clipboard.pasteText(t.text)}),o.settings.paste_block_drop&&o.on("dragend dragover draggesture dragdrop drop drag",function(e){e.preventDefault(),e.stopPropagation()}),o.settings.paste_data_images||o.on("drop",function(e){var t=e.dataTransfer;t&&t.files&&t.files.length>0&&e.preventDefault()}),o.addCommand("mceTogglePlainTextPaste",s),o.addButton("pastetext",{icon:"pastetext",tooltip:"Paste as text",onclick:s,onPostRender:l}),void o.addMenuItem("pastetext",{text:"Paste as text",selectable:!0,active:c.pasteFormat,onclick:s,onPostRender:l}))})}),o(["tinymce/pasteplugin/Utils"])}(window);

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/preview/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("preview",function(e){var t=e.settings,n=!tinymce.Env.ie;e.addCommand("mcePreview",function(){e.windowManager.open({title:"Preview",width:parseInt(e.getParam("plugin_preview_width","650"),10),height:parseInt(e.getParam("plugin_preview_height","500"),10),html:'<iframe src="javascript:\'\'" frameborder="0"'+(n?' sandbox="allow-scripts"':"")+"></iframe>",buttons:{text:"Close",onclick:function(){this.parent().parent().close()}},onPostRender:function(){var r,i="";i+='<base href="'+e.documentBaseURI.getURI()+'">',tinymce.each(e.contentCSS,function(t){i+='<link type="text/css" rel="stylesheet" href="'+e.documentBaseURI.toAbsolute(t)+'">'});var o=t.body_id||"tinymce";o.indexOf("=")!=-1&&(o=e.getParam("body_id","","hash"),o=o[e.id]||o);var a=t.body_class||"";a.indexOf("=")!=-1&&(a=e.getParam("body_class","","hash"),a=a[e.id]||"");var s='<script>document.addEventListener && document.addEventListener("click", function(e) {for (var elm = e.target; elm; elm = elm.parentNode) {if (elm.nodeName === "A") {e.preventDefault();}}}, false);</script> ',l=e.settings.directionality?' dir="'+e.settings.directionality+'"':"";if(r="<!DOCTYPE html><html><head>"+i+'</head><body id="'+o+'" class="mce-content-body '+a+'"'+l+">"+e.getContent()+s+"</body></html>",n)this.getEl("body").firstChild.src="data:text/html;charset=utf-8,"+encodeURIComponent(r);else{var c=this.getEl("body").firstChild.contentWindow.document;c.open(),c.write(r),c.close()}}})}),e.addButton("preview",{title:"Preview",cmd:"mcePreview"}),e.addMenuItem("preview",{text:"Preview",cmd:"mcePreview",context:"view"})});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/print/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("print",function(e){e.addCommand("mcePrint",function(){e.getWin().print()}),e.addButton("print",{title:"Print",cmd:"mcePrint"}),e.addShortcut("Meta+P","","mcePrint"),e.addMenuItem("print",{text:"Print",cmd:"mcePrint",icon:"print",shortcut:"Meta+P",context:"file"})});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/save/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("save",function(e){function t(){var t;if(t=tinymce.DOM.getParent(e.id,"form"),!e.getParam("save_enablewhendirty",!0)||e.isDirty())return tinymce.triggerSave(),e.getParam("save_onsavecallback")?(e.execCallback("save_onsavecallback",e),void e.nodeChanged()):void(t?(e.setDirty(!1),t.onsubmit&&!t.onsubmit()||("function"==typeof t.submit?t.submit():n(e.translate("Error: Form submit field collision."))),e.nodeChanged()):n(e.translate("Error: No form element found.")))}function n(t){e.notificationManager.open({text:t,type:"error"})}function r(){var t=tinymce.trim(e.startContent);return e.getParam("save_oncancelcallback")?void e.execCallback("save_oncancelcallback",e):(e.setContent(t),e.undoManager.clear(),void e.nodeChanged())}function i(){var t=this;e.on("nodeChange dirty",function(){t.disabled(e.getParam("save_enablewhendirty",!0)&&!e.isDirty())})}e.addCommand("mceSave",t),e.addCommand("mceCancel",r),e.addButton("save",{icon:"save",text:"Save",cmd:"mceSave",disabled:!0,onPostRender:i}),e.addButton("cancel",{text:"Cancel",icon:!1,cmd:"mceCancel",disabled:!0,onPostRender:i}),e.addShortcut("Meta+S","","mceSave")});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/searchreplace/plugin.min.js
@@ -1,1 +1,1 @@
-
+!function(){function e(e){return e&&1==e.nodeType&&"false"===e.contentEditable}function t(t,n,r,i,o){function a(e,t){if(t=t||0,!e[0])throw"findAndReplaceDOMText cannot handle zero-length matches";var n=e.index;if(t>0){var r=e[t];if(!r)throw"Invalid capture group";n+=e[0].indexOf(r),e[0]=r}return[n,n+e[0].length,[e[0]]]}function s(t){var n;if(3===t.nodeType)return t.data;if(m[t.nodeName]&&!p[t.nodeName])return"";if(n="",e(t))return"\n";if((p[t.nodeName]||h[t.nodeName])&&(n+="\n"),t=t.firstChild)do n+=s(t);while(t=t.nextSibling);return n}function l(t,n,r){var i,o,a,s,l=[],c=0,u=t,d=n.shift(),f=0;e:for(;;){if((p[u.nodeName]||h[u.nodeName]||e(u))&&c++,3===u.nodeType&&(!o&&u.length+c>=d[1]?(o=u,s=d[1]-c):i&&l.push(u),!i&&u.length+c>d[0]&&(i=u,a=d[0]-c),c+=u.length),i&&o){if(u=r({startNode:i,startNodeIndex:a,endNode:o,endNodeIndex:s,innerNodes:l,match:d[2],matchIndex:f}),c-=o.length-s,i=null,o=null,l=[],d=n.shift(),f++,!d)break}else if(m[u.nodeName]&&!p[u.nodeName]||!u.firstChild){if(u.nextSibling){u=u.nextSibling;continue}}else if(!e(u)){u=u.firstChild;continue}for(;;){if(u.nextSibling){u=u.nextSibling;break}if(u.parentNode===t)break e;u=u.parentNode}}}function c(e){var t;if("function"!=typeof e){var n=e.nodeType?e:f.createElement(e);t=function(e,t){var r=n.cloneNode(!1);return r.setAttribute("data-mce-index",t),e&&r.appendChild(f.createTextNode(e)),r}}else t=e;return function(e){var n,r,i,o=e.startNode,a=e.endNode,s=e.matchIndex;if(o===a){var l=o;i=l.parentNode,e.startNodeIndex>0&&(n=f.createTextNode(l.data.substring(0,e.startNodeIndex)),i.insertBefore(n,l));var c=t(e.match[0],s);return i.insertBefore(c,l),e.endNodeIndex<l.length&&(r=f.createTextNode(l.data.substring(e.endNodeIndex)),i.insertBefore(r,l)),l.parentNode.removeChild(l),c}n=f.createTextNode(o.data.substring(0,e.startNodeIndex)),r=f.createTextNode(a.data.substring(e.endNodeIndex));for(var u=t(o.data.substring(e.startNodeIndex),s),d=[],p=0,m=e.innerNodes.length;p<m;++p){var h=e.innerNodes[p],g=t(h.data,s);h.parentNode.replaceChild(g,h),d.push(g)}var v=t(a.data.substring(0,e.endNodeIndex),s);return i=o.parentNode,i.insertBefore(n,o),i.insertBefore(u,o),i.removeChild(o),i=a.parentNode,i.insertBefore(v,a),i.insertBefore(r,a),i.removeChild(a),v}}var u,d,f,p,m,h,g=[],v=0;if(f=n.ownerDocument,p=o.getBlockElements(),m=o.getWhiteSpaceElements(),h=o.getShortEndedElements(),d=s(n)){if(t.global)for(;u=t.exec(d);)g.push(a(u,i));else u=d.match(t),g.push(a(u,i));return g.length&&(v=g.length,l(n,g,c(r))),v}}function n(e){function n(){function t(){o.statusbar.find("#next").disabled(!a(d+1).length),o.statusbar.find("#prev").disabled(!a(d-1).length)}function n(){e.windowManager.alert("Could not find the specified string.",function(){o.find("#find")[0].focus()})}var r,i={};r=tinymce.trim(e.selection.getContent({format:"text"}));var o=e.windowManager.open({layout:"flex",pack:"center",align:"center",onClose:function(){e.focus(),u.done()},onSubmit:function(e){var r,s,l,c;return e.preventDefault(),s=o.find("#case").checked(),c=o.find("#words").checked(),l=o.find("#find").value(),l.length?i.text==l&&i.caseState==s&&i.wholeWord==c?0===a(d+1).length?void n():(u.next(),void t()):(r=u.find(l,s,c),r||n(),o.statusbar.items().slice(1).disabled(0===r),t(),void(i={text:l,caseState:s,wholeWord:c})):(u.done(!1),void o.statusbar.items().slice(1).disabled(!0))},buttons:[{text:"Find",subtype:"primary",onclick:function(){o.submit()}},{text:"Replace",disabled:!0,onclick:function(){u.replace(o.find("#replace").value())||(o.statusbar.items().slice(1).disabled(!0),d=-1,i={})}},{text:"Replace all",disabled:!0,onclick:function(){u.replace(o.find("#replace").value(),!0,!0),o.statusbar.items().slice(1).disabled(!0),i={}}},{type:"spacer",flex:1},{text:"Prev",name:"prev",disabled:!0,onclick:function(){u.prev(),t()}},{text:"Next",name:"next",disabled:!0,onclick:function(){u.next(),t()}}],title:"Find and replace",items:{type:"form",padding:20,labelGap:30,spacing:10,items:[{type:"textbox",name:"find",size:40,label:"Find",value:r},{type:"textbox",name:"replace",size:40,label:"Replace with"},{type:"checkbox",name:"case",text:"Match case",label:" "},{type:"checkbox",name:"words",text:"Whole words",label:" "}]}})}function r(e){var t=e.getAttribute("data-mce-index");return"number"==typeof t?""+t:t}function i(n){var r,i;return i=e.dom.create("span",{"data-mce-bogus":1}),i.className="mce-match-marker",r=e.getBody(),u.done(!1),t(n,r,i,!1,e.schema)}function o(e){var t=e.parentNode;e.firstChild&&t.insertBefore(e.firstChild,e),e.parentNode.removeChild(e)}function a(t){var n,i=[];if(n=tinymce.toArray(e.getBody().getElementsByTagName("span")),n.length)for(var o=0;o<n.length;o++){var a=r(n[o]);null!==a&&a.length&&a===t.toString()&&i.push(n[o])}return i}function s(t){var n=d,r=e.dom;t=t!==!1,t?n++:n--,r.removeClass(a(d),"mce-match-marker-selected");var i=a(n);return i.length?(r.addClass(a(n),"mce-match-marker-selected"),e.selection.scrollIntoView(i[0]),n):-1}function l(t){var n=e.dom,r=t.parentNode;n.remove(t),n.isEmpty(r)&&n.remove(r)}function c(e){var t=r(e);return null!==t&&t.length>0}var u=this,d=-1;u.init=function(e){e.addMenuItem("searchreplace",{text:"Find and replace",shortcut:"Meta+F",onclick:n,separator:"before",context:"edit"}),e.addButton("searchreplace",{tooltip:"Find and replace",shortcut:"Meta+F",onclick:n}),e.addCommand("SearchReplace",n),e.shortcuts.add("Meta+F","",n)},u.find=function(e,t,n){e=e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&"),e=n?"\\b"+e+"\\b":e;var r=i(new RegExp(e,t?"g":"gi"));return r&&(d=-1,d=s(!0)),r},u.next=function(){var e=s(!0);e!==-1&&(d=e)},u.prev=function(){var e=s(!1);e!==-1&&(d=e)},u.replace=function(t,n,i){var s,f,p,m,h,g,v=d;for(n=n!==!1,p=e.getBody(),f=tinymce.grep(tinymce.toArray(p.getElementsByTagName("span")),c),s=0;s<f.length;s++){var b=r(f[s]);if(m=h=parseInt(b,10),i||m===d){for(t.length?(f[s].firstChild.nodeValue=t,o(f[s])):l(f[s]);f[++s];){if(m=parseInt(r(f[s]),10),m!==h){s--;break}l(f[s])}n&&v--}else h>d&&f[s].setAttribute("data-mce-index",h-1)}return e.undoManager.add(),d=v,n?(g=a(v+1).length>0,u.next()):(g=a(v-1).length>0,u.prev()),!i&&g},u.done=function(t){var n,i,a,s;for(i=tinymce.toArray(e.getBody().getElementsByTagName("span")),n=0;n<i.length;n++){var l=r(i[n]);null!==l&&l.length&&(l===d.toString()&&(a||(a=i[n].firstChild),s=i[n].firstChild),o(i[n]))}if(a&&s){var c=e.dom.createRng();return c.setStart(a,0),c.setEnd(s,s.data.length),t!==!1&&e.selection.setRng(c),c}}}tinymce.PluginManager.add("searchreplace",n)}();

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/spellchecker/plugin.min.js
@@ -1,1 +1,1 @@
-
+!function(e,t){"use strict";function n(e,t){for(var n,r=[],o=0;o<e.length;++o){if(n=a[e[o]]||i(e[o]),!n)throw"module definition dependecy not found: "+e[o];r.push(n)}t.apply(null,r)}function r(e,r,i){if("string"!=typeof e)throw"invalid module definition, module id must be defined and be a string";if(r===t)throw"invalid module definition, dependencies must be specified";if(i===t)throw"invalid module definition, definition function must be specified";n(r,function(){a[e]=i.apply(null,arguments)})}function i(t){for(var n=e,r=t.split(/[.\/]/),i=0;i<r.length;++i){if(!n[r[i]])return;n=n[r[i]]}return n}function o(n){var r,i,o,s,l;for(r=0;r<n.length;r++){i=e,o=n[r],s=o.split(/[.\/]/);for(var c=0;c<s.length-1;++c)i[s[c]]===t&&(i[s[c]]={}),i=i[s[c]];i[s[s.length-1]]=a[o]}if(e.AMDLC_TESTS){l=e.privateModules||{};for(o in a)l[o]=a[o];for(r=0;r<n.length;r++)delete l[n[r]];e.privateModules=l}}var a={};r("tinymce/spellcheckerplugin/DomTextMatcher",[],function(){function e(e){return e&&1==e.nodeType&&"false"===e.contentEditable}return function(t,n){function r(e,t){if(!e[0])throw"findAndReplaceDOMText cannot handle zero-length matches";return{start:e.index,end:e.index+e[0].length,text:e[0],data:t}}function i(t){var n;if(3===t.nodeType)return t.data;if(E[t.nodeName]&&!N[t.nodeName])return"";if(e(t))return"\n";if(n="",(N[t.nodeName]||S[t.nodeName])&&(n+="\n"),t=t.firstChild)do n+=i(t);while(t=t.nextSibling);return n}function o(t,n,r){var i,o,a,s,l,c=[],u=0,d=t,f=0;n=n.slice(0),n.sort(function(e,t){return e.start-t.start}),l=n.shift();e:for(;;){if((N[d.nodeName]||S[d.nodeName]||e(d))&&u++,3===d.nodeType&&(!o&&d.length+u>=l.end?(o=d,s=l.end-u):i&&c.push(d),!i&&d.length+u>l.start&&(i=d,a=l.start-u),u+=d.length),i&&o){if(d=r({startNode:i,startNodeIndex:a,endNode:o,endNodeIndex:s,innerNodes:c,match:l.text,matchIndex:f}),u-=o.length-s,i=null,o=null,c=[],l=n.shift(),f++,!l)break}else if(E[d.nodeName]&&!N[d.nodeName]||!d.firstChild){if(d.nextSibling){d=d.nextSibling;continue}}else if(!e(d)){d=d.firstChild;continue}for(;;){if(d.nextSibling){d=d.nextSibling;break}if(d.parentNode===t)break e;d=d.parentNode}}}function a(e){function t(t,n){var r=_[n];r.stencil||(r.stencil=e(r));var i=r.stencil.cloneNode(!1);return i.setAttribute("data-mce-index",n),t&&i.appendChild(k.doc.createTextNode(t)),i}return function(e){var n,r,i,o=e.startNode,a=e.endNode,s=e.matchIndex,l=k.doc;if(o===a){var c=o;i=c.parentNode,e.startNodeIndex>0&&(n=l.createTextNode(c.data.substring(0,e.startNodeIndex)),i.insertBefore(n,c));var u=t(e.match,s);return i.insertBefore(u,c),e.endNodeIndex<c.length&&(r=l.createTextNode(c.data.substring(e.endNodeIndex)),i.insertBefore(r,c)),c.parentNode.removeChild(c),u}n=l.createTextNode(o.data.substring(0,e.startNodeIndex)),r=l.createTextNode(a.data.substring(e.endNodeIndex));for(var d=t(o.data.substring(e.startNodeIndex),s),f=[],p=0,m=e.innerNodes.length;p<m;++p){var h=e.innerNodes[p],g=t(h.data,s);h.parentNode.replaceChild(g,h),f.push(g)}var v=t(a.data.substring(0,e.endNodeIndex),s);return i=o.parentNode,i.insertBefore(n,o),i.insertBefore(d,o),i.removeChild(o),i=a.parentNode,i.insertBefore(v,a),i.insertBefore(r,a),i.removeChild(a),v}}function s(e){var t=e.parentNode;t.insertBefore(e.firstChild,e),e.parentNode.removeChild(e)}function l(e){var n=t.getElementsByTagName("*"),r=[];e="number"==typeof e?""+e:null;for(var i=0;i<n.length;i++){var o=n[i],a=o.getAttribute("data-mce-index");null!==a&&a.length&&(a!==e&&null!==e||r.push(o))}return r}function c(e){for(var t=_.length;t--;)if(_[t]===e)return t;return-1}function u(e){var t=[];return d(function(n,r){e(n,r)&&t.push(n)}),_=t,this}function d(e){for(var t=0,n=_.length;t<n&&e(_[t],t)!==!1;t++);return this}function f(e){return _.length&&o(t,_,a(e)),this}function p(e,t){if(w&&e.global)for(;x=e.exec(w);)_.push(r(x,t));return this}function m(e){var t,n=l(e?c(e):null);for(t=n.length;t--;)s(n[t]);return this}function h(e){return _[e.getAttribute("data-mce-index")]}function g(e){return l(c(e))[0]}function v(e,t,n){return _.push({start:e,end:e+t,text:w.substr(e,t),data:n}),this}function b(e){var t=l(c(e)),r=n.dom.createRng();return r.setStartBefore(t[0]),r.setEndAfter(t[t.length-1]),r}function y(e,t){var r=b(e);return r.deleteContents(),t.length>0&&r.insertNode(n.dom.doc.createTextNode(t)),r}function C(){return _.splice(0,_.length),m(),this}var x,w,N,E,S,_=[],k=n.dom;return N=n.schema.getBlockElements(),E=n.schema.getWhiteSpaceElements(),S=n.schema.getShortEndedElements(),w=i(t),{text:w,matches:_,each:d,filter:u,reset:C,matchFromElement:h,elementFromMatch:g,find:p,add:v,wrap:f,unwrap:m,replace:y,rangeFromMatch:b,indexOf:c}}}),r("tinymce/spellcheckerplugin/Plugin",["tinymce/spellcheckerplugin/DomTextMatcher","tinymce/PluginManager","tinymce/util/Tools","tinymce/ui/Menu","tinymce/dom/DOMUtils","tinymce/util/XHR","tinymce/util/URI","tinymce/util/JSON"],function(e,t,n,r,i,o,a,s){t.add("spellchecker",function(l,c){function u(){return B.textMatcher||(B.textMatcher=new e(l.getBody(),l)),B.textMatcher}function d(e,t){var r=[];return n.each(t,function(e){r.push({selectable:!0,text:e.name,data:e.value})}),r}function f(e){for(var t in e)return!1;return!0}function p(e,t){var o=[],a=k[e];n.each(a,function(e){o.push({text:e,onclick:function(){l.insertContent(l.dom.encode(e)),l.dom.remove(t),b()}})}),o.push({text:"-"}),A&&o.push({text:"Add to Dictionary",onclick:function(){y(e,t)}}),o.push.apply(o,[{text:"Ignore",onclick:function(){C(e,t)}},{text:"Ignore all",onclick:function(){C(e,t,!0)}}]),R=new r({items:o,context:"contextmenu",onautohide:function(e){e.target.className.indexOf("spellchecker")!=-1&&e.preventDefault()},onhide:function(){R.remove(),R=null}}),R.renderTo(document.body);var s=i.DOM.getPos(l.getContentAreaContainer()),c=l.dom.getPos(t[0]),u=l.dom.getRoot();"BODY"==u.nodeName?(c.x-=u.ownerDocument.documentElement.scrollLeft||u.scrollLeft,c.y-=u.ownerDocument.documentElement.scrollTop||u.scrollTop):(c.x-=u.scrollLeft,c.y-=u.scrollTop),s.x+=c.x,s.y+=c.y,R.moveTo(s.x,s.y+t[0].offsetHeight)}function m(){return l.getParam("spellchecker_wordchar_pattern")||new RegExp('[^\\s!"#$%&()*+,-./:;<=>?@[\\]^_{|}`\xa7\xa9\xab\xae\xb1\xb6\xb7\xb8\xbb\xbc\xbd\xbe\xbf\xd7\xf7\xa4\u201d\u201c\u201e\xa0\u2002\u2003\u2009]+',"g")}function h(e,t,r,i){var u={method:e,lang:P.spellchecker_language},d="";u["addToDictionary"==e?"word":"text"]=t,n.each(u,function(e,t){d&&(d+="&"),d+=t+"="+encodeURIComponent(e)}),o.send({url:new a(c).toAbsolute(P.spellchecker_rpc_url),type:"post",content_type:"application/x-www-form-urlencoded",data:d,success:function(e){if(e=s.parse(e))e.error?i(e.error):r(e);else{var t=l.translate("Server response wasn't proper JSON.");i(t)}},error:function(){var e=l.translate("The spelling service was not found: (")+P.spellchecker_rpc_url+l.translate(")");i(e)}})}function g(e,t,n,r){var i=P.spellchecker_callback||h;i.call(B,e,t,n,r)}function v(){function e(e){l.notificationManager.open({text:e,type:"error"}),l.setProgressState(!1),x()}x()||(l.setProgressState(!0),g("spellcheck",u().text,S,e),l.focus())}function b(){l.dom.select("span.mce-spellchecker-word").length||x()}function y(e,t){l.setProgressState(!0),g("addToDictionary",e,function(){l.setProgressState(!1),l.dom.remove(t,!0),b()},function(e){l.notificationManager.open({text:e,type:"error"}),l.setProgressState(!1)})}function C(e,t,r){l.selection.collapse(),r?n.each(l.dom.select("span.mce-spellchecker-word"),function(t){t.getAttribute("data-mce-word")==e&&l.dom.remove(t,!0)}):l.dom.remove(t,!0),b()}function x(){if(u().reset(),B.textMatcher=null,T)return T=!1,l.fire("SpellcheckEnd"),!0}function w(e){var t=e.getAttribute("data-mce-index");return"number"==typeof t?""+t:t}function N(e){var t,r=[];if(t=n.toArray(l.getBody().getElementsByTagName("span")),t.length)for(var i=0;i<t.length;i++){var o=w(t[i]);null!==o&&o.length&&o===e.toString()&&r.push(t[i])}return r}function E(e){var t=P.spellchecker_language;e.control.items().each(function(e){e.active(e.settings.data===t)})}function S(e){var t;if(e.words?(A=!!e.dictionary,t=e.words):t=e,l.setProgressState(!1),f(t)){var n=l.translate("No misspellings found.");return l.notificationManager.open({text:n,type:"info"}),void(T=!1)}k=t,u().find(m()).filter(function(e){return!!t[e.text]}).wrap(function(e){return l.dom.create("span",{"class":"mce-spellchecker-word","data-mce-bogus":1,"data-mce-word":e.text})}),T=!0,l.fire("SpellcheckStart")}var _,k,T,R,A,B=this,P=l.settings;if(/(^|[ ,])tinymcespellchecker([, ]|$)/.test(P.plugins)&&t.get("tinymcespellchecker"))return void("undefined"!=typeof console&&console.log&&console.log("Spell Checker Pro is incompatible with Spell Checker plugin! Remove 'spellchecker' from the 'plugins' option."));var D=P.spellchecker_languages||"English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr_FR,German=de,Italian=it,Polish=pl,Portuguese=pt_BR,Spanish=es,Swedish=sv";_=d("Language",n.map(D.split(","),function(e){return e=e.split("="),{name:e[0],value:e[1]}})),l.on("click",function(e){var t=e.target;if("mce-spellchecker-word"==t.className){e.preventDefault();var n=N(w(t));if(n.length>0){var r=l.dom.createRng();r.setStartBefore(n[0]),r.setEndAfter(n[n.length-1]),l.selection.setRng(r),p(t.getAttribute("data-mce-word"),n)}}}),l.addMenuItem("spellchecker",{text:"Spellcheck",context:"tools",onclick:v,selectable:!0,onPostRender:function(){var e=this;e.active(T),l.on("SpellcheckStart SpellcheckEnd",function(){e.active(T)})}});var M={tooltip:"Spellcheck",onclick:v,onPostRender:function(){var e=this;l.on("SpellcheckStart SpellcheckEnd",function(){e.active(T)})}};_.length>1&&(M.type="splitbutton",M.menu=_,M.onshow=E,M.onselect=function(e){P.spellchecker_language=e.control.settings.data}),l.addButton("spellchecker",M),l.addCommand("mceSpellCheck",v),l.on("remove",function(){R&&(R.remove(),R=null)}),l.on("change",b),this.getTextMatcher=u,this.getWordCharPattern=m,this.markErrors=S,this.getLanguage=function(){return P.spellchecker_language},P.spellchecker_language=P.spellchecker_language||P.language||"en"})}),o(["tinymce/spellcheckerplugin/DomTextMatcher"])}(window);

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/tabfocus/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("tabfocus",function(e){function t(e){9!==e.keyCode||e.ctrlKey||e.altKey||e.metaKey||e.preventDefault()}function n(t){function n(n){function o(e){return"BODY"===e.nodeName||"hidden"!=e.type&&"none"!=e.style.display&&"hidden"!=e.style.visibility&&o(e.parentNode)}function l(e){return/INPUT|TEXTAREA|BUTTON/.test(e.tagName)&&tinymce.get(t.id)&&e.tabIndex!=-1&&o(e)}if(s=r.select(":input:enabled,*[tabindex]:not(iframe)"),i(s,function(t,n){if(t.id==e.id)return a=n,!1}),n>0){for(c=a+1;c<s.length;c++)if(l(s[c]))return s[c]}else for(c=a-1;c>=0;c--)if(l(s[c]))return s[c];return null}var a,s,l,c;if(!(9!==t.keyCode||t.ctrlKey||t.altKey||t.metaKey||t.isDefaultPrevented())&&(l=o(e.getParam("tab_focus",e.getParam("tabfocus_elements",":prev,:next"))),1==l.length&&(l[1]=l[0],l[0]=":prev"),s=t.shiftKey?":prev"==l[0]?n(-1):r.get(l[0]):":next"==l[1]?n(1):r.get(l[1]))){var u=tinymce.get(s.id||s.name);s.id&&u?u.focus():tinymce.util.Delay.setTimeout(function(){tinymce.Env.webkit||window.focus(),s.focus()},10),t.preventDefault()}}var r=tinymce.DOM,i=tinymce.each,o=tinymce.explode;e.on("init",function(){e.inline&&tinymce.DOM.setAttrib(e.getBody(),"tabIndex",null),e.on("keyup",t),tinymce.Env.gecko?e.on("keypress keydown",n):e.on("keydown",n)})});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/table/plugin.min.js
@@ -1,1 +1,2 @@
-
+!function(e,t){"use strict";function n(e,t){for(var n,r=[],a=0;a<e.length;++a){if(n=o[e[a]]||i(e[a]),!n)throw"module definition dependecy not found: "+e[a];r.push(n)}t.apply(null,r)}function r(e,r,i){if("string"!=typeof e)throw"invalid module definition, module id must be defined and be a string";if(r===t)throw"invalid module definition, dependencies must be specified";if(i===t)throw"invalid module definition, definition function must be specified";n(r,function(){o[e]=i.apply(null,arguments)})}function i(t){for(var n=e,r=t.split(/[.\/]/),i=0;i<r.length;++i){if(!n[r[i]])return;n=n[r[i]]}return n}var o={};r("tinymce/tableplugin/Utils",["tinymce/Env"],function(e){function t(t){(!e.ie||e.ie>9)&&(t.hasChildNodes()||(t.innerHTML='<br data-mce-bogus="1" />'))}var n=function(e){return function(t,n){t&&(n=parseInt(n,10),1===n||0===n?t.removeAttribute(e,1):t.setAttribute(e,n,1))}},r=function(e){return function(t){return parseInt(t.getAttribute(e)||1,10)}};return{setColSpan:n("colSpan"),setRowSpan:n("rowspan"),getColSpan:r("colSpan"),getRowSpan:r("rowSpan"),setSpanVal:function(e,t,r){n(t)(e,r)},getSpanVal:function(e,t){return r(t)(e)},paddCell:t}}),r("tinymce/tableplugin/SplitCols",["tinymce/util/Tools","tinymce/tableplugin/Utils"],function(e,t){var n=function(e,t,n){return e[n]?e[n][t]:null},r=function(e,t,r){var i=n(e,t,r);return i?i.elm:null},i=function(e,t,i,o){var a,s,l=0,c=r(e,t,i);for(a=i;(o>0?a<e.length:a>=0)&&(s=n(e,t,a),c===s.elm);a+=o)l++;return l},o=function(e,t,n){for(var r,i=e[n],o=t;o<i.length;o++)if(r=i[o],r.real)return r.elm;return null},a=function(e,n){for(var r,o=[],a=e[n],s=0;s<a.length;s++)r=a[s],o.push({elm:r.elm,above:i(e,s,n,-1)-1,below:i(e,s,n,1)-1}),s+=t.getColSpan(r.elm)-1;return o},s=function(e,n){var r=e.elm.ownerDocument,i=r.createElement("td");return t.setColSpan(i,t.getColSpan(e.elm)),t.setRowSpan(i,n),t.paddCell(i),i},l=function(e,t,n,r){var i=o(e,n+1,r);i?i.parentNode.insertBefore(t,i):(i=o(e,0,r),i.parentNode.appendChild(t))},c=function(e,n,r,i){if(0!==n.above){t.setRowSpan(n.elm,n.above);var o=s(n,n.below+1);return l(e,o,r,i),o}return null},u=function(e,n,r,i){if(0!==n.below){t.setRowSpan(n.elm,n.above+1);var o=s(n,n.below);return l(e,o,r,i+1),o}return null},d=function(t,n,i,o){var s=a(t,i),l=r(t,n,i).parentNode,d=[];return e.each(s,function(e,n){var r=o?c(t,e,n,i):u(t,e,n,i);null!==r&&d.push(d)}),{cells:d,row:l}};return{splitAt:d}}),r("tinymce/tableplugin/TableGrid",["tinymce/util/Tools","tinymce/Env","tinymce/tableplugin/Utils","tinymce/tableplugin/SplitCols"],function(e,n,r,i){var o=e.each,a=r.getSpanVal,s=r.setSpanVal;return function(l,c,u){function d(){l.$("td[data-mce-selected],th[data-mce-selected]").removeAttr("data-mce-selected")}function f(e){return e===l.getBody()}function p(t,n){return t?(n=e.map(n.split(","),function(e){return e.toLowerCase()}),e.grep(t.childNodes,function(t){return e.inArray(n,t.nodeName.toLowerCase())!==-1})):[]}function m(){var e=0;Q=[],Z=0,o(["thead","tbody","tfoot"],function(t){var n=p(c,t)[0],r=p(n,"tr");o(r,function(n,r){r+=e,o(p(n,"td,th"),function(e,n){var i,o,s,l;if(Q[r])for(;Q[r][n];)n++;for(s=a(e,"rowspan"),l=a(e,"colspan"),o=r;o<r+s;o++)for(Q[o]||(Q[o]=[]),i=n;i<n+l;i++)Q[o][i]={part:t,real:o==r&&i==n,elm:e,rowspan:s,colspan:l};Z=Math.max(Z,n+1)})}),e+=r.length})}function h(e){return l.fire("newrow",{node:e}),e}function g(e){return l.fire("newcell",{node:e}),e}function v(e,t){return e=e.cloneNode(t),e.removeAttribute("id"),e}function b(e,t){var n;if(n=Q[t])return n[e]}function y(e,t){return e[t]?e[t]:null}function C(e,t){for(var n=[],r=0;r<e.length;r++)n.push(b(t,r));return n}function x(e){return e&&(!!re.getAttrib(e.elm,"data-mce-selected")||e==u)}function w(){var e=[];return o(c.rows,function(t){o(t.cells,function(n){if(re.getAttrib(n,"data-mce-selected")||u&&n==u.elm)return e.push(t),!1})}),e}function N(){var e=0;return o(Q,function(t){if(o(t,function(t){x(t)&&e++}),e)return!1}),e}function E(){var e=re.createRng();f(c)||(e.setStartAfter(c),e.setEndAfter(c),ne.setRng(e),re.remove(c))}function S(t){var i,a={};return l.settings.table_clone_elements!==!1&&(a=e.makeMap((l.settings.table_clone_elements||"strong em b i span font h1 h2 h3 h4 h5 h6 p div").toUpperCase(),/[ ,]/)),e.walk(t,function(e){var r;if(3==e.nodeType)return o(re.getParents(e.parentNode,null,t).reverse(),function(e){a[e.nodeName]&&(e=v(e,!1),i?r&&r.appendChild(e):i=r=e,r=e)}),r&&(r.innerHTML=n.ie&&n.ie<10?"&nbsp;":'<br data-mce-bogus="1" />'),!1},"childNodes"),t=v(t,!1),g(t),s(t,"rowSpan",1),s(t,"colSpan",1),i?t.appendChild(i):r.paddCell(t),t}function _(){var e,t=re.createRng();return o(re.select("tr",c),function(e){0===e.cells.length&&re.remove(e)}),0===re.select("tr",c).length?(t.setStartBefore(c),t.setEndBefore(c),ne.setRng(t),void re.remove(c)):(o(re.select("thead,tbody,tfoot",c),function(e){0===e.rows.length&&re.remove(e)}),m(),void(ee&&(e=Q[Math.min(Q.length-1,ee.y)],e&&(ne.select(e[Math.min(e.length-1,ee.x)].elm,!0),ne.collapse(!0)))))}function k(e,t,n,r){var i,o,a,s,l;for(i=Q[t][e].elm.parentNode,a=1;a<=n;a++)if(i=re.getNext(i,"tr")){for(o=e;o>=0;o--)if(l=Q[t+a][o].elm,l.parentNode==i){for(s=1;s<=r;s++)re.insertAfter(S(l),l);break}if(o==-1)for(s=1;s<=r;s++)i.insertBefore(S(i.cells[0]),i.cells[0])}}function T(){o(Q,function(e,t){o(e,function(e,n){var r,i,o;if(x(e)&&(e=e.elm,r=a(e,"colspan"),i=a(e,"rowspan"),r>1||i>1)){for(s(e,"rowSpan",1),s(e,"colSpan",1),o=0;o<r-1;o++)re.insertAfter(S(e),e);k(n,t,i-1,r)}})})}function R(e,t,n){for(var r=[],i=0;i<e.length;i++)(i<t||i>n)&&r.push(e[i]);return r}function A(t){return e.grep(t,function(e){return e.real===!1})}function B(e){for(var t=[],n=0;n<e.length;n++){var r=e[n].elm;t[t.length-1]!==r&&t.push(r)}return t}function P(t,n,i,o,a){var s=0;if(a-i<1)return 0;for(var l=i+1;l<=a;l++){var c=R(y(t,l),n,o),u=A(c);c.length===u.length&&(e.each(B(u),function(e){r.setRowSpan(e,r.getRowSpan(e)-1)}),s++)}return s}function D(t,n,i,o,a){var s=0;if(o-n<1)return 0;for(var l=n+1;l<=o;l++){var c=R(C(t,l),i,a),u=A(c);c.length===u.length&&(e.each(B(u),function(e){r.setColSpan(e,r.getColSpan(e)-1)}),s++)}return s}function M(t,n,r){var i,a,l,c,u,d,f,p,h,g,v,y,C;if(t?(i=q(t),a=i.x,l=i.y,c=a+(n-1),u=l+(r-1)):(ee=te=null,o(Q,function(e,t){o(e,function(e,n){x(e)&&(ee||(ee={x:n,y:t}),te={x:n,y:t})})}),ee&&(a=ee.x,l=ee.y,c=te.x,u=te.y)),p=b(a,l),h=b(c,u),p&&h&&p.part==h.part){T(),m(),y=P(Q,a,l,c,u),C=D(Q,a,l,c,u),p=b(a,l).elm;var w=c-a-C+1,N=u-l-y+1;for(w===Z&&N===Q.length&&(w=1,N=1),w===Z&&N>1&&(N=1),s(p,"colSpan",w),s(p,"rowSpan",N),f=l;f<=u;f++)for(d=a;d<=c;d++)Q[f]&&Q[f][d]&&(t=Q[f][d].elm,t!=p&&(g=e.grep(t.childNodes),o(g,function(e){p.appendChild(e)}),g.length&&(g=e.grep(p.childNodes),v=0,o(g,function(e){"BR"==e.nodeName&&v++<g.length-1&&p.removeChild(e)})),re.remove(t)));_()}}function L(e){var n,r,i,l,c,u,d,f,p,m;if(o(Q,function(r,i){if(o(r,function(t){if(x(t)&&(t=t.elm,c=t.parentNode,u=h(v(c,!1)),n=i,e))return!1}),e)return n===t}),n!==t){for(l=0,m=0;l<Q[0].length;l+=m)if(Q[n][l]&&(r=Q[n][l].elm,m=a(r,"colspan"),r!=i)){if(e){if(n>0&&Q[n-1][l]&&(f=Q[n-1][l].elm,p=a(f,"rowSpan"),p>1)){s(f,"rowSpan",p+1);continue}}else if(p=a(r,"rowspan"),p>1){s(r,"rowSpan",p+1);continue}d=S(r),s(d,"colSpan",r.colSpan),u.appendChild(d),i=r}u.hasChildNodes()&&(e?c.parentNode.insertBefore(u,c):re.insertAfter(u,c))}}function I(e,t){t=t||w().length||1;for(var n=0;n<t;n++)L(e)}function O(e){var n,r;o(Q,function(r){if(o(r,function(t,r){if(x(t)&&(n=r,e))return!1}),e)return n===t}),o(Q,function(t,i){var o,l,c;t[n]&&(o=t[n].elm,o!=r&&(c=a(o,"colspan"),l=a(o,"rowspan"),1==c?e?(o.parentNode.insertBefore(S(o),o),k(n,i,l-1,c)):(re.insertAfter(S(o),o),k(n,i,l-1,c)):s(o,"colSpan",o.colSpan+1),r=o))})}function H(e,t){t=t||N()||1;for(var n=0;n<t;n++)O(e)}function F(t){return e.grep(z(t),x)}function z(e){var t=[];return o(e,function(e){o(e,function(e){t.push(e)})}),t}function W(){var t=[];if(f(c)){if(1==Q[0].length)return;if(F(Q).length==z(Q).length)return}o(Q,function(n){o(n,function(n,r){x(n)&&e.inArray(t,r)===-1&&(o(Q,function(e){var t,n=e[r].elm;t=a(n,"colSpan"),t>1?s(n,"colSpan",t-1):re.remove(n)}),t.push(r))})}),_()}function U(){function e(e){var t,n;o(e.cells,function(e){var n=a(e,"rowSpan");n>1&&(s(e,"rowSpan",n-1),t=q(e),k(t.x,t.y,1,1))}),t=q(e.cells[0]),o(Q[t.y],function(e){var t;e=e.elm,e!=n&&(t=a(e,"rowSpan"),t<=1?re.remove(e):s(e,"rowSpan",t-1),n=e)})}var t;t=w(),f(c)&&t.length==c.rows.length||(o(t.reverse(),function(t){e(t)}),_())}function V(){var e=w();if(!f(c)||e.length!=c.rows.length)return re.remove(e),_(),e}function $(){var e=w();return o(e,function(t,n){e[n]=v(t,!0)}),e}function j(t,n){var r,a,l;t&&(r=i.splitAt(Q,ee.x,ee.y,n),a=r.row,e.each(r.cells,g),l=e.map(t,function(e){return e.cloneNode(!0)}),n||l.reverse(),o(l,function(e){var t,r,i=e.cells.length;for(h(e),t=0;t<i;t++)r=e.cells[t],g(r),s(r,"colSpan",1),s(r,"rowSpan",1);for(t=i;t<Z;t++)e.appendChild(g(S(e.cells[i-1])));for(t=Z;t<i;t++)re.remove(e.cells[t]);n?a.parentNode.insertBefore(e,a):re.insertAfter(e,a)}),d())}function q(e){var t;return o(Q,function(n,r){return o(n,function(n,i){if(n.elm==e)return t={x:i,y:r},!1}),!t}),t}function Y(e){ee=q(e)}function X(){var e,t;return e=t=0,o(Q,function(n,r){o(n,function(n,i){var o,a;x(n)&&(n=Q[r][i],i>e&&(e=i),r>t&&(t=r),n.real&&(o=n.colspan-1,a=n.rowspan-1,o&&i+o>e&&(e=i+o),a&&r+a>t&&(t=r+a)))})}),{x:e,y:t}}function K(e){var t,n,r,i,o,a,s,l,c,u;if(te=q(e),ee&&te){for(t=Math.min(ee.x,te.x),n=Math.min(ee.y,te.y),r=Math.max(ee.x,te.x),i=Math.max(ee.y,te.y),o=r,a=i,u=n;u<=i;u++)for(c=t;c<=r;c++)e=Q[u][c],e.real&&(s=e.colspan-1,l=e.rowspan-1,s&&c+s>o&&(o=c+s),l&&u+l>a&&(a=u+l));for(d(),u=n;u<=a;u++)for(c=t;c<=o;c++)Q[u][c]&&re.setAttrib(Q[u][c].elm,"data-mce-selected","1")}}function G(e,t){var n,r,i;n=q(e),r=n.y*Z+n.x;do{if(r+=t,i=b(r%Z,Math.floor(r/Z)),!i)break;if(i.elm!=e)return ne.select(i.elm,!0),re.isEmpty(i.elm)&&ne.collapse(!0),!0}while(i.elm==e);return!1}function J(t){if(ee){var n=i.splitAt(Q,ee.x,ee.y,t);e.each(n.cells,g)}}var Q,Z,ee,te,ne=l.selection,re=ne.dom;c=c||re.getParent(ne.getStart(!0),"table"),m(),u=u||re.getParent(ne.getStart(!0),"th,td"),u&&(ee=q(u),te=X(),u=b(ee.x,ee.y)),e.extend(this,{deleteTable:E,split:T,merge:M,insertRow:L,insertRows:I,insertCol:O,insertCols:H,splitCols:J,deleteCols:W,deleteRows:U,cutRows:V,copyRows:$,pasteRows:j,getPos:q,setStartCell:Y,setEndCell:K,moveRelIdx:G,refresh:m})}}),r("tinymce/tableplugin/Quirks",["tinymce/util/VK","tinymce/util/Delay","tinymce/Env","tinymce/util/Tools","tinymce/tableplugin/Utils"],function(e,t,n,r,i){var o=r.each,a=i.getSpanVal;return function(s){function l(){function n(n){function r(e,t){var r=e?"previousSibling":"nextSibling",o=s.dom.getParent(t,"tr"),a=o[r];if(a)return v(s,t,a,e),n.preventDefault(),!0;var l=s.dom.getParent(o,"table"),d=o.parentNode,f=d.nodeName.toLowerCase();if("tbody"===f||f===(e?"tfoot":"thead")){var p=i(e,l,d,"tbody");if(null!==p)return c(e,p,t)}return u(e,o,r,l)}function i(e,t,n,r){var i=s.dom.select(">"+r,t),o=i.indexOf(n);if(e&&0===o||!e&&o===i.length-1)return l(e,t);if(o===-1){var a="thead"===n.tagName.toLowerCase()?0:i.length-1;return i[a]}return i[o+(e?-1:1)]}function l(e,t){var n=e?"thead":"tfoot",r=s.dom.select(">"+n,t);return 0!==r.length?r[0]:null}function c(e,t,r){var i=d(t,e);return i&&v(s,r,i,e),n.preventDefault(),!0}function u(e,t,i,o){var a=o[i];if(a)return f(a),!0;var l=s.dom.getParent(o,"td,th");if(l)return r(e,l,n);var c=d(t,!e);return f(c),n.preventDefault(),!1}function d(e,t){var n=e&&e[t?"lastChild":"firstChild"];return n&&"BR"===n.nodeName?s.dom.getParent(n,"td,th"):n}function f(e){s.selection.setCursorLocation(e,0)}function p(){return C==e.UP||C==e.DOWN}function m(e){var t=e.selection.getNode(),n=e.dom.getParent(t,"tr");return null!==n}function h(e){for(var t=0,n=e;n.previousSibling;)n=n.previousSibling,t+=a(n,"colspan");return t}function g(e,t){var n=0,r=0;return o(e.children,function(e,i){if(n+=a(e,"colspan"),r=i,n>t)return!1}),r}function v(e,t,n,r){var i=h(s.dom.getParent(t,"td,th")),o=g(n,i),a=n.childNodes[o],l=d(a,r);f(l||a)}function b(e){var t=s.selection.getNode(),n=s.dom.getParent(t,"td,th"),r=s.dom.getParent(e,"td,th");return n&&n!==r&&y(n,r)}function y(e,t){return s.dom.getParent(e,"TABLE")===s.dom.getParent(t,"TABLE")}var C=n.keyCode;if(p()&&m(s)){var x=s.selection.getNode();t.setEditorTimeout(s,function(){b(x)&&r(!n.shiftKey&&C===e.UP,x,n)},0)}}s.on("KeyDown",function(e){n(e)})}function c(){function e(e,t){var n,r=t.ownerDocument,i=r.createRange();return i.setStartBefore(t),i.setEnd(e.endContainer,e.endOffset),n=r.createElement("body"),n.appendChild(i.cloneContents()),0===n.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi,"-").replace(/<[^>]+>/g,"").length}s.on("KeyDown",function(t){var n,r,i=s.dom;37!=t.keyCode&&38!=t.keyCode||(n=s.selection.getRng(),r=i.getParent(n.startContainer,"table"),r&&s.getBody().firstChild==r&&e(n,r)&&(n=i.createRng(),n.setStartBefore(r),n.setEndBefore(r),s.selection.setRng(n),t.preventDefault()))})}function u(){s.on("KeyDown SetContent VisualAid",function(){var e;for(e=s.getBody().lastChild;e;e=e.previousSibling)if(3==e.nodeType){if(e.nodeValue.length>0)break}else if(1==e.nodeType&&("BR"==e.tagName||!e.getAttribute("data-mce-bogus")))break;e&&"TABLE"==e.nodeName&&(s.settings.forced_root_block?s.dom.add(s.getBody(),s.settings.forced_root_block,s.settings.forced_root_block_attrs,n.ie&&n.ie<10?"&nbsp;":'<br data-mce-bogus="1" />'):s.dom.add(s.getBody(),"br",{"data-mce-bogus":"1"}))}),s.on("PreProcess",function(e){var t=e.node.lastChild;t&&("BR"==t.nodeName||1==t.childNodes.length&&("BR"==t.firstChild.nodeName||"\xa0"==t.firstChild.nodeValue))&&t.previousSibling&&"TABLE"==t.previousSibling.nodeName&&s.dom.remove(t)})}function d(){function e(e,t,n,r){var i,o,a,s=3,l=e.dom.getParent(t.startContainer,"TABLE");return l&&(i=l.parentNode),o=t.startContainer.nodeType==s&&0===t.startOffset&&0===t.endOffset&&r&&("TR"==n.nodeName||n==i),a=("TD"==n.nodeName||"TH"==n.nodeName)&&!r,o||a}function t(){var t=s.selection.getRng(),n=s.selection.getNode(),r=s.dom.getParent(t.startContainer,"TD,TH");if(e(s,t,n,r)){r||(r=n);for(var i=r.lastChild;i.lastChild;)i=i.lastChild;3==i.nodeType&&(t.setEnd(i,i.data.length),s.selection.setRng(t))}}s.on("KeyDown",function(){t()}),s.on("MouseDown",function(e){2!=e.button&&t()})}function f(){function t(e){s.selection.select(e,!0),s.selection.collapse(!0)}function n(e){s.$(e).empty(),i.paddCell(e)}s.on("keydown",function(i){if((i.keyCode==e.DELETE||i.keyCode==e.BACKSPACE)&&!i.isDefaultPrevented()){var o,a,l,c;if(o=s.dom.getParent(s.selection.getStart(),"table")){if(a=s.dom.select("td,th",o),l=r.grep(a,function(e){return!!s.dom.getAttrib(e,"data-mce-selected")}),0===l.length)return c=s.dom.getParent(s.selection.getStart(),"td,th"),void(s.selection.isCollapsed()&&c&&s.dom.isEmpty(c)&&(i.preventDefault(),n(c),t(c)));i.preventDefault(),s.undoManager.transact(function(){a.length==l.length?s.execCommand("mceTableDelete"):(r.each(l,n),t(l[0]))})}}})}function p(){var t=function(e){return e&&"CAPTION"==e.nodeName&&"TABLE"==e.parentNode.nodeName},r=function(e,t){var n=s.selection.getRng(),r=e.ownerDocument.createTextNode("\xa0");n.startOffset?e.insertBefore(r,e.firstChild):e.appendChild(r),t&&(s.selection.select(r,!0),s.selection.collapse(!0))},i=function(t){return(t.keyCode==e.DELETE||t.keyCode==e.BACKSPACE)&&!t.isDefaultPrevented()},o=function(e){return e.firstChild===e.lastChild&&e.firstChild},a=function(e){return e&&3===e.nodeType},l=function(e){var t=o(e);return a(t)&&1===t.data.length?t.data:null},c=function(e){var t=o(e),n=l(e);return t&&!a(t)||n&&!d(n)},u=function(e){return s.dom.isEmpty(e)||d(l(e))},d=function(e){return"\xa0"===e};s.on("keydown",function(e){if(i(e)){var o=s.dom.getParent(s.selection.getStart(),"caption");t(o)&&(n.ie&&(s.selection.isCollapsed()?c(o)&&r(o):(s.undoManager.transact(function(){s.execCommand("Delete"),u(o)&&r(o,!0)}),e.preventDefault())),u(o)&&e.preventDefault())}})}f(),p(),n.webkit&&(l(),d()),n.gecko&&(c(),u()),n.ie>9&&(c(),u())}}),r("tinymce/tableplugin/CellSelection",["tinymce/tableplugin/TableGrid","tinymce/dom/TreeWalker","tinymce/util/Tools"],function(e,t,n){return function(r,i){function o(e){r.getBody().style.webkitUserSelect="",(e||h)&&(r.$("td[data-mce-selected],th[data-mce-selected]").removeAttr("data-mce-selected"),h=!1)}function a(e,t){return!(!e||!t)&&e===m.getParent(t,"table")}function s(t){var n,o,s=t.target;if(!f&&!p&&s!==d&&(d=s,u&&c)){if(o=m.getParent(s,"td,th"),a(u,o)||(o=m.getParent(u,"td,th")),c===o&&!h)return;if(i(!0),a(u,o)){t.preventDefault(),l||(l=new e(r,u,c),r.getBody().style.webkitUserSelect="none"),l.setEndCell(o),h=!0,n=r.selection.getSel();try{n.removeAllRanges?n.removeAllRanges():n.empty()}catch(e){}}}}var l,c,u,d,f,p,m=r.dom,h=!0,g=function(){c=l=u=d=null,i(!1)};return r.on("SelectionChange",function(e){h&&e.stopImmediatePropagation()},!0),r.on("MouseDown",function(e){2==e.button||f||p||(o(),c=m.getParent(e.target,"td,th"),u=m.getParent(c,"table"))}),r.on("mouseover",s),r.on("remove",function(){m.unbind(r.getDoc(),"mouseover",s),o()}),r.on("MouseUp",function(){function e(e,r){var o=new t(e,e);do{if(3==e.nodeType&&0!==n.trim(e.nodeValue).length)return void(r?i.setStart(e,0):i.setEnd(e,e.nodeValue.length));if("BR"==e.nodeName)return void(r?i.setStartBefore(e):i.setEndBefore(e))}while(e=r?o.next():o.prev())}var i,o,a,s,u,d=r.selection;if(c){if(l&&(r.getBody().style.webkitUserSelect=""),o=m.select("td[data-mce-selected],th[data-mce-selected]"),o.length>0){i=m.createRng(),s=o[0],i.setStartBefore(s),i.setEndAfter(s),e(s,1),a=new t(s,m.getParent(o[0],"table"));do if("TD"==s.nodeName||"TH"==s.nodeName){if(!m.getAttrib(s,"data-mce-selected"))break;u=s}while(s=a.next());e(u),d.setRng(i)}r.nodeChanged(),g()}}),r.on("KeyUp Drop SetContent",function(e){o("setcontent"==e.type),g(),f=!1}),r.on("ObjectResizeStart ObjectResized",function(e){f="objectresized"!=e.type}),r.on("dragstart",function(){p=!0}),r.on("drop dragend",function(){p=!1}),{clear:o}}}),r("tinymce/tableplugin/Dialogs",["tinymce/util/Tools","tinymce/Env"],function(e,t){var n=e.each;return function(r){function i(){var e=r.settings.color_picker_callback;if(e)return function(){var t=this;e.call(r,function(e){t.value(e).fire("change")},t.value())}}function o(e){return{title:"Advanced",type:"form",defaults:{onchange:function(){d(e,this.parents().reverse()[0],"style"==this.name())}},items:[{label:"Style",name:"style",type:"textbox"},{type:"form",padding:0,formItemDefaults:{layout:"grid",alignH:["start","right"]},defaults:{size:7},items:[{label:"Border color",type:"colorbox",name:"borderColor",onaction:i()},{label:"Background color",type:"colorbox",name:"backgroundColor",onaction:i()}]}]}}function a(e){return e?e.replace(/px$/,""):""}function s(e){return/^[0-9]+$/.test(e)&&(e+="px"),e}function l(e){n("left center right".split(" "),function(t){r.formatter.remove("align"+t,{},e)})}function c(e){n("top middle bottom".split(" "),function(t){r.formatter.remove("valign"+t,{},e)})}function u(t,n,r){function i(t,r){return r=r||[],e.each(t,function(e){var t={text:e.text||e.title};e.menu?t.menu=i(e.menu):(t.value=e.value,n&&n(t)),r.push(t)}),r}return i(t,r||[])}function d(e,t,n){var r=t.toJSON(),i=e.parseStyle(r.style);n?(t.find("#borderColor").value(i["border-color"]||"")[0].fire("change"),t.find("#backgroundColor").value(i["background-color"]||"")[0].fire("change")):(i["border-color"]=r.borderColor,i["background-color"]=r.backgroundColor),t.find("#style").value(e.serializeStyle(e.parseStyle(e.serializeStyle(i))))}function f(e,t,n){var r=e.parseStyle(e.getAttrib(n,"style"));r["border-color"]&&(t.borderColor=r["border-color"]),r["background-color"]&&(t.backgroundColor=r["background-color"]),t.style=e.serializeStyle(r)}function p(e,t,r){var i=e.parseStyle(e.getAttrib(t,"style"));n(r,function(e){i[e.name]=e.value}),e.setAttrib(t,"style",e.serializeStyle(e.parseStyle(e.serializeStyle(i))))}var m=this;m.tableProps=function(){m.table(!0)},m.table=function(i){function c(){function n(e,t,r){if("TD"===e.tagName||"TH"===e.tagName)x.setStyle(e,t,r);else if(e.children)for(var i=0;i<e.children.length;i++)n(e.children[i],t,r)}var i;d(x,this),w=e.extend(w,this.toJSON()),w["class"]===!1&&delete w["class"],r.undoManager.transact(function(){if(h||(h=r.plugins.table.insertTable(w.cols||1,w.rows||1)),r.dom.setAttribs(h,{style:w.style,"class":w["class"]}),r.settings.table_style_by_css){if(C=[],C.push({name:"border",value:w.border}),C.push({name:"border-spacing",value:s(w.cellspacing)}),p(x,h,C),x.setAttribs(h,{"data-mce-border-color":w.borderColor,"data-mce-cell-padding":w.cellpadding,"data-mce-border":w.border}),h.children)for(var e=0;e<h.children.length;e++)n(h.children[e],"border",w.border),n(h.children[e],"padding",s(w.cellpadding))}else r.dom.setAttribs(h,{border:w.border,cellpadding:w.cellpadding,cellspacing:w.cellspacing});x.getAttrib(h,"width")&&!r.settings.table_style_by_css?x.setAttrib(h,"width",a(w.width)):x.setStyle(h,"width",s(w.width)),x.setStyle(h,"height",s(w.height)),i=x.select("caption",h)[0],i&&!w.caption&&x.remove(i),!i&&w.caption&&(i=x.create("caption"),i.innerHTML=t.ie?"\xa0":'<br data-mce-bogus="1"/>',h.insertBefore(i,h.firstChild)),l(h),w.align&&r.formatter.apply("align"+w.align,{},h),r.focus(),r.addVisual()})}function m(e,t){function n(e,n){for(var r=0;r<n.length;r++){var i=x.getStyle(n[r],t);if("undefined"==typeof e&&(e=i),e!=i)return""}return e}var i,o=r.dom.select("td,th",e);return i=n(i,o)}var h,g,v,b,y,C,x=r.dom,w={};i===!0?(h=x.getParent(r.selection.getStart(),"table"),h&&(w={width:a(x.getStyle(h,"width")||x.getAttrib(h,"width")),height:a(x.getStyle(h,"height")||x.getAttrib(h,"height")),cellspacing:a(x.getStyle(h,"border-spacing")||x.getAttrib(h,"cellspacing")),cellpadding:x.getAttrib(h,"data-mce-cell-padding")||x.getAttrib(h,"cellpadding")||m(h,"padding"),border:x.getAttrib(h,"data-mce-border")||x.getAttrib(h,"border")||m(h,"border"),borderColor:x.getAttrib(h,"data-mce-border-color"),caption:!!x.select("caption",h)[0],"class":x.getAttrib(h,"class")},n("left center right".split(" "),function(e){r.formatter.matchNode(h,"align"+e)&&(w.align=e)}))):(g={label:"Cols",name:"cols"},v={label:"Rows",name:"rows"}),r.settings.table_class_list&&(w["class"]&&(w["class"]=w["class"].replace(/\s*mce\-item\-table\s*/g,"")),b={name:"class",type:"listbox",label:"Class",values:u(r.settings.table_class_list,function(e){e.value&&(e.textStyle=function(){return r.formatter.getCssText({block:"table",classes:[e.value]})})})}),y={type:"form",layout:"flex",direction:"column",labelGapCalc:"children",padding:0,items:[{type:"form",labelGapCalc:!1,padding:0,layout:"grid",columns:2,defaults:{type:"textbox",maxWidth:50},items:r.settings.table_appearance_options!==!1?[g,v,{label:"Width",name:"width"},{label:"Height",name:"height"},{label:"Cell spacing",name:"cellspacing"},{label:"Cell padding",name:"cellpadding"},{label:"Border",name:"border"},{label:"Caption",name:"caption",type:"checkbox"}]:[g,v,{label:"Width",name:"width"},{label:"Height",name:"height"}]},{label:"Alignment",name:"align",type:"listbox",text:"None",values:[{text:"None",value:""},{text:"Left",value:"left"},{text:"Center",value:"center"},{text:"Right",value:"right"}]},b]},r.settings.table_advtab!==!1?(f(x,w,h),r.windowManager.open({title:"Table properties",data:w,bodyType:"tabpanel",body:[{title:"General",type:"form",items:y},o(x)],onsubmit:c})):r.windowManager.open({title:"Table properties",data:w,body:y,onsubmit:c})},m.merge=function(e,t){r.windowManager.open({title:"Merge cells",body:[{label:"Cols",name:"cols",type:"textbox",value:"1",size:10},{label:"Rows",name:"rows",type:"textbox",value:"1",size:10}],onsubmit:function(){var n=this.toJSON();r.undoManager.transact(function(){e.merge(t,n.cols,n.rows)})}})},m.cell=function(){function t(e,t,n){(1===b.length||n)&&v.setAttrib(e,t,n)}function i(e,t,n){(1===b.length||n)&&v.setStyle(e,t,n)}function p(){d(v,this),h=e.extend(h,this.toJSON()),r.undoManager.transact(function(){n(b,function(e){t(e,"scope",h.scope),t(e,"style",h.style),t(e,"class",h["class"]),i(e,"width",s(h.width)),i(e,"height",s(h.height)),h.type&&e.nodeName.toLowerCase()!==h.type&&(e=v.rename(e,h.type)),1===b.length&&(l(e),c(e)),h.align&&r.formatter.apply("align"+h.align,{},e),h.valign&&r.formatter.apply("valign"+h.valign,{},e)}),r.focus()})}var m,h,g,v=r.dom,b=[];if(b=r.dom.select("td[data-mce-selected],th[data-mce-selected]"),m=r.dom.getParent(r.selection.getStart(),"td,th"),!b.length&&m&&b.push(m),m=m||b[0]){b.length>1?h={width:"",height:"",scope:"","class":"",align:"",style:"",type:m.nodeName.toLowerCase()}:(h={width:a(v.getStyle(m,"width")||v.getAttrib(m,"width")),height:a(v.getStyle(m,"height")||v.getAttrib(m,"height")),scope:v.getAttrib(m,"scope"),"class":v.getAttrib(m,"class")},h.type=m.nodeName.toLowerCase(),n("left center right".split(" "),function(e){r.formatter.matchNode(m,"align"+e)&&(h.align=e)}),n("top middle bottom".split(" "),function(e){r.formatter.matchNode(m,"valign"+e)&&(h.valign=e)}),f(v,h,m)),r.settings.table_cell_class_list&&(g={name:"class",type:"listbox",label:"Class",values:u(r.settings.table_cell_class_list,function(e){e.value&&(e.textStyle=function(){return r.formatter.getCssText({block:"td",classes:[e.value]})})})});var y={type:"form",layout:"flex",direction:"column",labelGapCalc:"children",padding:0,items:[{type:"form",layout:"grid",columns:2,labelGapCalc:!1,padding:0,defaults:{type:"textbox",maxWidth:50},items:[{label:"Width",name:"width"},{label:"Height",name:"height"},{label:"Cell type",name:"type",type:"listbox",text:"None",minWidth:90,maxWidth:null,values:[{text:"Cell",value:"td"},{text:"Header cell",value:"th"}]},{label:"Scope",name:"scope",type:"listbox",text:"None",minWidth:90,maxWidth:null,values:[{text:"None",value:""},{text:"Row",value:"row"},{text:"Column",value:"col"},{text:"Row group",value:"rowgroup"},{text:"Column group",value:"colgroup"}]},{label:"H Align",name:"align",type:"listbox",text:"None",minWidth:90,maxWidth:null,values:[{text:"None",value:""},{text:"Left",value:"left"},{text:"Center",value:"center"},{text:"Right",value:"right"}]},{label:"V Align",name:"valign",type:"listbox",text:"None",minWidth:90,maxWidth:null,values:[{text:"None",value:""},{text:"Top",value:"top"},{text:"Middle",value:"middle"},{text:"Bottom",value:"bottom"}]}]},g]};r.settings.table_cell_advtab!==!1?r.windowManager.open({title:"Cell properties",bodyType:"tabpanel",data:h,body:[{title:"General",type:"form",items:y},o(v)],onsubmit:p}):r.windowManager.open({title:"Cell properties",data:h,body:y,onsubmit:p})}},m.row=function(){function t(e,t,n){(1===C.length||n)&&y.setAttrib(e,t,n)}function i(e,t,n){(1===C.length||n)&&y.setStyle(e,t,n)}function c(){var o,a,c;d(y,this),v=e.extend(v,this.toJSON()),r.undoManager.transact(function(){var e=v.type;n(C,function(n){t(n,"scope",v.scope),t(n,"style",v.style),t(n,"class",v["class"]),i(n,"height",s(v.height)),e!==n.parentNode.nodeName.toLowerCase()&&(o=y.getParent(n,"table"),a=n.parentNode,c=y.select(e,o)[0],c||(c=y.create(e),o.firstChild?o.insertBefore(c,o.firstChild):o.appendChild(c)),c.appendChild(n),a.hasChildNodes()||y.remove(a)),1===C.length&&l(n),v.align&&r.formatter.apply("align"+v.align,{},n)}),r.focus()})}var p,m,h,g,v,b,y=r.dom,C=[];p=r.dom.getParent(r.selection.getStart(),"table"),m=r.dom.getParent(r.selection.getStart(),"td,th"),n(p.rows,function(e){n(e.cells,function(t){if(y.getAttrib(t,"data-mce-selected")||t==m)return C.push(e),!1})}),h=C[0],h&&(C.length>1?v={height:"",scope:"","class":"",align:"",type:h.parentNode.nodeName.toLowerCase()}:(v={height:a(y.getStyle(h,"height")||y.getAttrib(h,"height")),scope:y.getAttrib(h,"scope"),"class":y.getAttrib(h,"class")},v.type=h.parentNode.nodeName.toLowerCase(),n("left center right".split(" "),function(e){r.formatter.matchNode(h,"align"+e)&&(v.align=e)}),f(y,v,h)),r.settings.table_row_class_list&&(g={name:"class",type:"listbox",label:"Class",values:u(r.settings.table_row_class_list,function(e){e.value&&(e.textStyle=function(){return r.formatter.getCssText({block:"tr",classes:[e.value]})})})}),b={type:"form",columns:2,padding:0,defaults:{type:"textbox"},items:[{type:"listbox",name:"type",label:"Row type",text:"Header",maxWidth:null,values:[{text:"Header",value:"thead"},{text:"Body",value:"tbody"},{text:"Footer",value:"tfoot"}]},{type:"listbox",name:"align",label:"Alignment",text:"None",maxWidth:null,values:[{text:"None",value:""},{text:"Left",value:"left"},{text:"Center",value:"center"},{text:"Right",value:"right"}]},{label:"Height",name:"height"},g]},r.settings.table_row_advtab!==!1?r.windowManager.open({title:"Row properties",data:v,bodyType:"tabpanel",body:[{title:"General",type:"form",items:b},o(y)],onsubmit:c}):r.windowManager.open({title:"Row properties",data:v,body:b,onsubmit:c}))}}}),r("tinymce/tableplugin/ResizeBars",["tinymce/util/Tools","tinymce/util/VK"],function(e,n){var r;return function(i){function o(e,t){return{index:e,y:i.dom.getPos(t).y}}function a(e,t){return{index:e,y:i.dom.getPos(t).y+t.offsetHeight}}function s(e,t){return{index:e,x:i.dom.getPos(t).x}}function l(e,t){return{index:e,x:i.dom.getPos(t).x+t.offsetWidth}}function c(){var e=i.getBody().dir;return"rtl"===e}function u(){return i.inline}function d(){return u?i.getBody().ownerDocument.body:i.getBody()}function f(e,t){return c()?l(e,t):s(e,t)}function p(e,t){return c()?s(e,t):l(e,t)}function m(e,t){return h(e,"width")/h(t,"width")*100}function h(e,t){var n=i.dom.getStyle(e,t,!0),r=parseInt(n,10);return r}function g(e){var t=h(e,"width"),n=h(e.parentElement,"width");return t/n*100}function v(e,t){var n=h(e,"width");return t/n*100}function b(e,t){var n=h(e.parentElement,"width");return t/n*100}function y(e,t,n){for(var r=[],i=1;i<n.length;i++){var o=n[i].element;r.push(e(i-1,o))}var a=n[n.length-1];return r.push(t(n.length-1,a.element)),r}function C(){var t=i.dom.select("."+fe,d());e.each(t,function(e){i.dom.remove(e)})}function x(e){C(),B(e)}function w(e,t,n,r,i,o,a,s){var l={"data-mce-bogus":"all","class":fe+" "+e,unselectable:"on","data-mce-resize":!1,style:"cursor: "+t+"; margin: 0; padding: 0; position: absolute; left: "+n+"px; top: "+r+"px; height: "+i+"px; width: "+o+"px; "};return l[a]=s,l}function N(t,n,r){e.each(t,function(e){var t=r.x,o=e.y-xe/2,a=xe,s=n;i.dom.add(d(),"div",w(pe,me,t,o,a,s,he,e.index))})}function E(t,n,r){e.each(t,function(e){var t=e.x-xe/2,o=r.y,a=n,s=xe;i.dom.add(d(),"div",w(ve,be,t,o,a,s,ye,e.index))})}function S(t){return e.map(t.rows,function(t){var n=e.map(t.cells,function(e){var t=e.hasAttribute("rowspan")?parseInt(e.getAttribute("rowspan"),10):1,n=e.hasAttribute("colspan")?parseInt(e.getAttribute("colspan"),10):1;return{element:e,rowspan:t,colspan:n}});return{element:t,cells:n}})}function _(n){function r(e,t){return e+","+t}function i(e,t){return s[r(e,t)]}function o(){var t=[];return e.each(l,function(e){t=t.concat(e.cells)}),t}function a(){return l}var s={},l=[],c=0,u=0;return e.each(n,function(n,i){var o=[];e.each(n.cells,function(e){for(var n=0;s[r(i,n)]!==t;)n++;for(var a={element:e.element,colspan:e.colspan,rowspan:e.rowspan,rowIndex:i,colIndex:n},l=0;l<e.colspan;l++)for(var d=0;d<e.rowspan;d++){var f=i+d,p=n+l;s[r(f,p)]=a,c=Math.max(c,f+1),u=Math.max(u,p+1)}o.push(a)}),l.push({element:n.element,cells:o})}),{grid:{maxRows:c,maxCols:u},getAt:i,getAllCells:o,getAllRows:a}}function k(e,t){for(var n=[],r=e;r<t;r++)n.push(r);return n}function T(e,t,n){for(var r,i=e(),o=0;o<i.length;o++)t(i[o])&&(r=i[o]);return r?r:n()}function R(t){var n=k(0,t.grid.maxCols),r=k(0,t.grid.maxRows);return e.map(n,function(e){function n(){for(var n=[],i=0;i<r.length;i++){var o=t.getAt(i,e);o&&o.colIndex===e&&n.push(o)}return n}function i(e){return 1===e.colspan}function o(){for(var n,i=0;i<r.length;i++)if(n=t.getAt(i,e))return n;return null}return T(n,i,o)})}function A(t){var n=k(0,t.grid.maxCols),r=k(0,t.grid.maxRows);return e.map(r,function(e){function r(){for(var r=[],i=0;i<n.length;i++){var o=t.getAt(e,i);o&&o.rowIndex===e&&r.push(o)}return r}function i(e){return 1===e.rowspan}function o(){return t.getAt(e,0)}return T(r,i,o);
+})}function B(e){var t=S(e),n=_(t),r=A(n),s=R(n),l=i.dom.getPos(e),c=r.length>0?y(o,a,r):[],u=s.length>0?y(f,p,s):[];N(c,e.offsetWidth,l),E(u,e.offsetHeight,l)}function P(e,t,n,r){if(t<0||t>=e.length-1)return"";var i=e[t];if(i)i={value:i,delta:0};else for(var o=e.slice(0,t).reverse(),a=0;a<o.length;a++)o[a]&&(i={value:o[a],delta:a+1});var s=e[t+1];if(s)s={value:s,delta:1};else for(var l=e.slice(t+1),c=0;c<l.length;c++)l[c]&&(s={value:l[c],delta:c+1});var u=s.delta-i.delta,d=Math.abs(s.value-i.value)/u;return n?d/h(r,"width")*100:d}function D(e,t){var n=i.dom.getStyle(e,t);return n||(n=i.dom.getAttrib(e,t)),n||(n=i.dom.getStyle(e,t,!0)),n}function M(e,t,n){var r=D(e,"width"),i=parseInt(r,10),o=t?m(e,n):h(e,"width");return(t&&!V(r)||!t&&!$(r))&&(i=0),!isNaN(i)&&i>0?i:o}function L(t,n,r){for(var i=R(t),o=e.map(i,function(e){return f(e.colIndex,e.element).x}),a=[],s=0;s<i.length;s++){var l=i[s].element.hasAttribute("colspan")?parseInt(i[s].element.getAttribute("colspan"),10):1,c=l>1?P(o,s):M(i[s].element,n,r);c=c?c:we,a.push(c)}return a}function I(e){var t=D(e,"height"),n=parseInt(t,10);return V(t)&&(n=0),!isNaN(n)&&n>0?n:h(e,"height")}function O(t){for(var n=A(t),r=e.map(n,function(e){return o(e.rowIndex,e.element).y}),i=[],a=0;a<n.length;a++){var s=n[a].element.hasAttribute("rowspan")?parseInt(n[a].element.getAttribute("rowspan"),10):1,l=s>1?P(r,a):I(n[a].element);l=l?l:Ne,i.push(l)}return i}function H(t,n,r,i,o){function a(t){return e.map(t,function(){return 0})}function s(){var e;if(o)e=[100-d[0]];else{var t=Math.max(i,d[0]+r);e=[t-d[0]]}return e}function l(e,t){var n,o=a(d.slice(0,e)),s=a(d.slice(t+1));if(r>=0){var l=Math.max(i,d[t]-r);n=o.concat([r,l-d[t]]).concat(s)}else{var c=Math.max(i,d[e]+r),u=d[e]-c;n=o.concat([c-d[e],u]).concat(s)}return n}function c(e,t){var n,o=a(d.slice(0,t));if(r>=0)n=o.concat([r]);else{var s=Math.max(i,d[t]+r);n=o.concat([s-d[t]])}return n}var u,d=t.slice(0);return u=0===t.length?[]:1===t.length?s():0===n?l(0,1):n>0&&n<t.length-1?l(n,n+1):n===t.length-1?c(n-1,n):[]}function F(e,t,n){for(var r=0,i=e;i<t;i++)r+=n[i];return r}function z(t,n){var r=t.getAllCells();return e.map(r,function(e){var t=F(e.colIndex,e.colIndex+e.colspan,n);return{element:e.element,width:t,colspan:e.colspan}})}function W(t,n){var r=t.getAllCells();return e.map(r,function(e){var t=F(e.rowIndex,e.rowIndex+e.rowspan,n);return{element:e.element,height:t,rowspan:e.rowspan}})}function U(t,n){var r=t.getAllRows();return e.map(r,function(e,t){return{element:e.element,height:n[t]}})}function V(e){return Se.test(e)}function $(e){return _e.test(e)}function j(t,n,r){function o(t,n){e.each(t,function(e){i.dom.setStyle(e.element,"width",e.width+n),i.dom.setAttrib(e.element,"width",null)})}function a(){return r<u.grid.maxCols-1?g(t):g(t)+b(t,n)}function s(){return r<u.grid.maxCols-1?h(t,"width"):h(t,"width")+n}function l(e,n,o){r!=u.grid.maxCols-1&&o||(i.dom.setStyle(t,"width",e+n),i.dom.setAttrib(t,"width",null))}for(var c=S(t),u=_(c),d=V(t.width)||V(t.style.width),f=L(u,d,t),p=d?v(t,n):n,m=H(f,r,p,we,d,t),y=[],C=0;C<m.length;C++)y.push(m[C]+f[C]);var x=z(u,y),w=d?"%":"px",N=d?a():s();i.undoManager.transact(function(){o(x,w),l(N,w,d)})}function q(t,n,r){for(var o=S(t),a=_(o),s=O(a),l=[],c=0,u=0;u<s.length;u++)l.push(u===r?n+s[u]:s[u]),c+=c[u];var d=W(a,l),f=U(a,l);i.undoManager.transact(function(){e.each(f,function(e){i.dom.setStyle(e.element,"height",e.height+"px"),i.dom.setAttrib(e.element,"height",null)}),e.each(d,function(e){i.dom.setStyle(e.element,"height",e.height+"px"),i.dom.setAttrib(e.element,"height",null)}),i.dom.setStyle(t,"height",c+"px"),i.dom.setAttrib(t,"height",null)})}function Y(){ae=setTimeout(function(){J()},200)}function X(){clearTimeout(ae)}function K(){var e=document.createElement("div");return e.setAttribute("style","margin: 0; padding: 0; position: fixed; left: 0px; top: 0px; height: 100%; width: 100%;"),e.setAttribute("data-mce-bogus","all"),e}function G(e,t){i.dom.bind(e,"mouseup",function(){J()}),i.dom.bind(e,"mousemove",function(e){X(),se&&t(e)}),i.dom.bind(e,"mouseout",function(){Y()})}function J(){if(i.dom.remove(le),se){i.dom.removeClass(ce,Ee),se=!1;var e,t;if(Z(ce)){var n=parseInt(i.dom.getAttrib(ce,Ce),10),o=i.dom.getPos(ce).x;e=parseInt(i.dom.getAttrib(ce,ye),10),t=c()?n-o:o-n,Math.abs(t)>=1&&j(r,t,e)}else if(ee(ce)){var a=parseInt(i.dom.getAttrib(ce,ge),10),s=i.dom.getPos(ce).y;e=parseInt(i.dom.getAttrib(ce,he),10),t=s-a,Math.abs(t)>=1&&q(r,t,e)}x(r),i.nodeChanged()}}function Q(e,t){le=le?le:K(),se=!0,i.dom.addClass(e,Ee),ce=e,G(le,t),i.dom.add(d(),le)}function Z(e){return i.dom.hasClass(e,ve)}function ee(e){return i.dom.hasClass(e,pe)}function te(e){ue=ue!==t?ue:e.clientX;var n=e.clientX-ue;ue=e.clientX;var r=i.dom.getPos(ce).x;i.dom.setStyle(ce,"left",r+n+"px")}function ne(e){de=de!==t?de:e.clientY;var n=e.clientY-de;de=e.clientY;var r=i.dom.getPos(ce).y;i.dom.setStyle(ce,"top",r+n+"px")}function re(e){ue=t,Q(e,te)}function ie(e){de=t,Q(e,ne)}function oe(e){var t=e.target,n=i.getBody();if(i.$.contains(n,r)||r===n)if(Z(t)){e.preventDefault();var o=i.dom.getPos(t).x;i.dom.setAttrib(t,Ce,o),re(t)}else if(ee(t)){e.preventDefault();var a=i.dom.getPos(t).y;i.dom.setAttrib(t,ge,a),ie(t)}else C()}var ae,se,le,ce,ue,de,fe="mce-resize-bar",pe="mce-resize-bar-row",me="row-resize",he="data-row",ge="data-initial-top",ve="mce-resize-bar-col",be="col-resize",ye="data-col",Ce="data-initial-left",xe=4,we=10,Ne=10,Ee="mce-resize-bar-dragging",Se=new RegExp(/(\d+(\.\d+)?%)/),_e=new RegExp(/px|em/);return i.on("init",function(){i.dom.bind(d(),"mousedown",oe)}),i.on("ObjectResized",function(t){var n=t.target;if("TABLE"===n.nodeName){var r=[];e.each(n.rows,function(t){e.each(t.cells,function(e){var t=i.dom.getStyle(e,"width",!0);r.push({cell:e,width:t})})}),e.each(r,function(e){i.dom.setStyle(e.cell,"width",e.width),i.dom.setAttrib(e.cell,"width",null)})}}),i.on("mouseover",function(e){if(!se){var t=i.dom.getParent(e.target,"table");("TABLE"===e.target.nodeName||t)&&(r=t,x(t))}}),i.on("keydown",function(e){switch(e.keyCode){case n.LEFT:case n.RIGHT:case n.UP:case n.DOWN:C()}}),i.on("remove",function(){C(),i.dom.unbind(d(),"mousedown",oe)}),{adjustWidth:j,adjustHeight:q,clearBars:C,drawBars:B,determineDeltas:H,getTableGrid:_,getTableDetails:S,getWidths:L,getPixelHeights:O,isPercentageBasedSize:V,isPixelBasedSize:$,recalculateWidths:z,recalculateCellHeights:W,recalculateRowHeights:U}}}),r("tinymce/tableplugin/Plugin",["tinymce/tableplugin/TableGrid","tinymce/tableplugin/Quirks","tinymce/tableplugin/CellSelection","tinymce/tableplugin/Dialogs","tinymce/tableplugin/ResizeBars","tinymce/util/Tools","tinymce/dom/TreeWalker","tinymce/Env","tinymce/PluginManager"],function(e,t,n,r,i,o,a,s,l){function c(o){function a(e){return function(){o.execCommand(e)}}function l(e,t){var n,r,i,a;for(i='<table id="__mce"><tbody>',n=0;n<t;n++){for(i+="<tr>",r=0;r<e;r++)i+="<td>"+(s.ie&&s.ie<10?"&nbsp;":"<br>")+"</td>";i+="</tr>"}return i+="</tbody></table>",o.undoManager.transact(function(){o.insertContent(i),a=o.dom.get("__mce"),o.dom.setAttrib(a,"id",null),o.$("tr",a).each(function(e,t){o.fire("newrow",{node:t}),o.$("th,td",t).each(function(e,t){o.fire("newcell",{node:t})})}),o.dom.setAttribs(a,o.settings.table_default_attributes||{}),o.dom.setStyles(a,o.settings.table_default_styles||{})}),a}function c(e,t,n){function r(){var r,i,a,s={},l=0;i=o.dom.select("td[data-mce-selected],th[data-mce-selected]"),r=i[0],r||(r=o.selection.getStart()),n&&i.length>0?(u(i,function(e){return s[e.parentNode.parentNode.nodeName]=1}),u(s,function(e){l+=e}),a=1!==l):a=!o.dom.getParent(r,t),e.disabled(a),o.selection.selectorChanged(t,function(t){e.disabled(!t)})}o.initialized?r():o.on("init",r)}function d(){c(this,"table")}function f(){c(this,"td,th")}function p(){c(this,"td,th",!0)}function m(){var e="";e='<table role="grid" class="mce-grid mce-grid-border" aria-readonly="true">';for(var t=0;t<10;t++){e+="<tr>";for(var n=0;n<10;n++)e+='<td role="gridcell" tabindex="-1"><a id="mcegrid'+(10*t+n)+'" href="#" data-mce-x="'+n+'" data-mce-y="'+t+'"></a></td>';e+="</tr>"}return e+="</table>",e+='<div class="mce-text-center" role="presentation">1 x 1</div>'}function h(e,t,n){var r,i,a,s,l,c=n.getEl().getElementsByTagName("table")[0],u=n.isRtl()||"tl-tr"==n.parent().rel;for(c.nextSibling.innerHTML=e+1+" x "+(t+1),u&&(e=9-e),i=0;i<10;i++)for(r=0;r<10;r++)s=c.rows[i].childNodes[r].firstChild,l=(u?r>=e:r<=e)&&i<=t,o.dom.toggleClass(s,"mce-active",l),l&&(a=s);return a.parentNode}function g(){o.addButton("tableprops",{title:"Table properties",onclick:E.tableProps,icon:"table"}),o.addButton("tabledelete",{title:"Delete table",onclick:a("mceTableDelete")}),o.addButton("tablecellprops",{title:"Cell properties",onclick:a("mceTableCellProps")}),o.addButton("tablemergecells",{title:"Merge cells",onclick:a("mceTableMergeCells")}),o.addButton("tablesplitcells",{title:"Split cell",onclick:a("mceTableSplitCells")}),o.addButton("tableinsertrowbefore",{title:"Insert row before",onclick:a("mceTableInsertRowBefore")}),o.addButton("tableinsertrowafter",{title:"Insert row after",onclick:a("mceTableInsertRowAfter")}),o.addButton("tabledeleterow",{title:"Delete row",onclick:a("mceTableDeleteRow")}),o.addButton("tablerowprops",{title:"Row properties",onclick:a("mceTableRowProps")}),o.addButton("tablecutrow",{title:"Cut row",onclick:a("mceTableCutRow")}),o.addButton("tablecopyrow",{title:"Copy row",onclick:a("mceTableCopyRow")}),o.addButton("tablepasterowbefore",{title:"Paste row before",onclick:a("mceTablePasteRowBefore")}),o.addButton("tablepasterowafter",{title:"Paste row after",onclick:a("mceTablePasteRowAfter")}),o.addButton("tableinsertcolbefore",{title:"Insert column before",onclick:a("mceTableInsertColBefore")}),o.addButton("tableinsertcolafter",{title:"Insert column after",onclick:a("mceTableInsertColAfter")}),o.addButton("tabledeletecol",{title:"Delete column",onclick:a("mceTableDeleteCol")})}function v(e){var t=o.dom.is(e,"table")&&o.getBody().contains(e);return t}function b(){var e=o.settings.table_toolbar;""!==e&&e!==!1&&(e||(e="tableprops tabledelete | tableinsertrowbefore tableinsertrowafter tabledeleterow | tableinsertcolbefore tableinsertcolafter tabledeletecol"),o.addContextToolbar(v,e))}function y(){return x}function C(e){x=e}var x,w,N=this,E=new r(o);!o.settings.object_resizing||o.settings.table_resize_bars===!1||o.settings.object_resizing!==!0&&"table"!==o.settings.object_resizing||(w=i(o)),o.settings.table_grid===!1?o.addMenuItem("inserttable",{text:"Table",icon:"table",context:"table",onclick:E.table}):o.addMenuItem("inserttable",{text:"Table",icon:"table",context:"table",ariaHideMenu:!0,onclick:function(e){e.aria&&(this.parent().hideAll(),e.stopImmediatePropagation(),E.table())},onshow:function(){h(0,0,this.menu.items()[0])},onhide:function(){var e=this.menu.items()[0].getEl().getElementsByTagName("a");o.dom.removeClass(e,"mce-active"),o.dom.addClass(e[0],"mce-active")},menu:[{type:"container",html:m(),onPostRender:function(){this.lastX=this.lastY=0},onmousemove:function(e){var t,n,r=e.target;"A"==r.tagName.toUpperCase()&&(t=parseInt(r.getAttribute("data-mce-x"),10),n=parseInt(r.getAttribute("data-mce-y"),10),(this.isRtl()||"tl-tr"==this.parent().rel)&&(t=9-t),t===this.lastX&&n===this.lastY||(h(t,n,e.control),this.lastX=t,this.lastY=n))},onclick:function(e){var t=this;"A"==e.target.tagName.toUpperCase()&&(e.preventDefault(),e.stopPropagation(),t.parent().cancel(),o.undoManager.transact(function(){l(t.lastX+1,t.lastY+1)}),o.addVisual())}}]}),o.addMenuItem("tableprops",{text:"Table properties",context:"table",onPostRender:d,onclick:E.tableProps}),o.addMenuItem("deletetable",{text:"Delete table",context:"table",onPostRender:d,cmd:"mceTableDelete"}),o.addMenuItem("cell",{separator:"before",text:"Cell",context:"table",menu:[{text:"Cell properties",onclick:a("mceTableCellProps"),onPostRender:f},{text:"Merge cells",onclick:a("mceTableMergeCells"),onPostRender:p},{text:"Split cell",onclick:a("mceTableSplitCells"),onPostRender:f}]}),o.addMenuItem("row",{text:"Row",context:"table",menu:[{text:"Insert row before",onclick:a("mceTableInsertRowBefore"),onPostRender:f},{text:"Insert row after",onclick:a("mceTableInsertRowAfter"),onPostRender:f},{text:"Delete row",onclick:a("mceTableDeleteRow"),onPostRender:f},{text:"Row properties",onclick:a("mceTableRowProps"),onPostRender:f},{text:"-"},{text:"Cut row",onclick:a("mceTableCutRow"),onPostRender:f},{text:"Copy row",onclick:a("mceTableCopyRow"),onPostRender:f},{text:"Paste row before",onclick:a("mceTablePasteRowBefore"),onPostRender:f},{text:"Paste row after",onclick:a("mceTablePasteRowAfter"),onPostRender:f}]}),o.addMenuItem("column",{text:"Column",context:"table",menu:[{text:"Insert column before",onclick:a("mceTableInsertColBefore"),onPostRender:f},{text:"Insert column after",onclick:a("mceTableInsertColAfter"),onPostRender:f},{text:"Delete column",onclick:a("mceTableDeleteCol"),onPostRender:f}]});var S=[];u("inserttable tableprops deletetable | cell row column".split(" "),function(e){"|"==e?S.push({text:"-"}):S.push(o.menuItems[e])}),o.addButton("table",{type:"menubutton",title:"Table",menu:S}),s.isIE||o.on("click",function(e){e=e.target,"TABLE"===e.nodeName&&(o.selection.select(e),o.nodeChanged())}),N.quirks=new t(o),o.on("Init",function(){N.cellSelection=new n(o,function(e){e&&w&&w.clearBars()}),N.resizeBars=w}),o.on("PreInit",function(){o.serializer.addAttributeFilter("data-mce-cell-padding,data-mce-border,data-mce-border-color",function(e,t){for(var n=e.length;n--;)e[n].attr(t,null)})}),u({mceTableSplitCells:function(e){e.split()},mceTableMergeCells:function(e){var t;t=o.dom.getParent(o.selection.getStart(),"th,td"),o.dom.select("td[data-mce-selected],th[data-mce-selected]").length?e.merge():E.merge(e,t)},mceTableInsertRowBefore:function(e){e.insertRows(!0)},mceTableInsertRowAfter:function(e){e.insertRows()},mceTableInsertColBefore:function(e){e.insertCols(!0)},mceTableInsertColAfter:function(e){e.insertCols()},mceTableDeleteCol:function(e){e.deleteCols()},mceTableDeleteRow:function(e){e.deleteRows()},mceTableCutRow:function(e){x=e.cutRows()},mceTableCopyRow:function(e){x=e.copyRows()},mceTablePasteRowBefore:function(e){e.pasteRows(x,!0)},mceTablePasteRowAfter:function(e){e.pasteRows(x)},mceSplitColsBefore:function(e){e.splitCols(!0)},mceSplitColsAfter:function(e){e.splitCols(!1)},mceTableDelete:function(e){w&&w.clearBars(),e.deleteTable()}},function(t,n){o.addCommand(n,function(){var n=new e(o);n&&(t(n),o.execCommand("mceRepaint"),N.cellSelection.clear())})}),u({mceInsertTable:E.table,mceTableProps:function(){E.table(!0)},mceTableRowProps:E.row,mceTableCellProps:E.cell},function(e,t){o.addCommand(t,function(t,n){e(n)})}),g(),b(),o.settings.table_tab_navigation!==!1&&o.on("keydown",function(t){var n,r,i;9==t.keyCode&&(n=o.dom.getParent(o.selection.getStart(),"th,td"),n&&(t.preventDefault(),r=new e(o),i=t.shiftKey?-1:1,o.undoManager.transact(function(){!r.moveRelIdx(n,i)&&i>0&&(r.insertRow(),r.refresh(),r.moveRelIdx(n,i))})))}),N.insertTable=l,N.setClipboardRows=C,N.getClipboardRows=y}var u=o.each;l.add("table",c)})}(window);

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/template/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("template",function(e){function t(t){return function(){var n=e.settings.templates;return"function"==typeof n?void n(t):void("string"==typeof n?tinymce.util.XHR.send({url:n,success:function(e){t(tinymce.util.JSON.parse(e))}}):t(n))}}function n(t){function n(t){function n(t){if(t.indexOf("<html>")==-1){var n="";tinymce.each(e.contentCSS,function(t){n+='<link type="text/css" rel="stylesheet" href="'+e.documentBaseURI.toAbsolute(t)+'">'});var i=e.settings.body_class||"";i.indexOf("=")!=-1&&(i=e.getParam("body_class","","hash"),i=i[e.id]||""),t="<!DOCTYPE html><html><head>"+n+'</head><body class="'+i+'">'+t+"</body></html>"}t=o(t,"template_preview_replace_values");var a=r.find("iframe")[0].getEl().contentWindow.document;a.open(),a.write(t),a.close()}var a=t.control.value();a.url?tinymce.util.XHR.send({url:a.url,success:function(e){i=e,n(i)}}):(i=a.content,n(i)),r.find("#description")[0].text(t.control.value().description)}var r,i,s=[];if(!t||0===t.length){var l=e.translate("No templates defined.");return void e.notificationManager.open({text:l,type:"info"})}tinymce.each(t,function(e){s.push({selected:!s.length,text:e.title,value:{url:e.url,content:e.content,description:e.description}})}),r=e.windowManager.open({title:"Insert template",layout:"flex",direction:"column",align:"stretch",padding:15,spacing:10,items:[{type:"form",flex:0,padding:0,items:[{type:"container",label:"Templates",items:{type:"listbox",label:"Templates",name:"template",values:s,onselect:n}}]},{type:"label",name:"description",label:"Description",text:"\xa0"},{type:"iframe",flex:1,border:1}],onsubmit:function(){a(!1,i)},minWidth:Math.min(tinymce.DOM.getViewPort().w,e.getParam("template_popup_width",600)),minHeight:Math.min(tinymce.DOM.getViewPort().h,e.getParam("template_popup_height",500))}),r.find("listbox")[0].fire("select")}function r(t,n){function r(e,t){if(e=""+e,e.length<t)for(var n=0;n<t-e.length;n++)e="0"+e;return e}var i="Sun Mon Tue Wed Thu Fri Sat Sun".split(" "),o="Sunday Monday Tuesday Wednesday Thursday Friday Saturday Sunday".split(" "),a="Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),s="January February March April May June July August September October November December".split(" ");return n=n||new Date,t=t.replace("%D","%m/%d/%Y"),t=t.replace("%r","%I:%M:%S %p"),t=t.replace("%Y",""+n.getFullYear()),t=t.replace("%y",""+n.getYear()),t=t.replace("%m",r(n.getMonth()+1,2)),t=t.replace("%d",r(n.getDate(),2)),t=t.replace("%H",""+r(n.getHours(),2)),t=t.replace("%M",""+r(n.getMinutes(),2)),t=t.replace("%S",""+r(n.getSeconds(),2)),t=t.replace("%I",""+((n.getHours()+11)%12+1)),t=t.replace("%p",""+(n.getHours()<12?"AM":"PM")),t=t.replace("%B",""+e.translate(s[n.getMonth()])),t=t.replace("%b",""+e.translate(a[n.getMonth()])),t=t.replace("%A",""+e.translate(o[n.getDay()])),t=t.replace("%a",""+e.translate(i[n.getDay()])),t=t.replace("%%","%")}function i(t){var n=e.dom,r=e.getParam("template_replace_values");s(n.select("*",t),function(e){s(r,function(t,i){n.hasClass(e,i)&&"function"==typeof r[i]&&r[i](e)})})}function o(t,n){return s(e.getParam(n),function(e,n){"function"==typeof e&&(e=e(n)),t=t.replace(new RegExp("\\{\\$"+n+"\\}","g"),e)}),t}function a(t,n){function a(e,t){return new RegExp("\\b"+t+"\\b","g").test(e.className)}var l,c,u=e.dom,d=e.selection.getContent();n=o(n,"template_replace_values"),l=u.create("div",null,n),c=u.select(".mceTmpl",l),c&&c.length>0&&(l=u.create("div",null),l.appendChild(c[0].cloneNode(!0))),s(u.select("*",l),function(t){a(t,e.getParam("template_cdate_classes","cdate").replace(/\s+/g,"|"))&&(t.innerHTML=r(e.getParam("template_cdate_format",e.getLang("template.cdate_format")))),a(t,e.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))&&(t.innerHTML=r(e.getParam("template_mdate_format",e.getLang("template.mdate_format")))),a(t,e.getParam("template_selected_content_classes","selcontent").replace(/\s+/g,"|"))&&(t.innerHTML=d)}),i(l),e.execCommand("mceInsertContent",!1,l.innerHTML),e.addVisual()}var s=tinymce.each;e.addCommand("mceInsertTemplate",a),e.addButton("template",{title:"Insert template",onclick:t(n)}),e.addMenuItem("template",{text:"Template",onclick:t(n),context:"insert"}),e.on("PreProcess",function(t){var n=e.dom;s(n.select("div",t.node),function(t){n.hasClass(t,"mceTmpl")&&(s(n.select("*",t),function(t){n.hasClass(t,e.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))&&(t.innerHTML=r(e.getParam("template_mdate_format",e.getLang("template.mdate_format"))))}),i(t))})})});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/textcolor/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("textcolor",function(e){function t(t){var n;return e.dom.getParents(e.selection.getStart(),function(e){var r;(r=e.style["forecolor"==t?"color":"background-color"])&&(n=r)}),n}function n(t){var n,r,i=[];for(r=["000000","Black","993300","Burnt orange","333300","Dark olive","003300","Dark green","003366","Dark azure","000080","Navy Blue","333399","Indigo","333333","Very dark gray","800000","Maroon","FF6600","Orange","808000","Olive","008000","Green","008080","Teal","0000FF","Blue","666699","Grayish blue","808080","Gray","FF0000","Red","FF9900","Amber","99CC00","Yellow green","339966","Sea green","33CCCC","Turquoise","3366FF","Royal blue","800080","Purple","999999","Medium gray","FF00FF","Magenta","FFCC00","Gold","FFFF00","Yellow","00FF00","Lime","00FFFF","Aqua","00CCFF","Sky blue","993366","Red violet","FFFFFF","White","FF99CC","Pink","FFCC99","Peach","FFFF99","Light yellow","CCFFCC","Pale green","CCFFFF","Pale cyan","99CCFF","Light sky blue","CC99FF","Plum"],r=e.settings.textcolor_map||r,r=e.settings[t+"_map"]||r,n=0;n<r.length;n+=2)i.push({text:r[n+1],color:"#"+r[n]});return i}function r(){function t(e,t){var n="transparent"==e;return'<td class="mce-grid-cell'+(n?" mce-colorbtn-trans":"")+'"><div id="'+m+"-"+h++ +'" data-mce-color="'+(e?e:"")+'" role="option" tabIndex="-1" style="'+(e?"background-color: "+e:"")+'" title="'+tinymce.translate(t)+'">'+(n?"&#215;":"")+"</div></td>"}var r,i,o,a,s,u,d,f,p=this,m=p._id,h=0;for(f=p.settings.origin,r=n(f),r.push({text:tinymce.translate("No color"),color:"transparent"}),o='<table class="mce-grid mce-grid-border mce-colorbutton-grid" role="list" cellspacing="0"><tbody>',a=r.length-1,u=0;u<c[f];u++){for(o+="<tr>",s=0;s<l[f];s++)d=u*l[f]+s,d>a?o+="<td></td>":(i=r[d],o+=t(i.color,i.text));o+="</tr>"}if(e.settings.color_picker_callback){for(o+='<tr><td colspan="'+l[f]+'" class="mce-custom-color-btn"><div id="'+m+'-c" class="mce-widget mce-btn mce-btn-small mce-btn-flat" role="button" tabindex="-1" aria-labelledby="'+m+'-c" style="width: 100%"><button type="button" role="presentation" tabindex="-1">'+tinymce.translate("Custom...")+"</button></div></td></tr>",o+="<tr>",s=0;s<l[f];s++)o+=t("","Custom color");o+="</tr>"}return o+="</tbody></table>"}function i(t,n){e.undoManager.transact(function(){e.focus(),e.formatter.apply(t,{value:n}),e.nodeChanged()})}function o(t){e.undoManager.transact(function(){e.focus(),e.formatter.remove(t,{value:null},null,!0),e.nodeChanged()})}function a(n){function r(e){d.hidePanel(),d.color(e),i(d.settings.format,e)}function a(){d.hidePanel(),d.resetColor(),o(d.settings.format)}function s(e,t){e.style.background=t,e.setAttribute("data-mce-color",t)}var c,u,d=this.parent();u=d.settings.origin,tinymce.DOM.getParent(n.target,".mce-custom-color-btn")&&(d.hidePanel(),e.settings.color_picker_callback.call(e,function(e){var t,n,i,o=d.panel.getEl().getElementsByTagName("table")[0];for(t=tinymce.map(o.rows[o.rows.length-1].childNodes,function(e){return e.firstChild}),i=0;i<t.length&&(n=t[i],n.getAttribute("data-mce-color"));i++);if(i==l[u])for(i=0;i<l[u]-1;i++)s(t[i],t[i+1].getAttribute("data-mce-color"));s(n,e),r(e)},t(d.settings.format))),c=n.target.getAttribute("data-mce-color"),c?(this.lastId&&document.getElementById(this.lastId).setAttribute("aria-selected",!1),n.target.setAttribute("aria-selected",!0),this.lastId=n.target.id,"transparent"==c?a():r(c)):null!==c&&d.hidePanel()}function s(){var e=this;e._color?i(e.settings.format,e._color):o(e.settings.format)}var l,c;c={forecolor:e.settings.forecolor_rows||e.settings.textcolor_rows||5,backcolor:e.settings.backcolor_rows||e.settings.textcolor_rows||5},l={forecolor:e.settings.forecolor_cols||e.settings.textcolor_cols||8,backcolor:e.settings.backcolor_cols||e.settings.textcolor_cols||8},e.addButton("forecolor",{type:"colorbutton",tooltip:"Text color",format:"forecolor",panel:{origin:"forecolor",role:"application",ariaRemember:!0,html:r,onclick:a},onclick:s}),e.addButton("backcolor",{type:"colorbutton",tooltip:"Background color",format:"hilitecolor",panel:{origin:"backcolor",role:"application",ariaRemember:!0,html:r,onclick:a},onclick:s})});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/textpattern/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("textpattern",function(e){function t(){return c&&(l.sort(function(e,t){return e.start.length>t.start.length?-1:e.start.length<t.start.length?1:0}),c=!1),l}function n(e){for(var n=t(),r=0;r<n.length;r++)if(0===e.indexOf(n[r].start)&&(!n[r].end||e.lastIndexOf(n[r].end)==e.length-n[r].end.length))return n[r]}function r(e,n,r){var i,o,a;for(i=t(),a=0;a<i.length;a++)if(o=i[a],o.end&&e.substr(n-o.end.length-r,o.end.length)==o.end)return o}function i(t){function i(){l=l.splitText(u),l.splitText(c-u-m),l.deleteData(0,p.start.length),l.deleteData(l.data.length-p.end.length,p.end.length)}var o,a,s,l,c,u,d,f,p,m,h;if(o=e.selection,a=e.dom,o.isCollapsed()&&(s=o.getRng(!0),l=s.startContainer,c=s.startOffset,d=l.data,m=t?1:0,3==l.nodeType&&(p=r(d,c,m),p&&(u=Math.max(0,c-m),u=d.lastIndexOf(p.start,u-p.end.length-1),u!==-1&&(f=a.createRng(),f.setStart(l,u),f.setEnd(l,c-m),p=n(f.toString()),p&&p.end&&!(l.data.length<=p.start.length+p.end.length))))))return h=e.formatter.get(p.format),h&&h[0].inline?(i(),e.formatter.apply(p.format,{},l),l):void 0}function o(){var t,r,i,o,a,s,l,c,u,d,f;if(t=e.selection,r=e.dom,t.isCollapsed()&&(l=r.getParent(t.getStart(),"p"))){for(u=new tinymce.dom.TreeWalker(l,l);a=u.next();)if(3==a.nodeType){o=a;break}if(o){if(c=n(o.data),!c)return;if(d=t.getRng(!0),i=d.startContainer,f=d.startOffset,o==i&&(f=Math.max(0,f-c.start.length)),tinymce.trim(o.data).length==c.start.length)return;c.format&&(s=e.formatter.get(c.format),s&&s[0].block&&(o.deleteData(0,c.start.length),e.formatter.apply(c.format,{},o),d.setStart(i,f),d.collapse(!0),t.setRng(d))),c.cmd&&e.undoManager.transact(function(){o.deleteData(0,c.start.length),e.execCommand(c.cmd)})}}}function a(){var t,n;n=i(),n&&(t=e.dom.createRng(),t.setStart(n,n.data.length),t.setEnd(n,n.data.length),e.selection.setRng(t)),o()}function s(){var t,n,r,o,a;t=i(!0),t&&(a=e.dom,n=t.data.slice(-1),/[\u00a0 ]/.test(n)&&(t.deleteData(t.data.length-1,1),r=a.doc.createTextNode(n),t.nextSibling?a.insertAfter(r,t.nextSibling):t.parentNode.appendChild(r),o=a.createRng(),o.setStart(r,1),o.setEnd(r,1),e.selection.setRng(o)))}var l,c=!0;l=e.settings.textpattern_patterns||[{start:"*",end:"*",format:"italic"},{start:"**",end:"**",format:"bold"},{start:"#",format:"h1"},{start:"##",format:"h2"},{start:"###",format:"h3"},{start:"####",format:"h4"},{start:"#####",format:"h5"},{start:"######",format:"h6"},{start:"1. ",cmd:"InsertOrderedList"},{start:"* ",cmd:"InsertUnorderedList"},{start:"- ",cmd:"InsertUnorderedList"}],e.on("keydown",function(e){13!=e.keyCode||tinymce.util.VK.modifierPressed(e)||a()},!0),e.on("keyup",function(e){32!=e.keyCode||tinymce.util.VK.modifierPressed(e)||s()}),this.getPatterns=t,this.setPatterns=function(e){l=e,c=!0}});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/toc/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("toc",function(e){function t(t){return e.schema.isValidChild("div",t)}function n(t){return t&&e.dom.is(t,"."+d.className)&&e.getBody().contains(t)}function r(){var t=this;t.disabled(e.readonly||!o()),e.on("LoadContent SetContent change",function(){t.disabled(e.readonly||!o())})}function i(e){var t,n=[];for(t=1;t<=e;t++)n.push("h"+t);return n.join(",")}function o(){return!(!d||!a(d).length)}function a(t){var n=i(t.depth),r=f(n);return r.length&&/^h[1-9]$/i.test(t.headerTag)&&(r=r.filter(function(n,r){return!e.dom.hasClass(r.parentNode,t.className)})),tinymce.map(r,function(e){return e.id||(e.id=h()),{id:e.id,level:parseInt(e.nodeName.replace(/^H/i,""),10),title:f.text(e)}})}function s(e){var t,n=9;for(t=0;t<e.length;t++)if(e[t].level<n&&(n=e[t].level),1==n)return n;return n}function l(t,n){var r="<"+t+' contenteditable="true">',i="</"+t+">";return r+e.dom.encode(n)+i}function c(e){var t=u(e);return'<div class="'+e.className+'" contenteditable="false">'+t+"</div>"}function u(e){var t,n,r,i,o="",c=a(e),u=s(c)-1;if(!c.length)return"";for(o+=l(e.headerTag,tinymce.translate("Table of Contents")),t=0;t<c.length;t++){if(r=c[t],i=c[t+1]&&c[t+1].level,u===r.level)o+="<li>";else for(n=u;n<r.level;n++)o+="<ul><li>";if(o+='<a href="#'+r.id+'">'+r.title+"</a>",i!==r.level&&i)for(n=r.level;n>i;n--)o+="</li></ul><li>";else o+="</li>",i||(o+="</ul>");u=r.level}return o}var d,f=e.$,p={depth:3,headerTag:"h2",className:"mce-toc"},m=function(e){var t=0;return function(){var n=(new Date).getTime().toString(32);return e+n+(t++).toString(32)}},h=m("mcetoc_");e.on("PreInit",function(){var n=e.settings,r=parseInt(n.toc_depth,10)||0;d={depth:r>=1&&r<=9?r:p.depth,headerTag:t(n.toc_header)?n.toc_header:p.headerTag,className:n.toc_class?e.dom.encode(n.toc_class):p.className}}),e.on("PreProcess",function(e){var t=f("."+d.className,e.node);t.length&&(t.removeAttr("contentEditable"),t.find("[contenteditable]").removeAttr("contentEditable"))}),e.on("SetContent",function(){var e=f("."+d.className);e.length&&(e.attr("contentEditable",!1),e.children(":first-child").attr("contentEditable",!0))});var g=function(t){return!t.length||e.dom.getParents(t[0],".mce-offscreen-selection").length>0};e.addCommand("mceInsertToc",function(){var t=f("."+d.className);g(t)?e.insertContent(c(d)):e.execCommand("mceUpdateToc")}),e.addCommand("mceUpdateToc",function(){var t=f("."+d.className);t.length&&e.undoManager.transact(function(){t.html(u(d))})}),e.addButton("toc",{tooltip:"Table of Contents",cmd:"mceInsertToc",icon:"toc",onPostRender:r}),e.addButton("tocupdate",{tooltip:"Update",cmd:"mceUpdateToc",icon:"reload"}),e.addContextToolbar(n,"tocupdate"),e.addMenuItem("toc",{text:"Table of Contents",context:"insert",cmd:"mceInsertToc",onPostRender:r})});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/visualblocks/css/visualblocks.css
@@ -1,1 +1,136 @@
+.mce-visualblocks p {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	margin-left: 3px;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7);
+}
 
+.mce-visualblocks h1 {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	margin-left: 3px;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==);
+}
+
+.mce-visualblocks h2 {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	margin-left: 3px;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==);
+}
+
+.mce-visualblocks h3 {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	margin-left: 3px;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7);
+}
+
+.mce-visualblocks h4 {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	margin-left: 3px;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==);
+}
+
+.mce-visualblocks h5 {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	margin-left: 3px;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==);
+}
+
+.mce-visualblocks h6 {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	margin-left: 3px;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==);
+}
+
+.mce-visualblocks div:not([data-mce-bogus]) {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	margin-left: 3px;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7);
+}
+
+.mce-visualblocks section {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	margin: 0 0 1em 3px;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=);
+}
+
+.mce-visualblocks article {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	margin: 0 0 1em 3px;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7);
+}
+
+.mce-visualblocks blockquote {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7);
+}
+
+.mce-visualblocks address {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	margin: 0 0 1em 3px;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=);
+}
+
+.mce-visualblocks pre {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	margin-left: 3px;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==);
+}
+
+.mce-visualblocks figure {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	margin: 0 0 1em 3px;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7);
+}
+
+.mce-visualblocks hgroup {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	margin: 0 0 1em 3px;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7);
+}
+
+.mce-visualblocks aside {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	margin: 0 0 1em 3px;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=);
+}
+
+.mce-visualblocks figcaption {
+	border: 1px dashed #BBB;
+}
+
+.mce-visualblocks ul {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	margin: 0 0 1em 3px;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhDQAKAIAAALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGuYnqUVSjvw26DzzXiqIDlVwAAOw==)
+}
+
+.mce-visualblocks ol {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	margin: 0 0 1em 3px;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybH6HHt0qourxC6CvzXieHyeWQAAOw==);
+}
+
+.mce-visualblocks dl {
+	padding-top: 10px;
+	border: 1px dashed #BBB;
+	margin: 0 0 1em 3px;
+	background: transparent no-repeat url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybEOnmOvUoWznTqeuEjNSCqeGRUAOw==);
+}
+

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/visualblocks/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("visualblocks",function(e,t){function n(){var t=this;t.active(o),e.on("VisualBlocks",function(){t.active(e.dom.hasClass(e.getBody(),"mce-visualblocks"))})}var r,i,o;window.NodeList&&(e.addCommand("mceVisualBlocks",function(){var n,a=e.dom;r||(r=a.uniqueId(),n=a.create("link",{id:r,rel:"stylesheet",href:t+"/css/visualblocks.css"}),e.getDoc().getElementsByTagName("head")[0].appendChild(n)),e.on("PreviewFormats AfterPreviewFormats",function(t){o&&a.toggleClass(e.getBody(),"mce-visualblocks","afterpreviewformats"==t.type)}),a.toggleClass(e.getBody(),"mce-visualblocks"),o=e.dom.hasClass(e.getBody(),"mce-visualblocks"),i&&i.active(a.hasClass(e.getBody(),"mce-visualblocks")),e.fire("VisualBlocks")}),e.addButton("visualblocks",{title:"Show blocks",cmd:"mceVisualBlocks",onPostRender:n}),e.addMenuItem("visualblocks",{text:"Show blocks",cmd:"mceVisualBlocks",onPostRender:n,selectable:!0,context:"view",prependToContext:!0}),e.on("init",function(){e.settings.visualblocks_default_state&&e.execCommand("mceVisualBlocks",!1,null,{skip_focus:!0})}),e.on("remove",function(){e.dom.removeClass(e.getBody(),"mce-visualblocks")}))});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/visualchars/plugin.min.js
@@ -1,1 +1,1 @@
-
+tinymce.PluginManager.add("visualchars",function(e){function t(t){function n(e){return'<span data-mce-bogus="1" class="mce-'+p[e]+'">'+e+"</span>"}function o(){var e,t="";for(e in p)t+=e;return new RegExp("["+t+"]","g")}function a(){var e,t="";for(e in p)t&&(t+=","),t+="span.mce-"+p[e];return t}var s,l,c,u,d,f,p,m,h=e.getBody(),g=e.selection;if(p={"\xa0":"nbsp","\xad":"shy"},r=!r,i.state=r,e.fire("VisualChars",{state:r}),m=o(),t&&(f=g.getBookmark()),r)for(l=[],tinymce.walk(h,function(e){3==e.nodeType&&e.nodeValue&&m.test(e.nodeValue)&&l.push(e)},"childNodes"),c=0;c<l.length;c++){for(u=l[c].nodeValue,u=u.replace(m,n),d=e.dom.create("div",null,u);s=d.lastChild;)e.dom.insertAfter(s,l[c]);e.dom.remove(l[c])}else for(l=e.dom.select(a(),h),c=l.length-1;c>=0;c--)e.dom.remove(l[c],1);g.moveToBookmark(f)}function n(){var t=this;e.on("VisualChars",function(e){t.active(e.state)})}var r,i=this;e.addCommand("mceVisualChars",t),e.addButton("visualchars",{title:"Show invisible characters",cmd:"mceVisualChars",onPostRender:n}),e.addMenuItem("visualchars",{text:"Show invisible characters",cmd:"mceVisualChars",onPostRender:n,selectable:!0,context:"view",prependToContext:!0})});

--- /dev/null
+++ b/tinymce4/js/tinymce/plugins/wordcount/plugin.min.js
@@ -1,1 +1,1 @@
-
+!function(){var e={},t=function(t){for(var n=e[t],i=n.deps,o=n.defn,a=i.length,s=new Array(a),l=0;l<a;++l)s[l]=r(i[l]);var c=o.apply(null,s);if(void 0===c)throw"module ["+t+"] returned undefined";n.instance=c},n=function(t,n,r){if("string"!=typeof t)throw"module id must be a string";if(void 0===n)throw"no dependencies for "+t;if(void 0===r)throw"no definition function for "+t;e[t]={deps:n,defn:r,instance:void 0}},r=function(n){var r=e[n];if(void 0===r)throw"module ["+n+"] was undefined";return void 0===r.instance&&t(n),r.instance},i=function(e,t){for(var n=e.length,i=new Array(n),o=0;o<n;++o)i.push(r(e[o]));t.apply(null,t)},o={};o.bolt={module:{api:{define:n,require:i,demand:r}}};var a=n,s=function(e,t){a(e,[],function(){return t})};s("1",tinymce.PluginManager),s("2",tinymce.util.Delay),a("4",[],function(){var e={aletter:"[A-Za-z\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f3\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u10a0-\u10c5\u10d0-\u10fa\u10fc\u1100-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1a00-\u1a16\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bc0-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u24b6-\u24e9\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2d00-\u2d25\u2d30-\u2d65\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005\u303b\u303c\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790\ua791\ua7a0-\ua7a9\ua7fa-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uffa0-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc]",midnumlet:"['\\.\u2018\u2019\u2024\ufe52\uff07\uff0e]",midletter:"[:\xb7\xb7\u05f4\u2027\ufe13\ufe55\uff1a]",midnum:"[,;;\u0589\u060c\u060d\u066c\u07f8\u2044\ufe10\ufe14\ufe50\ufe54\uff0c\uff1b]",numeric:"[0-9\u0660-\u0669\u066b\u06f0-\u06f9\u07c0-\u07c9\u0966-\u096f\u09e6-\u09ef\u0a66-\u0a6f\u0ae6-\u0aef\u0b66-\u0b6f\u0be6-\u0bef\u0c66-\u0c6f\u0ce6-\u0cef\u0d66-\u0d6f\u0e50-\u0e59\u0ed0-\u0ed9\u0f20-\u0f29\u1040-\u1049\u1090-\u1099\u17e0-\u17e9\u1810-\u1819\u1946-\u194f\u19d0-\u19d9\u1a80-\u1a89\u1a90-\u1a99\u1b50-\u1b59\u1bb0-\u1bb9\u1c40-\u1c49\u1c50-\u1c59\ua620-\ua629\ua8d0-\ua8d9\ua900-\ua909\ua9d0-\ua9d9\uaa50-\uaa59\uabf0-\uabf9]",cr:"\\r",lf:"\\n",newline:"[\x0B\f\x85\u2028\u2029]",extend:"[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962\u0963\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09cb-\u09cd\u09d7\u09e2\u09e3\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2\u0ae3\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0c01-\u0c03\u0c3e-\u0c44\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d02\u0d03\u0d3e-\u0d44\u0d46-\u0d48\u0d4a-\u0d4d\u0d57\u0d62\u0d63\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f3e\u0f3f\u0f71-\u0f84\u0f86\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102b-\u103e\u1056-\u1059\u105e-\u1060\u1062-\u1064\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f\u109a-\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b6-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u192b\u1930-\u193b\u19b0-\u19c0\u19c8\u19c9\u1a17-\u1a1b\u1a55-\u1a5e\u1a60-\u1a7c\u1a7f\u1b00-\u1b04\u1b34-\u1b44\u1b6b-\u1b73\u1b80-\u1b82\u1ba1-\u1baa\u1be6-\u1bf3\u1c24-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce8\u1ced\u1cf2\u1dc0-\u1de6\u1dfc-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua823-\ua827\ua880\ua881\ua8b4-\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua953\ua980-\ua983\ua9b3-\ua9c0\uaa29-\uaa36\uaa43\uaa4c\uaa4d\uaa7b\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe3-\uabea\uabec\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]",format:"[\xad\u0600-\u0603\u06dd\u070f\u17b4\u17b5\u200e\u200f\u202a-\u202e\u2060-\u2064\u206a-\u206f\ufeff\ufff9-\ufffb]",katakana:"[\u3031-\u3035\u309b\u309c\u30a0-\u30fa\u30fc-\u30ff\u31f0-\u31ff\u32d0-\u32fe\u3300-\u3357\uff66-\uff9d]",extendnumlet:"[_\u203f\u2040\u2054\ufe33\ufe34\ufe4d-\ufe4f\uff3f]",punctuation:"[!-#%-*,-\\/:;?@\\[-\\]_{}\xa1\xab\xb7\xbb\xbf;\xb7\u055a-\u055f\u0589\u058a\u05be\u05c0\u05c3\u05c6\u05f3\u05f4\u0609\u060a\u060c\u060d\u061b\u061e\u061f\u066a-\u066d\u06d4\u0700-\u070d\u07f7-\u07f9\u0830-\u083e\u085e\u0964\u0965\u0970\u0df4\u0e4f\u0e5a\u0e5b\u0f04-\u0f12\u0f3a-\u0f3d\u0f85\u0fd0-\u0fd4\u0fd9\u0fda\u104a-\u104f\u10fb\u1361-\u1368\u1400\u166d\u166e\u169b\u169c\u16eb-\u16ed\u1735\u1736\u17d4-\u17d6\u17d8-\u17da\u1800-\u180a\u1944\u1945\u1a1e\u1a1f\u1aa0-\u1aa6\u1aa8-\u1aad\u1b5a-\u1b60\u1bfc-\u1bff\u1c3b-\u1c3f\u1c7e\u1c7f\u1cd3\u2010-\u2027\u2030-\u2043\u2045-\u2051\u2053-\u205e\u207d\u207e\u208d\u208e\u3008\u3009\u2768-\u2775\u27c5\u27c6\u27e6-\u27ef\u2983-\u2998\u29d8-\u29db\u29fc\u29fd\u2cf9-\u2cfc\u2cfe\u2cff\u2d70\u2e00-\u2e2e\u2e30\u2e31\u3001-\u3003\u3008-\u3011\u3014-\u301f\u3030\u303d\u30a0\u30fb\ua4fe\ua4ff\ua60d-\ua60f\ua673\ua67e\ua6f2-\ua6f7\ua874-\ua877\ua8ce\ua8cf\ua8f8-\ua8fa\ua92e\ua92f\ua95f\ua9c1-\ua9cd\ua9de\ua9df\uaa5c-\uaa5f\uaade\uaadf\uabeb\ufd3e\ufd3f\ufe10-\ufe19\ufe30-\ufe52\ufe54-\ufe61\ufe63\ufe68\ufe6a\ufe6b\uff01-\uff03\uff05-\uff0a\uff0c-\uff0f\uff1a\uff1b\uff1f\uff20\uff3b-\uff3d\uff3f\uff5b\uff5d\uff5f-\uff65]"},t={ALETTER:0,MIDNUMLET:1,MIDLETTER:2,MIDNUM:3,NUMERIC:4,CR:5,LF:6,NEWLINE:7,EXTEND:8,FORMAT:9,KATAKANA:10,EXTENDNUMLET:11,AT:12,OTHER:13},n=[new RegExp(e.aletter),new RegExp(e.midnumlet),new RegExp(e.midletter),new RegExp(e.midnum),new RegExp(e.numeric),new RegExp(e.cr),new RegExp(e.lf),new RegExp(e.newline),new RegExp(e.extend),new RegExp(e.format),new RegExp(e.katakana),new RegExp(e.extendnumlet),new RegExp("@")],r="",i=new RegExp("^"+e.punctuation+"$"),o=/\s/;return{characterIndices:t,SETS:n,EMPTY_STRING:r,PUNCTUATION:i,WHITESPACE:o}}),a("7",[],function(){var e=function(e,t,n){var r,i;if(!e)return 0;if(n=n||e,void 0!==e.length){for(r=0,i=e.length;r<i;r++)if(t.call(n,e[r],r,e)===!1)return 0}else for(r in e)if(e.hasOwnProperty(r)&&t.call(n,e[r],r,e)===!1)return 0;return 1},t=function(t,n){var r=[];return e(t,function(e,i){r.push(n(e,i,t))}),r};return{each:e,map:t}}),a("5",["4","7"],function(e,t){var n=e.SETS,r=e.characterIndices.OTHER,i=function(e){var t,i,o=r,a=n.length;for(t=0;t<a;++t)if(i=n[t],i&&i.test(e)){o=t;break}return o},o=function(e){var t={};return function(n){if(t[n])return t[n];var r=e(n);return t[n]=r,r}},a=function(e){var n=o(i);return t.map(e.split(""),n)};return{classify:a}}),a("6",["4"],function(e){var t=e.characterIndices,n=function(e,n){var r,i,o=e[n],a=e[n+1];return!(n<0||n>e.length-1&&0!==n)&&((o!==t.ALETTER||a!==t.ALETTER)&&(i=e[n+2],(o!==t.ALETTER||a!==t.MIDLETTER&&a!==t.MIDNUMLET&&a!==t.AT||i!==t.ALETTER)&&(r=e[n-1],(o!==t.MIDLETTER&&o!==t.MIDNUMLET&&a!==t.AT||a!==t.ALETTER||r!==t.ALETTER)&&((o!==t.NUMERIC&&o!==t.ALETTER||a!==t.NUMERIC&&a!==t.ALETTER)&&((o!==t.MIDNUM&&o!==t.MIDNUMLET||a!==t.NUMERIC||r!==t.NUMERIC)&&((o!==t.NUMERIC||a!==t.MIDNUM&&a!==t.MIDNUMLET||i!==t.NUMERIC)&&(o!==t.EXTEND&&o!==t.FORMAT&&r!==t.EXTEND&&r!==t.FORMAT&&a!==t.EXTEND&&a!==t.FORMAT&&((o!==t.CR||a!==t.LF)&&(o===t.NEWLINE||o===t.CR||o===t.LF||(a===t.NEWLINE||a===t.CR||a===t.LF||(o!==t.KATAKANA||a!==t.KATAKANA)&&((a!==t.EXTENDNUMLET||o!==t.ALETTER&&o!==t.NUMERIC&&o!==t.KATAKANA&&o!==t.EXTENDNUMLET)&&((o!==t.EXTENDNUMLET||a!==t.ALETTER&&a!==t.NUMERIC&&a!==t.KATAKANA)&&o!==t.AT))))))))))))};return{isWordBoundary:n}}),a("3",["4","5","6"],function(e,t,n){var r=e.EMPTY_STRING,i=e.WHITESPACE,o=e.PUNCTUATION,a=function(e){return"http"===e||"https"===e},s=function(e,t){var n;for(n=t;n<e.length;++n){var r=e.charAt(n);if(i.test(r))break}return n},l=function(e,t,n){var r=s(t,n+1),i=t.substring(n+1,r);return"://"===i.substr(0,3)?{word:e+i,index:r}:{word:e,index:n}},c=function(e,s){var c,u,d,f=0,p=t.classify(e),m=p.length,h=[],g=[];for(s||(s={}),s.ignoreCase&&(e=e.toLowerCase()),u=s.includePunctuation,d=s.includeWhitespace;f<m;++f)if(c=e.charAt(f),h.push(c),n.isWordBoundary(p,f)){if(h=h.join(r),h&&(d||!i.test(h))&&(u||!o.test(h)))if(a(h)){var v=l(h,e,f);g.push(v.word),f=v.index}else g.push(h);h=[]}return g};return{getWords:c}}),a("0",["1","2","3"],function(e,t,n){return e.add("wordcount",function(e){var r=function(e){return e.removed?"":e.getBody().innerText},i=function(){return n.getWords(r(e)).length},o=function(){e.theme.panel.find("#wordcount").text(["Words: {0}",i()])};return e.on("init",function(){var n=e.theme.panel&&e.theme.panel.find("#statusbar")[0],r=t.debounce(o,300);n&&t.setEditorTimeout(e,function(){n.insert({type:"label",name:"wordcount",text:["Words: {0}",i()],classes:"wordcount",disabled:e.settings.readonly},0),e.on("setcontent beforeaddundo undo redo keyup",r)},0)}),{getCount:i}}),function(){}}),r("0")()}();

--- /dev/null
+++ b/tinymce4/js/tinymce/skins/custom/Variables.less
@@ -1,1 +1,197 @@
+// Variables
+// Syntax: <control>-(<sub control>)-<bg|border|text>-(<state>)-(<extra>);
+// Example: @btn-primary-bg-hover-hlight;
 
+@prefix:                         mce;
+
+// Default font
+@font-family:                    "Helvetica Neue", Helvetica, Arial, sans-serif;
+@font-size:                      14px;
+@line-height:                    20px;
+@has-gradients:                  false;
+@has-radius:                     true;
+@has-boxshadow:                  true;
+@has-button-borders:             false;
+
+// Text colors
+@text:                           #333333;
+@text-inverse:                   #ffffff;
+@text-disabled:                  #aaaaaa;
+@text-shadow:                    0 1px 1px hsla(hue(@text-inverse), saturation(@text-inverse), lightness(@text-inverse), 0.75);
+@text-error:                     #aa0000;
+
+// Button
+@btn-text:                       #313824;
+@btn-text-shadow:                #ffffff;
+@btn-border-top:                 rgba(68,171,32,0.1);
+@btn-border-right:               rgba(68,171,32,0.1);
+@btn-border-bottom:              rgba(68,171,32,0.1);
+@btn-border-left:                rgba(68,171,32,0.1);
+@btn-caret-border:               @btn-text;
+@btn-text-disabled:              @text-disabled;
+@btn-box-shadow:                 inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05);
+@btn-box-shadow-active:          inset 0 2px 4px rgba(0, 0, 0, .15), 0 1px 2px rgba(0, 0, 0, .05);
+@btn-box-disabled-opacity:       0.4;
+@btn-bg:                         #e6f0d2;
+@btn-bg-hlight:                  #d9d9d9;
+@btn-bg-hover:                   darken(@btn-bg, 5%);
+@btn-bg-hlight-hover:            darken(@btn-bg-hlight, 5%);
+@btn-border-hover:               darken(@btn-bg, 20%);
+@btn-border-active:              darken(@btn-bg, 20%);
+@btn-padding:                    4px 10px;
+
+@btn-primary-bg:                 #31b011;
+@btn-primary-bg-hlight:          #0044cc;
+@btn-primary-bg-hover:           darken(@btn-primary-bg, 5%);
+@btn-primary-bg-hover-hlight:    darken(@btn-primary-bg-hlight, 5%);
+@btn-primary-text:               #ffffff;
+@btn-primary-text-shadow:        #333333;
+@btn-primary-border-top:         mix(@btn-border-top, @btn-primary-bg, 50%);
+@btn-primary-border-right:       mix(@btn-border-right, @btn-primary-bg, 50%);
+@btn-primary-border-bottom:      mix(@btn-border-bottom, @btn-primary-bg, 50%);
+@btn-primary-border-left:        mix(@btn-border-left, @btn-primary-bg, 50%);
+@btn-primary-border:             transparent;
+@btn-primary-border-hover:       transparent;
+
+// Button group
+@btn-group-border-width:         1px;
+
+// Menu
+@menuitem-text:                  #4d2f2f;
+@menu-bg:                        #e0ebcb;
+@menu-margin:                    -1px 0 0;
+@menu-border:                    rgba(9,130,28,0.2);
+@menubar-border:                 mix(@panel-border, @panel-bg, 60%);
+@menuitem-text-inverse:          #ffffff;
+@menubar-bg-active:              darken(@btn-bg, 10%);
+@menuitem-bg-hover:              #0081C2;
+@menuitem-bg-selected:           #82a63b;
+@menuitem-bg-selected-hlight:    #0077b3;
+@menuitem-bg-disabled:           #CCC;
+@menuitem-caret:                 @menuitem-text;
+@menuitem-caret-selected:        @menuitem-text-inverse;
+@menuitem-separator-top:         #13630c;
+@menuitem-separator-bottom:      #ffffff;
+@menuitem-bg-active:             #a0cca7;
+@menuitem-text-active:           #333333;
+@menuitem-preview-border-active: #aaaaaa;
+@menubar-menubtn-text:           #333333;
+
+// Panel
+@panel-border:                   #9e9e9e;
+@panel-bg:                       #c0d29d;
+@panel-bg-hlight:                #c0d29d;
+
+// Tabs
+@tab-border:                     #c5c5c5;
+@tab-bg:                         #e3e3e3;
+@tab-bg-hover:                   #fdfdfd;
+@tab-bg-active:                  #fdfdfd;
+@tabs-bg:						 #ffffff;
+
+// Tooltip
+@tooltip-bg:                     #000;
+@tooltip-text:                   white;
+@tooltip-font-size:              11px;
+
+// Notification
+@notification-font-size:         14px;
+@notification-bg:                #f0f0f0;
+@notification-border:            #cccccc;
+@notification-text:              #333333;
+@notification-success-bg:        #dff0d8;
+@notification-success-border:    #d6e9c6;
+@notification-success-text:      #3c763d;
+@notification-info-bg:           #d9edf7;
+@notification-info-border:       #779ecb;
+@notification-info-text:         #31708f;
+@notification-warning-bg:        #fcf8e3;
+@notification-warning-border:    #faebcc;
+@notification-warning-text:      #8a6d3b;
+@notification-error-bg:          #f2dede;
+@notification-error-border:      #ebccd1;
+@notification-error-text:        #a94442;
+
+// Window
+@window-border:                  #c4c4c4;
+@window-head-border:             @window-border;
+@window-head-close:              mix(@text, @window-bg, 60%);
+@window-head-close-hover:        mix(@text, @window-bg, 40%);
+@window-foot-border:             @window-border;
+@window-foot-bg:                 @window-bg;
+@window-fullscreen-bg:           #FFF;
+@window-modalblock-bg:           #000;
+@window-modalblock-opacity:      0.3;
+@window-box-shadow:              0 3px 7px rgba(0, 0, 0, 0.3);
+@window-bg:                      #ffffff;
+@window-title-font-size:         20px;
+
+// Popover
+@popover-bg:                     @window-bg;
+@popover-arrow-width:            10px;
+@popover-arrow:                  @window-bg;
+@popover-arrow-outer-width:      @popover-arrow-width + 1;
+@popover-arrow-outer:            rgba(0, 0, 0, 0.25);
+
+// Floatpanel
+@floatpanel-box-shadow:          0 5px 10px rgba(0, 0, 0, .2);
+
+// Checkbox
+@checkbox-bg:                    @btn-bg;
+@checkbox-bg-hlight:             @btn-bg-hlight;
+@checkbox-box-shadow:            inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05);
+@checkbox-border:                #c5c5c5;
+@checkbox-border-focus:          #459e3d;
+
+// Path
+@path-text:                      @text;
+@path-bg-focus:                  #666;
+@path-text-focus:                #fff;
+
+// Textbox
+@textbox-text-placeholder:       #aaa;
+@textbox-box-shadow:             inset 0 1px 1px rgba(0, 0, 0, 0.075);
+@textbox-bg:                     #ffffff;
+@textbox-border:                 #c5c5c5;
+@textbox-border-focus:           #59a5e1;
+
+// Selectbox
+@selectbox-bg:                   @textbox-bg;
+@selectbox-border:               @textbox-border;
+
+// Throbber
+@throbber-bg:                    #fff url('img/loader.gif') no-repeat center center;
+
+// Combobox
+@combobox-border:                @textbox-border;
+
+// Colorpicker
+@colorpicker-border:             @textbox-border;
+@colorpicker-hue-bg:             #fff;
+@colorpicker-hue-border:         #333;
+
+// Grid
+@grid-bg-active:                 @menuitem-bg-active;
+@grid-border-active:             #a1a1a1;
+@grid-border:                    #d6d6d6;
+
+// Misc
+@colorbtn-backcolor-bg:          #bbbbbb;
+@iframe-border:                  @panel-border;
+
+// Slider
+@slider-border:                  #aaaaaa;
+@slider-bg:                      #eeeeee;
+@slider-handle-border:           #bbbbbb;
+@slider-handle-bg:               #dddddd;
+
+// Progress
+@progress-border:                #cccccc;
+@progress-bar-bg:                #dfdfdf;
+@progress-bar-bg-hlight:         #cccccc;
+@progress-text:                  #333333;
+@progress-text-shadow:           #ffffff;
+
+// Flow layout
+@flow-layout-spacing:            2px;
+

--- /dev/null
+++ b/tinymce4/js/tinymce/skins/custom/content.inline.min.css
@@ -1,1 +1,1 @@
-
+.mce-content-body .mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:black;font-family:Arial;font-size:11px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;line-height:normal;font-weight:normal;text-align:left;-webkit-tap-highlight-color:transparent;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-object{border:1px dotted #3a3a3a;background:#d5d5d5 url(img/object.gif) no-repeat center}.mce-preview-object{display:inline-block;position:relative;margin:0 2px 0 2px;line-height:0;border:1px solid gray}.mce-preview-object .mce-shim{position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}figure.align-left{float:left}figure.align-right{float:right}figure.image.align-center{display:table;margin-left:auto;margin-right:auto}figure.image{display:inline-block;border:1px solid gray;margin:0 2px 0 1px;background:#f5f2f0}figure.image img{margin:8px 8px 0 8px}figure.image figcaption{margin:6px 8px 6px 8px;text-align:center}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-pagebreak{cursor:default;display:block;border:0;width:100%;height:5px;border:1px dashed #666;margin-top:15px;page-break-before:always}@media print{.mce-pagebreak{border:0}}.mce-item-anchor{cursor:default;display:inline-block;-webkit-user-select:all;-webkit-user-modify:read-only;-moz-user-select:all;-moz-user-modify:read-only;user-select:all;user-modify:read-only;width:9px !important;height:9px !important;border:1px dotted #3a3a3a;background:#d5d5d5 url(img/anchor.gif) no-repeat center}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}hr{cursor:default}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-spellchecker-word{border-bottom:2px solid #f00;cursor:default}.mce-spellchecker-grammar{border-bottom:2px solid #008000;cursor:default}.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption{border:1px dashed #bbb}td[data-mce-selected],th[data-mce-selected]{background-color:#39f !important}.mce-edit-focus{outline:1px dotted #333}.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus{outline:2px solid #2d8ac7}.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover{outline:2px solid #7acaff}.mce-content-body *[contentEditable=false][data-mce-selected]{outline:2px solid #2d8ac7}.mce-resize-bar-dragging{background-color:blue;opacity:.25;filter:alpha(opacity=25);zoom:1}

--- /dev/null
+++ b/tinymce4/js/tinymce/skins/custom/content.min.css
@@ -1,1 +1,1 @@
-
+body{background-color:#fff;color:#000;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:11px;scrollbar-3dlight-color:#f0f0ee;scrollbar-arrow-color:#676662;scrollbar-base-color:#f0f0ee;scrollbar-darkshadow-color:#ddd;scrollbar-face-color:#e0e0dd;scrollbar-highlight-color:#f0f0ee;scrollbar-shadow-color:#f0f0ee;scrollbar-track-color:#f5f5f5}td,th{font-family:Verdana,Arial,Helvetica,sans-serif;font-size:11px}.mce-content-body .mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:black;font-family:Arial;font-size:11px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;line-height:normal;font-weight:normal;text-align:left;-webkit-tap-highlight-color:transparent;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-object{border:1px dotted #3a3a3a;background:#d5d5d5 url(img/object.gif) no-repeat center}.mce-preview-object{display:inline-block;position:relative;margin:0 2px 0 2px;line-height:0;border:1px solid gray}.mce-preview-object .mce-shim{position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}figure.align-left{float:left}figure.align-right{float:right}figure.image.align-center{display:table;margin-left:auto;margin-right:auto}figure.image{display:inline-block;border:1px solid gray;margin:0 2px 0 1px;background:#f5f2f0}figure.image img{margin:8px 8px 0 8px}figure.image figcaption{margin:6px 8px 6px 8px;text-align:center}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-pagebreak{cursor:default;display:block;border:0;width:100%;height:5px;border:1px dashed #666;margin-top:15px;page-break-before:always}@media print{.mce-pagebreak{border:0}}.mce-item-anchor{cursor:default;display:inline-block;-webkit-user-select:all;-webkit-user-modify:read-only;-moz-user-select:all;-moz-user-modify:read-only;user-select:all;user-modify:read-only;width:9px !important;height:9px !important;border:1px dotted #3a3a3a;background:#d5d5d5 url(img/anchor.gif) no-repeat center}.mce-nbsp,.mce-shy{background:#aaa}.mce-shy::after{content:'-'}hr{cursor:default}.mce-match-marker{background:#aaa;color:#fff}.mce-match-marker-selected{background:#39f;color:#fff}.mce-spellchecker-word{border-bottom:2px solid #f00;cursor:default}.mce-spellchecker-grammar{border-bottom:2px solid #008000;cursor:default}.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption{border:1px dashed #bbb}td[data-mce-selected],th[data-mce-selected]{background-color:#39f !important}.mce-edit-focus{outline:1px dotted #333}.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus{outline:2px solid #2d8ac7}.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover{outline:2px solid #7acaff}.mce-content-body *[contentEditable=false][data-mce-selected]{outline:2px solid #2d8ac7}.mce-resize-bar-dragging{background-color:blue;opacity:.25;filter:alpha(opacity=25);zoom:1}

--- /dev/null
+++ b/tinymce4/js/tinymce/skins/custom/fonts/readme.md
@@ -1,1 +1,2 @@
+Icons are generated and provided by the http://icomoon.io service.
 

 Binary files /dev/null and b/tinymce4/js/tinymce/skins/custom/fonts/tinymce-small.eot differ
--- /dev/null
+++ b/tinymce4/js/tinymce/skins/custom/fonts/tinymce-small.json
@@ -1,1 +1,1277 @@
-
+{
+	"IcoMoonType": "selection",
+	"icons": [
+		{
+			"icon": {
+				"paths": [
+					"M704 832v-37.004c151.348-61.628 256-193.82 256-346.996 0-212.078-200.576-384-448-384s-448 171.922-448 384c0 153.176 104.654 285.368 256 346.996v37.004h-192l-64-96v224h320v-222.812c-100.9-51.362-170.666-161.54-170.666-289.188 0-176.732 133.718-320 298.666-320 164.948 0 298.666 143.268 298.666 320 0 127.648-69.766 237.826-170.666 289.188v222.812h320v-224l-64 96h-192z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57376,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 0,
+				"order": 1,
+				"prevSize": 32,
+				"code": 57376,
+				"name": "charmap",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 0
+		},
+		{
+			"icon": {
+				"paths": [
+					"M256 64v896l256-256 256 256v-896h-512zM704 789.49l-192-192-192 192v-661.49h384v661.49z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57363,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 1,
+				"order": 2,
+				"prevSize": 32,
+				"code": 57363,
+				"name": "bookmark",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 1
+		},
+		{
+			"icon": {
+				"paths": [
+					"M927.274 230.216l-133.49-133.488c-21.104-21.104-49.232-32.728-79.198-32.728s-58.094 11.624-79.196 32.726l-165.492 165.49c-43.668 43.668-43.668 114.724 0 158.392l2.746 2.746 67.882-67.882-2.746-2.746c-6.132-6.132-6.132-16.494 0-22.626l165.492-165.492c4.010-4.008 8.808-4.608 11.312-4.608s7.302 0.598 11.312 4.61l133.49 133.488c6.132 6.134 6.132 16.498 0.002 22.628l-165.494 165.494c-4.008 4.008-8.806 4.608-11.31 4.608s-7.302-0.6-11.312-4.612l-2.746-2.746-67.88 67.884 2.742 2.742c21.106 21.108 49.23 32.728 79.2 32.728s58.094-11.624 79.196-32.726l165.494-165.492c43.662-43.666 43.662-114.72-0.004-158.39zM551.356 600.644l-67.882 67.882 2.746 2.746c4.008 4.008 4.61 8.806 4.61 11.31 0 2.506-0.598 7.302-4.606 11.314l-165.494 165.49c-4.010 4.010-8.81 4.61-11.314 4.61s-7.304-0.6-11.314-4.61l-133.492-133.486c-4.010-4.010-4.61-8.81-4.61-11.314s0.598-7.3 4.61-11.312l165.49-165.488c4.010-4.012 8.81-4.612 11.314-4.612s7.304 0.6 11.314 4.612l2.746 2.742 67.882-67.88-2.746-2.746c-21.104-21.104-49.23-32.726-79.196-32.726s-58.092 11.624-79.196 32.726l-165.488 165.486c-21.106 21.104-32.73 49.234-32.73 79.198s11.624 58.094 32.726 79.198l133.49 133.49c21.106 21.102 49.232 32.726 79.198 32.726s58.092-11.624 79.196-32.726l165.494-165.492c21.104-21.104 32.722-49.23 32.722-79.196s-11.624-58.094-32.726-79.196l-2.744-2.746zM800 838c-9.724 0-19.45-3.708-26.87-11.13l-128-127.998c-14.844-14.84-14.844-38.898 0-53.738 14.84-14.844 38.896-14.844 53.736 0l128 128c14.844 14.84 14.844 38.896 0 53.736-7.416 7.422-17.142 11.13-26.866 11.13zM608 960c-17.674 0-32-14.326-32-32v-128c0-17.674 14.326-32 32-32s32 14.326 32 32v128c0 17.674-14.326 32-32 32zM928 640h-128c-17.674 0-32-14.326-32-32s14.326-32 32-32h128c17.674 0 32 14.326 32 32s-14.326 32-32 32zM224 186c9.724 0 19.45 3.708 26.87 11.13l128 128c14.842 14.84 14.842 38.898 0 53.738-14.84 14.844-38.898 14.844-53.738 0l-128-128c-14.842-14.84-14.842-38.898 0-53.738 7.418-7.422 17.144-11.13 26.868-11.13zM416 64c17.674 0 32 14.326 32 32v128c0 17.674-14.326 32-32 32s-32-14.326-32-32v-128c0-17.674 14.326-32 32-32zM96 384h128c17.674 0 32 14.326 32 32s-14.326 32-32 32h-128c-17.674 0-32-14.326-32-32s14.326-32 32-32z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57362,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 2,
+				"order": 3,
+				"prevSize": 32,
+				"code": 57362,
+				"name": "link",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 2
+		},
+		{
+			"icon": {
+				"paths": [
+					"M927.274 230.216l-133.49-133.488c-21.104-21.104-49.232-32.728-79.198-32.728s-58.094 11.624-79.196 32.726l-165.492 165.49c-43.668 43.668-43.668 114.724 0 158.392l2.746 2.746 67.882-67.882-2.746-2.746c-6.132-6.132-6.132-16.494 0-22.626l165.492-165.492c4.010-4.008 8.808-4.608 11.312-4.608s7.302 0.598 11.312 4.61l133.49 133.488c6.132 6.134 6.132 16.498 0.002 22.628l-165.494 165.494c-4.008 4.008-8.806 4.608-11.31 4.608s-7.302-0.6-11.312-4.612l-2.746-2.746-67.88 67.884 2.742 2.742c21.106 21.108 49.23 32.728 79.2 32.728s58.094-11.624 79.196-32.726l165.494-165.492c43.662-43.666 43.662-114.72-0.004-158.39zM551.356 600.644l-67.882 67.882 2.746 2.746c4.008 4.008 4.61 8.806 4.61 11.31 0 2.506-0.598 7.302-4.606 11.314l-165.494 165.49c-4.010 4.010-8.81 4.61-11.314 4.61s-7.304-0.6-11.314-4.61l-133.492-133.486c-4.010-4.010-4.61-8.81-4.61-11.314s0.598-7.3 4.61-11.312l165.49-165.488c4.010-4.012 8.81-4.612 11.314-4.612s7.304 0.6 11.314 4.612l2.746 2.742 67.882-67.88-2.746-2.746c-21.104-21.104-49.23-32.726-79.196-32.726s-58.092 11.624-79.196 32.726l-165.488 165.486c-21.106 21.104-32.73 49.234-32.73 79.198s11.624 58.094 32.726 79.198l133.49 133.49c21.106 21.102 49.232 32.726 79.198 32.726s58.092-11.624 79.196-32.726l165.494-165.492c21.104-21.104 32.722-49.23 32.722-79.196s-11.624-58.094-32.726-79.196l-2.744-2.746zM352 710c-9.724 0-19.45-3.71-26.87-11.128-14.84-14.84-14.84-38.898 0-53.738l320-320c14.84-14.84 38.896-14.84 53.736 0 14.844 14.84 14.844 38.9 0 53.74l-320 320c-7.416 7.416-17.142 11.126-26.866 11.126z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57361,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 3,
+				"order": 4,
+				"prevSize": 32,
+				"code": 57361,
+				"name": "unlink",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 3
+		},
+		{
+			"icon": {
+				"paths": [
+					"M576 281.326v-217.326l336.002 336-336.002 336v-222.096c-390.906-9.17-315 247.096-256 446.096-288-320-212.092-690.874 256-678.674z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57360,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 4,
+				"order": 5,
+				"prevSize": 32,
+				"code": 57360,
+				"name": "redo",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 4
+		},
+		{
+			"icon": {
+				"paths": [
+					"M704 960c59-199 134.906-455.266-256-446.096v222.096l-336.002-336 336.002-336v217.326c468.092-12.2 544 358.674 256 678.674z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57359,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 5,
+				"order": 6,
+				"prevSize": 32,
+				"code": 57359,
+				"name": "undo",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 5
+		},
+		{
+			"icon": {
+				"paths": [
+					"M256.428 424.726c105.8 0 191.572 91.17 191.572 203.638 0 112.464-85.772 203.636-191.572 203.636-105.802 0-191.572-91.17-191.572-203.636l-0.856-29.092c0-224.93 171.54-407.272 383.144-407.272v116.364c-73.1 0-141.826 30.26-193.516 85.204-9.954 10.578-19.034 21.834-27.224 33.656 9.784-1.64 19.806-2.498 30.024-2.498zM768.428 424.726c105.8 0 191.572 91.17 191.572 203.638 0 112.464-85.772 203.636-191.572 203.636-105.802 0-191.572-91.17-191.572-203.636l-0.856-29.092c0-224.93 171.54-407.272 383.144-407.272v116.364c-73.1 0-141.826 30.26-193.516 85.204-9.956 10.578-19.036 21.834-27.224 33.656 9.784-1.64 19.806-2.498 30.024-2.498z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57358,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 6,
+				"order": 7,
+				"prevSize": 32,
+				"code": 57358,
+				"name": "blockquote",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 6
+		},
+		{
+			"icon": {
+				"paths": [
+					"M64 192h896v128h-896zM384 576h576v128h-576zM384 384h576v128h-576zM64 768h896v128h-896zM64 384l224 160-224 160z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57356,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 7,
+				"order": 8,
+				"prevSize": 32,
+				"code": 57356,
+				"name": "indent",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 7
+		},
+		{
+			"icon": {
+				"paths": [
+					"M64 192h896v128h-896zM64 576h576v128h-576zM64 384h576v128h-576zM64 768h896v128h-896zM960 384l-224 160 224 160z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57357,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 8,
+				"order": 9,
+				"prevSize": 32,
+				"code": 57357,
+				"name": "outdent",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 8
+		},
+		{
+			"icon": {
+				"paths": [
+					"M384 128h576v128h-576zM384 448h576v128h-576zM384 768h576v128h-576zM320 530v-146h-64v-320h-128v64h64v256h-64v64h128v50l-128 60v146h128v64h-128v64h128v64h-128v64h192v-320h-128v-50z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57355,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 9,
+				"order": 10,
+				"prevSize": 32,
+				"code": 57355,
+				"name": "numlist",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 9
+		},
+		{
+			"icon": {
+				"paths": [
+					"M384 128h576v128h-576zM384 448h576v128h-576zM384 768h576v128h-576zM128 192c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM128 512c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM128 832c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57354,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 10,
+				"order": 11,
+				"prevSize": 32,
+				"code": 57354,
+				"name": "bullist",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 10
+		},
+		{
+			"icon": {
+				"paths": [
+					"M888 384h-56v-256h64v-64h-320v64h64v256h-256v-256h64v-64h-320v64h64v256h-56c-39.6 0-72 32.4-72 72v432c0 39.6 32.4 72 72 72h240c39.6 0 72-32.4 72-72v-312h128v312c0 39.6 32.4 72 72 72h240c39.6 0 72-32.4 72-72v-432c0-39.6-32.4-72-72-72zM348 896h-184c-19.8 0-36-14.4-36-32s16.2-32 36-32h184c19.8 0 36 14.4 36 32s-16.2 32-36 32zM544 512h-64c-17.6 0-32-14.4-32-32s14.4-32 32-32h64c17.6 0 32 14.4 32 32s-14.4 32-32 32zM860 896h-184c-19.8 0-36-14.4-36-32s16.2-32 36-32h184c19.8 0 36 14.4 36 32s-16.2 32-36 32z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57353,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 11,
+				"order": 12,
+				"prevSize": 32,
+				"code": 57353,
+				"name": "searchreplace",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 11
+		},
+		{
+			"icon": {
+				"paths": [
+					"M704 384v-160c0-17.6-14.4-32-32-32h-160v-64c0-35.2-28.8-64-64-64h-128c-35.204 0-64 28.8-64 64v64h-160c-17.602 0-32 14.4-32 32v512c0 17.6 14.398 32 32 32h224v192h384l192-192v-384h-192zM320 128.114c0.034-0.038 0.072-0.078 0.114-0.114h127.768c0.042 0.036 0.082 0.076 0.118 0.114l0 63.886h-128v-63.886zM192 320v-64h384v64h-384zM704 869.49v-101.49h101.49l-101.49 101.49zM832 704h-192v192h-256v-448h448v256z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57352,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 12,
+				"order": 13,
+				"prevSize": 32,
+				"code": 57352,
+				"name": "paste",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 12
+		},
+		{
+			"icon": {
+				"paths": [
+					"M832 320h-192v-64l-192-192h-384v704h384v192h576v-448l-192-192zM832 410.51l101.49 101.49h-101.49v-101.49zM448 154.51l101.49 101.49h-101.49v-101.49zM128 128h256v192h192v384h-448v-576zM960 896h-448v-128h128v-384h128v192h192v320z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57393,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 13,
+				"order": 14,
+				"prevSize": 32,
+				"code": 57393,
+				"name": "copy",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 13
+		},
+		{
+			"icon": {
+				"paths": [
+					"M960 512h-265.876c-50.078-35.42-114.43-54.86-182.124-54.86-89.206 0-164.572-50.242-164.572-109.712 0-59.47 75.366-109.714 164.572-109.714 75.058 0 140.308 35.576 159.12 82.286h113.016c-7.93-50.644-37.58-97.968-84.058-132.826-50.88-38.16-117.676-59.174-188.078-59.174-70.404 0-137.196 21.014-188.074 59.174-54.788 41.090-86.212 99.502-86.212 160.254s31.424 119.164 86.212 160.254c1.956 1.466 3.942 2.898 5.946 4.316h-265.872v64h512.532c58.208 17.106 100.042 56.27 100.042 100.572 0 59.468-75.368 109.71-164.572 109.71-75.060 0-140.308-35.574-159.118-82.286h-113.016c7.93 50.64 37.582 97.968 84.060 132.826 50.876 38.164 117.668 59.18 188.072 59.18 70.402 0 137.198-21.016 188.074-59.174 54.79-41.090 86.208-99.502 86.208-160.254 0-35.298-10.654-69.792-30.294-100.572h204.012v-64z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57389,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 19,
+				"order": 15,
+				"prevSize": 32,
+				"code": 57389,
+				"name": "strikethrough",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 14
+		},
+		{
+			"icon": {
+				"paths": [
+					"M192 832h576v64h-576v-64zM640 128v384c0 31.312-14.7 61.624-41.39 85.352-30.942 27.502-73.068 42.648-118.61 42.648-45.544 0-87.668-15.146-118.608-42.648-26.692-23.728-41.392-54.040-41.392-85.352v-384h-128v384c0 141.382 128.942 256 288 256s288-114.618 288-256v-384h-128z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57388,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 20,
+				"order": 16,
+				"prevSize": 32,
+				"code": 57388,
+				"name": "underline",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 15
+		},
+		{
+			"icon": {
+				"paths": [
+					"M832 128v64h-144l-256 640h144v64h-448v-64h144l256-640h-144v-64h448z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57387,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 21,
+				"order": 17,
+				"prevSize": 32,
+				"code": 57387,
+				"name": "italic",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 16
+		},
+		{
+			"icon": {
+				"paths": [
+					"M625.442 494.182c48.074-38.15 78.558-94.856 78.558-158.182 0-114.876-100.29-208-224-208h-224v768h288c123.712 0 224-93.124 224-208 0-88.196-59.118-163.562-142.558-193.818zM384 304c0-26.51 21.49-48 48-48h67.204c42.414 0 76.796 42.98 76.796 96s-34.382 96-76.796 96h-115.204v-144zM547.2 768h-115.2c-26.51 0-48-21.49-48-48v-144h163.2c42.418 0 76.8 42.98 76.8 96s-34.382 96-76.8 96z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57386,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 22,
+				"order": 18,
+				"prevSize": 32,
+				"code": 57386,
+				"name": "bold",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 17
+		},
+		{
+			"icon": {
+				"paths": [
+					"M850.746 242.746l-133.492-133.49c-24.888-24.892-74.054-45.256-109.254-45.256h-416c-35.2 0-64 28.8-64 64v768c0 35.2 28.8 64 64 64h640c35.2 0 64-28.8 64-64v-544c0-35.2-20.366-84.364-45.254-109.254zM805.49 287.998c6.792 6.796 13.792 19.162 18.894 32.002h-184.384v-184.386c12.84 5.1 25.204 12.1 32 18.896l133.49 133.488zM831.884 896h-639.77c-0.040-0.034-0.082-0.076-0.114-0.116v-767.77c0.034-0.040 0.076-0.082 0.114-0.114h383.886v256h256v511.884c-0.034 0.040-0.076 0.082-0.116 0.116z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57345,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 23,
+				"order": 19,
+				"prevSize": 32,
+				"code": 57345,
+				"name": "newdocument",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 18
+		},
+		{
+			"icon": {
+				"paths": [
+					"M960 880v-591.938l-223.938-224.062h-592.062c-44.182 0-80 35.816-80 80v736c0 44.184 35.818 80 80 80h736c44.184 0 80-35.816 80-80zM576 192h64v192h-64v-192zM704 832h-384v-255.882c0.034-0.042 0.076-0.082 0.116-0.118h383.77c0.040 0.036 0.082 0.076 0.116 0.118l-0.002 255.882zM832 832h-64v-256c0-35.2-28.8-64-64-64h-384c-35.2 0-64 28.8-64 64v256h-64v-640h64v192c0 35.2 28.8 64 64 64h320c35.2 0 64-28.8 64-64v-171.010l128 128.072v490.938z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57344,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 24,
+				"order": 20,
+				"prevSize": 32,
+				"code": 57344,
+				"name": "save",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 19
+		},
+		{
+			"icon": {
+				"paths": [
+					"M64 192v704h896v-704h-896zM384 640v-128h256v128h-256zM640 704v128h-256v-128h256zM640 320v128h-256v-128h256zM320 320v128h-192v-128h192zM128 512h192v128h-192v-128zM704 512h192v128h-192v-128zM704 448v-128h192v128h-192zM128 704h192v128h-192v-128zM704 832v-128h192v128h-192z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57371,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 25,
+				"order": 21,
+				"prevSize": 32,
+				"code": 57371,
+				"name": "table",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 20
+		},
+		{
+			"icon": {
+				"paths": [
+					"M512 140c99.366 0 192.782 38.694 263.042 108.956s108.958 163.678 108.958 263.044-38.696 192.782-108.958 263.042-163.676 108.958-263.042 108.958-192.782-38.696-263.044-108.958-108.956-163.676-108.956-263.042 38.694-192.782 108.956-263.044 163.678-108.956 263.044-108.956zM512 64c-247.424 0-448 200.576-448 448s200.576 448 448 448 448-200.576 448-448-200.576-448-448-448v0zM320 384c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM576 384c0 35.346 28.654 64 64 64s64-28.654 64-64c0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64zM512 656c-101.84 0-192.56-36.874-251.166-94.328 23.126 117.608 126.778 206.328 251.166 206.328 124.388 0 228.040-88.72 251.168-206.328-58.608 57.454-149.328 94.328-251.168 94.328z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57377,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 26,
+				"order": 22,
+				"prevSize": 32,
+				"code": 57377,
+				"name": "emoticons",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 21
+		},
+		{
+			"icon": {
+				"paths": [
+					"M480 384l-192-192 128-128h-352v352l128-128 192 192zM640 480l192-192 128 128v-352h-352l128 128-192 192zM544 640l192 192-128 128h352v-352l-128 128-192-192zM384 544l-192 192-128-128v352h352l-128-128 192-192z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57379,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 27,
+				"order": 23,
+				"prevSize": 32,
+				"code": 57379,
+				"name": "fullscreen",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 22
+		},
+		{
+			"icon": {
+				"paths": [
+					"M64 448h896v128h-896z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57372,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 28,
+				"order": 24,
+				"prevSize": 32,
+				"code": 57372,
+				"name": "hr",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 23
+		},
+		{
+			"icon": {
+				"paths": [
+					"M64 768h512v128h-512v-128zM768 192h-220.558l-183.766 512h-132.288l183.762-512h-223.15v-128h576v128zM929.774 896l-129.774-129.774-129.774 129.774-62.226-62.226 129.774-129.774-129.774-129.774 62.226-62.226 129.774 129.774 129.774-129.774 62.226 62.226-129.774 129.774 129.774 129.774-62.226 62.226z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57373,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 29,
+				"order": 25,
+				"prevSize": 32,
+				"code": 57373,
+				"name": "removeformat",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 24
+		},
+		{
+			"icon": {
+				"paths": [
+					"M256 128h512v128h-512v-128zM896 320h-768c-35.2 0-64 28.8-64 64v256c0 35.2 28.796 64 64 64h128v192h512v-192h128c35.2 0 64-28.8 64-64v-256c0-35.2-28.8-64-64-64zM704 832h-384v-256h384v256zM910.4 416c0 25.626-20.774 46.4-46.398 46.4s-46.402-20.774-46.402-46.4 20.778-46.4 46.402-46.4c25.626 0 46.398 20.774 46.398 46.4z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57378,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 30,
+				"order": 26,
+				"prevSize": 32,
+				"code": 57378,
+				"name": "print",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 25
+		},
+		{
+			"icon": {
+				"paths": [
+					"M384 128c-123.712 0-224 100.288-224 224s100.288 224 224 224v320h128v-640h64v640h128v-640h128v-128h-448z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57390,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 31,
+				"order": 27,
+				"prevSize": 32,
+				"code": 57390,
+				"name": "visualchars",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 26
+		},
+		{
+			"icon": {
+				"paths": [
+					"M448 128c-123.712 0-224 100.288-224 224s100.288 224 224 224v320h128v-640h64v640h128v-640h128v-128h-448zM64 896l224-192-224-192z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57391,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 32,
+				"order": 28,
+				"prevSize": 32,
+				"code": 57391,
+				"name": "ltr",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 27
+		},
+		{
+			"icon": {
+				"paths": [
+					"M416 704l-192-192 192-192-64-64-256 256 256 256zM672 256l-64 64 192 192-192 192 64 64 256-256z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57367,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 38,
+				"order": 29,
+				"prevSize": 32,
+				"code": 57367,
+				"name": "code",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 28
+		},
+		{
+			"icon": {
+				"paths": [
+					"M448 704h128v128h-128v-128zM704 256c35.346 0 64 28.654 64 64v166l-228 154h-92v-64l192-128v-64h-320v-128h384zM512 64c-119.666 0-232.166 46.6-316.784 131.216-84.614 84.618-131.216 197.118-131.216 316.784 0 119.664 46.602 232.168 131.216 316.784 84.618 84.616 197.118 131.216 316.784 131.216 119.664 0 232.168-46.6 316.784-131.216 84.616-84.616 131.216-197.12 131.216-316.784 0-119.666-46.6-232.166-131.216-316.784-84.616-84.616-197.12-131.216-316.784-131.216z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57366,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 39,
+				"order": 30,
+				"prevSize": 32,
+				"code": 57366,
+				"name": "help",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 29
+		},
+		{
+			"icon": {
+				"paths": [
+					"M896 128h-768c-35.2 0-64 28.8-64 64v640c0 35.2 28.8 64 64 64h768c35.2 0 64-28.8 64-64v-640c0-35.2-28.8-64-64-64zM896 831.884c-0.012 0.014-0.030 0.028-0.042 0.042l-191.958-319.926-160 128-224-288-191.968 479.916c-0.010-0.010-0.022-0.022-0.032-0.032v-639.77c0.034-0.040 0.076-0.082 0.114-0.114h767.77c0.040 0.034 0.082 0.076 0.116 0.116v639.768zM640 352c0 53.019 42.981 96 96 96s96-42.981 96-96c0-53.019-42.981-96-96-96-53.019 0-96 42.981-96 96z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57364,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 40,
+				"order": 31,
+				"prevSize": 32,
+				"code": 57364,
+				"name": "image",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 30
+		},
+		{
+			"icon": {
+				"paths": [
+					"M896 128h-768c-35.2 0-64 28.8-64 64v640c0 35.2 28.8 64 64 64h768c35.2 0 64-28.8 64-64v-640c0-35.2-28.8-64-64-64zM256 832h-128v-128h128v128zM256 576h-128v-128h128v128zM256 320h-128v-128h128v128zM704 832h-384v-640h384v640zM896 832h-128v-128h128v128zM896 576h-128v-128h128v128zM896 320h-128v-128h128v128zM384 320v384l288-192z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57365,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 41,
+				"order": 32,
+				"prevSize": 32,
+				"code": 57365,
+				"name": "media",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 31
+		},
+		{
+			"icon": {
+				"paths": [
+					"M77.798 304.624l81.414 50.882c50.802-81.114 128.788-143.454 221.208-174.246l-30.366-91.094c-113.748 37.898-209.728 114.626-272.256 214.458zM673.946 90.166l-30.366 91.094c92.422 30.792 170.404 93.132 221.208 174.248l81.412-50.882c-62.526-99.834-158.506-176.562-272.254-214.46zM607.974 704.008c-4.808 0-9.692-1.090-14.286-3.386l-145.688-72.844v-211.778c0-17.672 14.328-32 32-32s32 14.328 32 32v172.222l110.31 55.156c15.806 7.902 22.214 27.124 14.31 42.932-5.604 11.214-16.908 17.696-28.646 17.698zM512 192c-212.078 0-384 171.922-384 384s171.922 384 384 384c212.078 0 384-171.922 384-384 0-212.078-171.922-384-384-384zM512 864c-159.058 0-288-128.942-288-288s128.942-288 288-288c159.058 0 288 128.942 288 288 0 159.058-128.942 288-288 288z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57368,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 42,
+				"order": 33,
+				"prevSize": 32,
+				"code": 57368,
+				"name": "insertdatetime",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 32
+		},
+		{
+			"icon": {
+				"paths": [
+					"M64 455.746c45.318-49.92 97.162-92.36 153.272-125.124 90.332-52.744 192.246-80.622 294.728-80.622 102.48 0 204.396 27.878 294.726 80.624 56.112 32.764 107.956 75.204 153.274 125.124v-117.432c-33.010-28.118-68.124-53.14-104.868-74.594-105.006-61.314-223.658-93.722-343.132-93.722s-238.128 32.408-343.134 93.72c-36.742 21.454-71.856 46.478-104.866 74.596v117.43zM512 320c-183.196 0-345.838 100.556-448 256 102.162 155.448 264.804 256 448 256 183.196 0 345.838-100.552 448-256-102.162-155.444-264.804-256-448-256zM512 512c0 35.346-28.654 64-64 64s-64-28.654-64-64c0-35.348 28.654-64 64-64s64 28.652 64 64zM728.066 696.662c-67.434 39.374-140.128 59.338-216.066 59.338s-148.632-19.964-216.066-59.338c-51.554-30.104-98.616-71.31-138.114-120.662 39.498-49.35 86.56-90.558 138.116-120.66 13.276-7.752 26.758-14.74 40.426-20.982-10.512 23.742-16.362 50.008-16.362 77.642 0 106.040 85.962 192 192 192 106.040 0 192-85.96 192-192 0-27.634-5.85-53.9-16.36-77.642 13.668 6.244 27.15 13.23 40.426 20.982 51.554 30.102 98.616 71.31 138.116 120.66-39.498 49.352-86.56 90.558-138.116 120.662z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57369,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 43,
+				"order": 34,
+				"prevSize": 32,
+				"code": 57369,
+				"name": "preview",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 33
+		},
+		{
+			"icon": {
+				"paths": [
+					"M651.168 283.834c-24.612-81.962-28.876-91.834-107.168-91.834h-64c-79.618 0-82.664 10.152-108.418 96 0 0.002 0 0.002-0.002 0.004l-143.998 479.996h113.636l57.6-192h226.366l57.6 192h113.63l-145.246-484.166zM437.218 448l38.4-136c10.086-33.618 36.38-30 36.38-30s26.294-3.618 36.38 30h0.004l38.4 136h-149.564z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57370,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 44,
+				"order": 35,
+				"prevSize": 32,
+				"code": 57370,
+				"name": "forecolor",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 34
+		},
+		{
+			"icon": {
+				"paths": [
+					"M576 64c247.424 0 448 200.576 448 448s-200.576 448-448 448v-96c94.024 0 182.418-36.614 248.902-103.098 66.484-66.484 103.098-154.878 103.098-248.902 0-94.022-36.614-182.418-103.098-248.902-66.484-66.484-154.878-103.098-248.902-103.098-94.022 0-182.418 36.614-248.902 103.098-51.14 51.138-84.582 115.246-97.306 184.902h186.208l-224 256-224-256h164.57c31.060-217.102 217.738-384 443.43-384zM768 448v128h-256v-320h128v192z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57384,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 45,
+				"order": 36,
+				"prevSize": 32,
+				"code": 57384,
+				"name": "restoredraft",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 35
+		},
+		{
+			"icon": {
+				"paths": [
+					"M1024 592.458v-160.916l-159.144-15.914c-8.186-30.042-20.088-58.548-35.21-84.98l104.596-127.838-113.052-113.050-127.836 104.596c-26.434-15.124-54.942-27.026-84.982-35.208l-15.914-159.148h-160.916l-15.914 159.146c-30.042 8.186-58.548 20.086-84.98 35.208l-127.838-104.594-113.050 113.050 104.596 127.836c-15.124 26.432-27.026 54.94-35.21 84.98l-159.146 15.916v160.916l159.146 15.914c8.186 30.042 20.086 58.548 35.21 84.982l-104.596 127.836 113.048 113.048 127.838-104.596c26.432 15.124 54.94 27.028 84.98 35.21l15.916 159.148h160.916l15.914-159.144c30.042-8.186 58.548-20.088 84.982-35.21l127.836 104.596 113.048-113.048-104.596-127.836c15.124-26.434 27.028-54.942 35.21-84.98l159.148-15.92zM704 576l-128 128h-128l-128-128v-128l128-128h128l128 128v128z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57346,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 46,
+				"order": 37,
+				"prevSize": 32,
+				"code": 57346,
+				"name": "fullpage",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 36
+		},
+		{
+			"icon": {
+				"paths": [
+					"M768 206v50h128v64h-192v-146l128-60v-50h-128v-64h192v146zM676 256h-136l-188 188-188-188h-136l256 256-256 256h136l188-188 188 188h136l-256-256z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57375,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 47,
+				"order": 38,
+				"prevSize": 32,
+				"code": 57375,
+				"name": "superscript",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 37
+		},
+		{
+			"icon": {
+				"paths": [
+					"M768 910v50h128v64h-192v-146l128-60v-50h-128v-64h192v146zM676 256h-136l-188 188-188-188h-136l256 256-256 256h136l188-188 188 188h136l-256-256z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57374,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 48,
+				"order": 39,
+				"prevSize": 32,
+				"code": 57374,
+				"name": "subscript",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 38
+		},
+		{
+			"icon": {
+				"paths": [
+					"M704 384v-160c0-17.6-14.4-32-32-32h-160v-64c0-35.2-28.8-64-64-64h-128c-35.204 0-64 28.8-64 64v64h-160c-17.602 0-32 14.4-32 32v512c0 17.6 14.398 32 32 32h224v192h576v-576h-192zM320 128.114c0.034-0.038 0.072-0.078 0.114-0.114h127.768c0.042 0.036 0.082 0.076 0.118 0.114l0 63.886h-128v-63.886zM192 320v-64h384v64h-384zM832 896h-448v-448h448v448zM448 512v128h32l32-64h64v192h-48v64h160v-64h-48v-192h64l32 64h32v-128z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"pastetext"
+				],
+				"defaultCode": 57397,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 49,
+				"order": 40,
+				"prevSize": 32,
+				"code": 57397,
+				"name": "pastetext",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 39
+		},
+		{
+			"icon": {
+				"paths": [
+					"M768 256h64v64h-64zM640 384h64v64h-64zM640 512h64v64h-64zM640 640h64v64h-64zM512 512h64v64h-64zM512 640h64v64h-64zM384 640h64v64h-64zM768 384h64v64h-64zM768 512h64v64h-64zM768 640h64v64h-64zM768 768h64v64h-64zM640 768h64v64h-64zM512 768h64v64h-64zM384 768h64v64h-64zM256 768h64v64h-64z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"resize",
+					"dots"
+				],
+				"defaultCode": 57394,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 50,
+				"order": 41,
+				"prevSize": 32,
+				"code": 57394,
+				"name": "resize",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 40
+		},
+		{
+			"icon": {
+				"paths": [
+					"M928 128h-416l-32-64h-352l-64 128h896zM840.34 704h87.66l32-448h-896l64 640h356.080c-104.882-37.776-180.080-138.266-180.080-256 0-149.982 122.018-272 272-272 149.98 0 272 122.018 272 272 0 21.678-2.622 43.15-7.66 64zM874.996 849.75l-134.496-110.692c17.454-28.922 27.5-62.814 27.5-99.058 0-106.040-85.96-192-192-192s-192 85.96-192 192 85.96 192 192 192c36.244 0 70.138-10.046 99.058-27.5l110.692 134.496c22.962 26.678 62.118 28.14 87.006 3.252l5.492-5.492c24.888-24.888 23.426-64.044-3.252-87.006zM576 764c-68.484 0-124-55.516-124-124s55.516-124 124-124 124 55.516 124 124-55.516 124-124 124z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"browse"
+				],
+				"defaultCode": 57396,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 51,
+				"order": 42,
+				"prevSize": 32,
+				"code": 57396,
+				"name": "browse",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 41
+		},
+		{
+			"icon": {
+				"paths": [
+					"M864.408 670.132c-46.47-46.47-106.938-68.004-161.082-62.806l-63.326-63.326 192-192c0 0 128-128 0-256l-320 320-320-320c-128 128 0 256 0 256l192 192-63.326 63.326c-54.144-5.198-114.61 16.338-161.080 62.806-74.98 74.98-85.112 186.418-22.626 248.9 62.482 62.482 173.92 52.354 248.9-22.626 46.47-46.468 68.002-106.938 62.806-161.080l63.326-63.326 63.328 63.328c-5.196 54.144 16.336 114.61 62.806 161.078 74.978 74.98 186.418 85.112 248.898 22.626 62.488-62.482 52.356-173.918-22.624-248.9zM353.124 758.578c-2.212 24.332-15.020 49.826-35.14 69.946-22.212 22.214-51.080 35.476-77.218 35.476-10.524 0-25.298-2.228-35.916-12.848-21.406-21.404-17.376-73.132 22.626-113.136 22.212-22.214 51.080-35.476 77.218-35.476 10.524 0 25.298 2.228 35.916 12.848 13.112 13.11 13.47 32.688 12.514 43.19zM512 608c-35.346 0-64-28.654-64-64s28.654-64 64-64 64 28.654 64 64-28.654 64-64 64zM819.152 851.152c-10.62 10.62-25.392 12.848-35.916 12.848-26.138 0-55.006-13.262-77.218-35.476-20.122-20.12-32.928-45.614-35.138-69.946-0.958-10.502-0.6-30.080 12.514-43.192 10.618-10.622 25.39-12.848 35.916-12.848 26.136 0 55.006 13.262 77.216 35.474 40.004 40.008 44.032 91.736 22.626 113.14z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57351,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 14,
+				"order": 43,
+				"prevSize": 32,
+				"code": 57351,
+				"name": "cut",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 42
+		},
+		{
+			"icon": {
+				"paths": [
+					"M64 192h896v128h-896zM64 576h896v128h-896zM64 384h896v128h-896zM64 768h896v128h-896z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57350,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 15,
+				"order": 44,
+				"prevSize": 32,
+				"code": 57350,
+				"name": "alignjustify",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 43
+		},
+		{
+			"icon": {
+				"paths": [
+					"M64 192h896v128h-896zM64 576h896v128h-896zM256 384h512v128h-512zM256 768h512v128h-512z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57348,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 16,
+				"order": 45,
+				"prevSize": 32,
+				"code": 57348,
+				"name": "aligncenter",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 44
+		},
+		{
+			"icon": {
+				"paths": [
+					"M64 192h896v128h-896zM64 576h896v128h-896zM384 384h576v128h-576zM384 768h576v128h-576z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57349,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 17,
+				"order": 46,
+				"prevSize": 32,
+				"code": 57349,
+				"name": "alignright",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 45
+		},
+		{
+			"icon": {
+				"paths": [
+					"M64 192h896v128h-896zM64 576h896v128h-896zM64 384h576v128h-576zM64 768h576v128h-576z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57347,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 18,
+				"order": 47,
+				"prevSize": 32,
+				"code": 57347,
+				"name": "alignleft",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 46
+		},
+		{
+			"icon": {
+				"paths": [
+					"M320 128c-123.712 0-224 100.288-224 224s100.288 224 224 224v320h128v-640h64v640h128v-640h128v-128h-448zM960 512l-224 192 224 192z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57392,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 33,
+				"order": 48,
+				"prevSize": 32,
+				"code": 57392,
+				"name": "rtl",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 47
+		},
+		{
+			"icon": {
+				"paths": [
+					"M512 384h128v64h-128zM512 768h128v64h-128zM576 576h128v64h-128zM768 576v192h-64v64h128v-256zM384 576h128v64h-128zM320 768h128v64h-128zM320 384h128v64h-128zM192 192v256h64v-192h64v-64zM704 448h128v-256h-64v192h-64zM64 64v896h896v-896h-896zM896 896h-768v-768h768v768zM192 576v256h64v-192h64v-64zM576 192h128v64h-128zM384 192h128v64h-128z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57382,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 34,
+				"order": 49,
+				"prevSize": 32,
+				"code": 57382,
+				"name": "template",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 48
+		},
+		{
+			"icon": {
+				"paths": [
+					"M816 64l16 384h-640l16-384h32l16 320h512l16-320h32zM208 960l-16-320h640l-16 320h-32l-16-256h-512l-16 256h-32zM64 512h128v64h-128zM256 512h128v64h-128zM448 512h128v64h-128zM640 512h128v64h-128zM832 512h128v64h-128z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57383,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 35,
+				"order": 50,
+				"prevSize": 32,
+				"code": 57383,
+				"name": "pagebreak",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 49
+		},
+		{
+			"icon": {
+				"paths": [
+					"M960 128v-64h-192c-35.202 0-64 28.8-64 64v320c0 15.856 5.858 30.402 15.496 41.614l-303.496 260.386-142-148-82 70 224 288 416-448h128v-64h-192v-320h192zM256 512h64v-384c0-35.2-28.8-64-64-64h-128c-35.2 0-64 28.8-64 64v384h64v-192h128v192zM128 256v-128h128v128h-128zM640 448v-96c0-35.2-8.8-64-44-64 35.2 0 44-28.8 44-64v-96c0-35.2-28.8-64-64-64h-192v448h192c35.2 0 64-28.8 64-64zM448 128h128v128h-128v-128zM448 320h128v128h-128v-128z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57380,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 36,
+				"order": 51,
+				"prevSize": 32,
+				"code": 57380,
+				"name": "spellcheck",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 50
+		},
+		{
+			"icon": {
+				"paths": [
+					"M448 512h-128v-128h128v-128h128v128h128v128h-128v128h-128v-128zM960 576v320h-896v-320h128v192h640v-192h128z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57381,
+				"grid": 0
+			},
+			"attrs": [],
+			"properties": {
+				"id": 37,
+				"order": 52,
+				"prevSize": 32,
+				"code": 57381,
+				"name": "nonbreaking",
+				"ligatures": ""
+			},
+			"setIdx": 0,
+			"setId": 2,
+			"iconIdx": 51
+		},
+		{
+			"icon": {
+				"paths": [
+					"M256 352v-128c0-53.020 42.98-96 96-96h32v-128h-32c-123.712 0-224 100.288-224 224v128c0 53.020-42.98 96-96 96h-32v128h32c53.020 0 96 42.98 96 96v128c0 123.71 100.288 224 224 224h32v-128h-32c-53.020 0-96-42.98-96-96v-128c0-62.684-25.758-119.342-67.254-160 41.496-40.658 67.254-97.316 67.254-160z",
+					"M1024 352v-128c0-53.020-42.98-96-96-96h-32v-128h32c123.71 0 224 100.288 224 224v128c0 53.020 42.98 96 96 96h32v128h-32c-53.020 0-96 42.98-96 96v128c0 123.71-100.29 224-224 224h-32v-128h32c53.020 0 96-42.98 96-96v-128c0-62.684 25.758-119.342 67.254-160-41.496-40.658-67.254-97.316-67.254-160z",
+					"M768 320.882c0 70.692-57.308 128-128 128s-128-57.308-128-128c0-70.692 57.308-128 128-128s128 57.308 128 128z",
+					"M640 511.118c-70.692 0-128 57.308-128 128 0 68.732 32 123.216 130.156 127.852-29.19 41.126-73.156 57.366-130.156 62.7v76c0 0 256 22.332 256-266.55-0.25-70.694-57.306-128.002-128-128.002z"
+				],
+				"width": 1280,
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"code",
+					"semicolon",
+					"curly-braces"
+				],
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 1,
+				"id": 0,
+				"prevSize": 16,
+				"code": 58883,
+				"name": "codesample"
+			},
+			"setIdx": 1,
+			"setId": 1,
+			"iconIdx": 0
+		}
+	],
+	"height": 1024,
+	"metadata": {
+		"name": "tinymce-small"
+	},
+	"preferences": {
+		"showGlyphs": true,
+		"showQuickUse": true,
+		"showQuickUse2": true,
+		"showSVGs": true,
+		"fontPref": {
+			"prefix": "icon-",
+			"metadata": {
+				"fontFamily": "tinymce-small",
+				"majorVersion": 1,
+				"minorVersion": 0
+			},
+			"metrics": {
+				"emSize": 1024,
+				"baseline": 6.25,
+				"whitespace": 50
+			},
+			"showMetrics": false,
+			"showMetadata": false,
+			"showVersion": false,
+			"embed": false
+		},
+		"imagePref": {
+			"prefix": "icon-",
+			"png": true,
+			"useClassSelector": true,
+			"color": 4473924,
+			"bgColor": 16777215
+		},
+		"historySize": 100,
+		"showCodes": true
+	}
+}

--- /dev/null
+++ b/tinymce4/js/tinymce/skins/custom/fonts/tinymce-small.svg
@@ -1,1 +1,63 @@
-
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by IcoMoon</metadata>
+<defs>
+<font id="tinymce-small" horiz-adv-x="1024">
+<font-face units-per-em="1024" ascent="960" descent="-64" />
+<missing-glyph horiz-adv-x="1024" />
+<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
+<glyph unicode="&#xe000;" glyph-name="save" d="M960 80v591.938l-223.938 224.062h-592.062c-44.182 0-80-35.816-80-80v-736c0-44.184 35.818-80 80-80h736c44.184 0 80 35.816 80 80zM576 768h64v-192h-64v192zM704 128h-384v255.882c0.034 0.042 0.076 0.082 0.116 0.118h383.77c0.040-0.036 0.082-0.076 0.116-0.118l-0.002-255.882zM832 128h-64v256c0 35.2-28.8 64-64 64h-384c-35.2 0-64-28.8-64-64v-256h-64v640h64v-192c0-35.2 28.8-64 64-64h320c35.2 0 64 28.8 64 64v171.010l128-128.072v-490.938z" />
+<glyph unicode="&#xe001;" glyph-name="newdocument" d="M850.746 717.254l-133.492 133.49c-24.888 24.892-74.054 45.256-109.254 45.256h-416c-35.2 0-64-28.8-64-64v-768c0-35.2 28.8-64 64-64h640c35.2 0 64 28.8 64 64v544c0 35.2-20.366 84.364-45.254 109.254zM805.49 672.002c6.792-6.796 13.792-19.162 18.894-32.002h-184.384v184.386c12.84-5.1 25.204-12.1 32-18.896l133.49-133.488zM831.884 64h-639.77c-0.040 0.034-0.082 0.076-0.114 0.116v767.77c0.034 0.040 0.076 0.082 0.114 0.114h383.886v-256h256v-511.884c-0.034-0.040-0.076-0.082-0.116-0.116z" />
+<glyph unicode="&#xe002;" glyph-name="fullpage" d="M1024 367.542v160.916l-159.144 15.914c-8.186 30.042-20.088 58.548-35.21 84.98l104.596 127.838-113.052 113.050-127.836-104.596c-26.434 15.124-54.942 27.026-84.982 35.208l-15.914 159.148h-160.916l-15.914-159.146c-30.042-8.186-58.548-20.086-84.98-35.208l-127.838 104.594-113.050-113.050 104.596-127.836c-15.124-26.432-27.026-54.94-35.21-84.98l-159.146-15.916v-160.916l159.146-15.914c8.186-30.042 20.086-58.548 35.21-84.982l-104.596-127.836 113.048-113.048 127.838 104.596c26.432-15.124 54.94-27.028 84.98-35.21l15.916-159.148h160.916l15.914 159.144c30.042 8.186 58.548 20.088 84.982 35.21l127.836-104.596 113.048 113.048-104.596 127.836c15.124 26.434 27.028 54.942 35.21 84.98l159.148 15.92zM704 384l-128-128h-128l-128 128v128l128 128h128l128-128v-128z" />
+<glyph unicode="&#xe003;" glyph-name="alignleft" d="M64 768h896v-128h-896zM64 384h896v-128h-896zM64 576h576v-128h-576zM64 192h576v-128h-576z" />
+<glyph unicode="&#xe004;" glyph-name="aligncenter" d="M64 768h896v-128h-896zM64 384h896v-128h-896zM256 576h512v-128h-512zM256 192h512v-128h-512z" />
+<glyph unicode="&#xe005;" glyph-name="alignright" d="M64 768h896v-128h-896zM64 384h896v-128h-896zM384 576h576v-128h-576zM384 192h576v-128h-576z" />
+<glyph unicode="&#xe006;" glyph-name="alignjustify" d="M64 768h896v-128h-896zM64 384h896v-128h-896zM64 576h896v-128h-896zM64 192h896v-128h-896z" />
+<glyph unicode="&#xe007;" glyph-name="cut" d="M864.408 289.868c-46.47 46.47-106.938 68.004-161.082 62.806l-63.326 63.326 192 192c0 0 128 128 0 256l-320-320-320 320c-128-128 0-256 0-256l192-192-63.326-63.326c-54.144 5.198-114.61-16.338-161.080-62.806-74.98-74.98-85.112-186.418-22.626-248.9 62.482-62.482 173.92-52.354 248.9 22.626 46.47 46.468 68.002 106.938 62.806 161.080l63.326 63.326 63.328-63.328c-5.196-54.144 16.336-114.61 62.806-161.078 74.978-74.98 186.418-85.112 248.898-22.626 62.488 62.482 52.356 173.918-22.624 248.9zM353.124 201.422c-2.212-24.332-15.020-49.826-35.14-69.946-22.212-22.214-51.080-35.476-77.218-35.476-10.524 0-25.298 2.228-35.916 12.848-21.406 21.404-17.376 73.132 22.626 113.136 22.212 22.214 51.080 35.476 77.218 35.476 10.524 0 25.298-2.228 35.916-12.848 13.112-13.11 13.47-32.688 12.514-43.19zM512 352c-35.346 0-64 28.654-64 64s28.654 64 64 64 64-28.654 64-64-28.654-64-64-64zM819.152 108.848c-10.62-10.62-25.392-12.848-35.916-12.848-26.138 0-55.006 13.262-77.218 35.476-20.122 20.12-32.928 45.614-35.138 69.946-0.958 10.502-0.6 30.080 12.514 43.192 10.618 10.622 25.39 12.848 35.916 12.848 26.136 0 55.006-13.262 77.216-35.474 40.004-40.008 44.032-91.736 22.626-113.14z" />
+<glyph unicode="&#xe008;" glyph-name="paste" d="M704 576v160c0 17.6-14.4 32-32 32h-160v64c0 35.2-28.8 64-64 64h-128c-35.204 0-64-28.8-64-64v-64h-160c-17.602 0-32-14.4-32-32v-512c0-17.6 14.398-32 32-32h224v-192h384l192 192v384h-192zM320 831.886c0.034 0.038 0.072 0.078 0.114 0.114h127.768c0.042-0.036 0.082-0.076 0.118-0.114v-63.886h-128v63.886zM192 640v64h384v-64h-384zM704 90.51v101.49h101.49l-101.49-101.49zM832 256h-192v-192h-256v448h448v-256z" />
+<glyph unicode="&#xe009;" glyph-name="searchreplace" d="M888 576h-56v256h64v64h-320v-64h64v-256h-256v256h64v64h-320v-64h64v-256h-56c-39.6 0-72-32.4-72-72v-432c0-39.6 32.4-72 72-72h240c39.6 0 72 32.4 72 72v312h128v-312c0-39.6 32.4-72 72-72h240c39.6 0 72 32.4 72 72v432c0 39.6-32.4 72-72 72zM348 64h-184c-19.8 0-36 14.4-36 32s16.2 32 36 32h184c19.8 0 36-14.4 36-32s-16.2-32-36-32zM544 448h-64c-17.6 0-32 14.4-32 32s14.4 32 32 32h64c17.6 0 32-14.4 32-32s-14.4-32-32-32zM860 64h-184c-19.8 0-36 14.4-36 32s16.2 32 36 32h184c19.8 0 36-14.4 36-32s-16.2-32-36-32z" />
+<glyph unicode="&#xe00a;" glyph-name="bullist" d="M384 832h576v-128h-576zM384 512h576v-128h-576zM384 192h576v-128h-576zM128 768c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64zM128 448c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64zM128 128c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64z" />
+<glyph unicode="&#xe00b;" glyph-name="numlist" d="M384 832h576v-128h-576zM384 512h576v-128h-576zM384 192h576v-128h-576zM320 430v146h-64v320h-128v-64h64v-256h-64v-64h128v-50l-128-60v-146h128v-64h-128v-64h128v-64h-128v-64h192v320h-128v50z" />
+<glyph unicode="&#xe00c;" glyph-name="indent" d="M64 768h896v-128h-896zM384 384h576v-128h-576zM384 576h576v-128h-576zM64 192h896v-128h-896zM64 576l224-160-224-160z" />
+<glyph unicode="&#xe00d;" glyph-name="outdent" d="M64 768h896v-128h-896zM64 384h576v-128h-576zM64 576h576v-128h-576zM64 192h896v-128h-896zM960 576l-224-160 224-160z" />
+<glyph unicode="&#xe00e;" glyph-name="blockquote" d="M256.428 535.274c105.8 0 191.572-91.17 191.572-203.638 0-112.464-85.772-203.636-191.572-203.636-105.802 0-191.572 91.17-191.572 203.636l-0.856 29.092c0 224.93 171.54 407.272 383.144 407.272v-116.364c-73.1 0-141.826-30.26-193.516-85.204-9.954-10.578-19.034-21.834-27.224-33.656 9.784 1.64 19.806 2.498 30.024 2.498zM768.428 535.274c105.8 0 191.572-91.17 191.572-203.638 0-112.464-85.772-203.636-191.572-203.636-105.802 0-191.572 91.17-191.572 203.636l-0.856 29.092c0 224.93 171.54 407.272 383.144 407.272v-116.364c-73.1 0-141.826-30.26-193.516-85.204-9.956-10.578-19.036-21.834-27.224-33.656 9.784 1.64 19.806 2.498 30.024 2.498z" />
+<glyph unicode="&#xe00f;" glyph-name="undo" d="M704 0c59 199 134.906 455.266-256 446.096v-222.096l-336.002 336 336.002 336v-217.326c468.092 12.2 544-358.674 256-678.674z" />
+<glyph unicode="&#xe010;" glyph-name="redo" d="M576 678.674v217.326l336.002-336-336.002-336v222.096c-390.906 9.17-315-247.096-256-446.096-288 320-212.092 690.874 256 678.674z" />
+<glyph unicode="&#xe011;" glyph-name="unlink" d="M927.274 729.784l-133.49 133.488c-21.104 21.104-49.232 32.728-79.198 32.728s-58.094-11.624-79.196-32.726l-165.492-165.49c-43.668-43.668-43.668-114.724 0-158.392l2.746-2.746 67.882 67.882-2.746 2.746c-6.132 6.132-6.132 16.494 0 22.626l165.492 165.492c4.010 4.008 8.808 4.608 11.312 4.608s7.302-0.598 11.312-4.61l133.49-133.488c6.132-6.134 6.132-16.498 0.002-22.628l-165.494-165.494c-4.008-4.008-8.806-4.608-11.31-4.608s-7.302 0.6-11.312 4.612l-2.746 2.746-67.88-67.884 2.742-2.742c21.106-21.108 49.23-32.728 79.2-32.728s58.094 11.624 79.196 32.726l165.494 165.492c43.662 43.666 43.662 114.72-0.004 158.39zM551.356 359.356l-67.882-67.882 2.746-2.746c4.008-4.008 4.61-8.806 4.61-11.31 0-2.506-0.598-7.302-4.606-11.314l-165.494-165.49c-4.010-4.010-8.81-4.61-11.314-4.61s-7.304 0.6-11.314 4.61l-133.492 133.486c-4.010 4.010-4.61 8.81-4.61 11.314s0.598 7.3 4.61 11.312l165.49 165.488c4.010 4.012 8.81 4.612 11.314 4.612s7.304-0.6 11.314-4.612l2.746-2.742 67.882 67.88-2.746 2.746c-21.104 21.104-49.23 32.726-79.196 32.726s-58.092-11.624-79.196-32.726l-165.488-165.486c-21.106-21.104-32.73-49.234-32.73-79.198s11.624-58.094 32.726-79.198l133.49-133.49c21.106-21.102 49.232-32.726 79.198-32.726s58.092 11.624 79.196 32.726l165.494 165.492c21.104 21.104 32.722 49.23 32.722 79.196s-11.624 58.094-32.726 79.196l-2.744 2.746zM352 250c-9.724 0-19.45 3.71-26.87 11.128-14.84 14.84-14.84 38.898 0 53.738l320 320c14.84 14.84 38.896 14.84 53.736 0 14.844-14.84 14.844-38.9 0-53.74l-320-320c-7.416-7.416-17.142-11.126-26.866-11.126z" />
+<glyph unicode="&#xe012;" glyph-name="link" d="M927.274 729.784l-133.49 133.488c-21.104 21.104-49.232 32.728-79.198 32.728s-58.094-11.624-79.196-32.726l-165.492-165.49c-43.668-43.668-43.668-114.724 0-158.392l2.746-2.746 67.882 67.882-2.746 2.746c-6.132 6.132-6.132 16.494 0 22.626l165.492 165.492c4.010 4.008 8.808 4.608 11.312 4.608s7.302-0.598 11.312-4.61l133.49-133.488c6.132-6.134 6.132-16.498 0.002-22.628l-165.494-165.494c-4.008-4.008-8.806-4.608-11.31-4.608s-7.302 0.6-11.312 4.612l-2.746 2.746-67.88-67.884 2.742-2.742c21.106-21.108 49.23-32.728 79.2-32.728s58.094 11.624 79.196 32.726l165.494 165.492c43.662 43.666 43.662 114.72-0.004 158.39zM551.356 359.356l-67.882-67.882 2.746-2.746c4.008-4.008 4.61-8.806 4.61-11.31 0-2.506-0.598-7.302-4.606-11.314l-165.494-165.49c-4.010-4.010-8.81-4.61-11.314-4.61s-7.304 0.6-11.314 4.61l-133.492 133.486c-4.010 4.010-4.61 8.81-4.61 11.314s0.598 7.3 4.61 11.312l165.49 165.488c4.010 4.012 8.81 4.612 11.314 4.612s7.304-0.6 11.314-4.612l2.746-2.742 67.882 67.88-2.746 2.746c-21.104 21.104-49.23 32.726-79.196 32.726s-58.092-11.624-79.196-32.726l-165.488-165.486c-21.106-21.104-32.73-49.234-32.73-79.198s11.624-58.094 32.726-79.198l133.49-133.49c21.106-21.102 49.232-32.726 79.198-32.726s58.092 11.624 79.196 32.726l165.494 165.492c21.104 21.104 32.722 49.23 32.722 79.196s-11.624 58.094-32.726 79.196l-2.744 2.746zM800 122c-9.724 0-19.45 3.708-26.87 11.13l-128 127.998c-14.844 14.84-14.844 38.898 0 53.738 14.84 14.844 38.896 14.844 53.736 0l128-128c14.844-14.84 14.844-38.896 0-53.736-7.416-7.422-17.142-11.13-26.866-11.13zM608 0c-17.674 0-32 14.326-32 32v128c0 17.674 14.326 32 32 32s32-14.326 32-32v-128c0-17.674-14.326-32-32-32zM928 320h-128c-17.674 0-32 14.326-32 32s14.326 32 32 32h128c17.674 0 32-14.326 32-32s-14.326-32-32-32zM224 774c9.724 0 19.45-3.708 26.87-11.13l128-128c14.842-14.84 14.842-38.898 0-53.738-14.84-14.844-38.898-14.844-53.738 0l-128 128c-14.842 14.84-14.842 38.898 0 53.738 7.418 7.422 17.144 11.13 26.868 11.13zM416 896c17.674 0 32-14.326 32-32v-128c0-17.674-14.326-32-32-32s-32 14.326-32 32v128c0 17.674 14.326 32 32 32zM96 576h128c17.674 0 32-14.326 32-32s-14.326-32-32-32h-128c-17.674 0-32 14.326-32 32s14.326 32 32 32z" />
+<glyph unicode="&#xe013;" glyph-name="bookmark" d="M256 896v-896l256 256 256-256v896h-512zM704 170.51l-192 192-192-192v661.49h384v-661.49z" />
+<glyph unicode="&#xe014;" glyph-name="image" d="M896 832h-768c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h768c35.2 0 64 28.8 64 64v640c0 35.2-28.8 64-64 64zM896 128.116c-0.012-0.014-0.030-0.028-0.042-0.042l-191.958 319.926-160-128-224 288-191.968-479.916c-0.010 0.010-0.022 0.022-0.032 0.032v639.77c0.034 0.040 0.076 0.082 0.114 0.114h767.77c0.040-0.034 0.082-0.076 0.116-0.116v-639.768zM640 608c0-53.019 42.981-96 96-96s96 42.981 96 96c0 53.019-42.981 96-96 96s-96-42.981-96-96z" />
+<glyph unicode="&#xe015;" glyph-name="media" d="M896 832h-768c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h768c35.2 0 64 28.8 64 64v640c0 35.2-28.8 64-64 64zM256 128h-128v128h128v-128zM256 384h-128v128h128v-128zM256 640h-128v128h128v-128zM704 128h-384v640h384v-640zM896 128h-128v128h128v-128zM896 384h-128v128h128v-128zM896 640h-128v128h128v-128zM384 640v-384l288 192z" />
+<glyph unicode="&#xe016;" glyph-name="help" d="M448 256h128v-128h-128v128zM704 704c35.346 0 64-28.654 64-64v-166l-228-154h-92v64l192 128v64h-320v128h384zM512 896c-119.666 0-232.166-46.6-316.784-131.216-84.614-84.618-131.216-197.118-131.216-316.784 0-119.664 46.602-232.168 131.216-316.784 84.618-84.616 197.118-131.216 316.784-131.216 119.664 0 232.168 46.6 316.784 131.216s131.216 197.12 131.216 316.784c0 119.666-46.6 232.166-131.216 316.784-84.616 84.616-197.12 131.216-316.784 131.216z" />
+<glyph unicode="&#xe017;" glyph-name="code" d="M416 256l-192 192 192 192-64 64-256-256 256-256zM672 704l-64-64 192-192-192-192 64-64 256 256z" />
+<glyph unicode="&#xe018;" glyph-name="insertdatetime" d="M77.798 655.376l81.414-50.882c50.802 81.114 128.788 143.454 221.208 174.246l-30.366 91.094c-113.748-37.898-209.728-114.626-272.256-214.458zM673.946 869.834l-30.366-91.094c92.422-30.792 170.404-93.132 221.208-174.248l81.412 50.882c-62.526 99.834-158.506 176.562-272.254 214.46zM607.974 255.992c-4.808 0-9.692 1.090-14.286 3.386l-145.688 72.844v211.778c0 17.672 14.328 32 32 32s32-14.328 32-32v-172.222l110.31-55.156c15.806-7.902 22.214-27.124 14.31-42.932-5.604-11.214-16.908-17.696-28.646-17.698zM512 768c-212.078 0-384-171.922-384-384s171.922-384 384-384c212.078 0 384 171.922 384 384s-171.922 384-384 384zM512 96c-159.058 0-288 128.942-288 288s128.942 288 288 288c159.058 0 288-128.942 288-288s-128.942-288-288-288z" />
+<glyph unicode="&#xe019;" glyph-name="preview" d="M64 504.254c45.318 49.92 97.162 92.36 153.272 125.124 90.332 52.744 192.246 80.622 294.728 80.622 102.48 0 204.396-27.878 294.726-80.624 56.112-32.764 107.956-75.204 153.274-125.124v117.432c-33.010 28.118-68.124 53.14-104.868 74.594-105.006 61.314-223.658 93.722-343.132 93.722s-238.128-32.408-343.134-93.72c-36.742-21.454-71.856-46.478-104.866-74.596v-117.43zM512 640c-183.196 0-345.838-100.556-448-256 102.162-155.448 264.804-256 448-256s345.838 100.552 448 256c-102.162 155.444-264.804 256-448 256zM512 448c0-35.346-28.654-64-64-64s-64 28.654-64 64c0 35.348 28.654 64 64 64s64-28.652 64-64zM728.066 263.338c-67.434-39.374-140.128-59.338-216.066-59.338s-148.632 19.964-216.066 59.338c-51.554 30.104-98.616 71.31-138.114 120.662 39.498 49.35 86.56 90.558 138.116 120.66 13.276 7.752 26.758 14.74 40.426 20.982-10.512-23.742-16.362-50.008-16.362-77.642 0-106.040 85.962-192 192-192 106.040 0 192 85.96 192 192 0 27.634-5.85 53.9-16.36 77.642 13.668-6.244 27.15-13.23 40.426-20.982 51.554-30.102 98.616-71.31 138.116-120.66-39.498-49.352-86.56-90.558-138.116-120.662z" />
+<glyph unicode="&#xe01a;" glyph-name="forecolor" d="M651.168 676.166c-24.612 81.962-28.876 91.834-107.168 91.834h-64c-79.618 0-82.664-10.152-108.418-96 0-0.002 0-0.002-0.002-0.004l-143.998-479.996h113.636l57.6 192h226.366l57.6-192h113.63l-145.246 484.166zM437.218 512l38.4 136c10.086 33.618 36.38 30 36.38 30s26.294 3.618 36.38-30h0.004l38.4-136h-149.564z" />
+<glyph unicode="&#xe01b;" glyph-name="table" d="M64 768v-704h896v704h-896zM384 320v128h256v-128h-256zM640 256v-128h-256v128h256zM640 640v-128h-256v128h256zM320 640v-128h-192v128h192zM128 448h192v-128h-192v128zM704 448h192v-128h-192v128zM704 512v128h192v-128h-192zM128 256h192v-128h-192v128zM704 128v128h192v-128h-192z" />
+<glyph unicode="&#xe01c;" glyph-name="hr" d="M64 512h896v-128h-896z" />
+<glyph unicode="&#xe01d;" glyph-name="removeformat" d="M64 192h512v-128h-512v128zM768 768h-220.558l-183.766-512h-132.288l183.762 512h-223.15v128h576v-128zM929.774 64l-129.774 129.774-129.774-129.774-62.226 62.226 129.774 129.774-129.774 129.774 62.226 62.226 129.774-129.774 129.774 129.774 62.226-62.226-129.774-129.774 129.774-129.774-62.226-62.226z" />
+<glyph unicode="&#xe01e;" glyph-name="subscript" d="M768 50v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM676 704h-136l-188-188-188 188h-136l256-256-256-256h136l188 188 188-188h136l-256 256z" />
+<glyph unicode="&#xe01f;" glyph-name="superscript" d="M768 754v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM676 704h-136l-188-188-188 188h-136l256-256-256-256h136l188 188 188-188h136l-256 256z" />
+<glyph unicode="&#xe020;" glyph-name="charmap" d="M704 128v37.004c151.348 61.628 256 193.82 256 346.996 0 212.078-200.576 384-448 384s-448-171.922-448-384c0-153.176 104.654-285.368 256-346.996v-37.004h-192l-64 96v-224h320v222.812c-100.9 51.362-170.666 161.54-170.666 289.188 0 176.732 133.718 320 298.666 320s298.666-143.268 298.666-320c0-127.648-69.766-237.826-170.666-289.188v-222.812h320v224l-64-96h-192z" />
+<glyph unicode="&#xe021;" glyph-name="emoticons" d="M512 820c99.366 0 192.782-38.694 263.042-108.956s108.958-163.678 108.958-263.044-38.696-192.782-108.958-263.042-163.676-108.958-263.042-108.958-192.782 38.696-263.044 108.958-108.956 163.676-108.956 263.042 38.694 192.782 108.956 263.044 163.678 108.956 263.044 108.956zM512 896c-247.424 0-448-200.576-448-448s200.576-448 448-448 448 200.576 448 448-200.576 448-448 448v0zM320 576c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64zM576 576c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64zM512 304c-101.84 0-192.56 36.874-251.166 94.328 23.126-117.608 126.778-206.328 251.166-206.328s228.040 88.72 251.168 206.328c-58.608-57.454-149.328-94.328-251.168-94.328z" />
+<glyph unicode="&#xe022;" glyph-name="print" d="M256 832h512v-128h-512v128zM896 640h-768c-35.2 0-64-28.8-64-64v-256c0-35.2 28.796-64 64-64h128v-192h512v192h128c35.2 0 64 28.8 64 64v256c0 35.2-28.8 64-64 64zM704 128h-384v256h384v-256zM910.4 544c0-25.626-20.774-46.4-46.398-46.4s-46.402 20.774-46.402 46.4 20.778 46.4 46.402 46.4c25.626 0 46.398-20.774 46.398-46.4z" />
+<glyph unicode="&#xe023;" glyph-name="fullscreen" d="M480 576l-192 192 128 128h-352v-352l128 128 192-192zM640 480l192 192 128-128v352h-352l128-128-192-192zM544 320l192-192-128-128h352v352l-128-128-192 192zM384 416l-192-192-128 128v-352h352l-128 128 192 192z" />
+<glyph unicode="&#xe024;" glyph-name="spellcheck" d="M960 832v64h-192c-35.202 0-64-28.8-64-64v-320c0-15.856 5.858-30.402 15.496-41.614l-303.496-260.386-142 148-82-70 224-288 416 448h128v64h-192v320h192zM256 448h64v384c0 35.2-28.8 64-64 64h-128c-35.2 0-64-28.8-64-64v-384h64v192h128v-192zM128 704v128h128v-128h-128zM640 512v96c0 35.2-8.8 64-44 64 35.2 0 44 28.8 44 64v96c0 35.2-28.8 64-64 64h-192v-448h192c35.2 0 64 28.8 64 64zM448 832h128v-128h-128v128zM448 640h128v-128h-128v128z" />
+<glyph unicode="&#xe025;" glyph-name="nonbreaking" d="M448 448h-128v128h128v128h128v-128h128v-128h-128v-128h-128v128zM960 384v-320h-896v320h128v-192h640v192h128z" />
+<glyph unicode="&#xe026;" glyph-name="template" d="M512 576h128v-64h-128zM512 192h128v-64h-128zM576 384h128v-64h-128zM768 384v-192h-64v-64h128v256zM384 384h128v-64h-128zM320 192h128v-64h-128zM320 576h128v-64h-128zM192 768v-256h64v192h64v64zM704 512h128v256h-64v-192h-64zM64 896v-896h896v896h-896zM896 64h-768v768h768v-768zM192 384v-256h64v192h64v64zM576 768h128v-64h-128zM384 768h128v-64h-128z" />
+<glyph unicode="&#xe027;" glyph-name="pagebreak" d="M816 896l16-384h-640l16 384h32l16-320h512l16 320h32zM208 0l-16 320h640l-16-320h-32l-16 256h-512l-16-256h-32zM64 448h128v-64h-128zM256 448h128v-64h-128zM448 448h128v-64h-128zM640 448h128v-64h-128zM832 448h128v-64h-128z" />
+<glyph unicode="&#xe028;" glyph-name="restoredraft" d="M576 896c247.424 0 448-200.576 448-448s-200.576-448-448-448v96c94.024 0 182.418 36.614 248.902 103.098s103.098 154.878 103.098 248.902c0 94.022-36.614 182.418-103.098 248.902s-154.878 103.098-248.902 103.098c-94.022 0-182.418-36.614-248.902-103.098-51.14-51.138-84.582-115.246-97.306-184.902h186.208l-224-256-224 256h164.57c31.060 217.102 217.738 384 443.43 384zM768 512v-128h-256v320h128v-192z" />
+<glyph unicode="&#xe02a;" glyph-name="bold" d="M625.442 465.818c48.074 38.15 78.558 94.856 78.558 158.182 0 114.876-100.29 208-224 208h-224v-768h288c123.712 0 224 93.124 224 208 0 88.196-59.118 163.562-142.558 193.818zM384 656c0 26.51 21.49 48 48 48h67.204c42.414 0 76.796-42.98 76.796-96s-34.382-96-76.796-96h-115.204v144zM547.2 192h-115.2c-26.51 0-48 21.49-48 48v144h163.2c42.418 0 76.8-42.98 76.8-96s-34.382-96-76.8-96z" />
+<glyph unicode="&#xe02b;" glyph-name="italic" d="M832 832v-64h-144l-256-640h144v-64h-448v64h144l256 640h-144v64h448z" />
+<glyph unicode="&#xe02c;" glyph-name="underline" d="M192 128h576v-64h-576v64zM640 832v-384c0-31.312-14.7-61.624-41.39-85.352-30.942-27.502-73.068-42.648-118.61-42.648-45.544 0-87.668 15.146-118.608 42.648-26.692 23.728-41.392 54.040-41.392 85.352v384h-128v-384c0-141.382 128.942-256 288-256s288 114.618 288 256v384h-128z" />
+<glyph unicode="&#xe02d;" glyph-name="strikethrough" d="M960 448h-265.876c-50.078 35.42-114.43 54.86-182.124 54.86-89.206 0-164.572 50.242-164.572 109.712s75.366 109.714 164.572 109.714c75.058 0 140.308-35.576 159.12-82.286h113.016c-7.93 50.644-37.58 97.968-84.058 132.826-50.88 38.16-117.676 59.174-188.078 59.174-70.404 0-137.196-21.014-188.074-59.174-54.788-41.090-86.212-99.502-86.212-160.254s31.424-119.164 86.212-160.254c1.956-1.466 3.942-2.898 5.946-4.316h-265.872v-64h512.532c58.208-17.106 100.042-56.27 100.042-100.572 0-59.468-75.368-109.71-164.572-109.71-75.060 0-140.308 35.574-159.118 82.286h-113.016c7.93-50.64 37.582-97.968 84.060-132.826 50.876-38.164 117.668-59.18 188.072-59.18 70.402 0 137.198 21.016 188.074 59.174 54.79 41.090 86.208 99.502 86.208 160.254 0 35.298-10.654 69.792-30.294 100.572h204.012v64z" />
+<glyph unicode="&#xe02e;" glyph-name="visualchars" d="M384 832c-123.712 0-224-100.288-224-224s100.288-224 224-224v-320h128v640h64v-640h128v640h128v128h-448z" />
+<glyph unicode="&#xe02f;" glyph-name="ltr" d="M448 832c-123.712 0-224-100.288-224-224s100.288-224 224-224v-320h128v640h64v-640h128v640h128v128h-448zM64 64l224 192-224 192z" />
+<glyph unicode="&#xe030;" glyph-name="rtl" d="M320 832c-123.712 0-224-100.288-224-224s100.288-224 224-224v-320h128v640h64v-640h128v640h128v128h-448zM960 448l-224-192 224-192z" />
+<glyph unicode="&#xe031;" glyph-name="copy" d="M832 640h-192v64l-192 192h-384v-704h384v-192h576v448l-192 192zM832 549.49l101.49-101.49h-101.49v101.49zM448 805.49l101.49-101.49h-101.49v101.49zM128 832h256v-192h192v-384h-448v576zM960 64h-448v128h128v384h128v-192h192v-320z" />
+<glyph unicode="&#xe032;" glyph-name="resize" d="M768 704h64v-64h-64zM640 576h64v-64h-64zM640 448h64v-64h-64zM640 320h64v-64h-64zM512 448h64v-64h-64zM512 320h64v-64h-64zM384 320h64v-64h-64zM768 576h64v-64h-64zM768 448h64v-64h-64zM768 320h64v-64h-64zM768 192h64v-64h-64zM640 192h64v-64h-64zM512 192h64v-64h-64zM384 192h64v-64h-64zM256 192h64v-64h-64z" />
+<glyph unicode="&#xe034;" glyph-name="browse" d="M928 832h-416l-32 64h-352l-64-128h896zM840.34 256h87.66l32 448h-896l64-640h356.080c-104.882 37.776-180.080 138.266-180.080 256 0 149.982 122.018 272 272 272 149.98 0 272-122.018 272-272 0-21.678-2.622-43.15-7.66-64zM874.996 110.25l-134.496 110.692c17.454 28.922 27.5 62.814 27.5 99.058 0 106.040-85.96 192-192 192s-192-85.96-192-192 85.96-192 192-192c36.244 0 70.138 10.046 99.058 27.5l110.692-134.496c22.962-26.678 62.118-28.14 87.006-3.252l5.492 5.492c24.888 24.888 23.426 64.044-3.252 87.006zM576 196c-68.484 0-124 55.516-124 124s55.516 124 124 124 124-55.516 124-124-55.516-124-124-124z" />
+<glyph unicode="&#xe035;" glyph-name="pastetext" d="M704 576v160c0 17.6-14.4 32-32 32h-160v64c0 35.2-28.8 64-64 64h-128c-35.204 0-64-28.8-64-64v-64h-160c-17.602 0-32-14.4-32-32v-512c0-17.6 14.398-32 32-32h224v-192h576v576h-192zM320 831.886c0.034 0.038 0.072 0.078 0.114 0.114h127.768c0.042-0.036 0.082-0.076 0.118-0.114v-63.886h-128v63.886zM192 640v64h384v-64h-384zM832 64h-448v448h448v-448zM448 448v-128h32l32 64h64v-192h-48v-64h160v64h-48v192h64l32-64h32v128z" />
+<glyph unicode="&#xe603;" glyph-name="codesample" d="M200.015 577.994v103.994c0 43.077 34.919 77.997 77.997 77.997h26v103.994h-26c-100.51 0-181.991-81.481-181.991-181.991v-103.994c0-43.077-34.919-77.997-77.997-77.997h-26v-103.994h26c43.077 0 77.997-34.919 77.997-77.997v-103.994c0-100.509 81.481-181.991 181.991-181.991h26v103.994h-26c-43.077 0-77.997 34.919-77.997 77.997v103.994c0 50.927-20.928 96.961-54.642 129.994 33.714 33.032 54.642 79.065 54.642 129.994zM823.985 577.994v103.994c0 43.077-34.919 77.997-77.997 77.997h-26v103.994h26c100.509 0 181.991-81.481 181.991-181.991v-103.994c0-43.077 34.919-77.997 77.997-77.997h26v-103.994h-26c-43.077 0-77.997-34.919-77.997-77.997v-103.994c0-100.509-81.482-181.991-181.991-181.991h-26v103.994h26c43.077 0 77.997 34.919 77.997 77.997v103.994c0 50.927 20.928 96.961 54.642 129.994-33.714 33.032-54.642 79.065-54.642 129.994zM615.997 603.277c0-57.435-46.56-103.994-103.994-103.994s-103.994 46.56-103.994 103.994c0 57.435 46.56 103.994 103.994 103.994s103.994-46.56 103.994-103.994zM512 448.717c-57.435 0-103.994-46.56-103.994-103.994 0-55.841 26-100.107 105.747-103.875-23.715-33.413-59.437-46.608-105.747-50.94v-61.747c0 0 207.991-18.144 207.991 216.561-0.202 57.437-46.56 103.996-103.994 103.996z" />
+</font></defs></svg>

 Binary files /dev/null and b/tinymce4/js/tinymce/skins/custom/fonts/tinymce-small.ttf differ
 Binary files /dev/null and b/tinymce4/js/tinymce/skins/custom/fonts/tinymce-small.woff differ
 Binary files /dev/null and b/tinymce4/js/tinymce/skins/custom/fonts/tinymce.eot differ
--- /dev/null
+++ b/tinymce4/js/tinymce/skins/custom/fonts/tinymce.json
@@ -1,1 +1,3469 @@
-
+{
+	"IcoMoonType": "selection",
+	"icons": [
+    {
+      "icon": {
+        "paths": [
+          "M889.68 166.32c-93.608-102.216-228.154-166.32-377.68-166.32-282.77 0-512 229.23-512 512h96c0-229.75 186.25-416 416-416 123.020 0 233.542 53.418 309.696 138.306l-149.696 149.694h352v-352l-134.32 134.32z",
+          "M928 512c0 229.75-186.25 416-416 416-123.020 0-233.542-53.418-309.694-138.306l149.694-149.694h-352v352l134.32-134.32c93.608 102.216 228.154 166.32 377.68 166.32 282.77 0 512-229.23 512-512h-96z"
+        ],
+        "attrs": [
+          {},
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "grid": 16,
+        "tags": [
+          "reload"
+        ]
+      },
+      "attrs": [
+        {},
+        {}
+      ],
+      "properties": {
+        "order": 647,
+        "id": 120,
+        "name": "reload",
+        "prevSize": 32,
+        "code": 59654
+      },
+      "setIdx": 0,
+      "setId": 5,
+      "iconIdx": 0
+    },
+    {
+      "icon": {
+        "paths": [
+          "M0 64h128v128h-128v-128z",
+          "M192 64h832v128h-832v-128z",
+          "M0 448h128v128h-128v-128z",
+          "M192 448h832v128h-832v-128z",
+          "M0 832h128v128h-128v-128z",
+          "M192 832h832v128h-832v-128z",
+          "M192 256h128v128h-128v-128z",
+          "M384 256h640v128h-640v-128z",
+          "M192 640h128v128h-128v-128z",
+          "M384 640h640v128h-640v-128z"
+        ],
+        "attrs": [
+          {},
+          {},
+          {},
+          {},
+          {},
+          {},
+          {},
+          {},
+          {},
+          {}
+        ],
+        "isMulticolor": false,
+        "isMulticolor2": false,
+        "tags": [
+          "toc"
+        ],
+        "grid": 16
+      },
+      "attrs": [
+        {},
+        {},
+        {},
+        {},
+        {},
+        {},
+        {},
+        {},
+        {},
+        {}
+      ],
+      "properties": {
+        "order": 646,
+        "id": 1,
+        "name": "toc",
+        "prevSize": 32,
+        "code": 59649
+      },
+      "setIdx": 0,
+      "setId": 6,
+      "iconIdx": 1
+    },
+		{
+			"icon": {
+				"paths": [
+					"M576.234 289.27l242.712-81.432 203.584 606.784-242.712 81.432zM0 896h256v-704h-256v704zM64 320h128v64h-128v-64zM320 896h256v-704h-256v704zM384 320h128v64h-128v-64z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"books",
+					"library",
+					"archive"
+				],
+				"defaultCode": 57458,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 523,
+				"id": 1722,
+				"prevSize": 32,
+				"code": 59665,
+				"name": "books",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 0
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 416v192c0 17.672 14.328 32 32 32h960c17.672 0 32-14.328 32-32v-192c0-17.672-14.328-32-32-32h-960c-17.672 0-32 14.328-32 32z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"minus",
+					"minimize",
+					"subtract"
+				],
+				"defaultCode": 58229,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 597,
+				"id": 1723,
+				"prevSize": 32,
+				"code": 59705,
+				"name": "minus",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 1
+		},
+		{
+			"icon": {
+				"paths": [
+					"M992 384h-352v-352c0-17.672-14.328-32-32-32h-192c-17.672 0-32 14.328-32 32v352h-352c-17.672 0-32 14.328-32 32v192c0 17.672 14.328 32 32 32h352v352c0 17.672 14.328 32 32 32h192c17.672 0 32-14.328 32-32v-352h352c17.672 0 32-14.328 32-32v-192c0-17.672-14.328-32-32-32z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"plus",
+					"add",
+					"sum"
+				],
+				"defaultCode": 58230,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 598,
+				"id": 1724,
+				"prevSize": 32,
+				"code": 59706,
+				"name": "plus",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 2
+		},
+		{
+			"icon": {
+				"paths": [
+					"M521.6 44.8l-67.2 67.2-86.4-86.4-86.4 86.4 86.4 86.4-368 368 432 432 518.4-518.4-428.8-435.2zM435.2 825.6l-262.4-262.4 35.2-35.2 576-51.2-348.8 348.8zM953.6 550.4c-6.4 6.4-16 16-28.8 32-28.8 32-41.6 64-41.6 89.6v0 0 0 0 0 0 0c0 16 6.4 35.2 22.4 48 12.8 12.8 32 22.4 48 22.4s35.2-6.4 48-22.4 22.4-32 22.4-48v0 0 0 0 0 0 0c0-25.6-12.8-54.4-41.6-89.6-9.6-16-22.4-25.6-28.8-32v0z"
+				],
+				"attrs": [
+					{}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"fill"
+				],
+				"grid": 16
+			},
+			"attrs": [
+				{}
+			],
+			"properties": {
+				"order": 599,
+				"id": 1695,
+				"prevSize": 32,
+				"code": 59650,
+				"name": "fill"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 3
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 694.4h1024v128h-1024v-128z",
+					"M0 928h1024v64h-1024v-64z",
+					"M0 393.6h1024v192h-1024v-192z",
+					"M0 32h1024v256h-1024v-256z"
+				],
+				"attrs": [
+					{},
+					{},
+					{},
+					{}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"borderwidth"
+				],
+				"grid": 16
+			},
+			"attrs": [
+				{},
+				{},
+				{},
+				{}
+			],
+			"properties": {
+				"order": 524,
+				"id": 1696,
+				"prevSize": 32,
+				"code": 59651,
+				"name": "borderwidth"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 4
+		},
+		{
+			"icon": {
+				"paths": [
+					"M739.2 332.8l-502.4 502.4h-185.6v-185.6l502.4-502.4 185.6 185.6zM803.2 272l-185.6-185.6 67.2-67.2c22.4-22.4 54.4-22.4 76.8 0l108.8 108.8c22.4 22.4 22.4 54.4 0 76.8l-67.2 67.2zM41.6 912h940.8v112h-940.8v-112z"
+				],
+				"attrs": [
+					{}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"line"
+				],
+				"grid": 16
+			},
+			"attrs": [
+				{}
+			],
+			"properties": {
+				"order": 525,
+				"id": 1697,
+				"prevSize": 32,
+				"code": 59652,
+				"name": "line"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 5
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 480h1024v64h-1024v-64z",
+					"M304 48v339.2h-67.2v-272h-67.2v-67.2z",
+					"M444.8 265.6v54.4h134.4v67.2h-201.6v-153.6l134.4-64v-54.4h-134.4v-67.2h201.6v153.6z",
+					"M854.4 48v339.2h-204.8v-67.2h137.6v-67.2h-137.6v-70.4h137.6v-67.2h-137.6v-67.2z",
+					"M115.2 793.6c3.2-57.6 38.4-83.2 108.8-83.2 38.4 0 67.2 9.6 86.4 25.6s25.6 35.2 25.6 70.4v112c0 25.6 0 28.8 9.6 41.6h-73.6c-3.2-9.6-3.2-9.6-6.4-19.2-22.4 19.2-41.6 25.6-70.4 25.6-54.4 0-89.6-32-89.6-76.8s28.8-70.4 99.2-80l38.4-6.4c16-3.2 22.4-6.4 22.4-16 0-12.8-12.8-22.4-38.4-22.4s-41.6 9.6-44.8 28.8h-67.2zM262.4 844.8c-6.4 3.2-12.8 6.4-25.6 6.4l-25.6 6.4c-25.6 6.4-38.4 16-38.4 28.8 0 16 12.8 25.6 35.2 25.6s41.6-9.6 54.4-32v-35.2z",
+					"M390.4 624h73.6v112c22.4-16 41.6-22.4 67.2-22.4 64 0 105.6 51.2 105.6 124.8 0 76.8-44.8 134.4-108.8 134.4-32 0-48-9.6-67.2-35.2v28.8h-70.4v-342.4zM460.8 838.4c0 41.6 22.4 70.4 51.2 70.4s51.2-28.8 51.2-70.4c0-44.8-19.2-70.4-51.2-70.4-28.8 0-51.2 28.8-51.2 70.4z",
+					"M851.2 806.4c-3.2-22.4-19.2-35.2-44.8-35.2-32 0-51.2 25.6-51.2 70.4 0 48 19.2 73.6 51.2 73.6 25.6 0 41.6-12.8 44.8-41.6l70.4 3.2c-9.6 60.8-54.4 96-118.4 96-73.6 0-121.6-51.2-121.6-128 0-80 48-131.2 124.8-131.2 64 0 108.8 35.2 112 96h-67.2z"
+				],
+				"attrs": [
+					{},
+					{},
+					{},
+					{},
+					{},
+					{},
+					{}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"count"
+				],
+				"grid": 16
+			},
+			"attrs": [
+				{},
+				{},
+				{},
+				{},
+				{},
+				{},
+				{}
+			],
+			"properties": {
+				"order": 526,
+				"id": 1698,
+				"prevSize": 32,
+				"code": 59653,
+				"name": "count"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 6
+		},
+		{
+			"icon": {
+				"paths": [
+					"M553.6 656l-118.4-118.4c80-89.6 137.6-195.2 172.8-304h137.6v-92.8h-326.4v-92.8h-92.8v92.8h-326.4v92.8h518.4c-32 89.6-80 176-147.2 249.6-44.8-48-80-99.2-108.8-156.8h-92.8c35.2 76.8 80 147.2 137.6 211.2l-236.8 233.6 67.2 67.2 233.6-233.6 144 144c3.2 0 38.4-92.8 38.4-92.8zM816 419.2h-92.8l-208 560h92.8l51.2-140.8h220.8l51.2 140.8h92.8l-208-560zM691.2 745.6l76.8-201.6 76.8 201.6h-153.6z"
+				],
+				"attrs": [
+					{}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"translate"
+				],
+				"grid": 16
+			},
+			"attrs": [
+				{}
+			],
+			"properties": {
+				"order": 527,
+				"id": 1699,
+				"prevSize": 32,
+				"code": 59655,
+				"name": "translate"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 7
+		},
+		{
+			"icon": {
+				"paths": [
+					"M576 64h128v128h-128v-128z",
+					"M576 320h128v128h-128v-128z",
+					"M320 320h128v128h-128v-128z",
+					"M576 576h128v128h-128v-128z",
+					"M320 576h128v128h-128v-128z",
+					"M320 832h128v128h-128v-128z",
+					"M576 832h128v128h-128v-128z",
+					"M320 64h128v128h-128v-128z"
+				],
+				"attrs": [
+					{
+						"opacity": 1,
+						"visibility": false
+					},
+					{
+						"opacity": 1,
+						"visibility": false
+					},
+					{
+						"opacity": 1,
+						"visibility": false
+					},
+					{
+						"opacity": 1,
+						"visibility": false
+					},
+					{
+						"opacity": 1,
+						"visibility": false
+					},
+					{
+						"opacity": 1,
+						"visibility": false
+					},
+					{
+						"opacity": 1,
+						"visibility": false
+					},
+					{
+						"opacity": 1,
+						"visibility": false
+					},
+					{
+						"opacity": 1,
+						"visibility": false
+					}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"drag"
+				],
+				"grid": 16
+			},
+			"attrs": [
+				{
+					"opacity": 1,
+					"visibility": false
+				},
+				{
+					"opacity": 1,
+					"visibility": false
+				},
+				{
+					"opacity": 1,
+					"visibility": false
+				},
+				{
+					"opacity": 1,
+					"visibility": false
+				},
+				{
+					"opacity": 1,
+					"visibility": false
+				},
+				{
+					"opacity": 1,
+					"visibility": false
+				},
+				{
+					"opacity": 1,
+					"visibility": false
+				},
+				{
+					"opacity": 1,
+					"visibility": false
+				},
+				{
+					"opacity": 1,
+					"visibility": false
+				}
+			],
+			"properties": {
+				"order": 528,
+				"id": 1700,
+				"prevSize": 32,
+				"code": 59656,
+				"name": "drag",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 8
+		},
+		{
+			"icon": {
+				"paths": [
+					"M1024 590.444l-512-397.426-512 397.428v-162.038l512-397.426 512 397.428zM896 576v384h-256v-256h-256v256h-256v-384l384-288z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"home"
+				],
+				"defaultCode": 57345,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 529,
+				"id": 1701,
+				"prevSize": 32,
+				"code": 59659,
+				"name": "home",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 9
+		},
+		{
+			"icon": {
+				"paths": [
+					"M839.432 199.43c27.492 27.492 50.554 78.672 55.552 120.57h-318.984v-318.984c41.898 4.998 93.076 28.060 120.568 55.552l142.864 142.862zM512 384v-384h-368c-44 0-80 36-80 80v864c0 44 36 80 80 80h672c44 0 80-36 80-80v-560h-384zM576 768v192h-192v-192h-160l256-256 256 256h-160z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"upload"
+				],
+				"defaultCode": 57474,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 530,
+				"id": 1702,
+				"prevSize": 32,
+				"code": 59668,
+				"name": "upload",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 10
+		},
+		{
+			"icon": {
+				"paths": [
+					"M928 64h-832c-52.8 0-96 43.2-96 96v512c0 52.8 43.2 96 96 96h160v256l307.2-256h364.8c52.8 0 96-43.2 96-96v-512c0-52.8-43.2-96-96-96zM896 640h-379.142l-196.858 174.714v-174.714h-192v-448h768v448z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"bubble"
+				],
+				"defaultCode": 57703,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 600,
+				"id": 1703,
+				"prevSize": 32,
+				"code": 59676,
+				"name": "bubble",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 11
+		},
+		{
+			"icon": {
+				"paths": [
+					"M622.826 702.736c-22.11-3.518-22.614-64.314-22.614-64.314s64.968-64.316 79.128-150.802c38.090 0 61.618-91.946 23.522-124.296 1.59-34.054 48.96-267.324-190.862-267.324-239.822 0-192.45 233.27-190.864 267.324-38.094 32.35-14.57 124.296 23.522 124.296 14.158 86.486 79.128 150.802 79.128 150.802s-0.504 60.796-22.614 64.314c-71.22 11.332-337.172 128.634-337.172 257.264h896c0-128.63-265.952-245.932-337.174-257.264z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"user"
+				],
+				"defaultCode": 57733,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 601,
+				"id": 1704,
+				"prevSize": 32,
+				"code": 59677,
+				"name": "user",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 12
+		},
+		{
+			"icon": {
+				"paths": [
+					"M592 448h-16v-192c0-105.87-86.13-192-192-192h-128c-105.87 0-192 86.13-192 192v192h-16c-26.4 0-48 21.6-48 48v480c0 26.4 21.6 48 48 48h544c26.4 0 48-21.6 48-48v-480c0-26.4-21.6-48-48-48zM192 256c0-35.29 28.71-64 64-64h128c35.29 0 64 28.71 64 64v192h-256v-192z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"lock"
+				],
+				"defaultCode": 57811,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 602,
+				"id": 1705,
+				"prevSize": 32,
+				"code": 59686,
+				"name": "lock"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 13
+		},
+		{
+			"icon": {
+				"paths": [
+					"M768 64c105.87 0 192 86.13 192 192v192h-128v-192c0-35.29-28.71-64-64-64h-128c-35.29 0-64 28.71-64 64v192h16c26.4 0 48 21.6 48 48v480c0 26.4-21.6 48-48 48h-544c-26.4 0-48-21.6-48-48v-480c0-26.4 21.6-48 48-48h400v-192c0-105.87 86.13-192 192-192h128z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"unlock"
+				],
+				"defaultCode": 57812,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 603,
+				"id": 1706,
+				"prevSize": 32,
+				"code": 59687,
+				"name": "unlock"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 14
+		},
+		{
+			"icon": {
+				"paths": [
+					"M448 128v-16c0-26.4-21.6-48-48-48h-160c-26.4 0-48 21.6-48 48v16h-192v128h192v16c0 26.4 21.6 48 48 48h160c26.4 0 48-21.6 48-48v-16h576v-128h-576zM256 256v-128h128v128h-128zM832 432c0-26.4-21.6-48-48-48h-160c-26.4 0-48 21.6-48 48v16h-576v128h576v16c0 26.4 21.6 48 48 48h160c26.4 0 48-21.6 48-48v-16h192v-128h-192v-16zM640 576v-128h128v128h-128zM448 752c0-26.4-21.6-48-48-48h-160c-26.4 0-48 21.6-48 48v16h-192v128h192v16c0 26.4 21.6 48 48 48h160c26.4 0 48-21.6 48-48v-16h576v-128h-576v-16zM256 896v-128h128v128h-128z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"settings"
+				],
+				"defaultCode": 57819,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 604,
+				"id": 1707,
+				"prevSize": 32,
+				"code": 59688,
+				"name": "settings",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 15
+		},
+		{
+			"icon": {
+				"paths": [
+					"M192 1024h640l64-704h-768zM640 128v-128h-256v128h-320v192l64-64h768l64 64v-192h-320zM576 128h-128v-64h128v64z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"remove2"
+				],
+				"defaultCode": 57935,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 605,
+				"id": 1708,
+				"prevSize": 32,
+				"code": 59690,
+				"name": "remove2",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 16
+		},
+		{
+			"icon": {
+				"paths": [
+					"M384 64h256v256h-256zM384 384h256v256h-256zM384 704h256v256h-256z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"menu"
+				],
+				"defaultCode": 58025,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 606,
+				"id": 1709,
+				"prevSize": 32,
+				"code": 59693,
+				"name": "menu",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 17
+		},
+		{
+			"icon": {
+				"paths": [
+					"M1009.956 915.76l-437.074-871.112c-16.742-29.766-38.812-44.648-60.882-44.648s-44.14 14.882-60.884 44.648l-437.074 871.112c-33.486 59.532-5 108.24 63.304 108.24h869.308c68.302 0 96.792-48.708 63.302-108.24zM512 896c-35.346 0-64-28.654-64-64 0-35.348 28.654-64 64-64 35.348 0 64 28.652 64 64 0 35.346-28.652 64-64 64zM556 704h-88l-20-256c0-35.346 28.654-64 64-64s64 28.654 64 64l-20 256z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"warning"
+				],
+				"defaultCode": 58198,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 531,
+				"id": 1710,
+				"prevSize": 32,
+				"code": 59696,
+				"name": "warning"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 18
+		},
+		{
+			"icon": {
+				"paths": [
+					"M448 704h128v128h-128zM704 256c35.346 0 64 28.654 64 64v192l-192 128h-128v-64l192-128v-64h-320v-128h384zM512 96c-111.118 0-215.584 43.272-294.156 121.844s-121.844 183.038-121.844 294.156c0 111.118 43.272 215.584 121.844 294.156 78.572 78.572 183.038 121.844 294.156 121.844 111.118 0 215.584-43.272 294.156-121.844 78.572-78.572 121.844-183.038 121.844-294.156 0-111.118-43.272-215.584-121.844-294.156-78.572-78.572-183.038-121.844-294.156-121.844zM512 0v0c282.77 0 512 229.23 512 512s-229.23 512-512 512c-282.77 0-512-229.23-512-512 0-282.77 229.23-512 512-512z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"question"
+				],
+				"defaultCode": 58201,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 532,
+				"id": 1711,
+				"prevSize": 32,
+				"code": 59697,
+				"name": "question",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 19
+		},
+		{
+			"icon": {
+				"paths": [
+					"M512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512 512-229.23 512-512-229.23-512-512-512zM512 896c-212.078 0-384-171.922-384-384s171.922-384 384-384c212.078 0 384 171.922 384 384 0 212.078-171.922 384-384 384zM768 576h-192v192h-128v-192h-192v-128h192v-192h128v192h192z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"pluscircle"
+				],
+				"defaultCode": 58206,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 533,
+				"id": 1712,
+				"prevSize": 32,
+				"code": 59698,
+				"name": "pluscircle",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 20
+		},
+		{
+			"icon": {
+				"paths": [
+					"M512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512 512-229.23 512-512-229.23-512-512-512zM448 192h128v128h-128v-128zM640 832h-256v-64h64v-256h-64v-64h192v320h64v64z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"info"
+				],
+				"defaultCode": 58211,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 534,
+				"id": 1713,
+				"prevSize": 32,
+				"code": 59699,
+				"name": "info"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 21
+		},
+		{
+			"icon": {
+				"paths": [
+					"M1024 736 736 0h-448l-288 288v448l288 288h448l288-288v-448l-288-288zM576 832h-128v-128h128v128zM576 576h-128v-384h128v384z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"notice"
+				],
+				"defaultCode": 58218,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 535,
+				"id": 1714,
+				"prevSize": 32,
+				"code": 59700,
+				"name": "notice"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 22
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 640l192 192 320-320 320 320 192-192-511.998-512z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"arrowup"
+				],
+				"defaultCode": 58288,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 536,
+				"id": 1715,
+				"prevSize": 32,
+				"code": 59707,
+				"name": "arrowup",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 23
+		},
+		{
+			"icon": {
+				"paths": [
+					"M384 0l-192 192 320 320-320 320 192 192 512-512z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"arrowright"
+				],
+				"defaultCode": 58289,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 537,
+				"id": 1716,
+				"prevSize": 32,
+				"code": 59708,
+				"name": "arrowright",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 24
+		},
+		{
+			"icon": {
+				"paths": [
+					"M1024 384l-192-192-320 320-320-320-192 192 512 511.998z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"arrowdown"
+				],
+				"defaultCode": 58290,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 538,
+				"id": 1717,
+				"prevSize": 32,
+				"code": 59709,
+				"name": "arrowdown",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 25
+		},
+		{
+			"icon": {
+				"paths": [
+					"M768 640l-256-256-256 256z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"arrowup2"
+				],
+				"defaultCode": 58292,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 539,
+				"id": 1718,
+				"prevSize": 32,
+				"code": 59711,
+				"name": "arrowup2",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 26
+		},
+		{
+			"icon": {
+				"paths": [
+					"M256 384l256 256 256-256z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"arrowdown2"
+				],
+				"defaultCode": 58294,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 540,
+				"id": 1719,
+				"prevSize": 32,
+				"code": 59712,
+				"name": "arrowdown2",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 27
+		},
+		{
+			"icon": {
+				"paths": [
+					"M256 256l256 256 256-256zM255.996 575.996l256 256 256-256z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"menu2"
+				],
+				"defaultCode": 58393,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 541,
+				"id": 1720,
+				"prevSize": 32,
+				"code": 59713,
+				"name": "menu2",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 28
+		},
+		{
+			"icon": {
+				"paths": [
+					"M704 576l128-128v512h-768v-768h512l-128 128h-256v512h512zM960 64v352l-130.744-130.744-354.746 354.744h-90.51v-90.512l354.744-354.744-130.744-130.744z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"newtab"
+				],
+				"defaultCode": 58492,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 607,
+				"id": 1721,
+				"prevSize": 32,
+				"code": 59745,
+				"name": "newtab",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 29
+		},
+		{
+			"icon": {
+				"paths": [
+					"M960 256v-64l-448 128-448-128v64l320 128v256l-128 448h64l192-448 192 448h64l-128-448v-256zM416 160q0-40 28-68t68-28 68 28 28 68-28 68-68 28-68-28-28-68z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"grid": 16,
+				"tags": [
+					"a11y"
+				]
+			},
+			"attrs": [],
+			"properties": {
+				"order": 608,
+				"id": 1694,
+				"prevSize": 32,
+				"code": 59648,
+				"name": "a11y"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 30
+		},
+		{
+			"icon": {
+				"paths": [
+					"M892.8 982.4l-89.6-89.6c-70.4 80-172.8 131.2-288 131.2-208 0-380.8-166.4-384-377.6 0 0 0 0 0 0 0-3.2 0-3.2 0-6.4s0-3.2 0-6.4v0c0 0 0 0 0-3.2 0 0 0-3.2 0-3.2 3.2-105.6 48-211.2 105.6-304l-192-192 44.8-44.8 182.4 182.4c0 0 0 0 0 0l569.6 569.6c0 0 0 0 0 0l99.2 99.2-48 44.8zM896 633.6c0 0 0 0 0 0 0-3.2 0-6.4 0-6.4-9.6-316.8-384-627.2-384-627.2s-108.8 89.6-208 220.8l70.4 70.4c6.4-9.6 16-22.4 22.4-32 41.6-51.2 83.2-96 115.2-128v0c32 32 73.6 76.8 115.2 128 108.8 137.6 169.6 265.6 172.8 371.2 0 0 0 3.2 0 3.2v0 0c0 3.2 0 3.2 0 6.4s0 3.2 0 3.2v0 0c0 22.4-3.2 41.6-9.6 64l76.8 76.8c16-41.6 28.8-89.6 28.8-137.6 0 0 0 0 0 0 0-3.2 0-3.2 0-6.4s-0-3.2-0-6.4z"
+				],
+				"attrs": [
+					{}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"invert"
+				],
+				"grid": 16,
+				"defaultCode": 58882
+			},
+			"attrs": [
+				{}
+			],
+			"properties": {
+				"order": 609,
+				"id": 0,
+				"prevSize": 32,
+				"code": 58882,
+				"name": "invert"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 31
+		},
+		{
+			"icon": {
+				"paths": [
+					"M928 128h-416l-32-64h-352l-64 128h896zM904.34 704h74.86l44.8-448h-1024l64 640h484.080c-104.882-37.776-180.080-138.266-180.080-256 0-149.982 122.018-272 272-272 149.98 0 272 122.018 272 272 0 21.678-2.622 43.15-7.66 64zM1002.996 913.75l-198.496-174.692c17.454-28.92 27.5-62.814 27.5-99.058 0-106.040-85.96-192-192-192s-192 85.96-192 192 85.96 192 192 192c36.244 0 70.138-10.046 99.058-27.5l174.692 198.496c22.962 26.678 62.118 28.14 87.006 3.252l5.492-5.492c24.888-24.888 23.426-64.044-3.252-87.006zM640 764c-68.484 0-124-55.516-124-124s55.516-124 124-124 124 55.516 124 124-55.516 124-124 124z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57396,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 0,
+				"order": 610,
+				"prevSize": 32,
+				"code": 57396,
+				"name": "browse",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 32
+		},
+		{
+			"icon": {
+				"paths": [
+					"M768 256h64v64h-64zM640 384h64v64h-64zM640 512h64v64h-64zM640 640h64v64h-64zM512 512h64v64h-64zM512 640h64v64h-64zM384 640h64v64h-64zM768 384h64v64h-64zM768 512h64v64h-64zM768 640h64v64h-64zM768 768h64v64h-64zM640 768h64v64h-64zM512 768h64v64h-64zM384 768h64v64h-64zM256 768h64v64h-64z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"resize",
+					"dots"
+				],
+				"defaultCode": 57394,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 1,
+				"order": 611,
+				"prevSize": 32,
+				"code": 57394,
+				"name": "resize",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 33
+		},
+		{
+			"icon": {
+				"paths": [
+					"M832 256h-192v-64l-192-192h-448v768h384v256h640v-576l-192-192zM832 346.51l101.49 101.49h-101.49v-101.49zM448 90.51l101.49 101.49h-101.49v-101.49zM64 64h320v192h192v448h-512v-640zM960 960h-512v-192h192v-448h128v192h192v448z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"copy"
+				],
+				"defaultCode": 57393,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 2,
+				"order": 612,
+				"prevSize": 32,
+				"code": 57393,
+				"name": "copy",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 34
+		},
+		{
+			"icon": {
+				"paths": [
+					"M256 64h512v128h-128v768h-128v-768h-128v768h-128v-448c-123.712 0-224-100.288-224-224s100.288-224 224-224zM960 896l-256-224 256-224z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"rtl"
+				],
+				"defaultCode": 57392,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 3,
+				"order": 613,
+				"prevSize": 32,
+				"code": 57392,
+				"name": "rtl",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 35
+		},
+		{
+			"icon": {
+				"paths": [
+					"M448 64h512v128h-128v768h-128v-768h-128v768h-128v-448c-123.712 0-224-100.288-224-224s100.288-224 224-224zM64 448l256 224-256 224z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"ltr"
+				],
+				"defaultCode": 57391,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 4,
+				"order": 542,
+				"prevSize": 32,
+				"code": 57391,
+				"name": "ltr",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 36
+		},
+		{
+			"icon": {
+				"paths": [
+					"M384 64h512v128h-128v768h-128v-768h-128v768h-128v-448c-123.712 0-224-100.288-224-224s100.288-224 224-224z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"visualchars"
+				],
+				"defaultCode": 57390,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 5,
+				"order": 543,
+				"prevSize": 32,
+				"code": 57390,
+				"name": "visualchars",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 37
+		},
+		{
+			"icon": {
+				"paths": [
+					"M731.42 517.036c63.92 47.938 100.58 116.086 100.58 186.964s-36.66 139.026-100.58 186.964c-59.358 44.518-137.284 69.036-219.42 69.036-82.138 0-160.062-24.518-219.42-69.036-63.92-47.938-100.58-116.086-100.58-186.964h128c0 69.382 87.926 128 192 128 104.074 0 192-58.618 192-128 0-69.382-87.926-128-192-128-82.138 0-160.062-24.518-219.42-69.036-63.92-47.94-100.58-116.086-100.58-186.964 0-70.878 36.66-139.024 100.58-186.964 59.358-44.518 137.282-69.036 219.42-69.036 82.136 0 160.062 24.518 219.42 69.036 63.92 47.94 100.58 116.086 100.58 186.964h-128c0-69.382-87.926-128-192-128-104.074 0-192 58.618-192 128 0 69.382 87.926 128 192 128 82.136 0 160.062 24.518 219.42 69.036zM0 512h1024v64h-1024z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"strikethrough"
+				],
+				"defaultCode": 57389,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 6,
+				"order": 544,
+				"prevSize": 32,
+				"code": 57389,
+				"name": "strikethrough",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 38
+		},
+		{
+			"icon": {
+				"paths": [
+					"M704 64h128v416c0 159.058-143.268 288-320 288-176.73 0-320-128.942-320-288v-416h128v416c0 40.166 18.238 78.704 51.354 108.506 36.896 33.204 86.846 51.494 140.646 51.494 53.8 0 103.75-18.29 140.646-51.494 33.116-29.802 51.354-68.34 51.354-108.506v-416zM192 832h640v128h-640z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"underline"
+				],
+				"defaultCode": 57388,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 7,
+				"order": 545,
+				"prevSize": 32,
+				"code": 57388,
+				"name": "underline",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 39
+		},
+		{
+			"icon": {
+				"paths": [
+					"M896 64v64h-128l-320 768h128v64h-448v-64h128l320-768h-128v-64z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"italic"
+				],
+				"defaultCode": 57387,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 8,
+				"order": 546,
+				"prevSize": 32,
+				"code": 57387,
+				"name": "italic",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 40
+		},
+		{
+			"icon": {
+				"paths": [
+					"M707.88 484.652c37.498-44.542 60.12-102.008 60.12-164.652 0-141.16-114.842-256-256-256h-320v896h384c141.158 0 256-114.842 256-256 0-92.956-49.798-174.496-124.12-219.348zM384 192h101.5c55.968 0 101.5 57.42 101.5 128s-45.532 128-101.5 128h-101.5v-256zM543 832h-159v-256h159c58.45 0 106 57.42 106 128s-47.55 128-106 128z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"bold0"
+				],
+				"defaultCode": 57386,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 9,
+				"order": 547,
+				"prevSize": 32,
+				"code": 57386,
+				"name": "bold",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 41
+		},
+		{
+			"icon": {
+				"paths": [
+					"M576 64c247.424 0 448 200.576 448 448s-200.576 448-448 448v-96c94.024 0 182.418-36.614 248.902-103.098 66.484-66.484 103.098-154.878 103.098-248.902 0-94.022-36.614-182.418-103.098-248.902-66.484-66.484-154.878-103.098-248.902-103.098-94.022 0-182.418 36.614-248.902 103.098-51.14 51.138-84.582 115.246-97.306 184.902h186.208l-224 256-224-256h164.57c31.060-217.102 217.738-384 443.43-384zM768 448v128h-256v-320h128v192z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"restoredraft"
+				],
+				"defaultCode": 57384,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 11,
+				"order": 548,
+				"prevSize": 32,
+				"code": 57384,
+				"name": "restoredraft",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 42
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 512h128v64h-128zM192 512h192v64h-192zM448 512h128v64h-128zM640 512h192v64h-192zM896 512h128v64h-128zM880 0l16 448h-768l16-448h32l16 384h640l16-384zM144 1024l-16-384h768l-16 384h-32l-16-320h-640l-16 320z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"pagebreak"
+				],
+				"defaultCode": 57383,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 12,
+				"order": 549,
+				"prevSize": 32,
+				"code": 57383,
+				"name": "pagebreak",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 43
+		},
+		{
+			"icon": {
+				"paths": [
+					"M384 192h128v64h-128zM576 192h128v64h-128zM896 192v256h-192v-64h128v-128h-64v-64zM320 384h128v64h-128zM512 384h128v64h-128zM192 256v128h64v64h-128v-256h192v64zM384 576h128v64h-128zM576 576h128v64h-128zM896 576v256h-192v-64h128v-128h-64v-64zM320 768h128v64h-128zM512 768h128v64h-128zM192 640v128h64v64h-128v-256h192v64zM960 64h-896v896h896v-896zM1024 0v0 1024h-1024v-1024h1024z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"template"
+				],
+				"defaultCode": 57382,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 13,
+				"order": 550,
+				"prevSize": 32,
+				"code": 57382,
+				"name": "template",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 44
+		},
+		{
+			"icon": {
+				"paths": [
+					"M448 576h-192v-128h192v-192h128v192h192v128h-192v192h-128zM1024 640v384h-1024v-384h128v256h768v-256z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"nonbreaking"
+				],
+				"defaultCode": 57381,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 14,
+				"order": 551,
+				"prevSize": 32,
+				"code": 57381,
+				"name": "nonbreaking",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 45
+		},
+		{
+			"icon": {
+				"paths": [
+					"M128 256h128v192h64v-384c0-35.2-28.8-64-64-64h-128c-35.2 0-64 28.8-64 64v384h64v-192zM128 64h128v128h-128v-128zM960 64v-64h-192c-35.202 0-64 28.8-64 64v320c0 35.2 28.798 64 64 64h192v-64h-192v-320h192zM640 160v-96c0-35.2-28.8-64-64-64h-192v448h192c35.2 0 64-28.8 64-64v-96c0-35.2-8.8-64-44-64 35.2 0 44-28.8 44-64zM576 384h-128v-128h128v128zM576 192h-128v-128h128v128zM832 576l-416 448-224-288 82-70 142 148 352-302z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"spellchecker"
+				],
+				"defaultCode": 57380,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 15,
+				"order": 552,
+				"prevSize": 32,
+				"code": 57380,
+				"name": "spellchecker",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 46
+		},
+		{
+			"icon": {
+				"paths": [
+					"M704 896h256l64-128v256h-384v-214.214c131.112-56.484 224-197.162 224-361.786 0-214.432-157.598-382.266-352-382.266-194.406 0-352 167.832-352 382.266 0 164.624 92.886 305.302 224 361.786v214.214h-384v-256l64 128h256v-32.59c-187.63-66.46-320-227.402-320-415.41 0-247.424 229.23-448 512-448 282.77 0 512 200.576 512 448 0 188.008-132.37 348.95-320 415.41v32.59z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"charmap"
+				],
+				"defaultCode": 57376,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 19,
+				"order": 614,
+				"prevSize": 32,
+				"code": 57376,
+				"name": "charmap",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 47
+		},
+		{
+			"icon": {
+				"paths": [
+					"M768 206v50h128v64h-192v-146l128-60v-50h-128v-64h192v146zM676 256h-136l-188 188-188-188h-136l256 256-256 256h136l188-188 188 188h136l-256-256z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"sup"
+				],
+				"defaultCode": 57375,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 20,
+				"order": 615,
+				"prevSize": 32,
+				"code": 57375,
+				"name": "sup",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 48
+		},
+		{
+			"icon": {
+				"paths": [
+					"M768 910v50h128v64h-192v-146l128-60v-50h-128v-64h192v146zM676 256h-136l-188 188-188-188h-136l256 256-256 256h136l188-188 188 188h136l-256-256z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"sub"
+				],
+				"defaultCode": 57374,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 21,
+				"order": 616,
+				"prevSize": 32,
+				"code": 57374,
+				"name": "sub",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 49
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 896h576v128h-576zM192 0h704v128h-704zM277.388 832l204.688-784.164 123.85 32.328-196.25 751.836zM929.774 1024l-129.774-129.774-129.774 129.774-62.226-62.226 129.774-129.774-129.774-129.774 62.226-62.226 129.774 129.774 129.774-129.774 62.226 62.226-129.774 129.774 129.774 129.774z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"removeformat"
+				],
+				"defaultCode": 57373,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 22,
+				"order": 617,
+				"prevSize": 32,
+				"code": 57373,
+				"name": "removeformat",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 50
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 448h1024v128h-1024z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"hr"
+				],
+				"defaultCode": 57372,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 23,
+				"order": 618,
+				"prevSize": 32,
+				"code": 57372,
+				"name": "hr",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 51
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 64v896h1024v-896h-1024zM384 640v-192h256v192h-256zM640 704v192h-256v-192h256zM640 192v192h-256v-192h256zM320 192v192h-256v-192h256zM64 448h256v192h-256v-192zM704 448h256v192h-256v-192zM704 384v-192h256v192h-256zM64 704h256v192h-256v-192zM704 896v-192h256v192h-256z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"table"
+				],
+				"defaultCode": 57371,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 24,
+				"order": 619,
+				"prevSize": 32,
+				"code": 57371,
+				"name": "table",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 52
+		},
+		{
+			"icon": {
+				"paths": [
+					"M322.018 832l57.6-192h264.764l57.6 192h113.632l-191.996-640h-223.236l-192 640h113.636zM475.618 320h72.764l57.6 192h-187.964l57.6-192z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"forecolor"
+				],
+				"defaultCode": 57370,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 25,
+				"order": 620,
+				"prevSize": 32,
+				"code": 57370,
+				"name": "forecolor",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 53
+		},
+		{
+			"icon": {
+				"paths": [
+					"M512 320c-209.368 0-395.244 100.556-512 256 116.756 155.446 302.632 256 512 256 209.368 0 395.244-100.554 512-256-116.756-155.444-302.632-256-512-256zM448 448c35.346 0 64 28.654 64 64s-28.654 64-64 64-64-28.654-64-64 28.654-64 64-64zM773.616 705.296c-39.648 20.258-81.652 35.862-124.846 46.376-44.488 10.836-90.502 16.328-136.77 16.328-46.266 0-92.282-5.492-136.768-16.324-43.194-10.518-85.198-26.122-124.846-46.376-63.020-32.202-120.222-76.41-167.64-129.298 47.418-52.888 104.62-97.1 167.64-129.298 32.336-16.522 66.242-29.946 101.082-40.040-19.888 30.242-31.468 66.434-31.468 105.336 0 106.040 85.962 192 192 192 106.038 0 192-85.96 192-192 0-38.902-11.582-75.094-31.466-105.34 34.838 10.096 68.744 23.52 101.082 40.042 63.022 32.198 120.218 76.408 167.638 129.298-47.42 52.886-104.618 97.1-167.638 129.296zM860.918 243.722c-108.72-55.554-226.112-83.722-348.918-83.722-122.806 0-240.198 28.168-348.918 83.722-58.772 30.032-113.732 67.904-163.082 112.076v109.206c55.338-58.566 120.694-107.754 192.194-144.29 99.62-50.904 207.218-76.714 319.806-76.714s220.186 25.81 319.804 76.716c71.502 36.536 136.858 85.724 192.196 144.29v-109.206c-49.35-44.174-104.308-82.046-163.082-112.078z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"preview"
+				],
+				"defaultCode": 57369,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 26,
+				"order": 553,
+				"prevSize": 32,
+				"code": 57369,
+				"name": "preview",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 54
+		},
+		{
+			"icon": {
+				"paths": [
+					"M512 192c-212.076 0-384 171.922-384 384s171.922 384 384 384c212.074 0 384-171.922 384-384s-171.926-384-384-384zM715.644 779.646c-54.392 54.396-126.716 84.354-203.644 84.354s-149.25-29.958-203.646-84.354c-54.396-54.394-84.354-126.718-84.354-203.646s29.958-149.25 84.354-203.646c54.396-54.396 126.718-84.354 203.646-84.354s149.252 29.958 203.642 84.354c54.402 54.396 84.358 126.718 84.358 203.646s-29.958 149.252-84.356 203.646zM325.93 203.862l-42.94-85.878c-98.874 49.536-179.47 130.132-229.006 229.008l85.876 42.94c40.248-80.336 105.732-145.822 186.070-186.070zM884.134 389.93l85.878-42.938c-49.532-98.876-130.126-179.472-229.004-229.008l-42.944 85.878c80.338 40.248 145.824 105.732 186.070 186.068zM512 384h-64v192c0 10.11 4.7 19.11 12.022 24.972l-0.012 0.016 160 128 39.976-49.976-147.986-118.39v-176.622z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"inserttime"
+				],
+				"defaultCode": 57368,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 27,
+				"order": 554,
+				"prevSize": 32,
+				"code": 57368,
+				"name": "inserttime",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 55
+		},
+		{
+			"icon": {
+				"paths": [
+					"M320 256l-256 256 256 256h128l-256-256 256-256zM704 256h-128l256 256-256 256h128l256-256z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"code"
+				],
+				"defaultCode": 57367,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 28,
+				"order": 555,
+				"prevSize": 32,
+				"code": 57367,
+				"name": "code",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 56
+		},
+		{
+			"icon": {
+				"paths": [
+					"M448 704h128v128h-128zM704 256c35.346 0 64 28.654 64 64v192l-192 128h-128v-64l192-128v-64h-320v-128h384zM512 96c-111.118 0-215.584 43.272-294.156 121.844s-121.844 183.038-121.844 294.156c0 111.118 43.272 215.584 121.844 294.156 78.572 78.572 183.038 121.844 294.156 121.844 111.118 0 215.584-43.272 294.156-121.844 78.572-78.572 121.844-183.038 121.844-294.156 0-111.118-43.272-215.584-121.844-294.156-78.572-78.572-183.038-121.844-294.156-121.844zM512 0v0c282.77 0 512 229.23 512 512s-229.23 512-512 512c-282.77 0-512-229.23-512-512 0-282.77 229.23-512 512-512z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"help"
+				],
+				"defaultCode": 57366,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 29,
+				"order": 556,
+				"prevSize": 32,
+				"code": 57366,
+				"name": "help",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 57
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 128v768h1024v-768h-1024zM192 832h-128v-128h128v128zM192 576h-128v-128h128v128zM192 320h-128v-128h128v128zM768 832h-512v-640h512v640zM960 832h-128v-128h128v128zM960 576h-128v-128h128v128zM960 320h-128v-128h128v128zM384 320v384l256-192z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"media"
+				],
+				"defaultCode": 57365,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 30,
+				"order": 557,
+				"prevSize": 32,
+				"code": 57365,
+				"name": "media",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 58
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 128v832h1024v-832h-1024zM960 896h-896v-704h896v704zM704 352c0-53.019 42.981-96 96-96s96 42.981 96 96c0 53.019-42.981 96-96 96-53.019 0-96-42.981-96-96zM896 832h-768l192-512 256 320 128-96z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"image"
+				],
+				"defaultCode": 57364,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 31,
+				"order": 558,
+				"prevSize": 32,
+				"code": 57364,
+				"name": "image",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 59
+		},
+		{
+			"icon": {
+				"paths": [
+					"M192 0v1024l320-320 320 320v-1024h-640zM768 869.49l-256-256-256 256v-805.49h512v805.49z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"anchor"
+				],
+				"defaultCode": 57363,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 32,
+				"order": 559,
+				"prevSize": 32,
+				"code": 57363,
+				"name": "anchor",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 60
+		},
+		{
+			"icon": {
+				"paths": [
+					"M476.888 675.114c4.56 9.048 6.99 19.158 6.99 29.696 0 17.616-6.744 34.058-18.992 46.308l-163.38 163.38c-12.248 12.248-28.696 18.992-46.308 18.992s-34.060-6.744-46.308-18.992l-99.38-99.38c-12.248-12.25-18.992-28.696-18.992-46.308s6.744-34.060 18.992-46.308l163.38-163.382c12.248-12.246 28.696-18.992 46.308-18.992 10.538 0 20.644 2.43 29.696 6.988l65.338-65.336c-27.87-21.41-61.44-32.16-95.034-32.16-39.986 0-79.972 15.166-110.308 45.502l-163.38 163.382c-60.67 60.67-60.67 159.95 0 220.618l99.38 99.382c30.334 30.332 70.32 45.5 110.306 45.5 39.988 0 79.974-15.168 110.308-45.502l163.38-163.38c55.82-55.82 60.238-144.298 13.344-205.346l-65.34 65.338zM978.496 144.884l-99.38-99.382c-30.334-30.336-70.32-45.502-110.308-45.502-39.986 0-79.97 15.166-110.306 45.502l-163.382 163.382c-55.82 55.82-60.238 144.298-13.342 205.342l65.338-65.34c-4.558-9.050-6.988-19.16-6.988-29.694 0-17.616 6.744-34.060 18.992-46.308l163.382-163.382c12.246-12.248 28.694-18.994 46.306-18.994 17.616 0 34.060 6.746 46.308 18.994l99.38 99.382c12.248 12.248 18.992 28.694 18.992 46.308s-6.744 34.060-18.992 46.308l-163.38 163.382c-12.248 12.248-28.694 18.992-46.308 18.992-10.536 0-20.644-2.43-29.696-6.99l-65.338 65.338c27.872 21.41 61.44 32.16 95.034 32.16 39.988 0 79.974-15.168 110.308-45.504l163.38-163.38c60.672-60.666 60.672-159.944 0-220.614zM233.368 278.624l-191.994-191.994 45.256-45.256 191.994 191.994zM384 0h64v192h-64zM0 384h192v64h-192zM790.632 745.376l191.996 191.996-45.256 45.256-191.996-191.996zM576 832h64v192h-64zM832 576h192v64h-192z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"unlink"
+				],
+				"defaultCode": 57362,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 33,
+				"order": 560,
+				"prevSize": 32,
+				"code": 57362,
+				"name": "unlink",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 61
+		},
+		{
+			"icon": {
+				"paths": [
+					"M320 704c17.6 17.6 47.274 16.726 65.942-1.942l316.118-316.116c18.668-18.668 19.54-48.342 1.94-65.942s-47.274-16.726-65.942 1.942l-316.116 316.116c-18.668 18.668-19.542 48.342-1.942 65.942zM476.888 675.112c4.56 9.050 6.99 19.16 6.99 29.696 0 17.616-6.744 34.060-18.992 46.308l-163.382 163.382c-12.248 12.248-28.694 18.992-46.308 18.992s-34.060-6.744-46.308-18.992l-99.382-99.382c-12.248-12.248-18.992-28.694-18.992-46.308s6.744-34.060 18.992-46.308l163.382-163.382c12.248-12.248 28.694-18.994 46.308-18.994 10.536 0 20.644 2.43 29.696 6.99l65.338-65.338c-27.87-21.41-61.44-32.16-95.034-32.16-39.986 0-79.972 15.166-110.308 45.502l-163.382 163.382c-60.67 60.67-60.67 159.948 0 220.618l99.382 99.382c30.334 30.332 70.32 45.5 110.306 45.5 39.988 0 79.974-15.168 110.308-45.502l163.382-163.382c55.82-55.82 60.238-144.298 13.344-205.344l-65.34 65.34zM978.498 144.884l-99.382-99.382c-30.334-30.336-70.32-45.502-110.308-45.502-39.986 0-79.972 15.166-110.308 45.502l-163.382 163.382c-55.82 55.82-60.238 144.298-13.342 205.342l65.338-65.34c-4.558-9.050-6.988-19.16-6.988-29.694 0-17.616 6.744-34.060 18.992-46.308l163.382-163.382c12.248-12.248 28.694-18.994 46.308-18.994s34.060 6.746 46.308 18.994l99.382 99.382c12.248 12.248 18.992 28.694 18.992 46.308s-6.744 34.060-18.992 46.308l-163.382 163.382c-12.248 12.248-28.694 18.992-46.308 18.992-10.536 0-20.644-2.43-29.696-6.99l-65.338 65.338c27.872 21.41 61.44 32.16 95.034 32.16 39.988 0 79.974-15.168 110.308-45.502l163.382-163.382c60.67-60.666 60.67-159.944 0-220.614z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"link"
+				],
+				"defaultCode": 57361,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 34,
+				"order": 561,
+				"prevSize": 32,
+				"code": 57361,
+				"name": "link",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 62
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 64h1024v128h-1024zM384 256h640v128h-640zM384 448h640v128h-640zM384 640h640v128h-640zM0 832h1024v128h-1024zM256 320v384l-256-192z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"outdent"
+				],
+				"defaultCode": 57357,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 38,
+				"order": 562,
+				"prevSize": 32,
+				"code": 57357,
+				"name": "outdent",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 63
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 64h1024v128h-1024zM384 256h640v128h-640zM384 448h640v128h-640zM384 640h640v128h-640zM0 832h1024v128h-1024zM0 704v-384l256 192z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"indent"
+				],
+				"defaultCode": 57356,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 39,
+				"order": 563,
+				"prevSize": 32,
+				"code": 57356,
+				"name": "indent",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 64
+		},
+		{
+			"icon": {
+				"paths": [
+					"M384 832h640v128h-640zM384 448h640v128h-640zM384 64h640v128h-640zM192 0v256h-64v-192h-64v-64zM128 526v50h128v64h-192v-146l128-60v-50h-128v-64h192v146zM256 704v320h-192v-64h128v-64h-128v-64h128v-64h-128v-64z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"numlist"
+				],
+				"defaultCode": 57355,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 40,
+				"order": 621,
+				"prevSize": 32,
+				"code": 57355,
+				"name": "numlist",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 65
+		},
+		{
+			"icon": {
+				"paths": [
+					"M384 64h640v128h-640v-128zM384 448h640v128h-640v-128zM384 832h640v128h-640v-128zM0 128c0-70.692 57.308-128 128-128 70.692 0 128 57.308 128 128 0 70.692-57.308 128-128 128-70.692 0-128-57.308-128-128zM0 512c0-70.692 57.308-128 128-128 70.692 0 128 57.308 128 128 0 70.692-57.308 128-128 128-70.692 0-128-57.308-128-128zM0 896c0-70.692 57.308-128 128-128 70.692 0 128 57.308 128 128 0 70.692-57.308 128-128 128-70.692 0-128-57.308-128-128z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"bullist"
+				],
+				"defaultCode": 57354,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 41,
+				"order": 622,
+				"prevSize": 32,
+				"code": 57354,
+				"name": "bullist",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 66
+		},
+		{
+			"icon": {
+				"paths": [
+					"M64 0h384v64h-384zM576 0h384v64h-384zM952 320h-56v-256h-256v256h-256v-256h-256v256h-56c-39.6 0-72 32.4-72 72v560c0 39.6 32.4 72 72 72h304c39.6 0 72-32.4 72-72v-376h128v376c0 39.6 32.4 72 72 72h304c39.6 0 72-32.4 72-72v-560c0-39.6-32.4-72-72-72zM348 960h-248c-19.8 0-36-14.4-36-32s16.2-32 36-32h248c19.8 0 36 14.4 36 32s-16.2 32-36 32zM544 512h-64c-17.6 0-32-14.4-32-32s14.4-32 32-32h64c17.6 0 32 14.4 32 32s-14.4 32-32 32zM924 960h-248c-19.8 0-36-14.4-36-32s16.2-32 36-32h248c19.8 0 36 14.4 36 32s-16.2 32-36 32z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"searchreplace"
+				],
+				"defaultCode": 57353,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 42,
+				"order": 623,
+				"prevSize": 32,
+				"code": 57353,
+				"name": "searchreplace",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 67
+		},
+		{
+			"icon": {
+				"paths": [
+					"M832 320v-160c0-17.6-14.4-32-32-32h-224v-64c0-35.2-28.8-64-64-64h-128c-35.204 0-64 28.8-64 64v64h-224c-17.602 0-32 14.4-32 32v640c0 17.6 14.398 32 32 32h288v192h448l192-192v-512h-192zM384 64.114c0.034-0.038 0.072-0.078 0.114-0.114h127.768c0.042 0.036 0.082 0.076 0.118 0.114l0 63.886h-128v-63.886zM192 256v-64h512v64h-512zM832 933.49v-101.49h101.49l-101.49 101.49zM960 768h-192v192h-320v-576h512v384z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"paste"
+				],
+				"defaultCode": 57352,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 43,
+				"order": 624,
+				"prevSize": 32,
+				"code": 57352,
+				"name": "paste",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 68
+		},
+		{
+			"icon": {
+				"paths": [
+					"M890.774 709.154c-45.654-45.556-103.728-69.072-157.946-69.072h-29.112l-63.904-64.008 255.62-256.038c63.904-64.010 63.904-192.028 0-256.038l-383.43 384.056-383.432-384.054c-63.904 64.008-63.904 192.028 0 256.038l255.622 256.034-63.906 64.008h-29.114c-54.22 0-112.292 23.518-157.948 69.076-81.622 81.442-92.65 202.484-24.63 270.35 29.97 29.902 70.288 44.494 112.996 44.494 54.216 0 112.29-23.514 157.946-69.072 53.584-53.464 76.742-124 67.084-185.348l65.384-65.488 65.376 65.488c-9.656 61.348 13.506 131.882 67.084 185.348 45.662 45.558 103.732 69.072 157.948 69.072 42.708 0 83.024-14.592 112.994-44.496 68.020-67.866 56.988-188.908-24.632-270.35zM353.024 845.538c-7.698 17.882-19.010 34.346-33.626 48.926-14.636 14.604-31.172 25.918-49.148 33.624-16.132 6.916-32.96 10.568-48.662 10.568-15.146 0-36.612-3.402-52.862-19.612-16.136-16.104-19.52-37.318-19.52-52.288 0-15.542 3.642-32.21 10.526-48.212 7.7-17.884 19.014-34.346 33.626-48.926 14.634-14.606 31.172-25.914 49.15-33.624 16.134-6.914 32.96-10.568 48.664-10.568 15.146 0 36.612 3.4 52.858 19.614 16.134 16.098 19.522 37.316 19.522 52.284 0.002 15.542-3.638 32.216-10.528 48.214zM512.004 666.596c-49.914 0-90.376-40.532-90.376-90.526 0-49.992 40.462-90.52 90.376-90.52s90.372 40.528 90.372 90.52c0 49.998-40.46 90.526-90.372 90.526zM855.272 919.042c-16.248 16.208-37.712 19.612-52.86 19.612-15.704 0-32.53-3.652-48.666-10.568-17.972-7.706-34.508-19.020-49.142-33.624-14.614-14.58-25.926-31.042-33.626-48.926-6.886-15.998-10.526-32.672-10.526-48.212 0-14.966 3.384-36.188 19.52-52.286 16.246-16.208 37.712-19.614 52.86-19.614 15.7 0 32.53 3.654 48.66 10.568 17.978 7.708 34.516 19.018 49.15 33.624 14.61 14.58 25.924 31.042 33.626 48.926 6.884 15.998 10.526 32.67 10.526 48.212-0.002 14.97-3.39 36.186-19.522 52.288z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"cut"
+				],
+				"defaultCode": 57351,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 44,
+				"order": 625,
+				"prevSize": 32,
+				"code": 57351,
+				"name": "cut",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 69
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 64h1024v128h-1024zM0 256h1024v128h-1024zM0 448h1024v128h-1024zM0 640h1024v128h-1024zM0 832h1024v128h-1024z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"alignjustify"
+				],
+				"defaultCode": 57350,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 45,
+				"order": 626,
+				"prevSize": 32,
+				"code": 57350,
+				"name": "alignjustify",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 70
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 64h1024v128h-1024zM384 256h640v128h-640zM384 640h640v128h-640zM0 448h1024v128h-1024zM0 832h1024v128h-1024z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"alignright"
+				],
+				"defaultCode": 57349,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 46,
+				"order": 627,
+				"prevSize": 32,
+				"code": 57349,
+				"name": "alignright",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 71
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 64h1024v128h-1024zM192 256h640v128h-640zM192 640h640v128h-640zM0 448h1024v128h-1024zM0 832h1024v128h-1024z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"aligncenter"
+				],
+				"defaultCode": 57348,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 47,
+				"order": 564,
+				"prevSize": 32,
+				"code": 57348,
+				"name": "aligncenter",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 72
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 64h1024v128h-1024zM0 256h640v128h-640zM0 640h640v128h-640zM0 448h1024v128h-1024zM0 832h1024v128h-1024z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"alignleft"
+				],
+				"defaultCode": 57347,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 48,
+				"order": 565,
+				"prevSize": 32,
+				"code": 57347,
+				"name": "alignleft",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 73
+		},
+		{
+			"icon": {
+				"paths": [
+					"M1024 592.458v-160.916l-159.144-15.914c-8.186-30.042-20.088-58.548-35.21-84.98l104.596-127.838-113.052-113.050-127.836 104.596c-26.434-15.124-54.942-27.026-84.982-35.208l-15.914-159.148h-160.916l-15.914 159.146c-30.042 8.186-58.548 20.086-84.98 35.208l-127.838-104.594-113.050 113.050 104.596 127.836c-15.124 26.432-27.026 54.94-35.21 84.98l-159.146 15.916v160.916l159.146 15.914c8.186 30.042 20.086 58.548 35.21 84.982l-104.596 127.836 113.048 113.048 127.838-104.596c26.432 15.124 54.94 27.028 84.98 35.21l15.916 159.148h160.916l15.914-159.144c30.042-8.186 58.548-20.088 84.982-35.21l127.836 104.596 113.048-113.048-104.596-127.836c15.124-26.434 27.028-54.942 35.21-84.98l159.148-15.92zM704 576l-128 128h-128l-128-128v-128l128-128h128l128 128v128z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"fullpage"
+				],
+				"defaultCode": 57346,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 49,
+				"order": 566,
+				"prevSize": 32,
+				"code": 57346,
+				"name": "fullpage",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 74
+		},
+		{
+			"icon": {
+				"paths": [
+					"M903.432 199.43l-142.864-142.862c-31.112-31.112-92.568-56.568-136.568-56.568h-480c-44 0-80 36-80 80v864c0 44 36 80 80 80h736c44 0 80-36 80-80v-608c0-44-25.456-105.458-56.568-136.57zM858.178 244.686c3.13 3.13 6.25 6.974 9.28 11.314h-163.458v-163.456c4.34 3.030 8.184 6.15 11.314 9.28l142.864 142.862zM896 944c0 8.672-7.328 16-16 16h-736c-8.672 0-16-7.328-16-16v-864c0-8.672 7.328-16 16-16h480c4.832 0 10.254 0.61 16 1.704v254.296h254.296c1.094 5.746 1.704 11.166 1.704 16v608z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"newdocument"
+				],
+				"defaultCode": 57345,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 50,
+				"order": 567,
+				"prevSize": 32,
+				"code": 57345,
+				"name": "newdocument",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 75
+		},
+		{
+			"icon": {
+				"paths": [
+					"M896 0h-896v1024h1024v-896l-128-128zM512 128h128v256h-128v-256zM896 896h-768v-768h64v320h576v-320h74.978l53.022 53.018v714.982z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"save"
+				],
+				"defaultCode": 57344,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 51,
+				"order": 568,
+				"prevSize": 32,
+				"code": 57344,
+				"name": "save",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 76
+		},
+		{
+			"icon": {
+				"paths": [
+					"M128 544l288 288 480-480-128-128-352 352-160-160z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"defaultCode": 57395,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 52,
+				"order": 569,
+				"prevSize": 32,
+				"code": 57395,
+				"name": "checkbox",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 77
+		},
+		{
+			"icon": {
+				"paths": [
+					"M512 512v128h32l32-64h64v256h-48v64h224v-64h-48v-256h64l32 64h32v-128zM832 320v-160c0-17.6-14.4-32-32-32h-224v-64c0-35.2-28.8-64-64-64h-128c-35.204 0-64 28.8-64 64v64h-224c-17.602 0-32 14.4-32 32v640c0 17.6 14.398 32 32 32h288v192h640v-704h-192zM384 64.114c0.034-0.038 0.072-0.078 0.114-0.114h127.768c0.042 0.036 0.082 0.076 0.118 0.114l0 63.886h-128v-63.886zM192 256v-64h512v64h-512zM960 960h-512v-576h512v576z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"pastetext"
+				],
+				"defaultCode": 57397,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 53,
+				"order": 570,
+				"prevSize": 32,
+				"code": 57397,
+				"name": "pastetext",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 78
+		},
+		{
+			"icon": {
+				"paths": [
+					"M1024 0v384l-138.26-138.26-212 212-107.48-107.48 212-212-138.26-138.26zM245.74 138.26l212 212-107.48 107.48-212-212-138.26 138.26v-384h384zM885.74 778.26l138.26-138.26v384h-384l138.26-138.26-212-212 107.48-107.48zM457.74 673.74l-212 212 138.26 138.26h-384v-384l138.26 138.26 212-212z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"fullscreen"
+				],
+				"defaultCode": 57379,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 16,
+				"order": 571,
+				"prevSize": 32,
+				"code": 57379,
+				"name": "fullscreen",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 79
+		},
+		{
+			"icon": {
+				"paths": [
+					"M256 64h512v128h-512zM960 256h-896c-35.2 0-64 28.8-64 64v320c0 35.2 28.796 64 64 64h192v256h512v-256h192c35.2 0 64-28.8 64-64v-320c0-35.2-28.8-64-64-64zM704 896h-384v-320h384v320zM974.4 352c0 25.626-20.774 46.4-46.398 46.4-25.626 0-46.402-20.774-46.402-46.4s20.776-46.4 46.402-46.4c25.626 0 46.398 20.774 46.398 46.4z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"print"
+				],
+				"defaultCode": 57378,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 17,
+				"order": 572,
+				"prevSize": 32,
+				"code": 57378,
+				"name": "print",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 80
+		},
+		{
+			"icon": {
+				"paths": [
+					"M512 0c-282.77 0-512 229.228-512 512 0 282.77 229.228 512 512 512 282.77 0 512-229.23 512-512 0-282.772-229.23-512-512-512zM512 944c-238.586 0-432-193.412-432-432 0-238.586 193.414-432 432-432 238.59 0 432 193.414 432 432 0 238.588-193.41 432-432 432zM384 320c0 35.346-28.654 64-64 64s-64-28.654-64-64 28.654-64 64-64 64 28.654 64 64zM768 320c0 35.346-28.652 64-64 64s-64-28.654-64-64 28.652-64 64-64 64 28.654 64 64zM512 652c141.074 0 262.688-57.532 318.462-123.192-20.872 171.22-156.288 303.192-318.462 303.192-162.118 0-297.498-132.026-318.444-303.168 55.786 65.646 177.386 123.168 318.444 123.168z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"emoticons"
+				],
+				"defaultCode": 57377,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 18,
+				"order": 573,
+				"prevSize": 32,
+				"code": 57377,
+				"name": "emoticons",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 81
+		},
+		{
+			"icon": {
+				"paths": [
+					"M225 448c123.712 0 224 100.29 224 224 0 123.712-100.288 224-224 224-123.712 0-224-100.288-224-224l-1-32c0-247.424 200.576-448 448-448v128c-85.474 0-165.834 33.286-226.274 93.726-11.634 11.636-22.252 24.016-31.83 37.020 11.438-1.8 23.16-2.746 35.104-2.746zM801 448c123.71 0 224 100.29 224 224 0 123.712-100.29 224-224 224-123.71 0-224-100.288-224-224l-1-32c0-247.424 200.576-448 448-448v128c-85.474 0-165.834 33.286-226.274 93.726-11.636 11.636-22.254 24.016-31.832 37.020 11.44-1.8 23.16-2.746 35.106-2.746z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"blockquote"
+				],
+				"defaultCode": 57358,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 37,
+				"order": 574,
+				"prevSize": 32,
+				"code": 57358,
+				"name": "blockquote",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 82
+		},
+		{
+			"icon": {
+				"paths": [
+					"M761.862 1024c113.726-206.032 132.888-520.306-313.862-509.824v253.824l-384-384 384-384v248.372c534.962-13.942 594.57 472.214 313.862 775.628z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"undo"
+				],
+				"defaultCode": 57359,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 36,
+				"order": 628,
+				"prevSize": 32,
+				"code": 57359,
+				"name": "undo",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 83
+		},
+		{
+			"icon": {
+				"paths": [
+					"M576 248.372v-248.372l384 384-384 384v-253.824c-446.75-10.482-427.588 303.792-313.86 509.824-280.712-303.414-221.1-789.57 313.86-775.628z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"redo"
+				],
+				"defaultCode": 57360,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 35,
+				"order": 629,
+				"prevSize": 32,
+				"code": 57360,
+				"name": "redo",
+				"ligatures": ""
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 84
+		},
+		{
+			"icon": {
+				"paths": [
+					"M199.995 381.998v-104.002c0-43.078 34.923-78.001 78.001-78.001h26v-104.002h-26c-100.518 0-182.003 81.485-182.003 182.003v104.002c0 43.078-34.923 78.001-78.001 78.001h-26v104.002h26c43.078 0 78.001 34.923 78.001 78.001v104.002c0 100.515 81.485 182.003 182.003 182.003h26v-104.002h-26c-43.078 0-78.001-34.923-78.001-78.001v-104.002c0-50.931-20.928-96.966-54.646-130.002 33.716-33.036 54.646-79.072 54.646-130.002z",
+					"M824.005 381.998v-104.002c0-43.078-34.923-78.001-78.001-78.001h-26v-104.002h26c100.515 0 182.003 81.485 182.003 182.003v104.002c0 43.078 34.923 78.001 78.001 78.001h26v104.002h-26c-43.078 0-78.001 34.923-78.001 78.001v104.002c0 100.515-81.488 182.003-182.003 182.003h-26v-104.002h26c43.078 0 78.001-34.923 78.001-78.001v-104.002c0-50.931 20.928-96.966 54.646-130.002-33.716-33.036-54.646-79.072-54.646-130.002z",
+					"M616.002 356.715c0 57.439-46.562 104.002-104.002 104.002s-104.002-46.562-104.002-104.002c0-57.439 46.562-104.002 104.002-104.002s104.002 46.562 104.002 104.002z",
+					"M512 511.283c-57.439 0-104.002 46.562-104.002 104.002 0 55.845 26 100.115 105.752 103.88-23.719 33.417-59.441 46.612-105.752 50.944v61.751c0 0 208.003 18.144 208.003-216.577-0.202-57.441-46.56-104.004-104.002-104.004z"
+				],
+				"width": 1024,
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"code",
+					"semicolon",
+					"curly-braces"
+				],
+				"grid": 16,
+				"defaultCode": 58883
+			},
+			"attrs": [],
+			"properties": {
+				"order": 630,
+				"id": 1,
+				"prevSize": 32,
+				"code": 58883,
+				"name": "codesample"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 85
+		},
+		{
+			"icon": {
+				"paths": [
+					"M864.626 473.162c-65.754-183.44-205.11-348.15-352.626-473.162-147.516 125.012-286.87 289.722-352.626 473.162-40.664 113.436-44.682 236.562 12.584 345.4 65.846 125.14 198.632 205.438 340.042 205.438s274.196-80.298 340.040-205.44c57.27-108.838 53.25-231.962 12.586-345.398zM738.764 758.956c-43.802 83.252-132.812 137.044-226.764 137.044-55.12 0-108.524-18.536-152.112-50.652 13.242 1.724 26.632 2.652 40.112 2.652 117.426 0 228.668-67.214 283.402-171.242 44.878-85.292 40.978-173.848 23.882-244.338 14.558 28.15 26.906 56.198 36.848 83.932 22.606 63.062 40.024 156.34-5.368 242.604z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"drop"
+				],
+				"defaultCode": 57381,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 87,
+				"order": 631,
+				"prevSize": 32,
+				"code": 59701,
+				"ligatures": "droplet, color9",
+				"name": "drop"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 86
+		},
+		{
+			"icon": {
+				"paths": [
+					"M768 128h-512l-256 256 512 576 512-576-256-256zM512 778.666v-2.666h-2.37l-14.222-16h16.592v-16h-30.814l-14.222-16h45.036v-16h-59.258l-14.222-16h73.48v-16h-87.704l-14.222-16h101.926v-16h-116.148l-14.222-16h130.37v-16h-144.592l-14.222-16h158.814v-16h-173.038l-14.222-16h187.26v-16h-201.482l-14.222-16h215.704v-16h-229.926l-14.222-16h244.148v-16h-258.372l-14.222-16h272.594v-16h-286.816l-14.222-16h301.038v-16h-315.26l-14.222-16h329.482v-16h-343.706l-7.344-8.262 139.072-139.072h211.978v3.334h215.314l16 16h-231.314v16h247.314l16 16h-263.314v16h279.314l16 16h-295.314v16h311.314l16 16h-327.314v16h343.312l7.738 7.738-351.050 394.928z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"diamond",
+					"gem",
+					"jewelry",
+					"dualtone"
+				],
+				"defaultCode": 57889,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 635,
+				"order": 632,
+				"prevSize": 32,
+				"code": 60327,
+				"ligatures": "diamond2, gem2",
+				"name": "sharpen"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 87
+		},
+		{
+			"icon": {
+				"paths": [
+					"M512 0c-282.77 0-512 229.23-512 512s229.23 512 512 512 512-229.23 512-512-229.23-512-512-512zM128 512c0-212.078 171.922-384 384-384v768c-212.078 0-384-171.922-384-384z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"contrast"
+				],
+				"defaultCode": 58104,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 854,
+				"order": 633,
+				"prevSize": 32,
+				"code": 60628,
+				"ligatures": "contrast",
+				"name": "contrast"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 88
+		},
+		{
+			"icon": {
+				"paths": [
+					"M893.254 221.254l-90.508-90.508-290.746 290.744-290.746-290.744-90.508 90.506 290.746 290.748-290.746 290.746 90.508 90.508 290.746-290.746 290.746 290.746 90.508-90.51-290.744-290.744z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"remove"
+				],
+				"defaultCode": 60778,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 24,
+				"order": 634,
+				"prevSize": 32,
+				"code": 60778,
+				"ligatures": "cross2, cancel3",
+				"name": "remove22"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 89
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 64v384c0 35.346 28.654 64 64 64s64-28.654 64-64v-229.488l677.488 677.488h-229.488c-35.346 0-64 28.652-64 64 0 35.346 28.654 64 64 64h384c35.346 0 64-28.654 64-64v-384c0-35.348-28.654-64-64-64s-64 28.652-64 64v229.488l-677.488-677.488h229.488c35.346 0 64-28.654 64-64s-28.652-64-64-64h-384c-35.346 0-64 28.654-64 64z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"resize2"
+				],
+				"defaultCode": 58329,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 1097,
+				"order": 575,
+				"prevSize": 32,
+				"code": 60921,
+				"ligatures": "arrow-resize2, diagonal2",
+				"name": "resize2"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 90
+		},
+		{
+			"icon": {
+				"paths": [
+					"M483.2 640l-147.2-336c-9.6-25.6-19.2-44.8-25.6-54.4s-16-12.8-25.6-12.8c-16 0-25.6 3.2-28.8 3.2v-70.4c9.6-6.4 25.6-6.4 38.4-9.6 32 0 57.6 6.4 73.6 22.4 6.4 6.4 12.8 16 19.2 25.6 6.4 12.8 12.8 25.6 16 41.6l121.6 291.2 150.4-371.2h92.8l-198.4 470.4v224h-86.4v-224z",
+					"M0 0v1024h1024v-1024h-1024zM960 960h-896v-896h896v896z"
+				],
+				"attrs": [
+					{},
+					{}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"gamma2"
+				],
+				"grid": 16,
+				"defaultCode": 58880
+			},
+			"attrs": [
+				{},
+				{}
+			],
+			"properties": {
+				"order": 576,
+				"id": 1,
+				"prevSize": 32,
+				"code": 58880,
+				"name": "gamma"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 91
+		},
+		{
+			"icon": {
+				"paths": [
+					"M627.2 880h-579.2v-396.8h579.2v396.8zM553.6 553.6h-435.2v256h435.2v-256z",
+					"M259.2 227.2c176-176 457.6-176 633.6 0s176 457.6 0 633.6c-121.6 121.6-297.6 160-454.4 108.8 121.6 28.8 262.4-9.6 361.6-108.8 150.4-150.4 160-384 22.4-521.6-121.6-121.6-320-128-470.4-19.2l86.4 86.4-294.4 22.4 22.4-294.4 92.8 92.8z"
+				],
+				"attrs": [
+					{},
+					{}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"orientation"
+				],
+				"grid": 16,
+				"defaultCode": 58881
+			},
+			"attrs": [
+				{},
+				{}
+			],
+			"properties": {
+				"order": 577,
+				"id": 0,
+				"prevSize": 32,
+				"code": 58881,
+				"name": "orientation"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 92
+		},
+		{
+			"icon": {
+				"paths": [
+					"M768 544v352h-640v-640h352l128-128h-512c-52.8 0-96 43.2-96 96v704c0 52.8 43.2 96 96 96h704c52.798 0 96-43.2 96-96v-512l-128 128z",
+					"M864 0l-608 608v160h160l608-608c0-96-64-160-160-160zM416 640l-48-48 480-480 48 48-480 480z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"pencil",
+					"write",
+					"edit"
+				],
+				"defaultCode": 57361,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 68,
+				"order": 578,
+				"prevSize": 32,
+				"code": 59669,
+				"ligatures": "pencil7, write7",
+				"name": "editimage"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 93
+		},
+		{
+			"icon": {
+				"paths": [
+					"M607.998 128.014c-212.070 0-383.986 171.916-383.986 383.986h-191.994l246.848 246.848 246.848-246.848h-191.994c0-151.478 122.798-274.276 274.276-274.276 151.48 0 274.276 122.798 274.276 274.276 0 151.48-122.796 274.276-274.276 274.276v109.71c212.070 0 383.986-171.916 383.986-383.986s-171.916-383.986-383.986-383.986z"
+				],
+				"width": 1024,
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"rotate-ccw",
+					"ccw",
+					"arrow"
+				],
+				"defaultCode": 60072,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 22,
+				"order": 579,
+				"prevSize": 32,
+				"code": 60072,
+				"ligatures": "rotate-ccw3, ccw4",
+				"name": "rotateleft"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 94
+		},
+		{
+			"icon": {
+				"paths": [
+					"M416.002 128.014c212.070 0 383.986 171.916 383.986 383.986h191.994l-246.848 246.848-246.848-246.848h191.994c0-151.478-122.798-274.276-274.276-274.276-151.48 0-274.276 122.798-274.276 274.276 0 151.48 122.796 274.276 274.276 274.276v109.71c-212.070 0-383.986-171.916-383.986-383.986s171.916-383.986 383.986-383.986z"
+				],
+				"width": 1024,
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"rotate-cw",
+					"cw",
+					"arrow"
+				],
+				"defaultCode": 60073,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 580,
+				"id": 1679,
+				"prevSize": 32,
+				"code": 60073,
+				"ligatures": "rotate-cw3, cw4",
+				"name": "rotateright"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 95
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 384h1024v-384zM1024 960v-384h-1024z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"flip-vertical",
+					"mirror"
+				],
+				"defaultCode": 57663,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 403,
+				"order": 581,
+				"prevSize": 32,
+				"code": 60074,
+				"ligatures": "flip-vertical, mirror",
+				"name": "flipv"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 96
+		},
+		{
+			"icon": {
+				"paths": [
+					"M576 0v1024h384zM0 1024h384v-1024z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"flip-horizontal",
+					"mirror"
+				],
+				"defaultCode": 57664,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 405,
+				"order": 582,
+				"prevSize": 32,
+				"code": 60076,
+				"ligatures": "flip-horizontal, mirror3",
+				"name": "fliph"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 97
+		},
+		{
+			"icon": {
+				"paths": [
+					"M992.262 871.396l-242.552-206.294c-25.074-22.566-51.89-32.926-73.552-31.926 57.256-67.068 91.842-154.078 91.842-249.176 0-212.078-171.922-384-384-384-212.076 0-384 171.922-384 384 0 212.078 171.922 384 384 384 95.098 0 182.108-34.586 249.176-91.844-1 21.662 9.36 48.478 31.926 73.552l206.294 242.552c35.322 39.246 93.022 42.554 128.22 7.356s31.892-92.898-7.354-128.22zM384 640c-141.384 0-256-114.616-256-256s114.616-256 256-256 256 114.616 256 256-114.614 256-256 256zM448 192h-128v128h-128v128h128v128h128v-128h128v-128h-128z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"zoom-in",
+					"magnifier",
+					"magnifier-plus",
+					"enlarge"
+				],
+				"defaultCode": 57788,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 534,
+				"order": 583,
+				"prevSize": 32,
+				"code": 60213,
+				"ligatures": "zoom-in3, magnifier9",
+				"name": "zoomin"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 98
+		},
+		{
+			"icon": {
+				"paths": [
+					"M992.262 871.396l-242.552-206.294c-25.074-22.566-51.89-32.926-73.552-31.926 57.256-67.068 91.842-154.078 91.842-249.176 0-212.078-171.922-384-384-384-212.076 0-384 171.922-384 384 0 212.078 171.922 384 384 384 95.098 0 182.108-34.586 249.176-91.844-1 21.662 9.36 48.478 31.926 73.552l206.294 242.552c35.322 39.246 93.022 42.554 128.22 7.356s31.892-92.898-7.354-128.22zM384 640c-141.384 0-256-114.616-256-256s114.616-256 256-256 256 114.616 256 256-114.614 256-256 256zM192 320h384v128h-384z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"zoom-out",
+					"magnifier",
+					"magnifier-minus",
+					"reduce"
+				],
+				"defaultCode": 57789,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 535,
+				"order": 584,
+				"prevSize": 32,
+				"code": 60214,
+				"ligatures": "zoom-out3, magnifier10",
+				"name": "zoomout"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 99
+		},
+		{
+			"icon": {
+				"paths": [
+					"M64 192h896v192h-896zM64 448h896v192h-896zM64 704h896v192h-896z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"menu",
+					"list",
+					"options",
+					"lines",
+					"hamburger"
+				],
+				"defaultCode": 58031,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"order": 585,
+				"id": 1448,
+				"prevSize": 32,
+				"code": 60522,
+				"ligatures": "menu3, list4",
+				"name": "options"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 100
+		},
+		{
+			"icon": {
+				"paths": [
+					"M512 832c35.346 0 64 28.654 64 64v64c0 35.346-28.654 64-64 64s-64-28.654-64-64v-64c0-35.346 28.654-64 64-64zM512 192c-35.346 0-64-28.654-64-64v-64c0-35.346 28.654-64 64-64s64 28.654 64 64v64c0 35.346-28.654 64-64 64zM960 448c35.346 0 64 28.654 64 64s-28.654 64-64 64h-64c-35.348 0-64-28.654-64-64s28.652-64 64-64h64zM192 512c0 35.346-28.654 64-64 64h-64c-35.346 0-64-28.654-64-64s28.654-64 64-64h64c35.346 0 64 28.654 64 64zM828.784 738.274l45.256 45.258c24.992 24.99 24.992 65.516 0 90.508-24.994 24.992-65.518 24.992-90.51 0l-45.256-45.256c-24.992-24.99-24.992-65.516 0-90.51 24.994-24.992 65.518-24.992 90.51-0zM195.216 285.726l-45.256-45.256c-24.994-24.994-24.994-65.516 0-90.51s65.516-24.994 90.51 0l45.256 45.256c24.994 24.994 24.994 65.516 0 90.51s-65.516 24.994-90.51 0zM828.784 285.726c-24.992 24.992-65.516 24.992-90.51 0-24.992-24.994-24.992-65.516 0-90.51l45.256-45.254c24.992-24.994 65.516-24.994 90.51 0 24.992 24.994 24.992 65.516 0 90.51l-45.256 45.254zM195.216 738.274c24.992-24.992 65.518-24.992 90.508 0 24.994 24.994 24.994 65.52 0 90.51l-45.254 45.256c-24.994 24.992-65.516 24.992-90.51 0s-24.994-65.518 0-90.508l45.256-45.258z",
+					"M512 256c-141.384 0-256 114.616-256 256 0 141.382 114.616 256 256 256 141.382 0 256-114.618 256-256 0-141.384-114.616-256-256-256zM512 672c-88.366 0-160-71.634-160-160s71.634-160 160-160 160 71.634 160 160-71.634 160-160 160z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"sun",
+					"weather"
+				],
+				"defaultCode": 58094,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 844,
+				"order": 635,
+				"prevSize": 32,
+				"code": 60620,
+				"ligatures": "sun2, weather21",
+				"name": "sun"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 101
+		},
+		{
+			"icon": {
+				"paths": [
+					"M715.812 64.48c-60.25-34.784-124.618-55.904-189.572-64.48 122.936 160.082 144.768 384.762 37.574 570.42-107.2 185.67-312.688 279.112-512.788 252.68 39.898 51.958 90.376 97.146 150.628 131.934 245.908 141.974 560.37 57.72 702.344-188.198 141.988-245.924 57.732-560.372-188.186-702.356z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"moon",
+					"night",
+					"sleep"
+				],
+				"defaultCode": 58105,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 855,
+				"order": 636,
+				"prevSize": 32,
+				"code": 60621,
+				"ligatures": "moon, night",
+				"name": "moon"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 102
+		},
+		{
+			"icon": {
+				"paths": [
+					"M672 1024l192-192-320-320 320-320-192-192-512 512z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"arrow-left",
+					"left",
+					"previous"
+				],
+				"defaultCode": 58291,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 1056,
+				"order": 637,
+				"prevSize": 32,
+				"code": 60864,
+				"ligatures": "arrow-left, left4",
+				"name": "arrowleft"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 103
+		},
+		{
+			"icon": {
+				"paths": [
+					"M832 256l192-192-64-64-192 192h-448v-192h-128v192h-192v128h192v512h512v192h128v-192h192v-128h-192v-448zM320 320h320l-320 320v-320zM384 704l320-320v320h-320z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"tags": [
+					"crop",
+					"resize",
+					"cut"
+				],
+				"defaultCode": 58428,
+				"grid": 16
+			},
+			"attrs": [],
+			"properties": {
+				"id": 1201,
+				"order": 638,
+				"prevSize": 32,
+				"code": 61048,
+				"ligatures": "crop, resize",
+				"name": "crop"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 104
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 64v896h1024v-896h-1024zM640 704v192h-256v-192h256zM640 192v192h-256v-192h256zM320 192v192h-256v-192h256zM704 384v-192h256v192h-256zM64 704h256v192h-256v-192zM704 896v-192h256v192h-256z"
+				],
+				"attrs": [
+					{
+						"fill": "rgb(0, 0, 0)"
+					}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"tablerowprops"
+				],
+				"defaultCode": 58880,
+				"grid": 16
+			},
+			"attrs": [
+				{
+					"fill": "rgb(0, 0, 0)"
+				}
+			],
+			"properties": {
+				"id": 1680,
+				"order": 639,
+				"prevSize": 32,
+				"code": 58884,
+				"name": "tablerowprops"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 105
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 64v896h1024v-896h-1024zM640 704v192h-256v-192h256zM640 192v192h-256v-192h256zM320 192v192h-256v-192h256zM64 448h256v192h-256v-192zM704 448h256v192h-256v-192zM704 384v-192h256v192h-256zM64 704h256v192h-256v-192zM704 896v-192h256v192h-256z"
+				],
+				"attrs": [
+					{
+						"fill": "rgb(0, 0, 0)"
+					}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"tablecellprops"
+				],
+				"defaultCode": 58881,
+				"grid": 16
+			},
+			"attrs": [
+				{
+					"fill": "rgb(0, 0, 0)"
+				}
+			],
+			"properties": {
+				"id": 1681,
+				"order": 640,
+				"prevSize": 32,
+				"code": 58885,
+				"name": "tablecellprops"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 106
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 64v832h1024v-832h-1024zM320 832h-256v-192h256v192zM320 576h-256v-192h256v192zM640 832h-256v-192h256v192zM640 576h-256v-192h256v192zM960 832h-256v-192h256v192zM960 576h-256v-192h256v192zM960 320h-896v-192h896v192z"
+				],
+				"attrs": [
+					{
+						"fill": "rgb(0, 0, 0)"
+					}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"table2"
+				],
+				"defaultCode": 58882,
+				"grid": 16
+			},
+			"attrs": [
+				{
+					"fill": "rgb(0, 0, 0)"
+				}
+			],
+			"properties": {
+				"id": 1682,
+				"order": 641,
+				"prevSize": 32,
+				"code": 58886,
+				"name": "table2"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 107
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 64v896h1024v-896h-1024zM384 896v-448h576v448h-576zM640 192v192h-256v-192h256zM320 192v192h-256v-192h256zM64 448h256v192h-256v-192zM704 384v-192h256v192h-256zM64 704h256v192h-256v-192z"
+				],
+				"attrs": [
+					{
+						"fill": "rgb(0, 0, 0)"
+					}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"tablemergecells"
+				],
+				"defaultCode": 58884,
+				"grid": 16
+			},
+			"attrs": [
+				{
+					"fill": "rgb(0, 0, 0)"
+				}
+			],
+			"properties": {
+				"id": 1683,
+				"order": 586,
+				"prevSize": 32,
+				"code": 58887,
+				"name": "tablemergecells"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 108
+		},
+		{
+			"icon": {
+				"paths": [
+					"M320 771.2v-182.4h-182.4v-89.6h182.4v-182.4h86.4v182.4h185.6v89.6h-185.6v182.4zM0 64v896h1024v-896h-1024zM640 896h-576v-704h576v704zM960 896h-256v-192h256v192zM960 640h-256v-192h256v192zM960 384h-256v-192h256v192z"
+				],
+				"attrs": [
+					{
+						"fill": "rgb(0, 0, 0)"
+					}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"tableinsertcolbefore"
+				],
+				"defaultCode": 58885,
+				"grid": 16
+			},
+			"attrs": [
+				{
+					"fill": "rgb(0, 0, 0)"
+				}
+			],
+			"properties": {
+				"id": 1684,
+				"order": 587,
+				"prevSize": 32,
+				"code": 58888,
+				"name": "tableinsertcolbefore"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 109
+		},
+		{
+			"icon": {
+				"paths": [
+					"M704 316.8v182.4h182.4v89.6h-182.4v182.4h-86.4v-182.4h-185.6v-89.6h185.6v-182.4zM0 64v896h1024v-896h-1024zM320 896h-256v-192h256v192zM320 640h-256v-192h256v192zM320 384h-256v-192h256v192zM960 896h-576v-704h576v704z"
+				],
+				"attrs": [
+					{
+						"fill": "rgb(0, 0, 0)"
+					}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"tableinsertcolafter"
+				],
+				"defaultCode": 58886,
+				"grid": 16
+			},
+			"attrs": [
+				{
+					"fill": "rgb(0, 0, 0)"
+				}
+			],
+			"properties": {
+				"id": 1685,
+				"order": 588,
+				"prevSize": 32,
+				"code": 58889,
+				"name": "tableinsertcolafter"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 110
+		},
+		{
+			"icon": {
+				"paths": [
+					"M691.2 451.2h-144v144h-70.4v-144h-144v-67.2h144v-144h70.4v144h144zM0 64v896h1024v-896h-1024zM320 896h-256v-192h256v192zM640 896h-256v-192h256v192zM960 896h-256v-192h256v192zM960 643.2h-896v-451.2h896v451.2z"
+				],
+				"attrs": [
+					{
+						"fill": "rgb(0, 0, 0)"
+					}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"tableinsertrowbefore"
+				],
+				"defaultCode": 58887,
+				"grid": 16
+			},
+			"attrs": [
+				{
+					"fill": "rgb(0, 0, 0)"
+				}
+			],
+			"properties": {
+				"id": 1686,
+				"order": 589,
+				"prevSize": 32,
+				"code": 58890,
+				"name": "tableinsertrowbefore"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 111
+		},
+		{
+			"icon": {
+				"paths": [
+					"M332.8 636.8h144v-144h70.4v144h144v67.2h-144v144h-70.4v-144h-144zM0 64v896h1024v-896h-1024zM384 192h256v192h-256v-192zM64 192h256v192h-256v-192zM960 896h-896v-451.2h896v451.2zM960 384h-256v-192h256v192z"
+				],
+				"attrs": [
+					{
+						"fill": "rgb(0, 0, 0)"
+					}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"tableinsertrowafter"
+				],
+				"defaultCode": 58888,
+				"grid": 16
+			},
+			"attrs": [
+				{
+					"fill": "rgb(0, 0, 0)"
+				}
+			],
+			"properties": {
+				"id": 1687,
+				"order": 590,
+				"prevSize": 32,
+				"code": 58891,
+				"name": "tableinsertrowafter"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 112
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 64v896h1024v-896h-1024zM384 192h256v192h-256v-192zM320 896h-256v-192h256v192zM320 640h-256v-192h256v192zM320 384h-256v-192h256v192zM960 896h-576v-448h576v448zM960 384h-256v-192h256v192zM864 803.2l-60.8 60.8-131.2-131.2-131.2 131.2-60.8-60.8 131.2-131.2-131.2-131.2 60.8-60.8 131.2 131.2 131.2-131.2 60.8 60.8-131.2 131.2z"
+				],
+				"attrs": [
+					{
+						"fill": "rgb(0, 0, 0)"
+					}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"tablesplitcells"
+				],
+				"defaultCode": 58890,
+				"grid": 16
+			},
+			"attrs": [
+				{
+					"fill": "rgb(0, 0, 0)"
+				}
+			],
+			"properties": {
+				"id": 1688,
+				"order": 591,
+				"prevSize": 32,
+				"code": 58893,
+				"name": "tablesplitcells"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 113
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 64h1024v896h-1024v-896zM60.8 192v704h899.2v-704h-899.2zM809.6 748.8l-96 96-204.8-204.8-204.8 204.8-96-96 204.8-204.8-204.8-204.8 96-96 204.8 204.8 204.8-204.8 96 96-204.8 204.8z"
+				],
+				"attrs": [
+					{
+						"fill": "rgb(0, 0, 0)"
+					}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"tabledelete"
+				],
+				"defaultCode": 58891,
+				"grid": 16
+			},
+			"attrs": [
+				{
+					"fill": "rgb(0, 0, 0)"
+				}
+			],
+			"properties": {
+				"id": 1689,
+				"order": 592,
+				"prevSize": 32,
+				"code": 58894,
+				"name": "tabledelete"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 114
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 64v832h1024v-832h-1024zM640 832h-256v-192h256v192zM640 576h-256v-192h256v192zM640 320h-256v-192h256v192zM960 832h-256v-192h256v192zM960 576h-256v-192h256v192zM960 320h-256v-192h256v192z"
+				],
+				"attrs": [
+					{
+						"fill": "rgb(0, 0, 0)"
+					}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"tableleftheader"
+				],
+				"defaultCode": 58922,
+				"grid": 16
+			},
+			"attrs": [
+				{
+					"fill": "rgb(0, 0, 0)"
+				}
+			],
+			"properties": {
+				"id": 1690,
+				"order": 593,
+				"prevSize": 32,
+				"code": 58922,
+				"name": "tableleftheader"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 115
+		},
+		{
+			"icon": {
+				"paths": [
+					"M0 64v832h1024v-832h-1024zM320 832h-256v-192h256v192zM320 576h-256v-192h256v192zM640 832h-256v-192h256v192zM640 576h-256v-192h256v192zM960 832h-256v-192h256v192zM960 576h-256v-192h256v192z"
+				],
+				"attrs": [
+					{
+						"fill": "rgb(0, 0, 0)"
+					}
+				],
+				"isMulticolor": false,
+				"tags": [
+					"tabletopheader"
+				],
+				"defaultCode": 58923,
+				"grid": 16
+			},
+			"attrs": [
+				{
+					"fill": "rgb(0, 0, 0)"
+				}
+			],
+			"properties": {
+				"id": 1691,
+				"order": 594,
+				"prevSize": 32,
+				"code": 58923,
+				"name": "tabletopheader"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 116
+		},
+		{
+			"icon": {
+				"paths": [
+					"M886.4 387.2l-156.8 156.8 160 160-76.8 76.8-160-160-156.8 156.8-76.8-73.6 160-160-163.2-163.2 76.8-76.8 163.2 163.2 156.8-156.8 73.6 76.8zM0 64v896h1024v-896h-1024zM960 384h-22.4l-64 64h86.4v192h-89.6l64 64h25.6v192h-896v-192h310.4l64-64h-374.4v-192h371.2l-64-64h-307.2v-192h896v192z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"grid": 16,
+				"tags": [
+					"tabledeleterow"
+				],
+				"defaultCode": 59392
+			},
+			"attrs": [],
+			"properties": {
+				"order": 595,
+				"id": 1693,
+				"prevSize": 32,
+				"code": 59392,
+				"name": "tabledeleterow"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 117
+		},
+		{
+			"icon": {
+				"paths": [
+					"M320 460.8l64 64v12.8l-64 64v-140.8zM640 537.6l64 64v-137.6l-64 64v9.6zM1024 64v896h-1024v-896h1024zM960 192h-256v51.2l-12.8-12.8-51.2 51.2v-89.6h-256v89.6l-51.2-51.2-12.8 12.8v-51.2h-256v704h256v-118.4l35.2 35.2 28.8-28.8v115.2h256v-115.2l48 48 16-16v83.2h256v-707.2zM672 297.6l-156.8 156.8-163.2-163.2-76.8 76.8 163.2 163.2-156.8 156.8 76.8 76.8 156.8-156.8 160 160 76.8-76.8-160-160 156.8-156.8-76.8-76.8z"
+				],
+				"attrs": [],
+				"isMulticolor": false,
+				"grid": 16,
+				"tags": [
+					"tabledeletecol"
+				],
+				"defaultCode": 59393
+			},
+			"attrs": [],
+			"properties": {
+				"order": 596,
+				"id": 1692,
+				"prevSize": 32,
+				"code": 59393,
+				"name": "tabledeletecol"
+			},
+			"setIdx": 2,
+			"setId": 1,
+			"iconIdx": 118
+		}
+	],
+	"height": 1024,
+	"metadata": {
+		"name": "tinymce"
+	},
+	"preferences": {
+		"showGlyphs": true,
+		"showQuickUse": true,
+		"showQuickUse2": true,
+		"showSVGs": true,
+		"fontPref": {
+			"prefix": "icon-",
+			"metadata": {
+				"fontFamily": "tinymce",
+				"majorVersion": 1,
+				"minorVersion": 0
+			},
+			"metrics": {
+				"emSize": 1024,
+				"baseline": 6.25,
+				"whitespace": 50
+			},
+			"resetPoint": 59649,
+			"embed": false
+		},
+		"imagePref": {
+			"prefix": "icon-",
+			"png": true,
+			"useClassSelector": true,
+			"color": 4473924,
+			"bgColor": 16777215
+		},
+		"historySize": 100,
+		"gridSize": 16,
+		"showGrid": true,
+		"showCodes": true,
+		"showLiga": false
+	}
+}

--- /dev/null
+++ b/tinymce4/js/tinymce/skins/custom/fonts/tinymce.svg
@@ -1,1 +1,131 @@
-
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by IcoMoon</metadata>
+<defs>
+<font id="tinymce" horiz-adv-x="1024">
+<font-face units-per-em="1024" ascent="960" descent="-64" />
+<missing-glyph horiz-adv-x="1024" />
+<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
+<glyph unicode="&#xe000;" glyph-name="save" d="M896 960h-896v-1024h1024v896l-128 128zM512 832h128v-256h-128v256zM896 64h-768v768h64v-320h576v320h74.978l53.022-53.018v-714.982z" />
+<glyph unicode="&#xe001;" glyph-name="newdocument" d="M903.432 760.57l-142.864 142.862c-31.112 31.112-92.568 56.568-136.568 56.568h-480c-44 0-80-36-80-80v-864c0-44 36-80 80-80h736c44 0 80 36 80 80v608c0 44-25.456 105.458-56.568 136.57zM858.178 715.314c3.13-3.13 6.25-6.974 9.28-11.314h-163.458v163.456c4.34-3.030 8.184-6.15 11.314-9.28l142.864-142.862zM896 16c0-8.672-7.328-16-16-16h-736c-8.672 0-16 7.328-16 16v864c0 8.672 7.328 16 16 16h480c4.832 0 10.254-0.61 16-1.704v-254.296h254.296c1.094-5.746 1.704-11.166 1.704-16v-608z" />
+<glyph unicode="&#xe002;" glyph-name="fullpage" d="M1024 367.542v160.916l-159.144 15.914c-8.186 30.042-20.088 58.548-35.21 84.98l104.596 127.838-113.052 113.050-127.836-104.596c-26.434 15.124-54.942 27.026-84.982 35.208l-15.914 159.148h-160.916l-15.914-159.146c-30.042-8.186-58.548-20.086-84.98-35.208l-127.838 104.594-113.050-113.050 104.596-127.836c-15.124-26.432-27.026-54.94-35.21-84.98l-159.146-15.916v-160.916l159.146-15.914c8.186-30.042 20.086-58.548 35.21-84.982l-104.596-127.836 113.048-113.048 127.838 104.596c26.432-15.124 54.94-27.028 84.98-35.21l15.916-159.148h160.916l15.914 159.144c30.042 8.186 58.548 20.088 84.982 35.21l127.836-104.596 113.048 113.048-104.596 127.836c15.124 26.434 27.028 54.942 35.21 84.98l159.148 15.92zM704 384l-128-128h-128l-128 128v128l128 128h128l128-128v-128z" />
+<glyph unicode="&#xe003;" glyph-name="alignleft" d="M0 896h1024v-128h-1024zM0 704h640v-128h-640zM0 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" />
+<glyph unicode="&#xe004;" glyph-name="aligncenter" d="M0 896h1024v-128h-1024zM192 704h640v-128h-640zM192 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" />
+<glyph unicode="&#xe005;" glyph-name="alignright" d="M0 896h1024v-128h-1024zM384 704h640v-128h-640zM384 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" />
+<glyph unicode="&#xe006;" glyph-name="alignjustify" d="M0 896h1024v-128h-1024zM0 704h1024v-128h-1024zM0 512h1024v-128h-1024zM0 320h1024v-128h-1024zM0 128h1024v-128h-1024z" />
+<glyph unicode="&#xe007;" glyph-name="cut" d="M890.774 250.846c-45.654 45.556-103.728 69.072-157.946 69.072h-29.112l-63.904 64.008 255.62 256.038c63.904 64.010 63.904 192.028 0 256.038l-383.43-384.056-383.432 384.054c-63.904-64.008-63.904-192.028 0-256.038l255.622-256.034-63.906-64.008h-29.114c-54.22 0-112.292-23.518-157.948-69.076-81.622-81.442-92.65-202.484-24.63-270.35 29.97-29.902 70.288-44.494 112.996-44.494 54.216 0 112.29 23.514 157.946 69.072 53.584 53.464 76.742 124 67.084 185.348l65.384 65.488 65.376-65.488c-9.656-61.348 13.506-131.882 67.084-185.348 45.662-45.558 103.732-69.072 157.948-69.072 42.708 0 83.024 14.592 112.994 44.496 68.020 67.866 56.988 188.908-24.632 270.35zM353.024 114.462c-7.698-17.882-19.010-34.346-33.626-48.926-14.636-14.604-31.172-25.918-49.148-33.624-16.132-6.916-32.96-10.568-48.662-10.568-15.146 0-36.612 3.402-52.862 19.612-16.136 16.104-19.52 37.318-19.52 52.288 0 15.542 3.642 32.21 10.526 48.212 7.7 17.884 19.014 34.346 33.626 48.926 14.634 14.606 31.172 25.914 49.15 33.624 16.134 6.914 32.96 10.568 48.664 10.568 15.146 0 36.612-3.4 52.858-19.614 16.134-16.098 19.522-37.316 19.522-52.284 0.002-15.542-3.638-32.216-10.528-48.214zM512.004 293.404c-49.914 0-90.376 40.532-90.376 90.526 0 49.992 40.462 90.52 90.376 90.52s90.372-40.528 90.372-90.52c0-49.998-40.46-90.526-90.372-90.526zM855.272 40.958c-16.248-16.208-37.712-19.612-52.86-19.612-15.704 0-32.53 3.652-48.666 10.568-17.972 7.706-34.508 19.020-49.142 33.624-14.614 14.58-25.926 31.042-33.626 48.926-6.886 15.998-10.526 32.672-10.526 48.212 0 14.966 3.384 36.188 19.52 52.286 16.246 16.208 37.712 19.614 52.86 19.614 15.7 0 32.53-3.654 48.66-10.568 17.978-7.708 34.516-19.018 49.15-33.624 14.61-14.58 25.924-31.042 33.626-48.926 6.884-15.998 10.526-32.67 10.526-48.212-0.002-14.97-3.39-36.186-19.522-52.288z" />
+<glyph unicode="&#xe008;" glyph-name="paste" d="M832 640v160c0 17.6-14.4 32-32 32h-224v64c0 35.2-28.8 64-64 64h-128c-35.204 0-64-28.8-64-64v-64h-224c-17.602 0-32-14.4-32-32v-640c0-17.6 14.398-32 32-32h288v-192h448l192 192v512h-192zM384 895.886c0.034 0.038 0.072 0.078 0.114 0.114h127.768c0.042-0.036 0.082-0.076 0.118-0.114v-63.886h-128v63.886zM192 704v64h512v-64h-512zM832 26.51v101.49h101.49l-101.49-101.49zM960 192h-192v-192h-320v576h512v-384z" />
+<glyph unicode="&#xe009;" glyph-name="searchreplace" d="M64 960h384v-64h-384zM576 960h384v-64h-384zM952 640h-56v256h-256v-256h-256v256h-256v-256h-56c-39.6 0-72-32.4-72-72v-560c0-39.6 32.4-72 72-72h304c39.6 0 72 32.4 72 72v376h128v-376c0-39.6 32.4-72 72-72h304c39.6 0 72 32.4 72 72v560c0 39.6-32.4 72-72 72zM348 0h-248c-19.8 0-36 14.4-36 32s16.2 32 36 32h248c19.8 0 36-14.4 36-32s-16.2-32-36-32zM544 448h-64c-17.6 0-32 14.4-32 32s14.4 32 32 32h64c17.6 0 32-14.4 32-32s-14.4-32-32-32zM924 0h-248c-19.8 0-36 14.4-36 32s16.2 32 36 32h248c19.8 0 36-14.4 36-32s-16.2-32-36-32z" />
+<glyph unicode="&#xe00a;" glyph-name="bullist" d="M384 896h640v-128h-640v128zM384 512h640v-128h-640v128zM384 128h640v-128h-640v128zM0 832c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128s-128 57.308-128 128zM0 448c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128s-128 57.308-128 128zM0 64c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128s-128 57.308-128 128z" />
+<glyph unicode="&#xe00b;" glyph-name="numlist" d="M384 128h640v-128h-640zM384 512h640v-128h-640zM384 896h640v-128h-640zM192 960v-256h-64v192h-64v64zM128 434v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM256 256v-320h-192v64h128v64h-128v64h128v64h-128v64z" />
+<glyph unicode="&#xe00c;" glyph-name="indent" d="M0 896h1024v-128h-1024zM384 704h640v-128h-640zM384 512h640v-128h-640zM384 320h640v-128h-640zM0 128h1024v-128h-1024zM0 256v384l256-192z" />
+<glyph unicode="&#xe00d;" glyph-name="outdent" d="M0 896h1024v-128h-1024zM384 704h640v-128h-640zM384 512h640v-128h-640zM384 320h640v-128h-640zM0 128h1024v-128h-1024zM256 640v-384l-256 192z" />
+<glyph unicode="&#xe00e;" glyph-name="blockquote" d="M225 512c123.712 0 224-100.29 224-224 0-123.712-100.288-224-224-224s-224 100.288-224 224l-1 32c0 247.424 200.576 448 448 448v-128c-85.474 0-165.834-33.286-226.274-93.726-11.634-11.636-22.252-24.016-31.83-37.020 11.438 1.8 23.16 2.746 35.104 2.746zM801 512c123.71 0 224-100.29 224-224 0-123.712-100.29-224-224-224s-224 100.288-224 224l-1 32c0 247.424 200.576 448 448 448v-128c-85.474 0-165.834-33.286-226.274-93.726-11.636-11.636-22.254-24.016-31.832-37.020 11.44 1.8 23.16 2.746 35.106 2.746z" />
+<glyph unicode="&#xe00f;" glyph-name="undo" d="M761.862-64c113.726 206.032 132.888 520.306-313.862 509.824v-253.824l-384 384 384 384v-248.372c534.962 13.942 594.57-472.214 313.862-775.628z" />
+<glyph unicode="&#xe010;" glyph-name="redo" d="M576 711.628v248.372l384-384-384-384v253.824c-446.75 10.482-427.588-303.792-313.86-509.824-280.712 303.414-221.1 789.57 313.86 775.628z" />
+<glyph unicode="&#xe011;" glyph-name="link" d="M320 256c17.6-17.6 47.274-16.726 65.942 1.942l316.118 316.116c18.668 18.668 19.54 48.342 1.94 65.942s-47.274 16.726-65.942-1.942l-316.116-316.116c-18.668-18.668-19.542-48.342-1.942-65.942zM476.888 284.888c4.56-9.050 6.99-19.16 6.99-29.696 0-17.616-6.744-34.060-18.992-46.308l-163.382-163.382c-12.248-12.248-28.694-18.992-46.308-18.992s-34.060 6.744-46.308 18.992l-99.382 99.382c-12.248 12.248-18.992 28.694-18.992 46.308s6.744 34.060 18.992 46.308l163.382 163.382c12.248 12.248 28.694 18.994 46.308 18.994 10.536 0 20.644-2.43 29.696-6.99l65.338 65.338c-27.87 21.41-61.44 32.16-95.034 32.16-39.986 0-79.972-15.166-110.308-45.502l-163.382-163.382c-60.67-60.67-60.67-159.948 0-220.618l99.382-99.382c30.334-30.332 70.32-45.5 110.306-45.5 39.988 0 79.974 15.168 110.308 45.502l163.382 163.382c55.82 55.82 60.238 144.298 13.344 205.344l-65.34-65.34zM978.498 815.116l-99.382 99.382c-30.334 30.336-70.32 45.502-110.308 45.502-39.986 0-79.972-15.166-110.308-45.502l-163.382-163.382c-55.82-55.82-60.238-144.298-13.342-205.342l65.338 65.34c-4.558 9.050-6.988 19.16-6.988 29.694 0 17.616 6.744 34.060 18.992 46.308l163.382 163.382c12.248 12.248 28.694 18.994 46.308 18.994s34.060-6.746 46.308-18.994l99.382-99.382c12.248-12.248 18.992-28.694 18.992-46.308s-6.744-34.060-18.992-46.308l-163.382-163.382c-12.248-12.248-28.694-18.992-46.308-18.992-10.536 0-20.644 2.43-29.696 6.99l-65.338-65.338c27.872-21.41 61.44-32.16 95.034-32.16 39.988 0 79.974 15.168 110.308 45.502l163.382 163.382c60.67 60.666 60.67 159.944 0 220.614z" />
+<glyph unicode="&#xe012;" glyph-name="unlink" d="M476.888 284.886c4.56-9.048 6.99-19.158 6.99-29.696 0-17.616-6.744-34.058-18.992-46.308l-163.38-163.38c-12.248-12.248-28.696-18.992-46.308-18.992s-34.060 6.744-46.308 18.992l-99.38 99.38c-12.248 12.25-18.992 28.696-18.992 46.308s6.744 34.060 18.992 46.308l163.38 163.382c12.248 12.246 28.696 18.992 46.308 18.992 10.538 0 20.644-2.43 29.696-6.988l65.338 65.336c-27.87 21.41-61.44 32.16-95.034 32.16-39.986 0-79.972-15.166-110.308-45.502l-163.38-163.382c-60.67-60.67-60.67-159.95 0-220.618l99.38-99.382c30.334-30.332 70.32-45.5 110.306-45.5 39.988 0 79.974 15.168 110.308 45.502l163.38 163.38c55.82 55.82 60.238 144.298 13.344 205.346l-65.34-65.338zM978.496 815.116l-99.38 99.382c-30.334 30.336-70.32 45.502-110.308 45.502-39.986 0-79.97-15.166-110.306-45.502l-163.382-163.382c-55.82-55.82-60.238-144.298-13.342-205.342l65.338 65.34c-4.558 9.050-6.988 19.16-6.988 29.694 0 17.616 6.744 34.060 18.992 46.308l163.382 163.382c12.246 12.248 28.694 18.994 46.306 18.994 17.616 0 34.060-6.746 46.308-18.994l99.38-99.382c12.248-12.248 18.992-28.694 18.992-46.308s-6.744-34.060-18.992-46.308l-163.38-163.382c-12.248-12.248-28.694-18.992-46.308-18.992-10.536 0-20.644 2.43-29.696 6.99l-65.338-65.338c27.872-21.41 61.44-32.16 95.034-32.16 39.988 0 79.974 15.168 110.308 45.504l163.38 163.38c60.672 60.666 60.672 159.944 0 220.614zM233.368 681.376l-191.994 191.994 45.256 45.256 191.994-191.994zM384 960h64v-192h-64zM0 576h192v-64h-192zM790.632 214.624l191.996-191.996-45.256-45.256-191.996 191.996zM576 128h64v-192h-64zM832 384h192v-64h-192z" />
+<glyph unicode="&#xe013;" glyph-name="anchor" d="M192 960v-1024l320 320 320-320v1024h-640zM768 90.51l-256 256-256-256v805.49h512v-805.49z" />
+<glyph unicode="&#xe014;" glyph-name="image" d="M0 832v-832h1024v832h-1024zM960 64h-896v704h896v-704zM704 608c0 53.019 42.981 96 96 96s96-42.981 96-96c0-53.019-42.981-96-96-96s-96 42.981-96 96zM896 128h-768l192 512 256-320 128 96z" />
+<glyph unicode="&#xe015;" glyph-name="media" d="M0 832v-768h1024v768h-1024zM192 128h-128v128h128v-128zM192 384h-128v128h128v-128zM192 640h-128v128h128v-128zM768 128h-512v640h512v-640zM960 128h-128v128h128v-128zM960 384h-128v128h128v-128zM960 640h-128v128h128v-128zM384 640v-384l256 192z" />
+<glyph unicode="&#xe016;" glyph-name="help" d="M448 256h128v-128h-128zM704 704c35.346 0 64-28.654 64-64v-192l-192-128h-128v64l192 128v64h-320v128h384zM512 864c-111.118 0-215.584-43.272-294.156-121.844s-121.844-183.038-121.844-294.156c0-111.118 43.272-215.584 121.844-294.156s183.038-121.844 294.156-121.844c111.118 0 215.584 43.272 294.156 121.844s121.844 183.038 121.844 294.156c0 111.118-43.272 215.584-121.844 294.156s-183.038 121.844-294.156 121.844zM512 960v0c282.77 0 512-229.23 512-512s-229.23-512-512-512c-282.77 0-512 229.23-512 512s229.23 512 512 512z" />
+<glyph unicode="&#xe017;" glyph-name="code" d="M320 704l-256-256 256-256h128l-256 256 256 256zM704 704h-128l256-256-256-256h128l256 256z" />
+<glyph unicode="&#xe018;" glyph-name="inserttime" d="M512 768c-212.076 0-384-171.922-384-384s171.922-384 384-384c212.074 0 384 171.922 384 384s-171.926 384-384 384zM715.644 180.354c-54.392-54.396-126.716-84.354-203.644-84.354s-149.25 29.958-203.646 84.354c-54.396 54.394-84.354 126.718-84.354 203.646s29.958 149.25 84.354 203.646c54.396 54.396 126.718 84.354 203.646 84.354s149.252-29.958 203.642-84.354c54.402-54.396 84.358-126.718 84.358-203.646s-29.958-149.252-84.356-203.646zM325.93 756.138l-42.94 85.878c-98.874-49.536-179.47-130.132-229.006-229.008l85.876-42.94c40.248 80.336 105.732 145.822 186.070 186.070zM884.134 570.070l85.878 42.938c-49.532 98.876-130.126 179.472-229.004 229.008l-42.944-85.878c80.338-40.248 145.824-105.732 186.070-186.068zM512 576h-64v-192c0-10.11 4.7-19.11 12.022-24.972l-0.012-0.016 160-128 39.976 49.976-147.986 118.39v176.622z" />
+<glyph unicode="&#xe019;" glyph-name="preview" d="M512 640c-209.368 0-395.244-100.556-512-256 116.756-155.446 302.632-256 512-256s395.244 100.554 512 256c-116.756 155.444-302.632 256-512 256zM448 512c35.346 0 64-28.654 64-64s-28.654-64-64-64-64 28.654-64 64 28.654 64 64 64zM773.616 254.704c-39.648-20.258-81.652-35.862-124.846-46.376-44.488-10.836-90.502-16.328-136.77-16.328-46.266 0-92.282 5.492-136.768 16.324-43.194 10.518-85.198 26.122-124.846 46.376-63.020 32.202-120.222 76.41-167.64 129.298 47.418 52.888 104.62 97.1 167.64 129.298 32.336 16.522 66.242 29.946 101.082 40.040-19.888-30.242-31.468-66.434-31.468-105.336 0-106.040 85.962-192 192-192s192 85.96 192 192c0 38.902-11.582 75.094-31.466 105.34 34.838-10.096 68.744-23.52 101.082-40.042 63.022-32.198 120.218-76.408 167.638-129.298-47.42-52.886-104.618-97.1-167.638-129.296zM860.918 716.278c-108.72 55.554-226.112 83.722-348.918 83.722s-240.198-28.168-348.918-83.722c-58.772-30.032-113.732-67.904-163.082-112.076v-109.206c55.338 58.566 120.694 107.754 192.194 144.29 99.62 50.904 207.218 76.714 319.806 76.714s220.186-25.81 319.804-76.716c71.502-36.536 136.858-85.724 192.196-144.29v109.206c-49.35 44.174-104.308 82.046-163.082 112.078z" />
+<glyph unicode="&#xe01a;" glyph-name="forecolor" d="M322.018 128l57.6 192h264.764l57.6-192h113.632l-191.996 640h-223.236l-192-640h113.636zM475.618 640h72.764l57.6-192h-187.964l57.6 192z" />
+<glyph unicode="&#xe01b;" glyph-name="table" d="M0 896v-896h1024v896h-1024zM384 320v192h256v-192h-256zM640 256v-192h-256v192h256zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM64 512h256v-192h-256v192zM704 512h256v-192h-256v192zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192zM704 64v192h256v-192h-256z" />
+<glyph unicode="&#xe01c;" glyph-name="hr" d="M0 512h1024v-128h-1024z" />
+<glyph unicode="&#xe01d;" glyph-name="removeformat" d="M0 64h576v-128h-576zM192 960h704v-128h-704zM277.388 128l204.688 784.164 123.85-32.328-196.25-751.836zM929.774-64l-129.774 129.774-129.774-129.774-62.226 62.226 129.774 129.774-129.774 129.774 62.226 62.226 129.774-129.774 129.774 129.774 62.226-62.226-129.774-129.774 129.774-129.774z" />
+<glyph unicode="&#xe01e;" glyph-name="sub" d="M768 50v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM676 704h-136l-188-188-188 188h-136l256-256-256-256h136l188 188 188-188h136l-256 256z" />
+<glyph unicode="&#xe01f;" glyph-name="sup" d="M768 754v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM676 704h-136l-188-188-188 188h-136l256-256-256-256h136l188 188 188-188h136l-256 256z" />
+<glyph unicode="&#xe020;" glyph-name="charmap" d="M704 64h256l64 128v-256h-384v214.214c131.112 56.484 224 197.162 224 361.786 0 214.432-157.598 382.266-352 382.266-194.406 0-352-167.832-352-382.266 0-164.624 92.886-305.302 224-361.786v-214.214h-384v256l64-128h256v32.59c-187.63 66.46-320 227.402-320 415.41 0 247.424 229.23 448 512 448s512-200.576 512-448c0-188.008-132.37-348.95-320-415.41v-32.59z" />
+<glyph unicode="&#xe021;" glyph-name="emoticons" d="M512 960c-282.77 0-512-229.228-512-512 0-282.77 229.228-512 512-512 282.77 0 512 229.23 512 512 0 282.772-229.23 512-512 512zM512 16c-238.586 0-432 193.412-432 432 0 238.586 193.414 432 432 432 238.59 0 432-193.414 432-432 0-238.588-193.41-432-432-432zM384 640c0-35.346-28.654-64-64-64s-64 28.654-64 64 28.654 64 64 64 64-28.654 64-64zM768 640c0-35.346-28.652-64-64-64s-64 28.654-64 64 28.652 64 64 64 64-28.654 64-64zM512 308c141.074 0 262.688 57.532 318.462 123.192-20.872-171.22-156.288-303.192-318.462-303.192-162.118 0-297.498 132.026-318.444 303.168 55.786-65.646 177.386-123.168 318.444-123.168z" />
+<glyph unicode="&#xe022;" glyph-name="print" d="M256 896h512v-128h-512zM960 704h-896c-35.2 0-64-28.8-64-64v-320c0-35.2 28.796-64 64-64h192v-256h512v256h192c35.2 0 64 28.8 64 64v320c0 35.2-28.8 64-64 64zM704 64h-384v320h384v-320zM974.4 608c0-25.626-20.774-46.4-46.398-46.4-25.626 0-46.402 20.774-46.402 46.4s20.776 46.4 46.402 46.4c25.626 0 46.398-20.774 46.398-46.4z" />
+<glyph unicode="&#xe023;" glyph-name="fullscreen" d="M1024 960v-384l-138.26 138.26-212-212-107.48 107.48 212 212-138.26 138.26zM245.74 821.74l212-212-107.48-107.48-212 212-138.26-138.26v384h384zM885.74 181.74l138.26 138.26v-384h-384l138.26 138.26-212 212 107.48 107.48zM457.74 286.26l-212-212 138.26-138.26h-384v384l138.26-138.26 212 212z" />
+<glyph unicode="&#xe024;" glyph-name="spellchecker" d="M128 704h128v-192h64v384c0 35.2-28.8 64-64 64h-128c-35.2 0-64-28.8-64-64v-384h64v192zM128 896h128v-128h-128v128zM960 896v64h-192c-35.202 0-64-28.8-64-64v-320c0-35.2 28.798-64 64-64h192v64h-192v320h192zM640 800v96c0 35.2-28.8 64-64 64h-192v-448h192c35.2 0 64 28.8 64 64v96c0 35.2-8.8 64-44 64 35.2 0 44 28.8 44 64zM576 576h-128v128h128v-128zM576 768h-128v128h128v-128zM832 384l-416-448-224 288 82 70 142-148 352 302z" />
+<glyph unicode="&#xe025;" glyph-name="nonbreaking" d="M448 384h-192v128h192v192h128v-192h192v-128h-192v-192h-128zM1024 320v-384h-1024v384h128v-256h768v256z" />
+<glyph unicode="&#xe026;" glyph-name="template" d="M384 768h128v-64h-128zM576 768h128v-64h-128zM896 768v-256h-192v64h128v128h-64v64zM320 576h128v-64h-128zM512 576h128v-64h-128zM192 704v-128h64v-64h-128v256h192v-64zM384 384h128v-64h-128zM576 384h128v-64h-128zM896 384v-256h-192v64h128v128h-64v64zM320 192h128v-64h-128zM512 192h128v-64h-128zM192 320v-128h64v-64h-128v256h192v-64zM960 896h-896v-896h896v896zM1024 960v0-1024h-1024v1024h1024z" />
+<glyph unicode="&#xe027;" glyph-name="pagebreak" d="M0 448h128v-64h-128zM192 448h192v-64h-192zM448 448h128v-64h-128zM640 448h192v-64h-192zM896 448h128v-64h-128zM880 960l16-448h-768l16 448h32l16-384h640l16 384zM144-64l-16 384h768l-16-384h-32l-16 320h-640l-16-320z" />
+<glyph unicode="&#xe028;" glyph-name="restoredraft" d="M576 896c247.424 0 448-200.576 448-448s-200.576-448-448-448v96c94.024 0 182.418 36.614 248.902 103.098s103.098 154.878 103.098 248.902c0 94.022-36.614 182.418-103.098 248.902s-154.878 103.098-248.902 103.098c-94.022 0-182.418-36.614-248.902-103.098-51.14-51.138-84.582-115.246-97.306-184.902h186.208l-224-256-224 256h164.57c31.060 217.102 217.738 384 443.43 384zM768 512v-128h-256v320h128v-192z" />
+<glyph unicode="&#xe02a;" glyph-name="bold" d="M707.88 475.348c37.498 44.542 60.12 102.008 60.12 164.652 0 141.16-114.842 256-256 256h-320v-896h384c141.158 0 256 114.842 256 256 0 92.956-49.798 174.496-124.12 219.348zM384 768h101.5c55.968 0 101.5-57.42 101.5-128s-45.532-128-101.5-128h-101.5v256zM543 128h-159v256h159c58.45 0 106-57.42 106-128s-47.55-128-106-128z" />
+<glyph unicode="&#xe02b;" glyph-name="italic" d="M896 896v-64h-128l-320-768h128v-64h-448v64h128l320 768h-128v64z" />
+<glyph unicode="&#xe02c;" glyph-name="underline" d="M704 896h128v-416c0-159.058-143.268-288-320-288-176.73 0-320 128.942-320 288v416h128v-416c0-40.166 18.238-78.704 51.354-108.506 36.896-33.204 86.846-51.494 140.646-51.494s103.75 18.29 140.646 51.494c33.116 29.802 51.354 68.34 51.354 108.506v416zM192 128h640v-128h-640z" />
+<glyph unicode="&#xe02d;" glyph-name="strikethrough" d="M731.42 442.964c63.92-47.938 100.58-116.086 100.58-186.964s-36.66-139.026-100.58-186.964c-59.358-44.518-137.284-69.036-219.42-69.036-82.138 0-160.062 24.518-219.42 69.036-63.92 47.938-100.58 116.086-100.58 186.964h128c0-69.382 87.926-128 192-128s192 58.618 192 128c0 69.382-87.926 128-192 128-82.138 0-160.062 24.518-219.42 69.036-63.92 47.94-100.58 116.086-100.58 186.964s36.66 139.024 100.58 186.964c59.358 44.518 137.282 69.036 219.42 69.036 82.136 0 160.062-24.518 219.42-69.036 63.92-47.94 100.58-116.086 100.58-186.964h-128c0 69.382-87.926 128-192 128s-192-58.618-192-128c0-69.382 87.926-128 192-128 82.136 0 160.062-24.518 219.42-69.036zM0 448h1024v-64h-1024z" />
+<glyph unicode="&#xe02e;" glyph-name="visualchars" d="M384 896h512v-128h-128v-768h-128v768h-128v-768h-128v448c-123.712 0-224 100.288-224 224s100.288 224 224 224z" />
+<glyph unicode="&#xe02f;" glyph-name="ltr" d="M448 896h512v-128h-128v-768h-128v768h-128v-768h-128v448c-123.712 0-224 100.288-224 224s100.288 224 224 224zM64 512l256-224-256-224z" />
+<glyph unicode="&#xe030;" glyph-name="rtl" d="M256 896h512v-128h-128v-768h-128v768h-128v-768h-128v448c-123.712 0-224 100.288-224 224s100.288 224 224 224zM960 64l-256 224 256 224z" />
+<glyph unicode="&#xe031;" glyph-name="copy" d="M832 704h-192v64l-192 192h-448v-768h384v-256h640v576l-192 192zM832 613.49l101.49-101.49h-101.49v101.49zM448 869.49l101.49-101.49h-101.49v101.49zM64 896h320v-192h192v-448h-512v640zM960 0h-512v192h192v448h128v-192h192v-448z" />
+<glyph unicode="&#xe032;" glyph-name="resize" d="M768 704h64v-64h-64zM640 576h64v-64h-64zM640 448h64v-64h-64zM640 320h64v-64h-64zM512 448h64v-64h-64zM512 320h64v-64h-64zM384 320h64v-64h-64zM768 576h64v-64h-64zM768 448h64v-64h-64zM768 320h64v-64h-64zM768 192h64v-64h-64zM640 192h64v-64h-64zM512 192h64v-64h-64zM384 192h64v-64h-64zM256 192h64v-64h-64z" />
+<glyph unicode="&#xe033;" glyph-name="checkbox" d="M128 416l288-288 480 480-128 128-352-352-160 160z" />
+<glyph unicode="&#xe034;" glyph-name="browse" d="M928 832h-416l-32 64h-352l-64-128h896zM904.34 256h74.86l44.8 448h-1024l64-640h484.080c-104.882 37.776-180.080 138.266-180.080 256 0 149.982 122.018 272 272 272 149.98 0 272-122.018 272-272 0-21.678-2.622-43.15-7.66-64zM1002.996 46.25l-198.496 174.692c17.454 28.92 27.5 62.814 27.5 99.058 0 106.040-85.96 192-192 192s-192-85.96-192-192 85.96-192 192-192c36.244 0 70.138 10.046 99.058 27.5l174.692-198.496c22.962-26.678 62.118-28.14 87.006-3.252l5.492 5.492c24.888 24.888 23.426 64.044-3.252 87.006zM640 196c-68.484 0-124 55.516-124 124s55.516 124 124 124 124-55.516 124-124-55.516-124-124-124z" />
+<glyph unicode="&#xe035;" glyph-name="pastetext" d="M512 448v-128h32l32 64h64v-256h-48v-64h224v64h-48v256h64l32-64h32v128zM832 640v160c0 17.6-14.4 32-32 32h-224v64c0 35.2-28.8 64-64 64h-128c-35.204 0-64-28.8-64-64v-64h-224c-17.602 0-32-14.4-32-32v-640c0-17.6 14.398-32 32-32h288v-192h640v704h-192zM384 895.886c0.034 0.038 0.072 0.078 0.114 0.114h127.768c0.042-0.036 0.082-0.076 0.118-0.114v-63.886h-128v63.886zM192 704v64h512v-64h-512zM960 0h-512v576h512v-576z" />
+<glyph unicode="&#xe600;" glyph-name="gamma" d="M483.2 320l-147.2 336c-9.6 25.6-19.2 44.8-25.6 54.4s-16 12.8-25.6 12.8c-16 0-25.6-3.2-28.8-3.2v70.4c9.6 6.4 25.6 6.4 38.4 9.6 32 0 57.6-6.4 73.6-22.4 6.4-6.4 12.8-16 19.2-25.6 6.4-12.8 12.8-25.6 16-41.6l121.6-291.2 150.4 371.2h92.8l-198.4-470.4v-224h-86.4v224zM0 960v-1024h1024v1024h-1024zM960 0h-896v896h896v-896z" />
+<glyph unicode="&#xe601;" glyph-name="orientation" d="M627.2 80h-579.2v396.8h579.2v-396.8zM553.6 406.4h-435.2v-256h435.2v256zM259.2 732.8c176 176 457.6 176 633.6 0s176-457.6 0-633.6c-121.6-121.6-297.6-160-454.4-108.8 121.6-28.8 262.4 9.6 361.6 108.8 150.4 150.4 160 384 22.4 521.6-121.6 121.6-320 128-470.4 19.2l86.4-86.4-294.4-22.4 22.4 294.4 92.8-92.8z" />
+<glyph unicode="&#xe602;" glyph-name="invert" d="M892.8-22.4l-89.6 89.6c-70.4-80-172.8-131.2-288-131.2-208 0-380.8 166.4-384 377.6 0 0 0 0 0 0 0 3.2 0 3.2 0 6.4s0 3.2 0 6.4v0c0 0 0 0 0 3.2 0 0 0 3.2 0 3.2 3.2 105.6 48 211.2 105.6 304l-192 192 44.8 44.8 182.4-182.4c0 0 0 0 0 0l569.6-569.6c0 0 0 0 0 0l99.2-99.2-48-44.8zM896 326.4c0 0 0 0 0 0 0 3.2 0 6.4 0 6.4-9.6 316.8-384 627.2-384 627.2s-108.8-89.6-208-220.8l70.4-70.4c6.4 9.6 16 22.4 22.4 32 41.6 51.2 83.2 96 115.2 128v0c32-32 73.6-76.8 115.2-128 108.8-137.6 169.6-265.6 172.8-371.2 0 0 0-3.2 0-3.2v0 0c0-3.2 0-3.2 0-6.4s0-3.2 0-3.2v0 0c0-22.4-3.2-41.6-9.6-64l76.8-76.8c16 41.6 28.8 89.6 28.8 137.6 0 0 0 0 0 0 0 3.2 0 3.2 0 6.4s0 3.2 0 6.4z" />
+<glyph unicode="&#xe603;" glyph-name="codesample" d="M199.995 578.002v104.002c0 43.078 34.923 78.001 78.001 78.001h26v104.002h-26c-100.518 0-182.003-81.485-182.003-182.003v-104.002c0-43.078-34.923-78.001-78.001-78.001h-26v-104.002h26c43.078 0 78.001-34.923 78.001-78.001v-104.002c0-100.515 81.485-182.003 182.003-182.003h26v104.002h-26c-43.078 0-78.001 34.923-78.001 78.001v104.002c0 50.931-20.928 96.966-54.646 130.002 33.716 33.036 54.646 79.072 54.646 130.002zM824.005 578.002v104.002c0 43.078-34.923 78.001-78.001 78.001h-26v104.002h26c100.515 0 182.003-81.485 182.003-182.003v-104.002c0-43.078 34.923-78.001 78.001-78.001h26v-104.002h-26c-43.078 0-78.001-34.923-78.001-78.001v-104.002c0-100.515-81.488-182.003-182.003-182.003h-26v104.002h26c43.078 0 78.001 34.923 78.001 78.001v104.002c0 50.931 20.928 96.966 54.646 130.002-33.716 33.036-54.646 79.072-54.646 130.002zM616.002 603.285c0-57.439-46.562-104.002-104.002-104.002s-104.002 46.562-104.002 104.002c0 57.439 46.562 104.002 104.002 104.002s104.002-46.562 104.002-104.002zM512 448.717c-57.439 0-104.002-46.562-104.002-104.002 0-55.845 26-100.115 105.752-103.88-23.719-33.417-59.441-46.612-105.752-50.944v-61.751c0 0 208.003-18.144 208.003 216.577-0.202 57.441-46.56 104.004-104.002 104.004z" />
+<glyph unicode="&#xe604;" glyph-name="tablerowprops" d="M0 896v-896h1024v896h-1024zM640 256v-192h-256v192h256zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192zM704 64v192h256v-192h-256z" />
+<glyph unicode="&#xe605;" glyph-name="tablecellprops" d="M0 896v-896h1024v896h-1024zM640 256v-192h-256v192h256zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM64 512h256v-192h-256v192zM704 512h256v-192h-256v192zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192zM704 64v192h256v-192h-256z" />
+<glyph unicode="&#xe606;" glyph-name="table2" d="M0 896v-832h1024v832h-1024zM320 128h-256v192h256v-192zM320 384h-256v192h256v-192zM640 128h-256v192h256v-192zM640 384h-256v192h256v-192zM960 128h-256v192h256v-192zM960 384h-256v192h256v-192zM960 640h-896v192h896v-192z" />
+<glyph unicode="&#xe607;" glyph-name="tablemergecells" d="M0 896v-896h1024v896h-1024zM384 64v448h576v-448h-576zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM64 512h256v-192h-256v192zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192z" />
+<glyph unicode="&#xe608;" glyph-name="tableinsertcolbefore" d="M320 188.8v182.4h-182.4v89.6h182.4v182.4h86.4v-182.4h185.6v-89.6h-185.6v-182.4zM0 896v-896h1024v896h-1024zM640 64h-576v704h576v-704zM960 64h-256v192h256v-192zM960 320h-256v192h256v-192zM960 576h-256v192h256v-192z" />
+<glyph unicode="&#xe609;" glyph-name="tableinsertcolafter" d="M704 643.2v-182.4h182.4v-89.6h-182.4v-182.4h-86.4v182.4h-185.6v89.6h185.6v182.4zM0 896v-896h1024v896h-1024zM320 64h-256v192h256v-192zM320 320h-256v192h256v-192zM320 576h-256v192h256v-192zM960 64h-576v704h576v-704z" />
+<glyph unicode="&#xe60a;" glyph-name="tableinsertrowbefore" d="M691.2 508.8h-144v-144h-70.4v144h-144v67.2h144v144h70.4v-144h144zM0 896v-896h1024v896h-1024zM320 64h-256v192h256v-192zM640 64h-256v192h256v-192zM960 64h-256v192h256v-192zM960 316.8h-896v451.2h896v-451.2z" />
+<glyph unicode="&#xe60b;" glyph-name="tableinsertrowafter" d="M332.8 323.2h144v144h70.4v-144h144v-67.2h-144v-144h-70.4v144h-144zM0 896v-896h1024v896h-1024zM384 768h256v-192h-256v192zM64 768h256v-192h-256v192zM960 64h-896v451.2h896v-451.2zM960 576h-256v192h256v-192z" />
+<glyph unicode="&#xe60d;" glyph-name="tablesplitcells" d="M0 896v-896h1024v896h-1024zM384 768h256v-192h-256v192zM320 64h-256v192h256v-192zM320 320h-256v192h256v-192zM320 576h-256v192h256v-192zM960 64h-576v448h576v-448zM960 576h-256v192h256v-192zM864 156.8l-60.8-60.8-131.2 131.2-131.2-131.2-60.8 60.8 131.2 131.2-131.2 131.2 60.8 60.8 131.2-131.2 131.2 131.2 60.8-60.8-131.2-131.2z" />
+<glyph unicode="&#xe60e;" glyph-name="tabledelete" d="M0 896h1024v-896h-1024v896zM60.8 768v-704h899.2v704h-899.2zM809.6 211.2l-96-96-204.8 204.8-204.8-204.8-96 96 204.8 204.8-204.8 204.8 96 96 204.8-204.8 204.8 204.8 96-96-204.8-204.8z" />
+<glyph unicode="&#xe62a;" glyph-name="tableleftheader" d="M0 896v-832h1024v832h-1024zM640 128h-256v192h256v-192zM640 384h-256v192h256v-192zM640 640h-256v192h256v-192zM960 128h-256v192h256v-192zM960 384h-256v192h256v-192zM960 640h-256v192h256v-192z" />
+<glyph unicode="&#xe62b;" glyph-name="tabletopheader" d="M0 896v-832h1024v832h-1024zM320 128h-256v192h256v-192zM320 384h-256v192h256v-192zM640 128h-256v192h256v-192zM640 384h-256v192h256v-192zM960 128h-256v192h256v-192zM960 384h-256v192h256v-192z" />
+<glyph unicode="&#xe800;" glyph-name="tabledeleterow" d="M886.4 572.8l-156.8-156.8 160-160-76.8-76.8-160 160-156.8-156.8-76.8 73.6 160 160-163.2 163.2 76.8 76.8 163.2-163.2 156.8 156.8 73.6-76.8zM0 896v-896h1024v896h-1024zM960 576h-22.4l-64-64h86.4v-192h-89.6l64-64h25.6v-192h-896v192h310.4l64 64h-374.4v192h371.2l-64 64h-307.2v192h896v-192z" />
+<glyph unicode="&#xe801;" glyph-name="tabledeletecol" d="M320 499.2l64-64v-12.8l-64-64v140.8zM640 422.4l64-64v137.6l-64-64v-9.6zM1024 896v-896h-1024v896h1024zM960 768h-256v-51.2l-12.8 12.8-51.2-51.2v89.6h-256v-89.6l-51.2 51.2-12.8-12.8v51.2h-256v-704h256v118.4l35.2-35.2 28.8 28.8v-115.2h256v115.2l48-48 16 16v-83.2h256v707.2zM672 662.4l-156.8-156.8-163.2 163.2-76.8-76.8 163.2-163.2-156.8-156.8 76.8-76.8 156.8 156.8 160-160 76.8 76.8-160 160 156.8 156.8-76.8 76.8z" />
+<glyph unicode="&#xe900;" glyph-name="a11y" d="M960 704v64l-448-128-448 128v-64l320-128v-256l-128-448h64l192 448 192-448h64l-128 448v256zM416 800q0 40 28 68t68 28 68-28 28-68-28-68-68-28-68 28-28 68z" />
+<glyph unicode="&#xe901;" glyph-name="toc" d="M0 896h128v-128h-128v128zM192 896h832v-128h-832v128zM192 704h128v-128h-128v128zM384 704h640v-128h-640v128zM384 512h128v-128h-128v128zM576 512h448v-128h-448v128zM0 320h128v-128h-128v128zM192 320h832v-128h-832v128zM192 128h128v-128h-128v128zM384 128h640v-128h-640v128z" />
+<glyph unicode="&#xe902;" glyph-name="fill" d="M521.6 915.2l-67.2-67.2-86.4 86.4-86.4-86.4 86.4-86.4-368-368 432-432 518.4 518.4-428.8 435.2zM435.2 134.4l-262.4 262.4 35.2 35.2 576 51.2-348.8-348.8zM953.6 409.6c-6.4-6.4-16-16-28.8-32-28.8-32-41.6-64-41.6-89.6v0 0 0 0 0 0 0c0-16 6.4-35.2 22.4-48 12.8-12.8 32-22.4 48-22.4s35.2 6.4 48 22.4 22.4 32 22.4 48v0 0 0 0 0 0 0c0 25.6-12.8 54.4-41.6 89.6-9.6 16-22.4 25.6-28.8 32v0z" />
+<glyph unicode="&#xe903;" glyph-name="borderwidth" d="M0 265.6h1024v-128h-1024v128zM0 32h1024v-64h-1024v64zM0 566.4h1024v-192h-1024v192zM0 928h1024v-256h-1024v256z" />
+<glyph unicode="&#xe904;" glyph-name="line" d="M739.2 627.2l-502.4-502.4h-185.6v185.6l502.4 502.4 185.6-185.6zM803.2 688l-185.6 185.6 67.2 67.2c22.4 22.4 54.4 22.4 76.8 0l108.8-108.8c22.4-22.4 22.4-54.4 0-76.8l-67.2-67.2zM41.6 48h940.8v-112h-940.8v112z" />
+<glyph unicode="&#xe905;" glyph-name="count" d="M0 480h1024v-64h-1024v64zM304 912v-339.2h-67.2v272h-67.2v67.2zM444.8 694.4v-54.4h134.4v-67.2h-201.6v153.6l134.4 64v54.4h-134.4v67.2h201.6v-153.6zM854.4 912v-339.2h-204.8v67.2h137.6v67.2h-137.6v70.4h137.6v67.2h-137.6v67.2zM115.2 166.4c3.2 57.6 38.4 83.2 108.8 83.2 38.4 0 67.2-9.6 86.4-25.6s25.6-35.2 25.6-70.4v-112c0-25.6 0-28.8 9.6-41.6h-73.6c-3.2 9.6-3.2 9.6-6.4 19.2-22.4-19.2-41.6-25.6-70.4-25.6-54.4 0-89.6 32-89.6 76.8s28.8 70.4 99.2 80l38.4 6.4c16 3.2 22.4 6.4 22.4 16 0 12.8-12.8 22.4-38.4 22.4s-41.6-9.6-44.8-28.8h-67.2zM262.4 115.2c-6.4-3.2-12.8-6.4-25.6-6.4l-25.6-6.4c-25.6-6.4-38.4-16-38.4-28.8 0-16 12.8-25.6 35.2-25.6s41.6 9.6 54.4 32v35.2zM390.4 336h73.6v-112c22.4 16 41.6 22.4 67.2 22.4 64 0 105.6-51.2 105.6-124.8 0-76.8-44.8-134.4-108.8-134.4-32 0-48 9.6-67.2 35.2v-28.8h-70.4v342.4zM460.8 121.6c0-41.6 22.4-70.4 51.2-70.4s51.2 28.8 51.2 70.4c0 44.8-19.2 70.4-51.2 70.4-28.8 0-51.2-28.8-51.2-70.4zM851.2 153.6c-3.2 22.4-19.2 35.2-44.8 35.2-32 0-51.2-25.6-51.2-70.4 0-48 19.2-73.6 51.2-73.6 25.6 0 41.6 12.8 44.8 41.6l70.4-3.2c-9.6-60.8-54.4-96-118.4-96-73.6 0-121.6 51.2-121.6 128 0 80 48 131.2 124.8 131.2 64 0 108.8-35.2 112-96h-67.2z" />
+<glyph unicode="&#xe906;" glyph-name="reload" d="M889.68 793.68c-93.608 102.216-228.154 166.32-377.68 166.32-282.77 0-512-229.23-512-512h96c0 229.75 186.25 416 416 416 123.020 0 233.542-53.418 309.696-138.306l-149.696-149.694h352v352l-134.32-134.32zM928 448c0-229.75-186.25-416-416-416-123.020 0-233.542 53.418-309.694 138.306l149.694 149.694h-352v-352l134.32 134.32c93.608-102.216 228.154-166.32 377.68-166.32 282.77 0 512 229.23 512 512h-96z" />
+<glyph unicode="&#xe907;" glyph-name="translate" d="M553.6 304l-118.4 118.4c80 89.6 137.6 195.2 172.8 304h137.6v92.8h-326.4v92.8h-92.8v-92.8h-326.4v-92.8h518.4c-32-89.6-80-176-147.2-249.6-44.8 48-80 99.2-108.8 156.8h-92.8c35.2-76.8 80-147.2 137.6-211.2l-236.8-233.6 67.2-67.2 233.6 233.6 144-144c3.2 0 38.4 92.8 38.4 92.8zM816 540.8h-92.8l-208-560h92.8l51.2 140.8h220.8l51.2-140.8h92.8l-208 560zM691.2 214.4l76.8 201.6 76.8-201.6h-153.6z" />
+<glyph unicode="&#xe908;" glyph-name="drag" d="M576 896h128v-128h-128v128zM576 640h128v-128h-128v128zM320 640h128v-128h-128v128zM576 384h128v-128h-128v128zM320 384h128v-128h-128v128zM320 128h128v-128h-128v128zM576 128h128v-128h-128v128zM320 896h128v-128h-128v128z" />
+<glyph unicode="&#xe90b;" glyph-name="home" d="M1024 369.556l-512 397.426-512-397.428v162.038l512 397.426 512-397.428zM896 384v-384h-256v256h-256v-256h-256v384l384 288z" />
+<glyph unicode="&#xe911;" glyph-name="books" d="M576.234 670.73l242.712 81.432 203.584-606.784-242.712-81.432zM0 64h256v704h-256v-704zM64 640h128v-64h-128v64zM320 64h256v704h-256v-704zM384 640h128v-64h-128v64z" />
+<glyph unicode="&#xe914;" glyph-name="upload" d="M839.432 760.57c27.492-27.492 50.554-78.672 55.552-120.57h-318.984v318.984c41.898-4.998 93.076-28.060 120.568-55.552l142.864-142.862zM512 576v384h-368c-44 0-80-36-80-80v-864c0-44 36-80 80-80h672c44 0 80 36 80 80v560h-384zM576 192v-192h-192v192h-160l256 256 256-256h-160z" />
+<glyph unicode="&#xe915;" glyph-name="editimage" d="M768 416v-352h-640v640h352l128 128h-512c-52.8 0-96-43.2-96-96v-704c0-52.8 43.2-96 96-96h704c52.798 0 96 43.2 96 96v512l-128-128zM864 960l-608-608v-160h160l608 608c0 96-64 160-160 160zM416 320l-48 48 480 480 48-48-480-480z" />
+<glyph unicode="&#xe91c;" glyph-name="bubble" d="M928 896h-832c-52.8 0-96-43.2-96-96v-512c0-52.8 43.2-96 96-96h160v-256l307.2 256h364.8c52.8 0 96 43.2 96 96v512c0 52.8-43.2 96-96 96zM896 320h-379.142l-196.858-174.714v174.714h-192v448h768v-448z" />
+<glyph unicode="&#xe91d;" glyph-name="user" d="M622.826 257.264c-22.11 3.518-22.614 64.314-22.614 64.314s64.968 64.316 79.128 150.802c38.090 0 61.618 91.946 23.522 124.296 1.59 34.054 48.96 267.324-190.862 267.324s-192.45-233.27-190.864-267.324c-38.094-32.35-14.57-124.296 23.522-124.296 14.158-86.486 79.128-150.802 79.128-150.802s-0.504-60.796-22.614-64.314c-71.22-11.332-337.172-128.634-337.172-257.264h896c0 128.63-265.952 245.932-337.174 257.264z" />
+<glyph unicode="&#xe926;" glyph-name="lock" d="M592 512h-16v192c0 105.87-86.13 192-192 192h-128c-105.87 0-192-86.13-192-192v-192h-16c-26.4 0-48-21.6-48-48v-480c0-26.4 21.6-48 48-48h544c26.4 0 48 21.6 48 48v480c0 26.4-21.6 48-48 48zM192 704c0 35.29 28.71 64 64 64h128c35.29 0 64-28.71 64-64v-192h-256v192z" />
+<glyph unicode="&#xe927;" glyph-name="unlock" d="M768 896c105.87 0 192-86.13 192-192v-192h-128v192c0 35.29-28.71 64-64 64h-128c-35.29 0-64-28.71-64-64v-192h16c26.4 0 48-21.6 48-48v-480c0-26.4-21.6-48-48-48h-544c-26.4 0-48 21.6-48 48v480c0 26.4 21.6 48 48 48h400v192c0 105.87 86.13 192 192 192h128z" />
+<glyph unicode="&#xe928;" glyph-name="settings" d="M448 832v16c0 26.4-21.6 48-48 48h-160c-26.4 0-48-21.6-48-48v-16h-192v-128h192v-16c0-26.4 21.6-48 48-48h160c26.4 0 48 21.6 48 48v16h576v128h-576zM256 704v128h128v-128h-128zM832 528c0 26.4-21.6 48-48 48h-160c-26.4 0-48-21.6-48-48v-16h-576v-128h576v-16c0-26.4 21.6-48 48-48h160c26.4 0 48 21.6 48 48v16h192v128h-192v16zM640 384v128h128v-128h-128zM448 208c0 26.4-21.6 48-48 48h-160c-26.4 0-48-21.6-48-48v-16h-192v-128h192v-16c0-26.4 21.6-48 48-48h160c26.4 0 48 21.6 48 48v16h576v128h-576v16zM256 64v128h128v-128h-128z" />
+<glyph unicode="&#xe92a;" glyph-name="remove2" d="M192-64h640l64 704h-768zM640 832v128h-256v-128h-320v-192l64 64h768l64-64v192h-320zM576 832h-128v64h128v-64z" />
+<glyph unicode="&#xe92d;" glyph-name="menu" d="M384 896h256v-256h-256zM384 576h256v-256h-256zM384 256h256v-256h-256z" />
+<glyph unicode="&#xe930;" glyph-name="warning" d="M1009.956 44.24l-437.074 871.112c-16.742 29.766-38.812 44.648-60.882 44.648s-44.14-14.882-60.884-44.648l-437.074-871.112c-33.486-59.532-5-108.24 63.304-108.24h869.308c68.302 0 96.792 48.708 63.302 108.24zM512 64c-35.346 0-64 28.654-64 64 0 35.348 28.654 64 64 64 35.348 0 64-28.652 64-64 0-35.346-28.652-64-64-64zM556 256h-88l-20 256c0 35.346 28.654 64 64 64s64-28.654 64-64l-20-256z" />
+<glyph unicode="&#xe931;" glyph-name="question" d="M448 256h128v-128h-128zM704 704c35.346 0 64-28.654 64-64v-192l-192-128h-128v64l192 128v64h-320v128h384zM512 864c-111.118 0-215.584-43.272-294.156-121.844s-121.844-183.038-121.844-294.156c0-111.118 43.272-215.584 121.844-294.156s183.038-121.844 294.156-121.844c111.118 0 215.584 43.272 294.156 121.844s121.844 183.038 121.844 294.156c0 111.118-43.272 215.584-121.844 294.156s-183.038 121.844-294.156 121.844zM512 960v0c282.77 0 512-229.23 512-512s-229.23-512-512-512c-282.77 0-512 229.23-512 512s229.23 512 512 512z" />
+<glyph unicode="&#xe932;" glyph-name="pluscircle" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512 64c-212.078 0-384 171.922-384 384s171.922 384 384 384c212.078 0 384-171.922 384-384s-171.922-384-384-384zM768 384h-192v-192h-128v192h-192v128h192v192h128v-192h192z" />
+<glyph unicode="&#xe933;" glyph-name="info" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM448 768h128v-128h-128v128zM640 128h-256v64h64v256h-64v64h192v-320h64v-64z" />
+<glyph unicode="&#xe934;" glyph-name="notice" d="M1024 224l-288 736h-448l-288-288v-448l288-288h448l288 288v448l-288 288zM576 128h-128v128h128v-128zM576 384h-128v384h128v-384z" />
+<glyph unicode="&#xe935;" glyph-name="drop" d="M864.626 486.838c-65.754 183.44-205.11 348.15-352.626 473.162-147.516-125.012-286.87-289.722-352.626-473.162-40.664-113.436-44.682-236.562 12.584-345.4 65.846-125.14 198.632-205.438 340.042-205.438s274.196 80.298 340.040 205.44c57.27 108.838 53.25 231.962 12.586 345.398zM738.764 201.044c-43.802-83.252-132.812-137.044-226.764-137.044-55.12 0-108.524 18.536-152.112 50.652 13.242-1.724 26.632-2.652 40.112-2.652 117.426 0 228.668 67.214 283.402 171.242 44.878 85.292 40.978 173.848 23.882 244.338 14.558-28.15 26.906-56.198 36.848-83.932 22.606-63.062 40.024-156.34-5.368-242.604z" />
+<glyph unicode="&#xe939;" glyph-name="minus" d="M0 544v-192c0-17.672 14.328-32 32-32h960c17.672 0 32 14.328 32 32v192c0 17.672-14.328 32-32 32h-960c-17.672 0-32-14.328-32-32z" />
+<glyph unicode="&#xe93a;" glyph-name="plus" d="M992 576h-352v352c0 17.672-14.328 32-32 32h-192c-17.672 0-32-14.328-32-32v-352h-352c-17.672 0-32-14.328-32-32v-192c0-17.672 14.328-32 32-32h352v-352c0-17.672 14.328-32 32-32h192c17.672 0 32 14.328 32 32v352h352c17.672 0 32 14.328 32 32v192c0 17.672-14.328 32-32 32z" />
+<glyph unicode="&#xe93b;" glyph-name="arrowup" d="M0 320l192-192 320 320 320-320 192 192-511.998 512z" />
+<glyph unicode="&#xe93c;" glyph-name="arrowright" d="M384 960l-192-192 320-320-320-320 192-192 512 512z" />
+<glyph unicode="&#xe93d;" glyph-name="arrowdown" d="M1024 576l-192 192-320-320-320 320-192-192 512-511.998z" />
+<glyph unicode="&#xe93f;" glyph-name="arrowup2" d="M768 320l-256 256-256-256z" />
+<glyph unicode="&#xe940;" glyph-name="arrowdown2" d="M256 576l256-256 256 256z" />
+<glyph unicode="&#xe941;" glyph-name="menu2" d="M256 704l256-256 256 256zM255.996 384.004l256-256 256 256z" />
+<glyph unicode="&#xe961;" glyph-name="newtab" d="M704 384l128 128v-512h-768v768h512l-128-128h-256v-512h512zM960 896v-352l-130.744 130.744-354.746-354.744h-90.51v90.512l354.744 354.744-130.744 130.744z" />
+<glyph unicode="&#xeaa8;" glyph-name="rotateleft" d="M607.998 831.986c-212.070 0-383.986-171.916-383.986-383.986h-191.994l246.848-246.848 246.848 246.848h-191.994c0 151.478 122.798 274.276 274.276 274.276 151.48 0 274.276-122.798 274.276-274.276 0-151.48-122.796-274.276-274.276-274.276v-109.71c212.070 0 383.986 171.916 383.986 383.986s-171.916 383.986-383.986 383.986z" />
+<glyph unicode="&#xeaa9;" glyph-name="rotateright" d="M416.002 831.986c212.070 0 383.986-171.916 383.986-383.986h191.994l-246.848-246.848-246.848 246.848h191.994c0 151.478-122.798 274.276-274.276 274.276-151.48 0-274.276-122.798-274.276-274.276 0-151.48 122.796-274.276 274.276-274.276v-109.71c-212.070 0-383.986 171.916-383.986 383.986s171.916 383.986 383.986 383.986z" />
+<glyph unicode="&#xeaaa;" glyph-name="flipv" d="M0 576h1024v384zM1024 0v384h-1024z" />
+<glyph unicode="&#xeaac;" glyph-name="fliph" d="M576 960v-1024h384zM0-64h384v1024z" />
+<glyph unicode="&#xeb35;" glyph-name="zoomin" d="M992.262 88.604l-242.552 206.294c-25.074 22.566-51.89 32.926-73.552 31.926 57.256 67.068 91.842 154.078 91.842 249.176 0 212.078-171.922 384-384 384-212.076 0-384-171.922-384-384s171.922-384 384-384c95.098 0 182.108 34.586 249.176 91.844-1-21.662 9.36-48.478 31.926-73.552l206.294-242.552c35.322-39.246 93.022-42.554 128.22-7.356s31.892 92.898-7.354 128.22zM384 320c-141.384 0-256 114.616-256 256s114.616 256 256 256 256-114.616 256-256-114.614-256-256-256zM448 768h-128v-128h-128v-128h128v-128h128v128h128v128h-128z" />
+<glyph unicode="&#xeb36;" glyph-name="zoomout" d="M992.262 88.604l-242.552 206.294c-25.074 22.566-51.89 32.926-73.552 31.926 57.256 67.068 91.842 154.078 91.842 249.176 0 212.078-171.922 384-384 384-212.076 0-384-171.922-384-384s171.922-384 384-384c95.098 0 182.108 34.586 249.176 91.844-1-21.662 9.36-48.478 31.926-73.552l206.294-242.552c35.322-39.246 93.022-42.554 128.22-7.356s31.892 92.898-7.354 128.22zM384 320c-141.384 0-256 114.616-256 256s114.616 256 256 256 256-114.616 256-256-114.614-256-256-256zM192 640h384v-128h-384z" />
+<glyph unicode="&#xeba7;" glyph-name="sharpen" d="M768 832h-512l-256-256 512-576 512 576-256 256zM512 181.334v2.666h-2.37l-14.222 16h16.592v16h-30.814l-14.222 16h45.036v16h-59.258l-14.222 16h73.48v16h-87.704l-14.222 16h101.926v16h-116.148l-14.222 16h130.37v16h-144.592l-14.222 16h158.814v16h-173.038l-14.222 16h187.26v16h-201.482l-14.222 16h215.704v16h-229.926l-14.222 16h244.148v16h-258.372l-14.222 16h272.594v16h-286.816l-14.222 16h301.038v16h-315.26l-14.222 16h329.482v16h-343.706l-7.344 8.262 139.072 139.072h211.978v-3.334h215.314l16-16h-231.314v-16h247.314l16-16h-263.314v-16h279.314l16-16h-295.314v-16h311.314l16-16h-327.314v-16h343.312l7.738-7.738-351.050-394.928z" />
+<glyph unicode="&#xec6a;" glyph-name="options" d="M64 768h896v-192h-896zM64 512h896v-192h-896zM64 256h896v-192h-896z" />
+<glyph unicode="&#xeccc;" glyph-name="sun" d="M512 128c35.346 0 64-28.654 64-64v-64c0-35.346-28.654-64-64-64s-64 28.654-64 64v64c0 35.346 28.654 64 64 64zM512 768c-35.346 0-64 28.654-64 64v64c0 35.346 28.654 64 64 64s64-28.654 64-64v-64c0-35.346-28.654-64-64-64zM960 512c35.346 0 64-28.654 64-64s-28.654-64-64-64h-64c-35.348 0-64 28.654-64 64s28.652 64 64 64h64zM192 448c0-35.346-28.654-64-64-64h-64c-35.346 0-64 28.654-64 64s28.654 64 64 64h64c35.346 0 64-28.654 64-64zM828.784 221.726l45.256-45.258c24.992-24.99 24.992-65.516 0-90.508-24.994-24.992-65.518-24.992-90.51 0l-45.256 45.256c-24.992 24.99-24.992 65.516 0 90.51 24.994 24.992 65.518 24.992 90.51 0zM195.216 674.274l-45.256 45.256c-24.994 24.994-24.994 65.516 0 90.51s65.516 24.994 90.51 0l45.256-45.256c24.994-24.994 24.994-65.516 0-90.51s-65.516-24.994-90.51 0zM828.784 674.274c-24.992-24.992-65.516-24.992-90.51 0-24.992 24.994-24.992 65.516 0 90.51l45.256 45.254c24.992 24.994 65.516 24.994 90.51 0 24.992-24.994 24.992-65.516 0-90.51l-45.256-45.254zM195.216 221.726c24.992 24.992 65.518 24.992 90.508 0 24.994-24.994 24.994-65.52 0-90.51l-45.254-45.256c-24.994-24.992-65.516-24.992-90.51 0s-24.994 65.518 0 90.508l45.256 45.258zM512 704c-141.384 0-256-114.616-256-256 0-141.382 114.616-256 256-256 141.382 0 256 114.618 256 256 0 141.384-114.616 256-256 256zM512 288c-88.366 0-160 71.634-160 160s71.634 160 160 160 160-71.634 160-160-71.634-160-160-160z" />
+<glyph unicode="&#xeccd;" glyph-name="moon" d="M715.812 895.52c-60.25 34.784-124.618 55.904-189.572 64.48 122.936-160.082 144.768-384.762 37.574-570.42-107.2-185.67-312.688-279.112-512.788-252.68 39.898-51.958 90.376-97.146 150.628-131.934 245.908-141.974 560.37-57.72 702.344 188.198 141.988 245.924 57.732 560.372-188.186 702.356z" />
+<glyph unicode="&#xecd4;" glyph-name="contrast" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM128 448c0 212.078 171.922 384 384 384v-768c-212.078 0-384 171.922-384 384z" />
+<glyph unicode="&#xed6a;" glyph-name="remove22" d="M893.254 738.746l-90.508 90.508-290.746-290.744-290.746 290.744-90.508-90.506 290.746-290.748-290.746-290.746 90.508-90.508 290.746 290.746 290.746-290.746 90.508 90.51-290.744 290.744z" />
+<glyph unicode="&#xedc0;" glyph-name="arrowleft" d="M672-64l192 192-320 320 320 320-192 192-512-512z" />
+<glyph unicode="&#xedf9;" glyph-name="resize2" d="M0 896v-384c0-35.346 28.654-64 64-64s64 28.654 64 64v229.488l677.488-677.488h-229.488c-35.346 0-64-28.652-64-64 0-35.346 28.654-64 64-64h384c35.346 0 64 28.654 64 64v384c0 35.348-28.654 64-64 64s-64-28.652-64-64v-229.488l-677.488 677.488h229.488c35.346 0 64 28.654 64 64s-28.652 64-64 64h-384c-35.346 0-64-28.654-64-64z" />
+<glyph unicode="&#xee78;" glyph-name="crop" d="M832 704l192 192-64 64-192-192h-448v192h-128v-192h-192v-128h192v-512h512v-192h128v192h192v128h-192v448zM320 640h320l-320-320v320zM384 256l320 320v-320h-320z" />
+</font></defs></svg>

 Binary files /dev/null and b/tinymce4/js/tinymce/skins/custom/fonts/tinymce.ttf differ
 Binary files /dev/null and b/tinymce4/js/tinymce/skins/custom/fonts/tinymce.woff differ
 Binary files /dev/null and b/tinymce4/js/tinymce/skins/custom/img/anchor.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/skins/custom/img/loader.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/skins/custom/img/object.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/skins/custom/img/trans.gif differ
--- /dev/null
+++ b/tinymce4/js/tinymce/skins/custom/skin.ie7.min.css
@@ -1,1 +1,1 @@
-
+.mce-container,.mce-container *,.mce-widget,.mce-widget *,.mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:#333;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;-webkit-tap-highlight-color:transparent;line-height:normal;font-weight:normal;text-align:left;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-widget button{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.mce-container *[unselectable]{-moz-user-select:none;-webkit-user-select:none;-o-user-select:none;user-select:none}.mce-fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.mce-fade.mce-in{opacity:1}.mce-tinymce{visibility:inherit !important;position:relative}.mce-fullscreen{border:0;padding:0;margin:0;overflow:hidden;height:100%;z-index:100}div.mce-fullscreen{position:fixed;top:0;left:0;width:100%;height:auto}.mce-tinymce{display:block;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mce-wordcount{position:absolute;top:0;right:0;padding:8px}div.mce-edit-area{background:#FFF;filter:none}.mce-statusbar{position:relative}.mce-statusbar .mce-container-body{position:relative}.mce-fullscreen .mce-resizehandle{display:none}.mce-charmap{border-collapse:collapse}.mce-charmap td{cursor:default;border:1px solid #9e9e9e;width:20px;height:20px;line-height:20px;text-align:center;vertical-align:middle;padding:2px}.mce-charmap td div{text-align:center}.mce-charmap td:hover{background:#d9d9d9}.mce-grid td.mce-grid-cell div{border:1px solid #d6d6d6;width:15px;height:15px;margin:0px;cursor:pointer}.mce-grid td.mce-grid-cell div:focus{border-color:#a1a1a1}.mce-grid td.mce-grid-cell div[disabled]{cursor:not-allowed}.mce-grid{border-spacing:2px;border-collapse:separate}.mce-grid a{display:block;border:1px solid transparent}.mce-grid a:hover,.mce-grid a:focus{border-color:#a1a1a1}.mce-grid-border{margin:0 4px 0 4px}.mce-grid-border a{border-color:#d6d6d6;width:13px;height:13px}.mce-grid-border a:hover,.mce-grid-border a.mce-active{border-color:#a1a1a1;background:#a0cca7}.mce-text-center{text-align:center}div.mce-tinymce-inline{width:100%;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-colorbtn-trans div{text-align:center;vertical-align:middle;font-weight:bold;font-size:20px;line-height:16px;color:#707070}.mce-monospace{font-family:"Courier New",Courier,monospace}.mce-toolbar-grp{padding:2px 0}.mce-toolbar-grp .mce-flow-layout-item{margin-bottom:0}.mce-rtl .mce-wordcount{left:0;right:auto}.mce-croprect-container{position:absolute;top:0;left:0}.mce-croprect-handle{position:absolute;top:0;left:0;width:20px;height:20px;border:2px solid white}.mce-croprect-handle-nw{border-width:2px 0 0 2px;margin:-2px 0 0 -2px;cursor:nw-resize;top:100px;left:100px}.mce-croprect-handle-ne{border-width:2px 2px 0 0;margin:-2px 0 0 -20px;cursor:ne-resize;top:100px;left:200px}.mce-croprect-handle-sw{border-width:0 0 2px 2px;margin:-20px 2px 0 -2px;cursor:sw-resize;top:200px;left:100px}.mce-croprect-handle-se{border-width:0 2px 2px 0;margin:-20px 0 0 -20px;cursor:se-resize;top:200px;left:200px}.mce-croprect-handle-move{position:absolute;cursor:move;border:0}.mce-croprect-block{opacity:.3;filter:alpha(opacity=30);zoom:1;position:absolute;background:black}.mce-croprect-handle:focus{border-color:#59a5e1}.mce-croprect-handle-move:focus{outline:1px solid #59a5e1}.mce-imagepanel{overflow:auto;background:black}.mce-imagepanel-bg{position:absolute;background:url('data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==')}.mce-imagepanel img{position:absolute}.mce-imagetool.mce-btn .mce-ico{display:block;width:20px;height:20px;text-align:center;line-height:20px;font-size:20px;padding:5px}.mce-arrow-up{margin-top:12px}.mce-arrow-down{margin-top:-12px}.mce-arrow:before,.mce-arrow:after{position:absolute;left:50%;display:block;width:0;height:0;border-style:solid;border-color:transparent;content:""}.mce-arrow.mce-arrow-up:before{top:-9px;border-bottom-color:#9e9e9e;border-width:0 9px 9px;margin-left:-9px}.mce-arrow.mce-arrow-down:before{bottom:-9px;border-top-color:#9e9e9e;border-width:9px 9px 0;margin-left:-9px}.mce-arrow.mce-arrow-up:after{top:-8px;border-bottom-color:#c0d29d;border-width:0 8px 8px;margin-left:-8px}.mce-arrow.mce-arrow-down:after{bottom:-8px;border-top-color:#c0d29d;border-width:8px 8px 0;margin-left:-8px}.mce-arrow.mce-arrow-left:before,.mce-arrow.mce-arrow-left:after{margin:0}.mce-arrow.mce-arrow-left:before{left:8px}.mce-arrow.mce-arrow-left:after{left:9px}.mce-arrow.mce-arrow-right:before,.mce-arrow.mce-arrow-right:after{left:auto;margin:0}.mce-arrow.mce-arrow-right:before{right:8px}.mce-arrow.mce-arrow-right:after{right:9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left:before{left:-9px;top:50%;border-right-color:#9e9e9e;border-width:9px 9px 9px 0;margin-top:-9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left:after{left:-8px;top:50%;border-right-color:#c0d29d;border-width:8px 8px 8px 0;margin-top:-8px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left{margin-left:12px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right:before{right:-9px;top:50%;border-left-color:#9e9e9e;border-width:9px 0 9px 9px;margin-top:-9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right:after{right:-8px;top:50%;border-left-color:#c0d29d;border-width:8px 0 8px 8px;margin-top:-8px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right{margin-left:-14px}.mce-container,.mce-container-body{display:block}.mce-autoscroll{overflow:hidden}.mce-scrollbar{position:absolute;width:7px;height:100%;top:2px;right:2px;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-scrollbar-h{top:auto;right:auto;left:2px;bottom:2px;width:100%;height:7px}.mce-scrollbar-thumb{position:absolute;background-color:#000;border:1px solid #888;border-color:rgba(85,85,85,0.6);width:5px;height:100%;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.mce-scrollbar-h .mce-scrollbar-thumb{width:100%;height:5px}.mce-scrollbar:hover,.mce-scrollbar.mce-active{background-color:#AAA;opacity:.6;filter:alpha(opacity=60);zoom:1;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.mce-scroll{position:relative}.mce-panel{border:0 solid #b9c89d;border:0 solid #9e9e9e;background-color:#c0d29d}.mce-floatpanel{position:absolute;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2)}.mce-floatpanel.mce-fixed{position:fixed}.mce-floatpanel .mce-arrow,.mce-floatpanel .mce-arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.mce-floatpanel .mce-arrow{border-width:11px}.mce-floatpanel .mce-arrow:after{border-width:10px;content:""}.mce-floatpanel.mce-popover{filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);top:0;left:0;background:#fff;border:1px solid #9e9e9e;border:1px solid rgba(0,0,0,0.25)}.mce-floatpanel.mce-popover.mce-bottom{margin-top:10px;*margin-top:0}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#9e9e9e;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.mce-floatpanel.mce-popover.mce-bottom.mce-start{margin-left:-22px}.mce-floatpanel.mce-popover.mce-bottom.mce-start>.mce-arrow{left:20px}.mce-floatpanel.mce-popover.mce-bottom.mce-end{margin-left:22px}.mce-floatpanel.mce-popover.mce-bottom.mce-end>.mce-arrow{right:10px;left:auto}.mce-fullscreen{border:0;padding:0;margin:0;overflow:hidden;height:100%}div.mce-fullscreen{position:fixed;top:0;left:0}#mce-modal-block{opacity:0;filter:alpha(opacity=0);zoom:1;position:fixed;left:0;top:0;width:100%;height:100%;background:#000}#mce-modal-block.mce-in{opacity:.3;filter:alpha(opacity=30);zoom:1}.mce-window-move{cursor:move}.mce-window{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;background:#fff;position:fixed;top:0;left:0;opacity:0;transform:scale(.1);transition:transform 100ms ease-in,opacity 150ms ease-in}.mce-window.mce-in{transform:scale(1);opacity:1}.mce-window-head{padding:9px 15px;border-bottom:1px solid #c4c4c4;position:relative}.mce-window-head .mce-close{position:absolute;right:0;top:0;height:38px;width:38px;text-align:center;cursor:pointer}.mce-window-head .mce-close i{color:#858585}.mce-close:hover i{color:#adadad}.mce-window-head .mce-title{line-height:20px;font-size:20px;font-weight:bold;text-rendering:optimizelegibility;padding-right:20px}.mce-window .mce-container-body{display:block}.mce-foot{display:block;background-color:#fff;border-top:1px solid #c4c4c4;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.mce-window-head .mce-dragh{position:absolute;top:0;left:0;cursor:move;width:90%;height:100%}.mce-window iframe{width:100%;height:100%}.mce-window.mce-fullscreen,.mce-window.mce-fullscreen .mce-foot{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.mce-window-body .mce-listbox{border-color:#bcd786}.mce-rtl .mce-window-head .mce-close{position:absolute;right:auto;left:15px}.mce-rtl .mce-window-head .mce-dragh{left:auto;right:0}.mce-rtl .mce-window-head .mce-title{direction:rtl;text-align:right}.mce-tooltip{position:absolute;padding:5px;opacity:.8;filter:alpha(opacity=80);zoom:1}.mce-tooltip-inner{font-size:11px;background-color:#000;color:#fff;max-width:200px;padding:5px 8px 4px 8px;text-align:center;white-space:normal}.mce-tooltip-inner{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.mce-tooltip-inner{-webkit-box-shadow:0 0 5px #000000;-moz-box-shadow:0 0 5px #000000;box-shadow:0 0 5px #000000}.mce-tooltip-arrow{position:absolute;width:0;height:0;line-height:0;border:5px dashed #000}.mce-tooltip-arrow-n{border-bottom-color:#000}.mce-tooltip-arrow-s{border-top-color:#000}.mce-tooltip-arrow-e{border-left-color:#000}.mce-tooltip-arrow-w{border-right-color:#000}.mce-tooltip-nw,.mce-tooltip-sw{margin-left:-14px}.mce-tooltip-ne,.mce-tooltip-se{margin-left:14px}.mce-tooltip-n .mce-tooltip-arrow{top:0px;left:50%;margin-left:-5px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-nw .mce-tooltip-arrow{top:0;left:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-ne .mce-tooltip-arrow{top:0;right:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-s .mce-tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-sw .mce-tooltip-arrow{bottom:0;left:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-se .mce-tooltip-arrow{bottom:0;right:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-e .mce-tooltip-arrow{right:0;top:50%;margin-top:-5px;border-left-style:solid;border-right:none;border-top-color:transparent;border-bottom-color:transparent}.mce-tooltip-w .mce-tooltip-arrow{left:0;top:50%;margin-top:-5px;border-right-style:solid;border-left:none;border-top-color:transparent;border-bottom-color:transparent}.mce-progress{display:inline-block;position:relative;height:20px}.mce-progress .mce-bar-container{display:inline-block;width:100px;height:100%;margin-right:8px;border:1px solid #ccc;overflow:hidden;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.mce-progress .mce-text{display:inline-block;margin-top:auto;margin-bottom:auto;font-size:14px;width:40px;color:#333}.mce-bar{display:block;width:0%;height:100%;background-color:#d7d7d7;-webkit-transition:width .2s ease;transition:width .2s ease}.mce-notification{position:absolute;background-color:#f0f0f0;padding:5px;margin-top:5px;border-width:1px;border-style:solid;border-color:#ccc;transition:transform 100ms ease-in,opacity 150ms ease-in;opacity:0}.mce-notification.mce-in{opacity:1}.mce-notification-success{background-color:#dff0d8;border-color:#d6e9c6}.mce-notification-info{background-color:#d9edf7;border-color:#779ecb}.mce-notification-warning{background-color:#fcf8e3;border-color:#faebcc}.mce-notification-error{background-color:#f2dede;border-color:#ebccd1}.mce-notification.mce-has-close{padding-right:15px}.mce-notification .mce-ico{margin-top:5px}.mce-notification-inner{display:inline-block;font-size:14px;margin:5px 8px 4px 8px;text-align:center;white-space:normal;color:#31708f}.mce-notification-inner a{text-decoration:underline;cursor:pointer}.mce-notification .mce-progress{margin-right:8px}.mce-notification .mce-progress .mce-text{margin-top:5px}.mce-notification *,.mce-notification .mce-progress .mce-text{color:#333}.mce-notification .mce-progress .mce-bar-container{border-color:#ccc}.mce-notification .mce-progress .mce-bar-container .mce-bar{background-color:#333}.mce-notification-success *,.mce-notification-success .mce-progress .mce-text{color:#3c763d}.mce-notification-success .mce-progress .mce-bar-container{border-color:#d6e9c6}.mce-notification-success .mce-progress .mce-bar-container .mce-bar{background-color:#3c763d}.mce-notification-info *,.mce-notification-info .mce-progress .mce-text{color:#31708f}.mce-notification-info .mce-progress .mce-bar-container{border-color:#779ecb}.mce-notification-info .mce-progress .mce-bar-container .mce-bar{background-color:#31708f}.mce-notification-warning *,.mce-notification-warning .mce-progress .mce-text{color:#8a6d3b}.mce-notification-warning .mce-progress .mce-bar-container{border-color:#faebcc}.mce-notification-warning .mce-progress .mce-bar-container .mce-bar{background-color:#8a6d3b}.mce-notification-error *,.mce-notification-error .mce-progress .mce-text{color:#a94442}.mce-notification-error .mce-progress .mce-bar-container{border-color:#ebccd1}.mce-notification-error .mce-progress .mce-bar-container .mce-bar{background-color:#a94442}.mce-notification .mce-close{position:absolute;top:6px;right:8px;font-size:20px;font-weight:bold;line-height:20px;color:#858585;cursor:pointer;height:20px;overflow:hidden}.mce-abs-layout{position:relative}body .mce-abs-layout-item,.mce-abs-end{position:absolute}.mce-abs-end{width:1px;height:1px}.mce-container-body.mce-abs-layout{overflow:hidden}.mce-btn{border:1px solid #9bc677;border-color:rgba(68,171,32,0.1) rgba(68,171,32,0.1) rgba(68,171,32,0.1) rgba(68,171,32,0.1);position:relative;text-shadow:0 1px 1px rgba(255,255,255,0.75);display:inline-block;*display:inline;*zoom:1;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e1e7d5}.mce-btn:hover,.mce-btn:focus{color:#313824;background-color:#d5dec4;border-color:#bcd786}.mce-btn.mce-disabled button,.mce-btn.mce-disabled:hover button{cursor:default;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-btn.mce-active,.mce-btn.mce-active:hover{background-color:#cfdab9;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);border-color:#bcd786}.mce-btn:active{background-color:#d3dcc0;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);border-color:#bcd786}.mce-btn button{padding:4px 10px;font-size:14px;line-height:20px;*line-height:16px;cursor:pointer;color:#313824;text-align:center;overflow:visible;-webkit-appearance:none}.mce-btn button::-moz-focus-inner{border:0;padding:0}.mce-btn i{text-shadow:1px 1px #fff}.mce-primary.mce-btn-has-text{min-width:50px}.mce-primary{color:#fff;border:1px solid transparent;border-color:transparent;background-color:#1d855c}.mce-primary:hover,.mce-primary:focus{background-color:#1a7350;border-color:transparent}.mce-primary.mce-disabled button,.mce-primary.mce-disabled:hover button{cursor:default;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-primary.mce-active,.mce-primary.mce-active:hover,.mce-primary:not(.mce-disabled):active{background-color:#166245;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05)}.mce-primary button,.mce-primary button i{color:#fff;text-shadow:1px 1px #333}.mce-btn .mce-txt{font-size:inherit;line-height:inherit;color:inherit}.mce-btn-large button{padding:9px 14px;font-size:16px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.mce-btn-large i{margin-top:2px}.mce-btn-small button{padding:1px 5px;font-size:12px;*padding-bottom:2px}.mce-btn-small i{line-height:20px;vertical-align:top;*line-height:18px}.mce-btn .mce-caret{margin-top:8px;margin-left:0}.mce-btn-small .mce-caret{margin-top:8px;margin-left:0}.mce-caret{display:inline-block;*display:inline;*zoom:1;width:0;height:0;vertical-align:top;border-top:4px solid #313824;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.mce-disabled .mce-caret{border-top-color:#aaa}.mce-caret.mce-up{border-bottom:4px solid #313824;border-top:0}.mce-btn-flat{border:0;background:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;filter:none}.mce-btn-flat:hover,.mce-btn-flat.mce-active,.mce-btn-flat:focus,.mce-btn-flat:active{border:0;background:#d1e3ac;filter:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-btn-has-text .mce-ico{padding-right:5px}.mce-rtl .mce-btn button{direction:rtl}.mce-btn-group .mce-btn{border-width:1px;margin:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin-left:2px}.mce-btn-group:not(:first-child){border-left:1px solid #c6dd99;padding-left:3px;margin-left:3px}.mce-btn-group .mce-first{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;margin-left:0}.mce-btn-group .mce-last{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.mce-btn-group .mce-first.mce-last{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.mce-btn-group .mce-btn.mce-flow-layout-item{margin:0}.mce-rtl .mce-btn-group .mce-btn{margin-left:0;margin-right:2px}.mce-rtl .mce-btn-group .mce-first{margin-right:0}.mce-rtl .mce-btn-group:not(:first-child){border-left:none;border-right:1px solid #c6dd99;padding-right:4px;margin-right:4px}.mce-checkbox{cursor:pointer}i.mce-i-checkbox{margin:0 3px 0 0;border:1px solid #c5c5c5;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e1e7d5;text-indent:-10em;*font-size:0;*line-height:0;*text-indent:0;overflow:hidden}.mce-checked i.mce-i-checkbox{color:#313824;font-size:16px;line-height:16px;text-indent:0}.mce-checkbox:focus i.mce-i-checkbox,.mce-checkbox.mce-focus i.mce-i-checkbox{border:1px solid #459e3d;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(69, 158, 61, 0.85);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(69, 158, 61, 0.85);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(69, 158, 61, 0.85)}.mce-checkbox.mce-disabled .mce-label,.mce-checkbox.mce-disabled i.mce-i-checkbox{color:#889273}.mce-checkbox .mce-label{vertical-align:middle}.mce-rtl .mce-checkbox{direction:rtl;text-align:right}.mce-rtl i.mce-i-checkbox{margin:0 0 0 3px}.mce-combobox{position:relative;display:inline-block;*display:inline;*zoom:1;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);*height:32px}.mce-combobox input{border:1px solid #c5c5c5;border-right-color:#c5c5c5;height:28px}.mce-combobox.mce-disabled input{color:#adadad}.mce-combobox.mce-has-open input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.mce-combobox .mce-btn{border:1px solid #c5c5c5;border-left:0;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;margin:0}.mce-combobox button{padding-right:8px;padding-left:8px}.mce-combobox.mce-disabled .mce-btn button{cursor:default;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-combobox .mce-status{position:absolute;right:2px;top:50%;line-height:16px;margin-top:-8px;font-size:12px;width:15px;height:15px;text-align:center;cursor:pointer}.mce-combobox.mce-has-status input{padding-right:20px}.mce-combobox.mce-has-open .mce-status{right:37px}.mce-combobox .mce-status.mce-i-warning{color:#c09853}.mce-combobox .mce-status.mce-i-checkmark{color:#468847}.mce-menu.mce-combobox-menu{border-top:0;margin-top:0;max-height:200px}.mce-menu.mce-combobox-menu .mce-menu-item{padding:4px 6px 4px 4px;font-size:11px}.mce-menu.mce-combobox-menu .mce-menu-item-sep{padding:0}.mce-menu.mce-combobox-menu .mce-text{font-size:11px}.mce-menu.mce-combobox-menu .mce-menu-item-link,.mce-menu.mce-combobox-menu .mce-menu-item-link b{font-size:11px}.mce-menu.mce-combobox-menu .mce-text b{font-size:11px}.mce-colorbox i{border:1px solid #c5c5c5;width:14px;height:14px}.mce-colorbutton .mce-ico{position:relative}.mce-colorbutton-grid{margin:4px}.mce-colorbutton button{padding-right:6px;padding-left:6px}.mce-colorbutton .mce-preview{padding-right:3px;display:block;position:absolute;left:50%;top:50%;margin-left:-17px;margin-top:7px;background:gray;width:13px;height:2px;overflow:hidden}.mce-colorbutton.mce-btn-small .mce-preview{margin-left:-16px;padding-right:0;width:16px}.mce-colorbutton .mce-open{padding-left:4px;padding-right:4px;border-left:1px solid transparent}.mce-colorbutton:hover .mce-open{border-color:#bcd786}.mce-colorbutton.mce-btn-small .mce-open{padding:0 3px 0 3px}.mce-rtl .mce-colorbutton{direction:rtl}.mce-rtl .mce-colorbutton .mce-preview{margin-left:0;padding-right:0;padding-left:3px}.mce-rtl .mce-colorbutton.mce-btn-small .mce-preview{margin-left:0;padding-right:0;padding-left:2px}.mce-rtl .mce-colorbutton .mce-open{padding-left:4px;padding-right:4px;border-left:0}.mce-colorpicker{position:relative;width:250px;height:220px}.mce-colorpicker-sv{position:absolute;top:0;left:0;width:90%;height:100%;border:1px solid #c5c5c5;cursor:crosshair;overflow:hidden}.mce-colorpicker-h-chunk{width:100%}.mce-colorpicker-overlay1,.mce-colorpicker-overlay2{width:100%;height:100%;position:absolute;top:0;left:0}.mce-colorpicker-overlay1{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr='#ffffff', endColorstr='#00ffffff');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr='#ffffff', endColorstr='#00ffffff')";background:linear-gradient(to right, #fff, rgba(255,255,255,0))}.mce-colorpicker-overlay2{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#00000000', endColorstr='#000000');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#00000000', endColorstr='#000000')";background:linear-gradient(to bottom, rgba(0,0,0,0), #000)}.mce-colorpicker-selector1{background:none;position:absolute;width:12px;height:12px;margin:-8px 0 0 -8px;border:1px solid black;border-radius:50%}.mce-colorpicker-selector2{position:absolute;width:10px;height:10px;border:1px solid white;border-radius:50%}.mce-colorpicker-h{position:absolute;top:0;right:0;width:6.5%;height:100%;border:1px solid #c5c5c5;cursor:crosshair}.mce-colorpicker-h-marker{margin-top:-4px;position:absolute;top:0;left:-1px;width:100%;border:1px solid #333;background:#fff;height:4px;z-index:100}.mce-path{display:inline-block;*display:inline;*zoom:1;padding:8px;white-space:normal}.mce-path .mce-txt{display:inline-block;padding-right:3px}.mce-path .mce-path-body{display:inline-block}.mce-path-item{display:inline-block;*display:inline;*zoom:1;cursor:pointer;color:#333}.mce-path-item:hover{text-decoration:underline}.mce-path-item:focus{background:#666;color:#fff}.mce-path .mce-divider{display:inline}.mce-disabled .mce-path-item{color:#aaa}.mce-rtl .mce-path{direction:rtl}.mce-fieldset{border:0 solid #9E9E9E;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.mce-fieldset>.mce-container-body{margin-top:-15px}.mce-fieldset-title{margin-left:5px;padding:0 5px 0 5px}.mce-fit-layout{display:inline-block;*display:inline;*zoom:1}.mce-fit-layout-item{position:absolute}.mce-flow-layout-item{display:inline-block;*display:inline;*zoom:1}.mce-flow-layout-item{margin:2px 0 2px 2px}.mce-flow-layout-item.mce-last{margin-right:2px}.mce-flow-layout{white-space:normal}.mce-tinymce-inline .mce-flow-layout{white-space:nowrap}.mce-rtl .mce-flow-layout{text-align:right;direction:rtl}.mce-rtl .mce-flow-layout-item{margin:2px 2px 2px 0}.mce-rtl .mce-flow-layout-item.mce-last{margin-left:2px}.mce-iframe{border:0 solid #9e9e9e;width:100%;height:100%}.mce-infobox{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 1px rgba(255,255,255,0.75);overflow:hidden;border:1px solid red}.mce-infobox div{display:block;margin:5px}.mce-infobox div button{position:absolute;top:50%;right:4px;cursor:pointer;margin-top:-8px;display:none}.mce-infobox div button:focus{outline:2px solid #bcd786}.mce-infobox.mce-has-help div{margin-right:25px}.mce-infobox.mce-has-help button{display:block}.mce-infobox.mce-success{background:#dff0d8;border-color:#d6e9c6}.mce-infobox.mce-success div{color:#3c763d}.mce-infobox.mce-warning{background:#fcf8e3;border-color:#faebcc}.mce-infobox.mce-warning div{color:#8a6d3b}.mce-infobox.mce-error{background:#f2dede;border-color:#ebccd1}.mce-infobox.mce-error div{color:#a94442}.mce-rtl .mce-infobox div{text-align:right;direction:rtl}.mce-label{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 1px rgba(255,255,255,0.75);overflow:hidden}.mce-label.mce-autoscroll{overflow:auto}.mce-label.mce-disabled{color:#aaa}.mce-label.mce-multiline{white-space:pre-wrap}.mce-label.mce-success{color:#468847}.mce-label.mce-warning{color:#c09853}.mce-label.mce-error{color:#b94a48}.mce-rtl .mce-label{text-align:right;direction:rtl}.mce-menubar .mce-menubtn{border-color:transparent;background:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;filter:none}.mce-menubar .mce-menubtn button{color:#333}.mce-menubar{border:1px solid #acb39e}.mce-menubar .mce-menubtn button span{color:#333}.mce-menubar .mce-caret{border-top-color:#333}.mce-menubar .mce-menubtn:hover,.mce-menubar .mce-menubtn.mce-active,.mce-menubar .mce-menubtn:focus{border-color:#bcd786;background:#e0ebcb;filter:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-menubtn button{color:#313824}.mce-menubtn.mce-btn-small span{font-size:12px}.mce-menubtn.mce-fixed-width span{display:inline-block;overflow-x:hidden;text-overflow:ellipsis;width:90px}.mce-menubtn.mce-fixed-width.mce-btn-small span{width:70px}.mce-menubtn .mce-caret{*margin-top:6px}.mce-rtl .mce-menubtn button{direction:rtl;text-align:right}.mce-menu-item{display:block;padding:6px 15px 6px 12px;clear:both;font-weight:normal;line-height:20px;color:#4d2f2f;white-space:nowrap;cursor:pointer;line-height:normal;border-left:4px solid transparent;margin-bottom:1px}.mce-menu-item .mce-ico,.mce-menu-item .mce-text{color:#4d2f2f}.mce-menu-item.mce-disabled .mce-text,.mce-menu-item.mce-disabled .mce-ico{color:#a5a08d}.mce-menu-item:hover .mce-text,.mce-menu-item.mce-selected .mce-text,.mce-menu-item:focus .mce-text{color:#fff}.mce-menu-item:hover .mce-ico,.mce-menu-item.mce-selected .mce-ico,.mce-menu-item:focus .mce-ico{color:#fff}.mce-menu-item.mce-disabled:hover{background:#ccc}.mce-menu-shortcut{display:inline-block;color:#a5a08d}.mce-menu-shortcut{display:inline-block;*display:inline;*zoom:1;padding:0 15px 0 20px}.mce-menu-item:hover .mce-menu-shortcut,.mce-menu-item.mce-selected .mce-menu-shortcut,.mce-menu-item:focus .mce-menu-shortcut{color:#fff}.mce-menu-item .mce-caret{margin-top:4px;*margin-top:3px;margin-right:6px;border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:4px solid #4d2f2f}.mce-menu-item.mce-selected .mce-caret,.mce-menu-item:focus .mce-caret,.mce-menu-item:hover .mce-caret{border-left-color:#fff}.mce-menu-align .mce-menu-shortcut{*margin-top:-2px}.mce-menu-align .mce-menu-shortcut,.mce-menu-align .mce-caret{position:absolute;right:0}.mce-menu-item.mce-active i{visibility:visible}.mce-menu-item-normal.mce-active{background-color:#a0cca7}.mce-menu-item-preview.mce-active{border-left:5px solid #aaa}.mce-menu-item-normal.mce-active .mce-text{color:#333}.mce-menu-item-normal.mce-active:hover .mce-text,.mce-menu-item-normal.mce-active:hover .mce-ico{color:#fff}.mce-menu-item-normal.mce-active:focus .mce-text,.mce-menu-item-normal.mce-active:focus .mce-ico{color:#fff}.mce-menu-item:hover,.mce-menu-item.mce-selected,.mce-menu-item:focus{text-decoration:none;color:#fff;background-color:#4e936b}.mce-menu-item-link{color:#093;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mce-menu-item-link b{color:#093}.mce-menu-item-ellipsis{display:block;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mce-menu-item:hover *,.mce-menu-item.mce-selected *,.mce-menu-item:focus *{color:#fff}div.mce-menu .mce-menu-item-sep,.mce-menu-item-sep:hover{border:0;padding:0;height:1px;margin:9px 1px;overflow:hidden;background:#13630c;border-bottom:1px solid #fff;cursor:default;filter:none}div.mce-menu .mce-menu-item b{font-weight:bold}.mce-menu-item-indent-1{padding-left:20px}.mce-menu-item-indent-2{padding-left:35px}.mce-menu-item-indent-2{padding-left:35px}.mce-menu-item-indent-3{padding-left:40px}.mce-menu-item-indent-4{padding-left:45px}.mce-menu-item-indent-5{padding-left:50px}.mce-menu-item-indent-6{padding-left:55px}.mce-menu.mce-rtl{direction:rtl}.mce-rtl .mce-menu-item{text-align:right;direction:rtl;padding:6px 12px 6px 15px}.mce-menu-align.mce-rtl .mce-menu-shortcut,.mce-menu-align.mce-rtl .mce-caret{right:auto;left:0}.mce-rtl .mce-menu-item .mce-caret{margin-left:6px;margin-right:0;border-right:4px solid #4d2f2f;border-left:0}.mce-rtl .mce-menu-item.mce-selected .mce-caret,.mce-rtl .mce-menu-item:focus .mce-caret,.mce-rtl .mce-menu-item:hover .mce-caret{border-left-color:transparent;border-right-color:#fff}.mce-throbber{position:absolute;top:0;left:0;width:100%;height:100%;opacity:.6;filter:alpha(opacity=60);zoom:1;background:#fff url('img/loader.gif') no-repeat center center}.mce-throbber-inline{position:static;height:50px}.mce-menu .mce-throbber-inline{height:25px;background-size:contain}.mce-menu{position:absolute;left:0;top:0;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;z-index:1000;padding:5px 0 5px 0;margin:-1px 0 0;min-width:160px;background:#e0ebcb;border:1px solid #77b269;border:1px solid rgba(9,130,28,0.2);z-index:1002;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);max-height:400px;overflow:auto;overflow-x:hidden}.mce-menu i{display:none}.mce-menu-has-icons i{display:inline-block;*display:inline}.mce-menu-sub-tr-tl{margin:-6px 0 0 -1px}.mce-menu-sub-br-bl{margin:6px 0 0 -1px}.mce-menu-sub-tl-tr{margin:-6px 0 0 1px}.mce-menu-sub-bl-br{margin:6px 0 0 1px}.mce-listbox button{text-align:left;padding-right:20px;position:relative}.mce-listbox .mce-caret{position:absolute;margin-top:-2px;right:8px;top:50%}.mce-rtl .mce-listbox .mce-caret{right:auto;left:8px}.mce-rtl .mce-listbox button{padding-right:10px;padding-left:20px}.mce-container-body .mce-resizehandle{position:absolute;right:0;bottom:0;width:16px;height:16px;visibility:visible;cursor:s-resize;margin:0}.mce-container-body .mce-resizehandle-both{cursor:se-resize}i.mce-i-resize{color:#333}.mce-selectbox{background:#fff;border:1px solid #c5c5c5}.mce-slider{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;border:1px solid #aaa;background:#eee;width:100px;height:10px;position:relative;display:block}.mce-slider.mce-vertical{width:10px;height:100px}.mce-slider-handle{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;border:1px solid #bbb;background:#ddd;display:block;width:13px;height:13px;position:absolute;top:0;left:0;margin-left:-1px;margin-top:-2px}.mce-slider-handle:focus{background:#bbb}.mce-spacer{visibility:hidden}.mce-splitbtn .mce-open{border-left:1px solid transparent}.mce-splitbtn:hover .mce-open{border-left-color:#bcd786}.mce-splitbtn button{padding-right:6px;padding-left:6px}.mce-splitbtn .mce-open{padding-right:4px;padding-left:4px}.mce-splitbtn .mce-open.mce-active{background-color:#cfdab9;outline:1px solid #bcd786}.mce-splitbtn.mce-btn-small .mce-open{padding:0 3px 0 3px}.mce-rtl .mce-splitbtn{direction:rtl;text-align:right}.mce-rtl .mce-splitbtn button{padding-right:4px;padding-left:4px}.mce-rtl .mce-splitbtn .mce-open{border-left:0}.mce-stack-layout-item{display:block}.mce-tabs{display:block;border-bottom:1px solid #c5c5c5}.mce-tabs,.mce-tabs+.mce-container-body{background:#fff}.mce-tab{display:inline-block;*display:inline;*zoom:1;border:1px solid #c5c5c5;border-width:0 1px 0 0;background:#e3e3e3;padding:8px;text-shadow:0 1px 1px rgba(255,255,255,0.75);height:13px;cursor:pointer}.mce-tab:hover{background:#fdfdfd}.mce-tab.mce-active{background:#fdfdfd;border-bottom-color:transparent;margin-bottom:-1px;height:14px}.mce-rtl .mce-tabs{text-align:right;direction:rtl}.mce-rtl .mce-tab{border-width:0 0 0 1px}.mce-textbox{background:#fff;border:1px solid #c5c5c5;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);display:inline-block;-webkit-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;height:28px;resize:none;padding:0 4px 0 4px;white-space:pre-wrap;*white-space:pre;color:#333}.mce-textbox:focus,.mce-textbox.mce-focus{border-color:#59a5e1;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(89, 165, 225, 0.85);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(89, 165, 225, 0.85);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(89, 165, 225, 0.85)}.mce-placeholder .mce-textbox{color:#aaa}.mce-textbox.mce-multiline{padding:4px;height:auto}.mce-textbox.mce-disabled{color:#adadad}.mce-rtl .mce-textbox{text-align:right;direction:rtl}@font-face{font-family:'tinymce';src:url('fonts/tinymce.eot');src:url('fonts/tinymce.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce.woff') format('woff'),url('fonts/tinymce.ttf') format('truetype'),url('fonts/tinymce.svg#tinymce') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'tinymce-small';src:url('fonts/tinymce-small.eot');src:url('fonts/tinymce-small.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce-small.woff') format('woff'),url('fonts/tinymce-small.ttf') format('truetype'),url('fonts/tinymce-small.svg#tinymce') format('svg');font-weight:normal;font-style:normal}.mce-ico{font-family:'tinymce';font-style:normal;font-weight:normal;font-size:16px;line-height:16px;vertical-align:text-top;-webkit-font-smoothing:antialiased;display:inline-block;background:transparent center center;width:16px;height:16px;color:#313824;-ie7-icon:' '}.mce-btn-small .mce-ico{font-family:'tinymce-small'}.mce-ico,i.mce-i-checkbox{zoom:expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = this.currentStyle['-ie7-icon'].substr(1, 1) + '&nbsp;')}.mce-i-save{-ie7-icon:"\e000"}.mce-i-newdocument{-ie7-icon:"\e001"}.mce-i-fullpage{-ie7-icon:"\e002"}.mce-i-alignleft{-ie7-icon:"\e003"}.mce-i-aligncenter{-ie7-icon:"\e004"}.mce-i-alignright{-ie7-icon:"\e005"}.mce-i-alignjustify{-ie7-icon:"\e006"}.mce-i-alignnone{-ie7-icon:"\e003"}.mce-i-cut{-ie7-icon:"\e007"}.mce-i-paste{-ie7-icon:"\e008"}.mce-i-searchreplace{-ie7-icon:"\e009"}.mce-i-bullist{-ie7-icon:"\e00a"}.mce-i-numlist{-ie7-icon:"\e00b"}.mce-i-indent{-ie7-icon:"\e00c"}.mce-i-outdent{-ie7-icon:"\e00d"}.mce-i-blockquote{-ie7-icon:"\e00e"}.mce-i-undo{-ie7-icon:"\e00f"}.mce-i-redo{-ie7-icon:"\e010"}.mce-i-link{-ie7-icon:"\e011"}.mce-i-unlink{-ie7-icon:"\e012"}.mce-i-anchor{-ie7-icon:"\e013"}.mce-i-image{-ie7-icon:"\e014"}.mce-i-media{-ie7-icon:"\e015"}.mce-i-help{-ie7-icon:"\e016"}.mce-i-code{-ie7-icon:"\e017"}.mce-i-insertdatetime{-ie7-icon:"\e018"}.mce-i-preview{-ie7-icon:"\e019"}.mce-i-forecolor{-ie7-icon:"\e01a"}.mce-i-backcolor{-ie7-icon:"\e01a"}.mce-i-table{-ie7-icon:"\e01b"}.mce-i-hr{-ie7-icon:"\e01c"}.mce-i-removeformat{-ie7-icon:"\e01d"}.mce-i-subscript{-ie7-icon:"\e01e"}.mce-i-superscript{-ie7-icon:"\e01f"}.mce-i-charmap{-ie7-icon:"\e020"}.mce-i-emoticons{-ie7-icon:"\e021"}.mce-i-print{-ie7-icon:"\e022"}.mce-i-fullscreen{-ie7-icon:"\e023"}.mce-i-spellchecker{-ie7-icon:"\e024"}.mce-i-nonbreaking{-ie7-icon:"\e025"}.mce-i-template{-ie7-icon:"\e026"}.mce-i-pagebreak{-ie7-icon:"\e027"}.mce-i-restoredraft{-ie7-icon:"\e028"}.mce-i-untitled{-ie7-icon:"\e029"}.mce-i-bold{-ie7-icon:"\e02a"}.mce-i-italic{-ie7-icon:"\e02b"}.mce-i-underline{-ie7-icon:"\e02c"}.mce-i-strikethrough{-ie7-icon:"\e02d"}.mce-i-visualchars{-ie7-icon:"\e02e"}.mce-i-ltr{-ie7-icon:"\e02f"}.mce-i-rtl{-ie7-icon:"\e030"}.mce-i-copy{-ie7-icon:"\e031"}.mce-i-resize{-ie7-icon:"\e032"}.mce-i-browse{-ie7-icon:"\e034"}.mce-i-pastetext{-ie7-icon:"\e035"}.mce-i-rotateleft{-ie7-icon:"\eaa8"}.mce-i-rotateright{-ie7-icon:"\eaa9"}.mce-i-crop{-ie7-icon:"\ee78"}.mce-i-editimage{-ie7-icon:"\e914"}.mce-i-options{-ie7-icon:"\ec6a"}.mce-i-flipv{-ie7-icon:"\eaaa"}.mce-i-fliph{-ie7-icon:"\eaac"}.mce-i-zoomin{-ie7-icon:"\eb35"}.mce-i-zoomout{-ie7-icon:"\eb36"}.mce-i-sun{-ie7-icon:"\eccc"}.mce-i-moon{-ie7-icon:"\eccd"}.mce-i-arrowleft{-ie7-icon:"\edc0"}.mce-i-arrowright{-ie7-icon:"\edb8"}.mce-i-drop{-ie7-icon:"\e934"}.mce-i-contrast{-ie7-icon:"\ecd4"}.mce-i-sharpen{-ie7-icon:"\eba7"}.mce-i-palette{-ie7-icon:"\e92a"}.mce-i-resize2{-ie7-icon:"\edf9"}.mce-i-orientation{-ie7-icon:"\e601"}.mce-i-invert{-ie7-icon:"\e602"}.mce-i-gamma{-ie7-icon:"\e600"}.mce-i-remove{-ie7-icon:"\ed6a"}.mce-i-codesample{-ie7-icon:"\e603"}.mce-i-checkbox,.mce-i-selected{-ie7-icon:"\e033"}.mce-i-selected{visibility:hidden}.mce-i-backcolor{background:#BBB}

--- /dev/null
+++ b/tinymce4/js/tinymce/skins/custom/skin.json
@@ -1,1 +1,79 @@
-
+{
+	"skin-name": "custom",
+	"preview-bg": "#eeeeee",
+	"text": "#333333",
+	"text-inverse": "#ffffff",
+	"text-disabled": "#aaaaaa",
+	"has-gradients": false,
+	"has-radius": true,
+	"has-boxshadow": true,
+	"has-button-borders": false,
+	"btn-text": "#313824",
+	"btn-text-shadow": "#ffffff",
+	"btn-bg": "#e6f0d2",
+	"btn-bg-hlight": "#d9d9d9",
+	"btn-border-top": "rgba(68,171,32,0.1)",
+	"btn-border-right": "rgba(68,171,32,0.1)",
+	"btn-border-bottom": "rgba(68,171,32,0.1)",
+	"btn-border-left": "rgba(68,171,32,0.1)",
+	"btn-split-border": "#bdbdbd",
+	"btn-primary-text": "#ffffff",
+	"btn-primary-text-shadow": "#333333",
+	"btn-primary-bg": "#31b011",
+	"btn-primary-bg-hlight": "#0044cc",
+	"btn-padding": "4px 10px",
+	"menu-bg": "#e0ebcb",
+	"menu-border": "rgba(9,130,28,0.2)",
+	"menuitem-text": "#4d2f2f",
+	"menuitem-bg-selected": "#82a63b",
+	"menuitem-bg-selected-hlight": "#0077b3",
+	"menuitem-separator-top": "#13630c",
+	"menuitem-separator-bottom": "#ffffff",
+	"menuitem-text-inverse": "#ffffff",
+	"menuitem-bg-active": "#a0cca7",
+	"menuitem-text-active": "#333333",
+	"menuitem-preview-border-active": "#aaaaaa",
+	"menubar-menubtn-text": "#333333",
+	"checkbox-border": "#c5c5c5",
+	"checkbox-border-focus": "#459e3d",
+	"panel-border": "#9e9e9e",
+	"panel-bg": "#c0d29d",
+	"panel-bg-hlight": "#c0d29d",
+	"textbox-bg": "#ffffff",
+	"textbox-border": "#c5c5c5",
+	"textbox-border-focus": "#59a5e1",
+	"window-bg": "#ffffff",
+	"window-border": "#c4c4c4",
+	"tab-bg": "#e3e3e3",
+	"tab-bg-hover": "#fdfdfd",
+	"tab-bg-active": "#fdfdfd",
+	"tab-border": "#c5c5c5",
+	"tabs-bg": "#ffffff",
+	"notification-bg": "#f0f0f0",
+	"notification-border": "#cccccc",
+	"notification-text": "#333333",
+	"notification-success-bg": "#dff0d8",
+	"notification-success-border": "#d6e9c6",
+	"notification-success-text": "#3c763d",
+	"notification-info-bg": "#d9edf7",
+	"notification-info-border": "#779ecb",
+	"notification-info-text": "#31708f",
+	"notification-warning-bg": "#fcf8e3",
+	"notification-warning-border": "#faebcc",
+	"notification-warning-text": "#8a6d3b",
+	"notification-error-bg": "#f2dede",
+	"notification-error-border": "#ebccd1",
+	"notification-error-text": "#a94442",
+	"progress-bar-bg": "#dfdfdf",
+	"progress-bar-bg-hlight": "#cccccc",
+	"progress-border": "#cccccc",
+	"progress-text": "#333333",
+	"progress-text-shadow": "#ffffff",
+	"slider-bg": "#eeeeee",
+	"slider-border": "#aaaaaa",
+	"slider-handle-bg": "#dddddd",
+	"slider-handle-border": "#bbbbbb",
+	"colorbtn-backcolor-bg": "#bbbbbb",
+	"grid-border": "#d6d6d6",
+	"grid-border-active": "#a1a1a1"
+}

--- /dev/null
+++ b/tinymce4/js/tinymce/skins/custom/skin.min.css
@@ -1,1 +1,1 @@
-
+.mce-container,.mce-container *,.mce-widget,.mce-widget *,.mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:#333;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;-webkit-tap-highlight-color:transparent;line-height:normal;font-weight:normal;text-align:left;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-widget button{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.mce-container *[unselectable]{-moz-user-select:none;-webkit-user-select:none;-o-user-select:none;user-select:none}.mce-fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.mce-fade.mce-in{opacity:1}.mce-tinymce{visibility:inherit !important;position:relative}.mce-fullscreen{border:0;padding:0;margin:0;overflow:hidden;height:100%;z-index:100}div.mce-fullscreen{position:fixed;top:0;left:0;width:100%;height:auto}.mce-tinymce{display:block;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mce-wordcount{position:absolute;top:0;right:0;padding:8px}div.mce-edit-area{background:#FFF;filter:none}.mce-statusbar{position:relative}.mce-statusbar .mce-container-body{position:relative}.mce-fullscreen .mce-resizehandle{display:none}.mce-charmap{border-collapse:collapse}.mce-charmap td{cursor:default;border:1px solid #9e9e9e;width:20px;height:20px;line-height:20px;text-align:center;vertical-align:middle;padding:2px}.mce-charmap td div{text-align:center}.mce-charmap td:hover{background:#d9d9d9}.mce-grid td.mce-grid-cell div{border:1px solid #d6d6d6;width:15px;height:15px;margin:0px;cursor:pointer}.mce-grid td.mce-grid-cell div:focus{border-color:#a1a1a1}.mce-grid td.mce-grid-cell div[disabled]{cursor:not-allowed}.mce-grid{border-spacing:2px;border-collapse:separate}.mce-grid a{display:block;border:1px solid transparent}.mce-grid a:hover,.mce-grid a:focus{border-color:#a1a1a1}.mce-grid-border{margin:0 4px 0 4px}.mce-grid-border a{border-color:#d6d6d6;width:13px;height:13px}.mce-grid-border a:hover,.mce-grid-border a.mce-active{border-color:#a1a1a1;background:#a0cca7}.mce-text-center{text-align:center}div.mce-tinymce-inline{width:100%;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-colorbtn-trans div{text-align:center;vertical-align:middle;font-weight:bold;font-size:20px;line-height:16px;color:#707070}.mce-monospace{font-family:"Courier New",Courier,monospace}.mce-toolbar-grp{padding:2px 0}.mce-toolbar-grp .mce-flow-layout-item{margin-bottom:0}.mce-rtl .mce-wordcount{left:0;right:auto}.mce-croprect-container{position:absolute;top:0;left:0}.mce-croprect-handle{position:absolute;top:0;left:0;width:20px;height:20px;border:2px solid white}.mce-croprect-handle-nw{border-width:2px 0 0 2px;margin:-2px 0 0 -2px;cursor:nw-resize;top:100px;left:100px}.mce-croprect-handle-ne{border-width:2px 2px 0 0;margin:-2px 0 0 -20px;cursor:ne-resize;top:100px;left:200px}.mce-croprect-handle-sw{border-width:0 0 2px 2px;margin:-20px 2px 0 -2px;cursor:sw-resize;top:200px;left:100px}.mce-croprect-handle-se{border-width:0 2px 2px 0;margin:-20px 0 0 -20px;cursor:se-resize;top:200px;left:200px}.mce-croprect-handle-move{position:absolute;cursor:move;border:0}.mce-croprect-block{opacity:.3;filter:alpha(opacity=30);zoom:1;position:absolute;background:black}.mce-croprect-handle:focus{border-color:#59a5e1}.mce-croprect-handle-move:focus{outline:1px solid #59a5e1}.mce-imagepanel{overflow:auto;background:black}.mce-imagepanel-bg{position:absolute;background:url('data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==')}.mce-imagepanel img{position:absolute}.mce-imagetool.mce-btn .mce-ico{display:block;width:20px;height:20px;text-align:center;line-height:20px;font-size:20px;padding:5px}.mce-arrow-up{margin-top:12px}.mce-arrow-down{margin-top:-12px}.mce-arrow:before,.mce-arrow:after{position:absolute;left:50%;display:block;width:0;height:0;border-style:solid;border-color:transparent;content:""}.mce-arrow.mce-arrow-up:before{top:-9px;border-bottom-color:#9e9e9e;border-width:0 9px 9px;margin-left:-9px}.mce-arrow.mce-arrow-down:before{bottom:-9px;border-top-color:#9e9e9e;border-width:9px 9px 0;margin-left:-9px}.mce-arrow.mce-arrow-up:after{top:-8px;border-bottom-color:#c0d29d;border-width:0 8px 8px;margin-left:-8px}.mce-arrow.mce-arrow-down:after{bottom:-8px;border-top-color:#c0d29d;border-width:8px 8px 0;margin-left:-8px}.mce-arrow.mce-arrow-left:before,.mce-arrow.mce-arrow-left:after{margin:0}.mce-arrow.mce-arrow-left:before{left:8px}.mce-arrow.mce-arrow-left:after{left:9px}.mce-arrow.mce-arrow-right:before,.mce-arrow.mce-arrow-right:after{left:auto;margin:0}.mce-arrow.mce-arrow-right:before{right:8px}.mce-arrow.mce-arrow-right:after{right:9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left:before{left:-9px;top:50%;border-right-color:#9e9e9e;border-width:9px 9px 9px 0;margin-top:-9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left:after{left:-8px;top:50%;border-right-color:#c0d29d;border-width:8px 8px 8px 0;margin-top:-8px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left{margin-left:12px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right:before{right:-9px;top:50%;border-left-color:#9e9e9e;border-width:9px 0 9px 9px;margin-top:-9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right:after{right:-8px;top:50%;border-left-color:#c0d29d;border-width:8px 0 8px 8px;margin-top:-8px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right{margin-left:-14px}.mce-edit-aria-container>.mce-container-body{display:flex}.mce-edit-aria-container>.mce-container-body .mce-edit-area{flex:1}.mce-edit-aria-container>.mce-container-body .mce-sidebar>.mce-container-body{display:flex;align-items:stretch;height:100%}.mce-edit-aria-container>.mce-container-body .mce-sidebar-panel{min-width:250px;max-width:250px;position:relative}.mce-edit-aria-container>.mce-container-body .mce-sidebar-panel>.mce-container-body{position:absolute;width:100%;height:100%;overflow:auto;top:0;left:0}.mce-sidebar-toolbar{border:0 solid #9e9e9e;border-left-width:1px}.mce-sidebar-toolbar .mce-btn.mce-active,.mce-sidebar-toolbar .mce-btn.mce-active:hover{border:1px solid transparent;border-color:transparent;background-color:#1d855c}.mce-sidebar-toolbar .mce-btn.mce-active button,.mce-sidebar-toolbar .mce-btn.mce-active:hover button,.mce-sidebar-toolbar .mce-btn.mce-active button i,.mce-sidebar-toolbar .mce-btn.mce-active:hover button i{color:#fff;text-shadow:1px 1px #333}.mce-sidebar-panel{border:0 solid #9e9e9e;border-left-width:1px}.mce-container,.mce-container-body{display:block}.mce-autoscroll{overflow:hidden}.mce-scrollbar{position:absolute;width:7px;height:100%;top:2px;right:2px;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-scrollbar-h{top:auto;right:auto;left:2px;bottom:2px;width:100%;height:7px}.mce-scrollbar-thumb{position:absolute;background-color:#000;border:1px solid #888;border-color:rgba(85,85,85,0.6);width:5px;height:100%;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.mce-scrollbar-h .mce-scrollbar-thumb{width:100%;height:5px}.mce-scrollbar:hover,.mce-scrollbar.mce-active{background-color:#AAA;opacity:.6;filter:alpha(opacity=60);zoom:1;-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.mce-scroll{position:relative}.mce-panel{border:0 solid #b9c89d;border:0 solid #9e9e9e;background-color:#c0d29d}.mce-floatpanel{position:absolute;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2)}.mce-floatpanel.mce-fixed{position:fixed}.mce-floatpanel .mce-arrow,.mce-floatpanel .mce-arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.mce-floatpanel .mce-arrow{border-width:11px}.mce-floatpanel .mce-arrow:after{border-width:10px;content:""}.mce-floatpanel.mce-popover{filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);top:0;left:0;background:#fff;border:1px solid #9e9e9e;border:1px solid rgba(0,0,0,0.25)}.mce-floatpanel.mce-popover.mce-bottom{margin-top:10px;*margin-top:0}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#9e9e9e;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.mce-floatpanel.mce-popover.mce-bottom.mce-start{margin-left:-22px}.mce-floatpanel.mce-popover.mce-bottom.mce-start>.mce-arrow{left:20px}.mce-floatpanel.mce-popover.mce-bottom.mce-end{margin-left:22px}.mce-floatpanel.mce-popover.mce-bottom.mce-end>.mce-arrow{right:10px;left:auto}.mce-fullscreen{border:0;padding:0;margin:0;overflow:hidden;height:100%}div.mce-fullscreen{position:fixed;top:0;left:0}#mce-modal-block{opacity:0;filter:alpha(opacity=0);zoom:1;position:fixed;left:0;top:0;width:100%;height:100%;background:#000}#mce-modal-block.mce-in{opacity:.3;filter:alpha(opacity=30);zoom:1}.mce-window-move{cursor:move}.mce-window{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;background:#fff;position:fixed;top:0;left:0;opacity:0;transform:scale(.1);transition:transform 100ms ease-in,opacity 150ms ease-in}.mce-window.mce-in{transform:scale(1);opacity:1}.mce-window-head{padding:9px 15px;border-bottom:1px solid #c4c4c4;position:relative}.mce-window-head .mce-close{position:absolute;right:0;top:0;height:38px;width:38px;text-align:center;cursor:pointer}.mce-window-head .mce-close i{color:#858585}.mce-close:hover i{color:#adadad}.mce-window-head .mce-title{line-height:20px;font-size:20px;font-weight:bold;text-rendering:optimizelegibility;padding-right:20px}.mce-window .mce-container-body{display:block}.mce-foot{display:block;background-color:#fff;border-top:1px solid #c4c4c4;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px}.mce-window-head .mce-dragh{position:absolute;top:0;left:0;cursor:move;width:90%;height:100%}.mce-window iframe{width:100%;height:100%}.mce-window.mce-fullscreen,.mce-window.mce-fullscreen .mce-foot{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.mce-window-body .mce-listbox{border-color:#bcd786}.mce-rtl .mce-window-head .mce-close{position:absolute;right:auto;left:15px}.mce-rtl .mce-window-head .mce-dragh{left:auto;right:0}.mce-rtl .mce-window-head .mce-title{direction:rtl;text-align:right}.mce-tooltip{position:absolute;padding:5px;opacity:.8;filter:alpha(opacity=80);zoom:1}.mce-tooltip-inner{font-size:11px;background-color:#000;color:#fff;max-width:200px;padding:5px 8px 4px 8px;text-align:center;white-space:normal}.mce-tooltip-inner{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.mce-tooltip-inner{-webkit-box-shadow:0 0 5px #000000;-moz-box-shadow:0 0 5px #000000;box-shadow:0 0 5px #000000}.mce-tooltip-arrow{position:absolute;width:0;height:0;line-height:0;border:5px dashed #000}.mce-tooltip-arrow-n{border-bottom-color:#000}.mce-tooltip-arrow-s{border-top-color:#000}.mce-tooltip-arrow-e{border-left-color:#000}.mce-tooltip-arrow-w{border-right-color:#000}.mce-tooltip-nw,.mce-tooltip-sw{margin-left:-14px}.mce-tooltip-ne,.mce-tooltip-se{margin-left:14px}.mce-tooltip-n .mce-tooltip-arrow{top:0px;left:50%;margin-left:-5px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-nw .mce-tooltip-arrow{top:0;left:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-ne .mce-tooltip-arrow{top:0;right:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-s .mce-tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-sw .mce-tooltip-arrow{bottom:0;left:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-se .mce-tooltip-arrow{bottom:0;right:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-e .mce-tooltip-arrow{right:0;top:50%;margin-top:-5px;border-left-style:solid;border-right:none;border-top-color:transparent;border-bottom-color:transparent}.mce-tooltip-w .mce-tooltip-arrow{left:0;top:50%;margin-top:-5px;border-right-style:solid;border-left:none;border-top-color:transparent;border-bottom-color:transparent}.mce-progress{display:inline-block;position:relative;height:20px}.mce-progress .mce-bar-container{display:inline-block;width:100px;height:100%;margin-right:8px;border:1px solid #ccc;overflow:hidden;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.mce-progress .mce-text{display:inline-block;margin-top:auto;margin-bottom:auto;font-size:14px;width:40px;color:#333}.mce-bar{display:block;width:0%;height:100%;background-color:#d7d7d7;-webkit-transition:width .2s ease;transition:width .2s ease}.mce-notification{position:absolute;background-color:#f0f0f0;padding:5px;margin-top:5px;border-width:1px;border-style:solid;border-color:#ccc;transition:transform 100ms ease-in,opacity 150ms ease-in;opacity:0}.mce-notification.mce-in{opacity:1}.mce-notification-success{background-color:#dff0d8;border-color:#d6e9c6}.mce-notification-info{background-color:#d9edf7;border-color:#779ecb}.mce-notification-warning{background-color:#fcf8e3;border-color:#faebcc}.mce-notification-error{background-color:#f2dede;border-color:#ebccd1}.mce-notification.mce-has-close{padding-right:15px}.mce-notification .mce-ico{margin-top:5px}.mce-notification-inner{display:inline-block;font-size:14px;margin:5px 8px 4px 8px;text-align:center;white-space:normal;color:#31708f}.mce-notification-inner a{text-decoration:underline;cursor:pointer}.mce-notification .mce-progress{margin-right:8px}.mce-notification .mce-progress .mce-text{margin-top:5px}.mce-notification *,.mce-notification .mce-progress .mce-text{color:#333}.mce-notification .mce-progress .mce-bar-container{border-color:#ccc}.mce-notification .mce-progress .mce-bar-container .mce-bar{background-color:#333}.mce-notification-success *,.mce-notification-success .mce-progress .mce-text{color:#3c763d}.mce-notification-success .mce-progress .mce-bar-container{border-color:#d6e9c6}.mce-notification-success .mce-progress .mce-bar-container .mce-bar{background-color:#3c763d}.mce-notification-info *,.mce-notification-info .mce-progress .mce-text{color:#31708f}.mce-notification-info .mce-progress .mce-bar-container{border-color:#779ecb}.mce-notification-info .mce-progress .mce-bar-container .mce-bar{background-color:#31708f}.mce-notification-warning *,.mce-notification-warning .mce-progress .mce-text{color:#8a6d3b}.mce-notification-warning .mce-progress .mce-bar-container{border-color:#faebcc}.mce-notification-warning .mce-progress .mce-bar-container .mce-bar{background-color:#8a6d3b}.mce-notification-error *,.mce-notification-error .mce-progress .mce-text{color:#a94442}.mce-notification-error .mce-progress .mce-bar-container{border-color:#ebccd1}.mce-notification-error .mce-progress .mce-bar-container .mce-bar{background-color:#a94442}.mce-notification .mce-close{position:absolute;top:6px;right:8px;font-size:20px;font-weight:bold;line-height:20px;color:#858585;cursor:pointer;height:20px;overflow:hidden}.mce-abs-layout{position:relative}body .mce-abs-layout-item,.mce-abs-end{position:absolute}.mce-abs-end{width:1px;height:1px}.mce-container-body.mce-abs-layout{overflow:hidden}.mce-btn{border:1px solid #9bc677;border-color:rgba(68,171,32,0.1) rgba(68,171,32,0.1) rgba(68,171,32,0.1) rgba(68,171,32,0.1);position:relative;text-shadow:0 1px 1px rgba(255,255,255,0.75);display:inline-block;*display:inline;*zoom:1;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e1e7d5}.mce-btn:hover,.mce-btn:focus{color:#313824;background-color:#d5dec4;border-color:#bcd786}.mce-btn.mce-disabled button,.mce-btn.mce-disabled:hover button{cursor:default;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-btn.mce-active,.mce-btn.mce-active:hover{background-color:#cfdab9;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);border-color:#bcd786}.mce-btn:active{background-color:#d3dcc0;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);border-color:#bcd786}.mce-btn button{padding:4px 10px;font-size:14px;*line-height:16px;cursor:pointer;color:#313824;text-align:center;overflow:visible;-webkit-appearance:none}.mce-btn button::-moz-focus-inner{border:0;padding:0}.mce-btn i{text-shadow:1px 1px #fff}.mce-primary.mce-btn-has-text{min-width:50px}.mce-primary{color:#fff;border:1px solid transparent;border-color:transparent;background-color:#1d855c}.mce-primary:hover,.mce-primary:focus{background-color:#1a7350;border-color:transparent}.mce-primary.mce-disabled button,.mce-primary.mce-disabled:hover button{cursor:default;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-primary.mce-active,.mce-primary.mce-active:hover,.mce-primary:not(.mce-disabled):active{background-color:#166245;-webkit-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05)}.mce-primary button,.mce-primary button i{color:#fff;text-shadow:1px 1px #333}.mce-btn .mce-txt{font-size:inherit;line-height:inherit;color:inherit}.mce-btn-large button{padding:9px 14px;font-size:16px;line-height:normal;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.mce-btn-large i{margin-top:2px}.mce-btn-small button{padding:1px 5px;font-size:12px;*padding-bottom:2px}.mce-btn-small i{line-height:20px;vertical-align:top;*line-height:18px}.mce-btn .mce-caret{margin-top:8px;margin-left:0}.mce-btn-small .mce-caret{margin-top:8px;margin-left:0}.mce-caret{display:inline-block;*display:inline;*zoom:1;width:0;height:0;vertical-align:top;border-top:4px solid #313824;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.mce-disabled .mce-caret{border-top-color:#aaa}.mce-caret.mce-up{border-bottom:4px solid #313824;border-top:0}.mce-btn-flat{border:0;background:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;filter:none}.mce-btn-flat:hover,.mce-btn-flat.mce-active,.mce-btn-flat:focus,.mce-btn-flat:active{border:0;background:#d1e3ac;filter:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-btn-has-text .mce-ico{padding-right:5px}.mce-rtl .mce-btn button{direction:rtl}.mce-btn-group .mce-btn{border-width:1px;margin:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;margin-left:2px}.mce-btn-group:not(:first-child){border-left:1px solid #c6dd99;padding-left:3px;margin-left:3px}.mce-btn-group .mce-first{-webkit-border-radius:3px 0 0 3px;-moz-border-radius:3px 0 0 3px;border-radius:3px 0 0 3px;margin-left:0}.mce-btn-group .mce-last{-webkit-border-radius:0 3px 3px 0;-moz-border-radius:0 3px 3px 0;border-radius:0 3px 3px 0}.mce-btn-group .mce-first.mce-last{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.mce-btn-group .mce-btn.mce-flow-layout-item{margin:0}.mce-rtl .mce-btn-group .mce-btn{margin-left:0;margin-right:2px}.mce-rtl .mce-btn-group .mce-first{margin-right:0}.mce-rtl .mce-btn-group:not(:first-child){border-left:none;border-right:1px solid #c6dd99;padding-right:4px;margin-right:4px}.mce-checkbox{cursor:pointer}i.mce-i-checkbox{margin:0 3px 0 0;border:1px solid #c5c5c5;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);background-color:#e1e7d5;text-indent:-10em;*font-size:0;*line-height:0;*text-indent:0;overflow:hidden}.mce-checked i.mce-i-checkbox{color:#313824;font-size:16px;line-height:16px;text-indent:0}.mce-checkbox:focus i.mce-i-checkbox,.mce-checkbox.mce-focus i.mce-i-checkbox{border:1px solid #459e3d;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(69, 158, 61, 0.85);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(69, 158, 61, 0.85);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(69, 158, 61, 0.85)}.mce-checkbox.mce-disabled .mce-label,.mce-checkbox.mce-disabled i.mce-i-checkbox{color:#889273}.mce-checkbox .mce-label{vertical-align:middle}.mce-rtl .mce-checkbox{direction:rtl;text-align:right}.mce-rtl i.mce-i-checkbox{margin:0 0 0 3px}.mce-combobox{position:relative;display:inline-block;*display:inline;*zoom:1;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);*height:32px}.mce-combobox input{border:1px solid #c5c5c5;border-right-color:#c5c5c5;height:28px}.mce-combobox.mce-disabled input{color:#adadad}.mce-combobox.mce-has-open input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px}.mce-combobox .mce-btn{border:1px solid #c5c5c5;border-left:0;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;margin:0}.mce-combobox button{padding-right:8px;padding-left:8px}.mce-combobox.mce-disabled .mce-btn button{cursor:default;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-combobox .mce-status{position:absolute;right:2px;top:50%;line-height:16px;margin-top:-8px;font-size:12px;width:15px;height:15px;text-align:center;cursor:pointer}.mce-combobox.mce-has-status input{padding-right:20px}.mce-combobox.mce-has-open .mce-status{right:37px}.mce-combobox .mce-status.mce-i-warning{color:#c09853}.mce-combobox .mce-status.mce-i-checkmark{color:#468847}.mce-menu.mce-combobox-menu{border-top:0;margin-top:0;max-height:200px}.mce-menu.mce-combobox-menu .mce-menu-item{padding:4px 6px 4px 4px;font-size:11px}.mce-menu.mce-combobox-menu .mce-menu-item-sep{padding:0}.mce-menu.mce-combobox-menu .mce-text{font-size:11px}.mce-menu.mce-combobox-menu .mce-menu-item-link,.mce-menu.mce-combobox-menu .mce-menu-item-link b{font-size:11px}.mce-menu.mce-combobox-menu .mce-text b{font-size:11px}.mce-colorbox i{border:1px solid #c5c5c5;width:14px;height:14px}.mce-colorbutton .mce-ico{position:relative}.mce-colorbutton-grid{margin:4px}.mce-colorbutton button{padding-right:6px;padding-left:6px}.mce-colorbutton .mce-preview{padding-right:3px;display:block;position:absolute;left:50%;top:50%;margin-left:-17px;margin-top:7px;background:gray;width:13px;height:2px;overflow:hidden}.mce-colorbutton.mce-btn-small .mce-preview{margin-left:-16px;padding-right:0;width:16px}.mce-colorbutton .mce-open{padding-left:4px;padding-right:4px;border-left:1px solid transparent}.mce-colorbutton:hover .mce-open{border-color:#bcd786}.mce-colorbutton.mce-btn-small .mce-open{padding:0 3px 0 3px}.mce-rtl .mce-colorbutton{direction:rtl}.mce-rtl .mce-colorbutton .mce-preview{margin-left:0;padding-right:0;padding-left:3px}.mce-rtl .mce-colorbutton.mce-btn-small .mce-preview{margin-left:0;padding-right:0;padding-left:2px}.mce-rtl .mce-colorbutton .mce-open{padding-left:4px;padding-right:4px;border-left:0}.mce-colorpicker{position:relative;width:250px;height:220px}.mce-colorpicker-sv{position:absolute;top:0;left:0;width:90%;height:100%;border:1px solid #c5c5c5;cursor:crosshair;overflow:hidden}.mce-colorpicker-h-chunk{width:100%}.mce-colorpicker-overlay1,.mce-colorpicker-overlay2{width:100%;height:100%;position:absolute;top:0;left:0}.mce-colorpicker-overlay1{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr='#ffffff', endColorstr='#00ffffff');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr='#ffffff', endColorstr='#00ffffff')";background:linear-gradient(to right, #fff, rgba(255,255,255,0))}.mce-colorpicker-overlay2{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#00000000', endColorstr='#000000');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#00000000', endColorstr='#000000')";background:linear-gradient(to bottom, rgba(0,0,0,0), #000)}.mce-colorpicker-selector1{background:none;position:absolute;width:12px;height:12px;margin:-8px 0 0 -8px;border:1px solid black;border-radius:50%}.mce-colorpicker-selector2{position:absolute;width:10px;height:10px;border:1px solid white;border-radius:50%}.mce-colorpicker-h{position:absolute;top:0;right:0;width:6.5%;height:100%;border:1px solid #c5c5c5;cursor:crosshair}.mce-colorpicker-h-marker{margin-top:-4px;position:absolute;top:0;left:-1px;width:100%;border:1px solid #333;background:#fff;height:4px;z-index:100}.mce-path{display:inline-block;*display:inline;*zoom:1;padding:8px;white-space:normal}.mce-path .mce-txt{display:inline-block;padding-right:3px}.mce-path .mce-path-body{display:inline-block}.mce-path-item{display:inline-block;*display:inline;*zoom:1;cursor:pointer;color:#333}.mce-path-item:hover{text-decoration:underline}.mce-path-item:focus{background:#666;color:#fff}.mce-path .mce-divider{display:inline}.mce-disabled .mce-path-item{color:#aaa}.mce-rtl .mce-path{direction:rtl}.mce-fieldset{border:0 solid #9E9E9E;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.mce-fieldset>.mce-container-body{margin-top:-15px}.mce-fieldset-title{margin-left:5px;padding:0 5px 0 5px}.mce-fit-layout{display:inline-block;*display:inline;*zoom:1}.mce-fit-layout-item{position:absolute}.mce-flow-layout-item{display:inline-block;*display:inline;*zoom:1}.mce-flow-layout-item{margin:2px 0 2px 2px}.mce-flow-layout-item.mce-last{margin-right:2px}.mce-flow-layout{white-space:normal}.mce-tinymce-inline .mce-flow-layout{white-space:nowrap}.mce-rtl .mce-flow-layout{text-align:right;direction:rtl}.mce-rtl .mce-flow-layout-item{margin:2px 2px 2px 0}.mce-rtl .mce-flow-layout-item.mce-last{margin-left:2px}.mce-iframe{border:0 solid #9e9e9e;width:100%;height:100%}.mce-infobox{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 1px rgba(255,255,255,0.75);overflow:hidden;border:1px solid red}.mce-infobox div{display:block;margin:5px}.mce-infobox div button{position:absolute;top:50%;right:4px;cursor:pointer;margin-top:-8px;display:none}.mce-infobox div button:focus{outline:2px solid #bcd786}.mce-infobox.mce-has-help div{margin-right:25px}.mce-infobox.mce-has-help button{display:block}.mce-infobox.mce-success{background:#dff0d8;border-color:#d6e9c6}.mce-infobox.mce-success div{color:#3c763d}.mce-infobox.mce-warning{background:#fcf8e3;border-color:#faebcc}.mce-infobox.mce-warning div{color:#8a6d3b}.mce-infobox.mce-error{background:#f2dede;border-color:#ebccd1}.mce-infobox.mce-error div{color:#a94442}.mce-rtl .mce-infobox div{text-align:right;direction:rtl}.mce-label{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 1px rgba(255,255,255,0.75);overflow:hidden}.mce-label.mce-autoscroll{overflow:auto}.mce-label.mce-disabled{color:#aaa}.mce-label.mce-multiline{white-space:pre-wrap}.mce-label.mce-success{color:#468847}.mce-label.mce-warning{color:#c09853}.mce-label.mce-error{color:#b94a48}.mce-rtl .mce-label{text-align:right;direction:rtl}.mce-menubar .mce-menubtn{border-color:transparent;background:transparent;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;filter:none}.mce-menubar .mce-menubtn button{color:#333}.mce-menubar{border:1px solid #acb39e}.mce-menubar .mce-menubtn button span{color:#333}.mce-menubar .mce-caret{border-top-color:#333}.mce-menubar .mce-menubtn:hover,.mce-menubar .mce-menubtn.mce-active,.mce-menubar .mce-menubtn:focus{border-color:#bcd786;background:#e0ebcb;filter:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.mce-menubtn button{color:#313824}.mce-menubtn.mce-btn-small span{font-size:12px}.mce-menubtn.mce-fixed-width span{display:inline-block;overflow-x:hidden;text-overflow:ellipsis;width:90px}.mce-menubtn.mce-fixed-width.mce-btn-small span{width:70px}.mce-menubtn .mce-caret{*margin-top:6px}.mce-rtl .mce-menubtn button{direction:rtl;text-align:right}.mce-menu-item{display:block;padding:6px 15px 6px 12px;clear:both;font-weight:normal;line-height:20px;color:#4d2f2f;white-space:nowrap;cursor:pointer;line-height:normal;border-left:4px solid transparent;margin-bottom:1px}.mce-menu-item .mce-ico,.mce-menu-item .mce-text{color:#4d2f2f}.mce-menu-item.mce-disabled .mce-text,.mce-menu-item.mce-disabled .mce-ico{color:#a5a08d}.mce-menu-item:hover .mce-text,.mce-menu-item.mce-selected .mce-text,.mce-menu-item:focus .mce-text{color:#fff}.mce-menu-item:hover .mce-ico,.mce-menu-item.mce-selected .mce-ico,.mce-menu-item:focus .mce-ico{color:#fff}.mce-menu-item.mce-disabled:hover{background:#ccc}.mce-menu-shortcut{display:inline-block;color:#a5a08d}.mce-menu-shortcut{display:inline-block;*display:inline;*zoom:1;padding:0 15px 0 20px}.mce-menu-item:hover .mce-menu-shortcut,.mce-menu-item.mce-selected .mce-menu-shortcut,.mce-menu-item:focus .mce-menu-shortcut{color:#fff}.mce-menu-item .mce-caret{margin-top:4px;*margin-top:3px;margin-right:6px;border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:4px solid #4d2f2f}.mce-menu-item.mce-selected .mce-caret,.mce-menu-item:focus .mce-caret,.mce-menu-item:hover .mce-caret{border-left-color:#fff}.mce-menu-align .mce-menu-shortcut{*margin-top:-2px}.mce-menu-align .mce-menu-shortcut,.mce-menu-align .mce-caret{position:absolute;right:0}.mce-menu-item.mce-active i{visibility:visible}.mce-menu-item-normal.mce-active{background-color:#a0cca7}.mce-menu-item-preview.mce-active{border-left:5px solid #aaa}.mce-menu-item-normal.mce-active .mce-text{color:#333}.mce-menu-item-normal.mce-active:hover .mce-text,.mce-menu-item-normal.mce-active:hover .mce-ico{color:#fff}.mce-menu-item-normal.mce-active:focus .mce-text,.mce-menu-item-normal.mce-active:focus .mce-ico{color:#fff}.mce-menu-item:hover,.mce-menu-item.mce-selected,.mce-menu-item:focus{text-decoration:none;color:#fff;background-color:#4e936b}.mce-menu-item-link{color:#093;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mce-menu-item-link b{color:#093}.mce-menu-item-ellipsis{display:block;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mce-menu-item:hover *,.mce-menu-item.mce-selected *,.mce-menu-item:focus *{color:#fff}div.mce-menu .mce-menu-item-sep,.mce-menu-item-sep:hover{border:0;padding:0;height:1px;margin:9px 1px;overflow:hidden;background:#13630c;border-bottom:1px solid #fff;cursor:default;filter:none}div.mce-menu .mce-menu-item b{font-weight:bold}.mce-menu-item-indent-1{padding-left:20px}.mce-menu-item-indent-2{padding-left:35px}.mce-menu-item-indent-2{padding-left:35px}.mce-menu-item-indent-3{padding-left:40px}.mce-menu-item-indent-4{padding-left:45px}.mce-menu-item-indent-5{padding-left:50px}.mce-menu-item-indent-6{padding-left:55px}.mce-menu.mce-rtl{direction:rtl}.mce-rtl .mce-menu-item{text-align:right;direction:rtl;padding:6px 12px 6px 15px}.mce-menu-align.mce-rtl .mce-menu-shortcut,.mce-menu-align.mce-rtl .mce-caret{right:auto;left:0}.mce-rtl .mce-menu-item .mce-caret{margin-left:6px;margin-right:0;border-right:4px solid #4d2f2f;border-left:0}.mce-rtl .mce-menu-item.mce-selected .mce-caret,.mce-rtl .mce-menu-item:focus .mce-caret,.mce-rtl .mce-menu-item:hover .mce-caret{border-left-color:transparent;border-right-color:#fff}.mce-throbber{position:absolute;top:0;left:0;width:100%;height:100%;opacity:.6;filter:alpha(opacity=60);zoom:1;background:#fff url('img/loader.gif') no-repeat center center}.mce-throbber-inline{position:static;height:50px}.mce-menu .mce-throbber-inline{height:25px;background-size:contain}.mce-menu{position:absolute;left:0;top:0;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;z-index:1000;padding:5px 0 5px 0;margin:-1px 0 0;min-width:160px;background:#e0ebcb;border:1px solid #77b269;border:1px solid rgba(9,130,28,0.2);z-index:1002;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);max-height:400px;overflow:auto;overflow-x:hidden}.mce-menu i{display:none}.mce-menu-has-icons i{display:inline-block;*display:inline}.mce-menu-sub-tr-tl{margin:-6px 0 0 -1px}.mce-menu-sub-br-bl{margin:6px 0 0 -1px}.mce-menu-sub-tl-tr{margin:-6px 0 0 1px}.mce-menu-sub-bl-br{margin:6px 0 0 1px}.mce-listbox button{text-align:left;padding-right:20px;position:relative}.mce-listbox .mce-caret{position:absolute;margin-top:-2px;right:8px;top:50%}.mce-rtl .mce-listbox .mce-caret{right:auto;left:8px}.mce-rtl .mce-listbox button{padding-right:10px;padding-left:20px}.mce-container-body .mce-resizehandle{position:absolute;right:0;bottom:0;width:16px;height:16px;visibility:visible;cursor:s-resize;margin:0}.mce-container-body .mce-resizehandle-both{cursor:se-resize}i.mce-i-resize{color:#333}.mce-selectbox{background:#fff;border:1px solid #c5c5c5}.mce-slider{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;border:1px solid #aaa;background:#eee;width:100px;height:10px;position:relative;display:block}.mce-slider.mce-vertical{width:10px;height:100px}.mce-slider-handle{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;border:1px solid #bbb;background:#ddd;display:block;width:13px;height:13px;position:absolute;top:0;left:0;margin-left:-1px;margin-top:-2px}.mce-slider-handle:focus{background:#bbb}.mce-spacer{visibility:hidden}.mce-splitbtn .mce-open{border-left:1px solid transparent}.mce-splitbtn:hover .mce-open{border-left-color:#bcd786}.mce-splitbtn button{padding-right:6px;padding-left:6px}.mce-splitbtn .mce-open{padding-right:4px;padding-left:4px}.mce-splitbtn .mce-open.mce-active{background-color:#cfdab9;outline:1px solid #bcd786}.mce-splitbtn.mce-btn-small .mce-open{padding:0 3px 0 3px}.mce-rtl .mce-splitbtn{direction:rtl;text-align:right}.mce-rtl .mce-splitbtn button{padding-right:4px;padding-left:4px}.mce-rtl .mce-splitbtn .mce-open{border-left:0}.mce-stack-layout-item{display:block}.mce-tabs{display:block;border-bottom:1px solid #c5c5c5}.mce-tabs,.mce-tabs+.mce-container-body{background:#fff}.mce-tab{display:inline-block;*display:inline;*zoom:1;border:1px solid #c5c5c5;border-width:0 1px 0 0;background:#e3e3e3;padding:8px;text-shadow:0 1px 1px rgba(255,255,255,0.75);height:13px;cursor:pointer}.mce-tab:hover{background:#fdfdfd}.mce-tab.mce-active{background:#fdfdfd;border-bottom-color:transparent;margin-bottom:-1px;height:14px}.mce-rtl .mce-tabs{text-align:right;direction:rtl}.mce-rtl .mce-tab{border-width:0 0 0 1px}.mce-textbox{background:#fff;border:1px solid #c5c5c5;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);display:inline-block;-webkit-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;height:28px;resize:none;padding:0 4px 0 4px;white-space:pre-wrap;*white-space:pre;color:#333}.mce-textbox:focus,.mce-textbox.mce-focus{border-color:#59a5e1;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(89, 165, 225, 0.85);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(89, 165, 225, 0.85);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(89, 165, 225, 0.85)}.mce-placeholder .mce-textbox{color:#aaa}.mce-textbox.mce-multiline{padding:4px;height:auto}.mce-textbox.mce-disabled{color:#adadad}.mce-rtl .mce-textbox{text-align:right;direction:rtl}@font-face{font-family:'tinymce';src:url('fonts/tinymce.eot');src:url('fonts/tinymce.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce.woff') format('woff'),url('fonts/tinymce.ttf') format('truetype'),url('fonts/tinymce.svg#tinymce') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'tinymce-small';src:url('fonts/tinymce-small.eot');src:url('fonts/tinymce-small.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce-small.woff') format('woff'),url('fonts/tinymce-small.ttf') format('truetype'),url('fonts/tinymce-small.svg#tinymce') format('svg');font-weight:normal;font-style:normal}.mce-ico{font-family:'tinymce',Arial;font-style:normal;font-weight:normal;font-variant:normal;font-size:16px;line-height:16px;speak:none;vertical-align:text-top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;background:transparent center center;background-size:cover;width:16px;height:16px;color:#313824}.mce-btn-small .mce-ico{font-family:'tinymce-small',Arial}.mce-i-save:before{content:"\e000"}.mce-i-newdocument:before{content:"\e001"}.mce-i-fullpage:before{content:"\e002"}.mce-i-alignleft:before{content:"\e003"}.mce-i-aligncenter:before{content:"\e004"}.mce-i-alignright:before{content:"\e005"}.mce-i-alignjustify:before{content:"\e006"}.mce-i-alignnone:before{content:"\e003"}.mce-i-cut:before{content:"\e007"}.mce-i-paste:before{content:"\e008"}.mce-i-searchreplace:before{content:"\e009"}.mce-i-bullist:before{content:"\e00a"}.mce-i-numlist:before{content:"\e00b"}.mce-i-indent:before{content:"\e00c"}.mce-i-outdent:before{content:"\e00d"}.mce-i-blockquote:before{content:"\e00e"}.mce-i-undo:before{content:"\e00f"}.mce-i-redo:before{content:"\e010"}.mce-i-link:before{content:"\e011"}.mce-i-unlink:before{content:"\e012"}.mce-i-anchor:before{content:"\e013"}.mce-i-image:before{content:"\e014"}.mce-i-media:before{content:"\e015"}.mce-i-help:before{content:"\e016"}.mce-i-code:before{content:"\e017"}.mce-i-insertdatetime:before{content:"\e018"}.mce-i-preview:before{content:"\e019"}.mce-i-forecolor:before{content:"\e01a"}.mce-i-backcolor:before{content:"\e01a"}.mce-i-table:before{content:"\e01b"}.mce-i-hr:before{content:"\e01c"}.mce-i-removeformat:before{content:"\e01d"}.mce-i-subscript:before{content:"\e01e"}.mce-i-superscript:before{content:"\e01f"}.mce-i-charmap:before{content:"\e020"}.mce-i-emoticons:before{content:"\e021"}.mce-i-print:before{content:"\e022"}.mce-i-fullscreen:before{content:"\e023"}.mce-i-spellchecker:before{content:"\e024"}.mce-i-nonbreaking:before{content:"\e025"}.mce-i-template:before{content:"\e026"}.mce-i-pagebreak:before{content:"\e027"}.mce-i-restoredraft:before{content:"\e028"}.mce-i-bold:before{content:"\e02a"}.mce-i-italic:before{content:"\e02b"}.mce-i-underline:before{content:"\e02c"}.mce-i-strikethrough:before{content:"\e02d"}.mce-i-visualchars:before{content:"\e02e"}.mce-i-visualblocks:before{content:"\e02e"}.mce-i-ltr:before{content:"\e02f"}.mce-i-rtl:before{content:"\e030"}.mce-i-copy:before{content:"\e031"}.mce-i-resize:before{content:"\e032"}.mce-i-browse:before{content:"\e034"}.mce-i-pastetext:before{content:"\e035"}.mce-i-rotateleft:before{content:"\eaa8"}.mce-i-rotateright:before{content:"\eaa9"}.mce-i-crop:before{content:"\ee78"}.mce-i-editimage:before{content:"\e915"}.mce-i-options:before{content:"\ec6a"}.mce-i-flipv:before{content:"\eaaa"}.mce-i-fliph:before{content:"\eaac"}.mce-i-zoomin:before{content:"\eb35"}.mce-i-zoomout:before{content:"\eb36"}.mce-i-sun:before{content:"\eccc"}.mce-i-moon:before{content:"\eccd"}.mce-i-arrowleft:before{content:"\edc0"}.mce-i-arrowright:before{content:"\e93c"}.mce-i-drop:before{content:"\e935"}.mce-i-contrast:before{content:"\ecd4"}.mce-i-sharpen:before{content:"\eba7"}.mce-i-resize2:before{content:"\edf9"}.mce-i-orientation:before{content:"\e601"}.mce-i-invert:before{content:"\e602"}.mce-i-gamma:before{content:"\e600"}.mce-i-remove:before{content:"\ed6a"}.mce-i-tablerowprops:before{content:"\e604"}.mce-i-tablecellprops:before{content:"\e605"}.mce-i-table2:before{content:"\e606"}.mce-i-tablemergecells:before{content:"\e607"}.mce-i-tableinsertcolbefore:before{content:"\e608"}.mce-i-tableinsertcolafter:before{content:"\e609"}.mce-i-tableinsertrowbefore:before{content:"\e60a"}.mce-i-tableinsertrowafter:before{content:"\e60b"}.mce-i-tablesplitcells:before{content:"\e60d"}.mce-i-tabledelete:before{content:"\e60e"}.mce-i-tableleftheader:before{content:"\e62a"}.mce-i-tabletopheader:before{content:"\e62b"}.mce-i-tabledeleterow:before{content:"\e800"}.mce-i-tabledeletecol:before{content:"\e801"}.mce-i-codesample:before{content:"\e603"}.mce-i-fill:before{content:"\e902"}.mce-i-borderwidth:before{content:"\e903"}.mce-i-line:before{content:"\e904"}.mce-i-count:before{content:"\e905"}.mce-i-translate:before{content:"\e907"}.mce-i-drag:before{content:"\e908"}.mce-i-home:before{content:"\e90b"}.mce-i-upload:before{content:"\e914"}.mce-i-bubble:before{content:"\e91c"}.mce-i-user:before{content:"\e91d"}.mce-i-lock:before{content:"\e926"}.mce-i-unlock:before{content:"\e927"}.mce-i-settings:before{content:"\e928"}.mce-i-remove2:before{content:"\e92a"}.mce-i-menu:before{content:"\e92d"}.mce-i-warning:before{content:"\e930"}.mce-i-question:before{content:"\e931"}.mce-i-pluscircle:before{content:"\e932"}.mce-i-info:before{content:"\e933"}.mce-i-notice:before{content:"\e934"}.mce-i-arrowup:before{content:"\e93b"}.mce-i-arrowdown:before{content:"\e93d"}.mce-i-arrowup2:before{content:"\e93f"}.mce-i-arrowdown2:before{content:"\e940"}.mce-i-menu2:before{content:"\e941"}.mce-i-newtab:before{content:"\e961"}.mce-i-a11y:before{content:"\e900"}.mce-i-plus:before{content:"\e93a"}.mce-i-insert:before{content:"\e93a"}.mce-i-minus:before{content:"\e939"}.mce-i-books:before{content:"\e911"}.mce-i-reload:before{content:"\e906"}.mce-i-toc:before{content:"\e901"}.mce-i-checkmark:before{content:"\e033"}.mce-i-checkbox:before,.mce-i-selected:before{content:"\e033"}.mce-i-insert{font-size:14px}.mce-i-selected{visibility:hidden}i.mce-i-backcolor{text-shadow:none;background:#bbb}

--- /dev/null
+++ b/tinymce4/js/tinymce/skins/lightgray/content.inline.min.css
@@ -1,1 +1,1 @@
-
+.mce-content-body .mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:black;font-family:Arial;font-size:11px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;line-height:normal;font-weight:normal;text-align:left;-webkit-tap-highlight-color:transparent;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-object{border:1px dotted #3A3A3A;background:#D5D5D5 url(img/object.gif) no-repeat center}.mce-preview-object{display:inline-block;position:relative;margin:0 2px 0 2px;line-height:0;border:1px solid gray}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-preview-object .mce-shim{position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}figure.align-left{float:left}figure.align-right{float:right}figure.image.align-center{display:table;margin-left:auto;margin-right:auto}figure.image{display:inline-block;border:1px solid gray;margin:0 2px 0 1px;background:#f5f2f0}figure.image img{margin:8px 8px 0 8px}figure.image figcaption{margin:6px 8px 6px 8px;text-align:center}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-pagebreak{cursor:default;display:block;border:0;width:100%;height:5px;border:1px dashed #666;margin-top:15px;page-break-before:always}@media print{.mce-pagebreak{border:0}}.mce-item-anchor{cursor:default;display:inline-block;-webkit-user-select:all;-webkit-user-modify:read-only;-moz-user-select:all;-moz-user-modify:read-only;user-select:all;user-modify:read-only;width:9px !important;height:9px !important;border:1px dotted #3A3A3A;background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-nbsp,.mce-shy{background:#AAA}.mce-shy::after{content:'-'}hr{cursor:default}.mce-match-marker{background:#AAA;color:#fff}.mce-match-marker-selected{background:#3399ff;color:#fff}.mce-spellchecker-word{border-bottom:2px solid #F00;cursor:default}.mce-spellchecker-grammar{border-bottom:2px solid #008000;cursor:default}.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption{border:1px dashed #BBB}td[data-mce-selected],th[data-mce-selected]{background-color:#3399ff !important}.mce-edit-focus{outline:1px dotted #333}.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus{outline:2px solid #2d8ac7}.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover{outline:2px solid #7ACAFF}.mce-content-body *[contentEditable=false][data-mce-selected]{outline:2px solid #2d8ac7}.mce-resize-bar-dragging{background-color:blue;opacity:.25;filter:alpha(opacity=25);zoom:1}

--- /dev/null
+++ b/tinymce4/js/tinymce/skins/lightgray/content.min.css
@@ -1,1 +1,1 @@
-
+body{background-color:#FFFFFF;color:#000000;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:14px;scrollbar-3dlight-color:#F0F0EE;scrollbar-arrow-color:#676662;scrollbar-base-color:#F0F0EE;scrollbar-darkshadow-color:#DDDDDD;scrollbar-face-color:#E0E0DD;scrollbar-highlight-color:#F0F0EE;scrollbar-shadow-color:#F0F0EE;scrollbar-track-color:#F5F5F5}td,th{font-family:Verdana,Arial,Helvetica,sans-serif;font-size:14px}.mce-content-body .mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:black;font-family:Arial;font-size:11px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;line-height:normal;font-weight:normal;text-align:left;-webkit-tap-highlight-color:transparent;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-object{border:1px dotted #3A3A3A;background:#D5D5D5 url(img/object.gif) no-repeat center}.mce-preview-object{display:inline-block;position:relative;margin:0 2px 0 2px;line-height:0;border:1px solid gray}.mce-preview-object[data-mce-selected="2"] .mce-shim{display:none}.mce-preview-object .mce-shim{position:absolute;top:0;left:0;width:100%;height:100%;background:url(data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7)}figure.align-left{float:left}figure.align-right{float:right}figure.image.align-center{display:table;margin-left:auto;margin-right:auto}figure.image{display:inline-block;border:1px solid gray;margin:0 2px 0 1px;background:#f5f2f0}figure.image img{margin:8px 8px 0 8px}figure.image figcaption{margin:6px 8px 6px 8px;text-align:center}.mce-toc{border:1px solid gray}.mce-toc h2{margin:4px}.mce-toc li{list-style-type:none}.mce-pagebreak{cursor:default;display:block;border:0;width:100%;height:5px;border:1px dashed #666;margin-top:15px;page-break-before:always}@media print{.mce-pagebreak{border:0}}.mce-item-anchor{cursor:default;display:inline-block;-webkit-user-select:all;-webkit-user-modify:read-only;-moz-user-select:all;-moz-user-modify:read-only;user-select:all;user-modify:read-only;width:9px !important;height:9px !important;border:1px dotted #3A3A3A;background:#D5D5D5 url(img/anchor.gif) no-repeat center}.mce-nbsp,.mce-shy{background:#AAA}.mce-shy::after{content:'-'}hr{cursor:default}.mce-match-marker{background:#AAA;color:#fff}.mce-match-marker-selected{background:#3399ff;color:#fff}.mce-spellchecker-word{border-bottom:2px solid #F00;cursor:default}.mce-spellchecker-grammar{border-bottom:2px solid #008000;cursor:default}.mce-item-table,.mce-item-table td,.mce-item-table th,.mce-item-table caption{border:1px dashed #BBB}td[data-mce-selected],th[data-mce-selected]{background-color:#3399ff !important}.mce-edit-focus{outline:1px dotted #333}.mce-content-body *[contentEditable=false] *[contentEditable=true]:focus{outline:2px solid #2d8ac7}.mce-content-body *[contentEditable=false] *[contentEditable=true]:hover{outline:2px solid #7ACAFF}.mce-content-body *[contentEditable=false][data-mce-selected]{outline:2px solid #2d8ac7}.mce-resize-bar-dragging{background-color:blue;opacity:.25;filter:alpha(opacity=25);zoom:1}

 Binary files /dev/null and b/tinymce4/js/tinymce/skins/lightgray/fonts/tinymce-small.eot differ
--- /dev/null
+++ b/tinymce4/js/tinymce/skins/lightgray/fonts/tinymce-small.svg
@@ -1,1 +1,63 @@
-
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by IcoMoon</metadata>
+<defs>
+<font id="tinymce-small" horiz-adv-x="1024">
+<font-face units-per-em="1024" ascent="960" descent="-64" />
+<missing-glyph horiz-adv-x="1024" />
+<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
+<glyph unicode="&#xe000;" glyph-name="save" d="M960 80v591.938l-223.938 224.062h-592.062c-44.182 0-80-35.816-80-80v-736c0-44.184 35.818-80 80-80h736c44.184 0 80 35.816 80 80zM576 768h64v-192h-64v192zM704 128h-384v255.882c0.034 0.042 0.076 0.082 0.116 0.118h383.77c0.040-0.036 0.082-0.076 0.116-0.118l-0.002-255.882zM832 128h-64v256c0 35.2-28.8 64-64 64h-384c-35.2 0-64-28.8-64-64v-256h-64v640h64v-192c0-35.2 28.8-64 64-64h320c35.2 0 64 28.8 64 64v171.010l128-128.072v-490.938z" />
+<glyph unicode="&#xe001;" glyph-name="newdocument" d="M850.746 717.254l-133.492 133.49c-24.888 24.892-74.054 45.256-109.254 45.256h-416c-35.2 0-64-28.8-64-64v-768c0-35.2 28.8-64 64-64h640c35.2 0 64 28.8 64 64v544c0 35.2-20.366 84.364-45.254 109.254zM805.49 672.002c6.792-6.796 13.792-19.162 18.894-32.002h-184.384v184.386c12.84-5.1 25.204-12.1 32-18.896l133.49-133.488zM831.884 64h-639.77c-0.040 0.034-0.082 0.076-0.114 0.116v767.77c0.034 0.040 0.076 0.082 0.114 0.114h383.886v-256h256v-511.884c-0.034-0.040-0.076-0.082-0.116-0.116z" />
+<glyph unicode="&#xe002;" glyph-name="fullpage" d="M1024 367.542v160.916l-159.144 15.914c-8.186 30.042-20.088 58.548-35.21 84.98l104.596 127.838-113.052 113.050-127.836-104.596c-26.434 15.124-54.942 27.026-84.982 35.208l-15.914 159.148h-160.916l-15.914-159.146c-30.042-8.186-58.548-20.086-84.98-35.208l-127.838 104.594-113.050-113.050 104.596-127.836c-15.124-26.432-27.026-54.94-35.21-84.98l-159.146-15.916v-160.916l159.146-15.914c8.186-30.042 20.086-58.548 35.21-84.982l-104.596-127.836 113.048-113.048 127.838 104.596c26.432-15.124 54.94-27.028 84.98-35.21l15.916-159.148h160.916l15.914 159.144c30.042 8.186 58.548 20.088 84.982 35.21l127.836-104.596 113.048 113.048-104.596 127.836c15.124 26.434 27.028 54.942 35.21 84.98l159.148 15.92zM704 384l-128-128h-128l-128 128v128l128 128h128l128-128v-128z" />
+<glyph unicode="&#xe003;" glyph-name="alignleft" d="M64 768h896v-128h-896zM64 384h896v-128h-896zM64 576h576v-128h-576zM64 192h576v-128h-576z" />
+<glyph unicode="&#xe004;" glyph-name="aligncenter" d="M64 768h896v-128h-896zM64 384h896v-128h-896zM256 576h512v-128h-512zM256 192h512v-128h-512z" />
+<glyph unicode="&#xe005;" glyph-name="alignright" d="M64 768h896v-128h-896zM64 384h896v-128h-896zM384 576h576v-128h-576zM384 192h576v-128h-576z" />
+<glyph unicode="&#xe006;" glyph-name="alignjustify" d="M64 768h896v-128h-896zM64 384h896v-128h-896zM64 576h896v-128h-896zM64 192h896v-128h-896z" />
+<glyph unicode="&#xe007;" glyph-name="cut" d="M864.408 289.868c-46.47 46.47-106.938 68.004-161.082 62.806l-63.326 63.326 192 192c0 0 128 128 0 256l-320-320-320 320c-128-128 0-256 0-256l192-192-63.326-63.326c-54.144 5.198-114.61-16.338-161.080-62.806-74.98-74.98-85.112-186.418-22.626-248.9 62.482-62.482 173.92-52.354 248.9 22.626 46.47 46.468 68.002 106.938 62.806 161.080l63.326 63.326 63.328-63.328c-5.196-54.144 16.336-114.61 62.806-161.078 74.978-74.98 186.418-85.112 248.898-22.626 62.488 62.482 52.356 173.918-22.624 248.9zM353.124 201.422c-2.212-24.332-15.020-49.826-35.14-69.946-22.212-22.214-51.080-35.476-77.218-35.476-10.524 0-25.298 2.228-35.916 12.848-21.406 21.404-17.376 73.132 22.626 113.136 22.212 22.214 51.080 35.476 77.218 35.476 10.524 0 25.298-2.228 35.916-12.848 13.112-13.11 13.47-32.688 12.514-43.19zM512 352c-35.346 0-64 28.654-64 64s28.654 64 64 64 64-28.654 64-64-28.654-64-64-64zM819.152 108.848c-10.62-10.62-25.392-12.848-35.916-12.848-26.138 0-55.006 13.262-77.218 35.476-20.122 20.12-32.928 45.614-35.138 69.946-0.958 10.502-0.6 30.080 12.514 43.192 10.618 10.622 25.39 12.848 35.916 12.848 26.136 0 55.006-13.262 77.216-35.474 40.004-40.008 44.032-91.736 22.626-113.14z" />
+<glyph unicode="&#xe008;" glyph-name="paste" d="M704 576v160c0 17.6-14.4 32-32 32h-160v64c0 35.2-28.8 64-64 64h-128c-35.204 0-64-28.8-64-64v-64h-160c-17.602 0-32-14.4-32-32v-512c0-17.6 14.398-32 32-32h224v-192h384l192 192v384h-192zM320 831.886c0.034 0.038 0.072 0.078 0.114 0.114h127.768c0.042-0.036 0.082-0.076 0.118-0.114v-63.886h-128v63.886zM192 640v64h384v-64h-384zM704 90.51v101.49h101.49l-101.49-101.49zM832 256h-192v-192h-256v448h448v-256z" />
+<glyph unicode="&#xe009;" glyph-name="searchreplace" d="M888 576h-56v256h64v64h-320v-64h64v-256h-256v256h64v64h-320v-64h64v-256h-56c-39.6 0-72-32.4-72-72v-432c0-39.6 32.4-72 72-72h240c39.6 0 72 32.4 72 72v312h128v-312c0-39.6 32.4-72 72-72h240c39.6 0 72 32.4 72 72v432c0 39.6-32.4 72-72 72zM348 64h-184c-19.8 0-36 14.4-36 32s16.2 32 36 32h184c19.8 0 36-14.4 36-32s-16.2-32-36-32zM544 448h-64c-17.6 0-32 14.4-32 32s14.4 32 32 32h64c17.6 0 32-14.4 32-32s-14.4-32-32-32zM860 64h-184c-19.8 0-36 14.4-36 32s16.2 32 36 32h184c19.8 0 36-14.4 36-32s-16.2-32-36-32z" />
+<glyph unicode="&#xe00a;" glyph-name="bullist" d="M384 832h576v-128h-576zM384 512h576v-128h-576zM384 192h576v-128h-576zM128 768c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64zM128 448c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64zM128 128c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64z" />
+<glyph unicode="&#xe00b;" glyph-name="numlist" d="M384 832h576v-128h-576zM384 512h576v-128h-576zM384 192h576v-128h-576zM320 430v146h-64v320h-128v-64h64v-256h-64v-64h128v-50l-128-60v-146h128v-64h-128v-64h128v-64h-128v-64h192v320h-128v50z" />
+<glyph unicode="&#xe00c;" glyph-name="indent" d="M64 768h896v-128h-896zM384 384h576v-128h-576zM384 576h576v-128h-576zM64 192h896v-128h-896zM64 576l224-160-224-160z" />
+<glyph unicode="&#xe00d;" glyph-name="outdent" d="M64 768h896v-128h-896zM64 384h576v-128h-576zM64 576h576v-128h-576zM64 192h896v-128h-896zM960 576l-224-160 224-160z" />
+<glyph unicode="&#xe00e;" glyph-name="blockquote" d="M256.428 535.274c105.8 0 191.572-91.17 191.572-203.638 0-112.464-85.772-203.636-191.572-203.636-105.802 0-191.572 91.17-191.572 203.636l-0.856 29.092c0 224.93 171.54 407.272 383.144 407.272v-116.364c-73.1 0-141.826-30.26-193.516-85.204-9.954-10.578-19.034-21.834-27.224-33.656 9.784 1.64 19.806 2.498 30.024 2.498zM768.428 535.274c105.8 0 191.572-91.17 191.572-203.638 0-112.464-85.772-203.636-191.572-203.636-105.802 0-191.572 91.17-191.572 203.636l-0.856 29.092c0 224.93 171.54 407.272 383.144 407.272v-116.364c-73.1 0-141.826-30.26-193.516-85.204-9.956-10.578-19.036-21.834-27.224-33.656 9.784 1.64 19.806 2.498 30.024 2.498z" />
+<glyph unicode="&#xe00f;" glyph-name="undo" d="M704 0c59 199 134.906 455.266-256 446.096v-222.096l-336.002 336 336.002 336v-217.326c468.092 12.2 544-358.674 256-678.674z" />
+<glyph unicode="&#xe010;" glyph-name="redo" d="M576 678.674v217.326l336.002-336-336.002-336v222.096c-390.906 9.17-315-247.096-256-446.096-288 320-212.092 690.874 256 678.674z" />
+<glyph unicode="&#xe011;" glyph-name="unlink" d="M927.274 729.784l-133.49 133.488c-21.104 21.104-49.232 32.728-79.198 32.728s-58.094-11.624-79.196-32.726l-165.492-165.49c-43.668-43.668-43.668-114.724 0-158.392l2.746-2.746 67.882 67.882-2.746 2.746c-6.132 6.132-6.132 16.494 0 22.626l165.492 165.492c4.010 4.008 8.808 4.608 11.312 4.608s7.302-0.598 11.312-4.61l133.49-133.488c6.132-6.134 6.132-16.498 0.002-22.628l-165.494-165.494c-4.008-4.008-8.806-4.608-11.31-4.608s-7.302 0.6-11.312 4.612l-2.746 2.746-67.88-67.884 2.742-2.742c21.106-21.108 49.23-32.728 79.2-32.728s58.094 11.624 79.196 32.726l165.494 165.492c43.662 43.666 43.662 114.72-0.004 158.39zM551.356 359.356l-67.882-67.882 2.746-2.746c4.008-4.008 4.61-8.806 4.61-11.31 0-2.506-0.598-7.302-4.606-11.314l-165.494-165.49c-4.010-4.010-8.81-4.61-11.314-4.61s-7.304 0.6-11.314 4.61l-133.492 133.486c-4.010 4.010-4.61 8.81-4.61 11.314s0.598 7.3 4.61 11.312l165.49 165.488c4.010 4.012 8.81 4.612 11.314 4.612s7.304-0.6 11.314-4.612l2.746-2.742 67.882 67.88-2.746 2.746c-21.104 21.104-49.23 32.726-79.196 32.726s-58.092-11.624-79.196-32.726l-165.488-165.486c-21.106-21.104-32.73-49.234-32.73-79.198s11.624-58.094 32.726-79.198l133.49-133.49c21.106-21.102 49.232-32.726 79.198-32.726s58.092 11.624 79.196 32.726l165.494 165.492c21.104 21.104 32.722 49.23 32.722 79.196s-11.624 58.094-32.726 79.196l-2.744 2.746zM352 250c-9.724 0-19.45 3.71-26.87 11.128-14.84 14.84-14.84 38.898 0 53.738l320 320c14.84 14.84 38.896 14.84 53.736 0 14.844-14.84 14.844-38.9 0-53.74l-320-320c-7.416-7.416-17.142-11.126-26.866-11.126z" />
+<glyph unicode="&#xe012;" glyph-name="link" d="M927.274 729.784l-133.49 133.488c-21.104 21.104-49.232 32.728-79.198 32.728s-58.094-11.624-79.196-32.726l-165.492-165.49c-43.668-43.668-43.668-114.724 0-158.392l2.746-2.746 67.882 67.882-2.746 2.746c-6.132 6.132-6.132 16.494 0 22.626l165.492 165.492c4.010 4.008 8.808 4.608 11.312 4.608s7.302-0.598 11.312-4.61l133.49-133.488c6.132-6.134 6.132-16.498 0.002-22.628l-165.494-165.494c-4.008-4.008-8.806-4.608-11.31-4.608s-7.302 0.6-11.312 4.612l-2.746 2.746-67.88-67.884 2.742-2.742c21.106-21.108 49.23-32.728 79.2-32.728s58.094 11.624 79.196 32.726l165.494 165.492c43.662 43.666 43.662 114.72-0.004 158.39zM551.356 359.356l-67.882-67.882 2.746-2.746c4.008-4.008 4.61-8.806 4.61-11.31 0-2.506-0.598-7.302-4.606-11.314l-165.494-165.49c-4.010-4.010-8.81-4.61-11.314-4.61s-7.304 0.6-11.314 4.61l-133.492 133.486c-4.010 4.010-4.61 8.81-4.61 11.314s0.598 7.3 4.61 11.312l165.49 165.488c4.010 4.012 8.81 4.612 11.314 4.612s7.304-0.6 11.314-4.612l2.746-2.742 67.882 67.88-2.746 2.746c-21.104 21.104-49.23 32.726-79.196 32.726s-58.092-11.624-79.196-32.726l-165.488-165.486c-21.106-21.104-32.73-49.234-32.73-79.198s11.624-58.094 32.726-79.198l133.49-133.49c21.106-21.102 49.232-32.726 79.198-32.726s58.092 11.624 79.196 32.726l165.494 165.492c21.104 21.104 32.722 49.23 32.722 79.196s-11.624 58.094-32.726 79.196l-2.744 2.746zM800 122c-9.724 0-19.45 3.708-26.87 11.13l-128 127.998c-14.844 14.84-14.844 38.898 0 53.738 14.84 14.844 38.896 14.844 53.736 0l128-128c14.844-14.84 14.844-38.896 0-53.736-7.416-7.422-17.142-11.13-26.866-11.13zM608 0c-17.674 0-32 14.326-32 32v128c0 17.674 14.326 32 32 32s32-14.326 32-32v-128c0-17.674-14.326-32-32-32zM928 320h-128c-17.674 0-32 14.326-32 32s14.326 32 32 32h128c17.674 0 32-14.326 32-32s-14.326-32-32-32zM224 774c9.724 0 19.45-3.708 26.87-11.13l128-128c14.842-14.84 14.842-38.898 0-53.738-14.84-14.844-38.898-14.844-53.738 0l-128 128c-14.842 14.84-14.842 38.898 0 53.738 7.418 7.422 17.144 11.13 26.868 11.13zM416 896c17.674 0 32-14.326 32-32v-128c0-17.674-14.326-32-32-32s-32 14.326-32 32v128c0 17.674 14.326 32 32 32zM96 576h128c17.674 0 32-14.326 32-32s-14.326-32-32-32h-128c-17.674 0-32 14.326-32 32s14.326 32 32 32z" />
+<glyph unicode="&#xe013;" glyph-name="bookmark" d="M256 896v-896l256 256 256-256v896h-512zM704 170.51l-192 192-192-192v661.49h384v-661.49z" />
+<glyph unicode="&#xe014;" glyph-name="image" d="M896 832h-768c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h768c35.2 0 64 28.8 64 64v640c0 35.2-28.8 64-64 64zM896 128.116c-0.012-0.014-0.030-0.028-0.042-0.042l-191.958 319.926-160-128-224 288-191.968-479.916c-0.010 0.010-0.022 0.022-0.032 0.032v639.77c0.034 0.040 0.076 0.082 0.114 0.114h767.77c0.040-0.034 0.082-0.076 0.116-0.116v-639.768zM640 608c0-53.019 42.981-96 96-96s96 42.981 96 96c0 53.019-42.981 96-96 96s-96-42.981-96-96z" />
+<glyph unicode="&#xe015;" glyph-name="media" d="M896 832h-768c-35.2 0-64-28.8-64-64v-640c0-35.2 28.8-64 64-64h768c35.2 0 64 28.8 64 64v640c0 35.2-28.8 64-64 64zM256 128h-128v128h128v-128zM256 384h-128v128h128v-128zM256 640h-128v128h128v-128zM704 128h-384v640h384v-640zM896 128h-128v128h128v-128zM896 384h-128v128h128v-128zM896 640h-128v128h128v-128zM384 640v-384l288 192z" />
+<glyph unicode="&#xe016;" glyph-name="help" d="M448 256h128v-128h-128v128zM704 704c35.346 0 64-28.654 64-64v-166l-228-154h-92v64l192 128v64h-320v128h384zM512 896c-119.666 0-232.166-46.6-316.784-131.216-84.614-84.618-131.216-197.118-131.216-316.784 0-119.664 46.602-232.168 131.216-316.784 84.618-84.616 197.118-131.216 316.784-131.216 119.664 0 232.168 46.6 316.784 131.216s131.216 197.12 131.216 316.784c0 119.666-46.6 232.166-131.216 316.784-84.616 84.616-197.12 131.216-316.784 131.216z" />
+<glyph unicode="&#xe017;" glyph-name="code" d="M416 256l-192 192 192 192-64 64-256-256 256-256zM672 704l-64-64 192-192-192-192 64-64 256 256z" />
+<glyph unicode="&#xe018;" glyph-name="insertdatetime" d="M77.798 655.376l81.414-50.882c50.802 81.114 128.788 143.454 221.208 174.246l-30.366 91.094c-113.748-37.898-209.728-114.626-272.256-214.458zM673.946 869.834l-30.366-91.094c92.422-30.792 170.404-93.132 221.208-174.248l81.412 50.882c-62.526 99.834-158.506 176.562-272.254 214.46zM607.974 255.992c-4.808 0-9.692 1.090-14.286 3.386l-145.688 72.844v211.778c0 17.672 14.328 32 32 32s32-14.328 32-32v-172.222l110.31-55.156c15.806-7.902 22.214-27.124 14.31-42.932-5.604-11.214-16.908-17.696-28.646-17.698zM512 768c-212.078 0-384-171.922-384-384s171.922-384 384-384c212.078 0 384 171.922 384 384s-171.922 384-384 384zM512 96c-159.058 0-288 128.942-288 288s128.942 288 288 288c159.058 0 288-128.942 288-288s-128.942-288-288-288z" />
+<glyph unicode="&#xe019;" glyph-name="preview" d="M64 504.254c45.318 49.92 97.162 92.36 153.272 125.124 90.332 52.744 192.246 80.622 294.728 80.622 102.48 0 204.396-27.878 294.726-80.624 56.112-32.764 107.956-75.204 153.274-125.124v117.432c-33.010 28.118-68.124 53.14-104.868 74.594-105.006 61.314-223.658 93.722-343.132 93.722s-238.128-32.408-343.134-93.72c-36.742-21.454-71.856-46.478-104.866-74.596v-117.43zM512 640c-183.196 0-345.838-100.556-448-256 102.162-155.448 264.804-256 448-256s345.838 100.552 448 256c-102.162 155.444-264.804 256-448 256zM512 448c0-35.346-28.654-64-64-64s-64 28.654-64 64c0 35.348 28.654 64 64 64s64-28.652 64-64zM728.066 263.338c-67.434-39.374-140.128-59.338-216.066-59.338s-148.632 19.964-216.066 59.338c-51.554 30.104-98.616 71.31-138.114 120.662 39.498 49.35 86.56 90.558 138.116 120.66 13.276 7.752 26.758 14.74 40.426 20.982-10.512-23.742-16.362-50.008-16.362-77.642 0-106.040 85.962-192 192-192 106.040 0 192 85.96 192 192 0 27.634-5.85 53.9-16.36 77.642 13.668-6.244 27.15-13.23 40.426-20.982 51.554-30.102 98.616-71.31 138.116-120.66-39.498-49.352-86.56-90.558-138.116-120.662z" />
+<glyph unicode="&#xe01a;" glyph-name="forecolor" d="M651.168 676.166c-24.612 81.962-28.876 91.834-107.168 91.834h-64c-79.618 0-82.664-10.152-108.418-96 0-0.002 0-0.002-0.002-0.004l-143.998-479.996h113.636l57.6 192h226.366l57.6-192h113.63l-145.246 484.166zM437.218 512l38.4 136c10.086 33.618 36.38 30 36.38 30s26.294 3.618 36.38-30h0.004l38.4-136h-149.564z" />
+<glyph unicode="&#xe01b;" glyph-name="table" d="M64 768v-704h896v704h-896zM384 320v128h256v-128h-256zM640 256v-128h-256v128h256zM640 640v-128h-256v128h256zM320 640v-128h-192v128h192zM128 448h192v-128h-192v128zM704 448h192v-128h-192v128zM704 512v128h192v-128h-192zM128 256h192v-128h-192v128zM704 128v128h192v-128h-192z" />
+<glyph unicode="&#xe01c;" glyph-name="hr" d="M64 512h896v-128h-896z" />
+<glyph unicode="&#xe01d;" glyph-name="removeformat" d="M64 192h512v-128h-512v128zM768 768h-220.558l-183.766-512h-132.288l183.762 512h-223.15v128h576v-128zM929.774 64l-129.774 129.774-129.774-129.774-62.226 62.226 129.774 129.774-129.774 129.774 62.226 62.226 129.774-129.774 129.774 129.774 62.226-62.226-129.774-129.774 129.774-129.774-62.226-62.226z" />
+<glyph unicode="&#xe01e;" glyph-name="subscript" d="M768 50v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM676 704h-136l-188-188-188 188h-136l256-256-256-256h136l188 188 188-188h136l-256 256z" />
+<glyph unicode="&#xe01f;" glyph-name="superscript" d="M768 754v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM676 704h-136l-188-188-188 188h-136l256-256-256-256h136l188 188 188-188h136l-256 256z" />
+<glyph unicode="&#xe020;" glyph-name="charmap" d="M704 128v37.004c151.348 61.628 256 193.82 256 346.996 0 212.078-200.576 384-448 384s-448-171.922-448-384c0-153.176 104.654-285.368 256-346.996v-37.004h-192l-64 96v-224h320v222.812c-100.9 51.362-170.666 161.54-170.666 289.188 0 176.732 133.718 320 298.666 320s298.666-143.268 298.666-320c0-127.648-69.766-237.826-170.666-289.188v-222.812h320v224l-64-96h-192z" />
+<glyph unicode="&#xe021;" glyph-name="emoticons" d="M512 820c99.366 0 192.782-38.694 263.042-108.956s108.958-163.678 108.958-263.044-38.696-192.782-108.958-263.042-163.676-108.958-263.042-108.958-192.782 38.696-263.044 108.958-108.956 163.676-108.956 263.042 38.694 192.782 108.956 263.044 163.678 108.956 263.044 108.956zM512 896c-247.424 0-448-200.576-448-448s200.576-448 448-448 448 200.576 448 448-200.576 448-448 448v0zM320 576c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64zM576 576c0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64s-64-28.654-64-64zM512 304c-101.84 0-192.56 36.874-251.166 94.328 23.126-117.608 126.778-206.328 251.166-206.328s228.040 88.72 251.168 206.328c-58.608-57.454-149.328-94.328-251.168-94.328z" />
+<glyph unicode="&#xe022;" glyph-name="print" d="M256 832h512v-128h-512v128zM896 640h-768c-35.2 0-64-28.8-64-64v-256c0-35.2 28.796-64 64-64h128v-192h512v192h128c35.2 0 64 28.8 64 64v256c0 35.2-28.8 64-64 64zM704 128h-384v256h384v-256zM910.4 544c0-25.626-20.774-46.4-46.398-46.4s-46.402 20.774-46.402 46.4 20.778 46.4 46.402 46.4c25.626 0 46.398-20.774 46.398-46.4z" />
+<glyph unicode="&#xe023;" glyph-name="fullscreen" d="M480 576l-192 192 128 128h-352v-352l128 128 192-192zM640 480l192 192 128-128v352h-352l128-128-192-192zM544 320l192-192-128-128h352v352l-128-128-192 192zM384 416l-192-192-128 128v-352h352l-128 128 192 192z" />
+<glyph unicode="&#xe024;" glyph-name="spellcheck" d="M960 832v64h-192c-35.202 0-64-28.8-64-64v-320c0-15.856 5.858-30.402 15.496-41.614l-303.496-260.386-142 148-82-70 224-288 416 448h128v64h-192v320h192zM256 448h64v384c0 35.2-28.8 64-64 64h-128c-35.2 0-64-28.8-64-64v-384h64v192h128v-192zM128 704v128h128v-128h-128zM640 512v96c0 35.2-8.8 64-44 64 35.2 0 44 28.8 44 64v96c0 35.2-28.8 64-64 64h-192v-448h192c35.2 0 64 28.8 64 64zM448 832h128v-128h-128v128zM448 640h128v-128h-128v128z" />
+<glyph unicode="&#xe025;" glyph-name="nonbreaking" d="M448 448h-128v128h128v128h128v-128h128v-128h-128v-128h-128v128zM960 384v-320h-896v320h128v-192h640v192h128z" />
+<glyph unicode="&#xe026;" glyph-name="template" d="M512 576h128v-64h-128zM512 192h128v-64h-128zM576 384h128v-64h-128zM768 384v-192h-64v-64h128v256zM384 384h128v-64h-128zM320 192h128v-64h-128zM320 576h128v-64h-128zM192 768v-256h64v192h64v64zM704 512h128v256h-64v-192h-64zM64 896v-896h896v896h-896zM896 64h-768v768h768v-768zM192 384v-256h64v192h64v64zM576 768h128v-64h-128zM384 768h128v-64h-128z" />
+<glyph unicode="&#xe027;" glyph-name="pagebreak" d="M816 896l16-384h-640l16 384h32l16-320h512l16 320h32zM208 0l-16 320h640l-16-320h-32l-16 256h-512l-16-256h-32zM64 448h128v-64h-128zM256 448h128v-64h-128zM448 448h128v-64h-128zM640 448h128v-64h-128zM832 448h128v-64h-128z" />
+<glyph unicode="&#xe028;" glyph-name="restoredraft" d="M576 896c247.424 0 448-200.576 448-448s-200.576-448-448-448v96c94.024 0 182.418 36.614 248.902 103.098s103.098 154.878 103.098 248.902c0 94.022-36.614 182.418-103.098 248.902s-154.878 103.098-248.902 103.098c-94.022 0-182.418-36.614-248.902-103.098-51.14-51.138-84.582-115.246-97.306-184.902h186.208l-224-256-224 256h164.57c31.060 217.102 217.738 384 443.43 384zM768 512v-128h-256v320h128v-192z" />
+<glyph unicode="&#xe02a;" glyph-name="bold" d="M625.442 465.818c48.074 38.15 78.558 94.856 78.558 158.182 0 114.876-100.29 208-224 208h-224v-768h288c123.712 0 224 93.124 224 208 0 88.196-59.118 163.562-142.558 193.818zM384 656c0 26.51 21.49 48 48 48h67.204c42.414 0 76.796-42.98 76.796-96s-34.382-96-76.796-96h-115.204v144zM547.2 192h-115.2c-26.51 0-48 21.49-48 48v144h163.2c42.418 0 76.8-42.98 76.8-96s-34.382-96-76.8-96z" />
+<glyph unicode="&#xe02b;" glyph-name="italic" d="M832 832v-64h-144l-256-640h144v-64h-448v64h144l256 640h-144v64h448z" />
+<glyph unicode="&#xe02c;" glyph-name="underline" d="M192 128h576v-64h-576v64zM640 832v-384c0-31.312-14.7-61.624-41.39-85.352-30.942-27.502-73.068-42.648-118.61-42.648-45.544 0-87.668 15.146-118.608 42.648-26.692 23.728-41.392 54.040-41.392 85.352v384h-128v-384c0-141.382 128.942-256 288-256s288 114.618 288 256v384h-128z" />
+<glyph unicode="&#xe02d;" glyph-name="strikethrough" d="M960 448h-265.876c-50.078 35.42-114.43 54.86-182.124 54.86-89.206 0-164.572 50.242-164.572 109.712s75.366 109.714 164.572 109.714c75.058 0 140.308-35.576 159.12-82.286h113.016c-7.93 50.644-37.58 97.968-84.058 132.826-50.88 38.16-117.676 59.174-188.078 59.174-70.404 0-137.196-21.014-188.074-59.174-54.788-41.090-86.212-99.502-86.212-160.254s31.424-119.164 86.212-160.254c1.956-1.466 3.942-2.898 5.946-4.316h-265.872v-64h512.532c58.208-17.106 100.042-56.27 100.042-100.572 0-59.468-75.368-109.71-164.572-109.71-75.060 0-140.308 35.574-159.118 82.286h-113.016c7.93-50.64 37.582-97.968 84.060-132.826 50.876-38.164 117.668-59.18 188.072-59.18 70.402 0 137.198 21.016 188.074 59.174 54.79 41.090 86.208 99.502 86.208 160.254 0 35.298-10.654 69.792-30.294 100.572h204.012v64z" />
+<glyph unicode="&#xe02e;" glyph-name="visualchars" d="M384 832c-123.712 0-224-100.288-224-224s100.288-224 224-224v-320h128v640h64v-640h128v640h128v128h-448z" />
+<glyph unicode="&#xe02f;" glyph-name="ltr" d="M448 832c-123.712 0-224-100.288-224-224s100.288-224 224-224v-320h128v640h64v-640h128v640h128v128h-448zM64 64l224 192-224 192z" />
+<glyph unicode="&#xe030;" glyph-name="rtl" d="M320 832c-123.712 0-224-100.288-224-224s100.288-224 224-224v-320h128v640h64v-640h128v640h128v128h-448zM960 448l-224-192 224-192z" />
+<glyph unicode="&#xe031;" glyph-name="copy" d="M832 640h-192v64l-192 192h-384v-704h384v-192h576v448l-192 192zM832 549.49l101.49-101.49h-101.49v101.49zM448 805.49l101.49-101.49h-101.49v101.49zM128 832h256v-192h192v-384h-448v576zM960 64h-448v128h128v384h128v-192h192v-320z" />
+<glyph unicode="&#xe032;" glyph-name="resize" d="M768 704h64v-64h-64zM640 576h64v-64h-64zM640 448h64v-64h-64zM640 320h64v-64h-64zM512 448h64v-64h-64zM512 320h64v-64h-64zM384 320h64v-64h-64zM768 576h64v-64h-64zM768 448h64v-64h-64zM768 320h64v-64h-64zM768 192h64v-64h-64zM640 192h64v-64h-64zM512 192h64v-64h-64zM384 192h64v-64h-64zM256 192h64v-64h-64z" />
+<glyph unicode="&#xe034;" glyph-name="browse" d="M928 832h-416l-32 64h-352l-64-128h896zM840.34 256h87.66l32 448h-896l64-640h356.080c-104.882 37.776-180.080 138.266-180.080 256 0 149.982 122.018 272 272 272 149.98 0 272-122.018 272-272 0-21.678-2.622-43.15-7.66-64zM874.996 110.25l-134.496 110.692c17.454 28.922 27.5 62.814 27.5 99.058 0 106.040-85.96 192-192 192s-192-85.96-192-192 85.96-192 192-192c36.244 0 70.138 10.046 99.058 27.5l110.692-134.496c22.962-26.678 62.118-28.14 87.006-3.252l5.492 5.492c24.888 24.888 23.426 64.044-3.252 87.006zM576 196c-68.484 0-124 55.516-124 124s55.516 124 124 124 124-55.516 124-124-55.516-124-124-124z" />
+<glyph unicode="&#xe035;" glyph-name="pastetext" d="M704 576v160c0 17.6-14.4 32-32 32h-160v64c0 35.2-28.8 64-64 64h-128c-35.204 0-64-28.8-64-64v-64h-160c-17.602 0-32-14.4-32-32v-512c0-17.6 14.398-32 32-32h224v-192h576v576h-192zM320 831.886c0.034 0.038 0.072 0.078 0.114 0.114h127.768c0.042-0.036 0.082-0.076 0.118-0.114v-63.886h-128v63.886zM192 640v64h384v-64h-384zM832 64h-448v448h448v-448zM448 448v-128h32l32 64h64v-192h-48v-64h160v64h-48v192h64l32-64h32v128z" />
+<glyph unicode="&#xe603;" glyph-name="codesample" d="M200.015 577.994v103.994c0 43.077 34.919 77.997 77.997 77.997h26v103.994h-26c-100.51 0-181.991-81.481-181.991-181.991v-103.994c0-43.077-34.919-77.997-77.997-77.997h-26v-103.994h26c43.077 0 77.997-34.919 77.997-77.997v-103.994c0-100.509 81.481-181.991 181.991-181.991h26v103.994h-26c-43.077 0-77.997 34.919-77.997 77.997v103.994c0 50.927-20.928 96.961-54.642 129.994 33.714 33.032 54.642 79.065 54.642 129.994zM823.985 577.994v103.994c0 43.077-34.919 77.997-77.997 77.997h-26v103.994h26c100.509 0 181.991-81.481 181.991-181.991v-103.994c0-43.077 34.919-77.997 77.997-77.997h26v-103.994h-26c-43.077 0-77.997-34.919-77.997-77.997v-103.994c0-100.509-81.482-181.991-181.991-181.991h-26v103.994h26c43.077 0 77.997 34.919 77.997 77.997v103.994c0 50.927 20.928 96.961 54.642 129.994-33.714 33.032-54.642 79.065-54.642 129.994zM615.997 603.277c0-57.435-46.56-103.994-103.994-103.994s-103.994 46.56-103.994 103.994c0 57.435 46.56 103.994 103.994 103.994s103.994-46.56 103.994-103.994zM512 448.717c-57.435 0-103.994-46.56-103.994-103.994 0-55.841 26-100.107 105.747-103.875-23.715-33.413-59.437-46.608-105.747-50.94v-61.747c0 0 207.991-18.144 207.991 216.561-0.202 57.437-46.56 103.996-103.994 103.996z" />
+</font></defs></svg>

 Binary files /dev/null and b/tinymce4/js/tinymce/skins/lightgray/fonts/tinymce-small.ttf differ
 Binary files /dev/null and b/tinymce4/js/tinymce/skins/lightgray/fonts/tinymce-small.woff differ
 Binary files /dev/null and b/tinymce4/js/tinymce/skins/lightgray/fonts/tinymce.eot differ
--- /dev/null
+++ b/tinymce4/js/tinymce/skins/lightgray/fonts/tinymce.svg
@@ -1,1 +1,131 @@
-
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg xmlns="http://www.w3.org/2000/svg">
+<metadata>Generated by IcoMoon</metadata>
+<defs>
+<font id="tinymce" horiz-adv-x="1024">
+<font-face units-per-em="1024" ascent="960" descent="-64" />
+<missing-glyph horiz-adv-x="1024" />
+<glyph unicode="&#x20;" horiz-adv-x="512" d="" />
+<glyph unicode="&#xe000;" glyph-name="save" d="M896 960h-896v-1024h1024v896l-128 128zM512 832h128v-256h-128v256zM896 64h-768v768h64v-320h576v320h74.978l53.022-53.018v-714.982z" />
+<glyph unicode="&#xe001;" glyph-name="newdocument" d="M903.432 760.57l-142.864 142.862c-31.112 31.112-92.568 56.568-136.568 56.568h-480c-44 0-80-36-80-80v-864c0-44 36-80 80-80h736c44 0 80 36 80 80v608c0 44-25.456 105.458-56.568 136.57zM858.178 715.314c3.13-3.13 6.25-6.974 9.28-11.314h-163.458v163.456c4.34-3.030 8.184-6.15 11.314-9.28l142.864-142.862zM896 16c0-8.672-7.328-16-16-16h-736c-8.672 0-16 7.328-16 16v864c0 8.672 7.328 16 16 16h480c4.832 0 10.254-0.61 16-1.704v-254.296h254.296c1.094-5.746 1.704-11.166 1.704-16v-608z" />
+<glyph unicode="&#xe002;" glyph-name="fullpage" d="M1024 367.542v160.916l-159.144 15.914c-8.186 30.042-20.088 58.548-35.21 84.98l104.596 127.838-113.052 113.050-127.836-104.596c-26.434 15.124-54.942 27.026-84.982 35.208l-15.914 159.148h-160.916l-15.914-159.146c-30.042-8.186-58.548-20.086-84.98-35.208l-127.838 104.594-113.050-113.050 104.596-127.836c-15.124-26.432-27.026-54.94-35.21-84.98l-159.146-15.916v-160.916l159.146-15.914c8.186-30.042 20.086-58.548 35.21-84.982l-104.596-127.836 113.048-113.048 127.838 104.596c26.432-15.124 54.94-27.028 84.98-35.21l15.916-159.148h160.916l15.914 159.144c30.042 8.186 58.548 20.088 84.982 35.21l127.836-104.596 113.048 113.048-104.596 127.836c15.124 26.434 27.028 54.942 35.21 84.98l159.148 15.92zM704 384l-128-128h-128l-128 128v128l128 128h128l128-128v-128z" />
+<glyph unicode="&#xe003;" glyph-name="alignleft" d="M0 896h1024v-128h-1024zM0 704h640v-128h-640zM0 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" />
+<glyph unicode="&#xe004;" glyph-name="aligncenter" d="M0 896h1024v-128h-1024zM192 704h640v-128h-640zM192 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" />
+<glyph unicode="&#xe005;" glyph-name="alignright" d="M0 896h1024v-128h-1024zM384 704h640v-128h-640zM384 320h640v-128h-640zM0 512h1024v-128h-1024zM0 128h1024v-128h-1024z" />
+<glyph unicode="&#xe006;" glyph-name="alignjustify" d="M0 896h1024v-128h-1024zM0 704h1024v-128h-1024zM0 512h1024v-128h-1024zM0 320h1024v-128h-1024zM0 128h1024v-128h-1024z" />
+<glyph unicode="&#xe007;" glyph-name="cut" d="M890.774 250.846c-45.654 45.556-103.728 69.072-157.946 69.072h-29.112l-63.904 64.008 255.62 256.038c63.904 64.010 63.904 192.028 0 256.038l-383.43-384.056-383.432 384.054c-63.904-64.008-63.904-192.028 0-256.038l255.622-256.034-63.906-64.008h-29.114c-54.22 0-112.292-23.518-157.948-69.076-81.622-81.442-92.65-202.484-24.63-270.35 29.97-29.902 70.288-44.494 112.996-44.494 54.216 0 112.29 23.514 157.946 69.072 53.584 53.464 76.742 124 67.084 185.348l65.384 65.488 65.376-65.488c-9.656-61.348 13.506-131.882 67.084-185.348 45.662-45.558 103.732-69.072 157.948-69.072 42.708 0 83.024 14.592 112.994 44.496 68.020 67.866 56.988 188.908-24.632 270.35zM353.024 114.462c-7.698-17.882-19.010-34.346-33.626-48.926-14.636-14.604-31.172-25.918-49.148-33.624-16.132-6.916-32.96-10.568-48.662-10.568-15.146 0-36.612 3.402-52.862 19.612-16.136 16.104-19.52 37.318-19.52 52.288 0 15.542 3.642 32.21 10.526 48.212 7.7 17.884 19.014 34.346 33.626 48.926 14.634 14.606 31.172 25.914 49.15 33.624 16.134 6.914 32.96 10.568 48.664 10.568 15.146 0 36.612-3.4 52.858-19.614 16.134-16.098 19.522-37.316 19.522-52.284 0.002-15.542-3.638-32.216-10.528-48.214zM512.004 293.404c-49.914 0-90.376 40.532-90.376 90.526 0 49.992 40.462 90.52 90.376 90.52s90.372-40.528 90.372-90.52c0-49.998-40.46-90.526-90.372-90.526zM855.272 40.958c-16.248-16.208-37.712-19.612-52.86-19.612-15.704 0-32.53 3.652-48.666 10.568-17.972 7.706-34.508 19.020-49.142 33.624-14.614 14.58-25.926 31.042-33.626 48.926-6.886 15.998-10.526 32.672-10.526 48.212 0 14.966 3.384 36.188 19.52 52.286 16.246 16.208 37.712 19.614 52.86 19.614 15.7 0 32.53-3.654 48.66-10.568 17.978-7.708 34.516-19.018 49.15-33.624 14.61-14.58 25.924-31.042 33.626-48.926 6.884-15.998 10.526-32.67 10.526-48.212-0.002-14.97-3.39-36.186-19.522-52.288z" />
+<glyph unicode="&#xe008;" glyph-name="paste" d="M832 640v160c0 17.6-14.4 32-32 32h-224v64c0 35.2-28.8 64-64 64h-128c-35.204 0-64-28.8-64-64v-64h-224c-17.602 0-32-14.4-32-32v-640c0-17.6 14.398-32 32-32h288v-192h448l192 192v512h-192zM384 895.886c0.034 0.038 0.072 0.078 0.114 0.114h127.768c0.042-0.036 0.082-0.076 0.118-0.114v-63.886h-128v63.886zM192 704v64h512v-64h-512zM832 26.51v101.49h101.49l-101.49-101.49zM960 192h-192v-192h-320v576h512v-384z" />
+<glyph unicode="&#xe009;" glyph-name="searchreplace" d="M64 960h384v-64h-384zM576 960h384v-64h-384zM952 640h-56v256h-256v-256h-256v256h-256v-256h-56c-39.6 0-72-32.4-72-72v-560c0-39.6 32.4-72 72-72h304c39.6 0 72 32.4 72 72v376h128v-376c0-39.6 32.4-72 72-72h304c39.6 0 72 32.4 72 72v560c0 39.6-32.4 72-72 72zM348 0h-248c-19.8 0-36 14.4-36 32s16.2 32 36 32h248c19.8 0 36-14.4 36-32s-16.2-32-36-32zM544 448h-64c-17.6 0-32 14.4-32 32s14.4 32 32 32h64c17.6 0 32-14.4 32-32s-14.4-32-32-32zM924 0h-248c-19.8 0-36 14.4-36 32s16.2 32 36 32h248c19.8 0 36-14.4 36-32s-16.2-32-36-32z" />
+<glyph unicode="&#xe00a;" glyph-name="bullist" d="M384 896h640v-128h-640v128zM384 512h640v-128h-640v128zM384 128h640v-128h-640v128zM0 832c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128s-128 57.308-128 128zM0 448c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128s-128 57.308-128 128zM0 64c0 70.692 57.308 128 128 128s128-57.308 128-128c0-70.692-57.308-128-128-128s-128 57.308-128 128z" />
+<glyph unicode="&#xe00b;" glyph-name="numlist" d="M384 128h640v-128h-640zM384 512h640v-128h-640zM384 896h640v-128h-640zM192 960v-256h-64v192h-64v64zM128 434v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM256 256v-320h-192v64h128v64h-128v64h128v64h-128v64z" />
+<glyph unicode="&#xe00c;" glyph-name="indent" d="M0 896h1024v-128h-1024zM384 704h640v-128h-640zM384 512h640v-128h-640zM384 320h640v-128h-640zM0 128h1024v-128h-1024zM0 256v384l256-192z" />
+<glyph unicode="&#xe00d;" glyph-name="outdent" d="M0 896h1024v-128h-1024zM384 704h640v-128h-640zM384 512h640v-128h-640zM384 320h640v-128h-640zM0 128h1024v-128h-1024zM256 640v-384l-256 192z" />
+<glyph unicode="&#xe00e;" glyph-name="blockquote" d="M225 512c123.712 0 224-100.29 224-224 0-123.712-100.288-224-224-224s-224 100.288-224 224l-1 32c0 247.424 200.576 448 448 448v-128c-85.474 0-165.834-33.286-226.274-93.726-11.634-11.636-22.252-24.016-31.83-37.020 11.438 1.8 23.16 2.746 35.104 2.746zM801 512c123.71 0 224-100.29 224-224 0-123.712-100.29-224-224-224s-224 100.288-224 224l-1 32c0 247.424 200.576 448 448 448v-128c-85.474 0-165.834-33.286-226.274-93.726-11.636-11.636-22.254-24.016-31.832-37.020 11.44 1.8 23.16 2.746 35.106 2.746z" />
+<glyph unicode="&#xe00f;" glyph-name="undo" d="M761.862-64c113.726 206.032 132.888 520.306-313.862 509.824v-253.824l-384 384 384 384v-248.372c534.962 13.942 594.57-472.214 313.862-775.628z" />
+<glyph unicode="&#xe010;" glyph-name="redo" d="M576 711.628v248.372l384-384-384-384v253.824c-446.75 10.482-427.588-303.792-313.86-509.824-280.712 303.414-221.1 789.57 313.86 775.628z" />
+<glyph unicode="&#xe011;" glyph-name="link" d="M320 256c17.6-17.6 47.274-16.726 65.942 1.942l316.118 316.116c18.668 18.668 19.54 48.342 1.94 65.942s-47.274 16.726-65.942-1.942l-316.116-316.116c-18.668-18.668-19.542-48.342-1.942-65.942zM476.888 284.888c4.56-9.050 6.99-19.16 6.99-29.696 0-17.616-6.744-34.060-18.992-46.308l-163.382-163.382c-12.248-12.248-28.694-18.992-46.308-18.992s-34.060 6.744-46.308 18.992l-99.382 99.382c-12.248 12.248-18.992 28.694-18.992 46.308s6.744 34.060 18.992 46.308l163.382 163.382c12.248 12.248 28.694 18.994 46.308 18.994 10.536 0 20.644-2.43 29.696-6.99l65.338 65.338c-27.87 21.41-61.44 32.16-95.034 32.16-39.986 0-79.972-15.166-110.308-45.502l-163.382-163.382c-60.67-60.67-60.67-159.948 0-220.618l99.382-99.382c30.334-30.332 70.32-45.5 110.306-45.5 39.988 0 79.974 15.168 110.308 45.502l163.382 163.382c55.82 55.82 60.238 144.298 13.344 205.344l-65.34-65.34zM978.498 815.116l-99.382 99.382c-30.334 30.336-70.32 45.502-110.308 45.502-39.986 0-79.972-15.166-110.308-45.502l-163.382-163.382c-55.82-55.82-60.238-144.298-13.342-205.342l65.338 65.34c-4.558 9.050-6.988 19.16-6.988 29.694 0 17.616 6.744 34.060 18.992 46.308l163.382 163.382c12.248 12.248 28.694 18.994 46.308 18.994s34.060-6.746 46.308-18.994l99.382-99.382c12.248-12.248 18.992-28.694 18.992-46.308s-6.744-34.060-18.992-46.308l-163.382-163.382c-12.248-12.248-28.694-18.992-46.308-18.992-10.536 0-20.644 2.43-29.696 6.99l-65.338-65.338c27.872-21.41 61.44-32.16 95.034-32.16 39.988 0 79.974 15.168 110.308 45.502l163.382 163.382c60.67 60.666 60.67 159.944 0 220.614z" />
+<glyph unicode="&#xe012;" glyph-name="unlink" d="M476.888 284.886c4.56-9.048 6.99-19.158 6.99-29.696 0-17.616-6.744-34.058-18.992-46.308l-163.38-163.38c-12.248-12.248-28.696-18.992-46.308-18.992s-34.060 6.744-46.308 18.992l-99.38 99.38c-12.248 12.25-18.992 28.696-18.992 46.308s6.744 34.060 18.992 46.308l163.38 163.382c12.248 12.246 28.696 18.992 46.308 18.992 10.538 0 20.644-2.43 29.696-6.988l65.338 65.336c-27.87 21.41-61.44 32.16-95.034 32.16-39.986 0-79.972-15.166-110.308-45.502l-163.38-163.382c-60.67-60.67-60.67-159.95 0-220.618l99.38-99.382c30.334-30.332 70.32-45.5 110.306-45.5 39.988 0 79.974 15.168 110.308 45.502l163.38 163.38c55.82 55.82 60.238 144.298 13.344 205.346l-65.34-65.338zM978.496 815.116l-99.38 99.382c-30.334 30.336-70.32 45.502-110.308 45.502-39.986 0-79.97-15.166-110.306-45.502l-163.382-163.382c-55.82-55.82-60.238-144.298-13.342-205.342l65.338 65.34c-4.558 9.050-6.988 19.16-6.988 29.694 0 17.616 6.744 34.060 18.992 46.308l163.382 163.382c12.246 12.248 28.694 18.994 46.306 18.994 17.616 0 34.060-6.746 46.308-18.994l99.38-99.382c12.248-12.248 18.992-28.694 18.992-46.308s-6.744-34.060-18.992-46.308l-163.38-163.382c-12.248-12.248-28.694-18.992-46.308-18.992-10.536 0-20.644 2.43-29.696 6.99l-65.338-65.338c27.872-21.41 61.44-32.16 95.034-32.16 39.988 0 79.974 15.168 110.308 45.504l163.38 163.38c60.672 60.666 60.672 159.944 0 220.614zM233.368 681.376l-191.994 191.994 45.256 45.256 191.994-191.994zM384 960h64v-192h-64zM0 576h192v-64h-192zM790.632 214.624l191.996-191.996-45.256-45.256-191.996 191.996zM576 128h64v-192h-64zM832 384h192v-64h-192z" />
+<glyph unicode="&#xe013;" glyph-name="anchor" d="M192 960v-1024l320 320 320-320v1024h-640zM768 90.51l-256 256-256-256v805.49h512v-805.49z" />
+<glyph unicode="&#xe014;" glyph-name="image" d="M0 832v-832h1024v832h-1024zM960 64h-896v704h896v-704zM704 608c0 53.019 42.981 96 96 96s96-42.981 96-96c0-53.019-42.981-96-96-96s-96 42.981-96 96zM896 128h-768l192 512 256-320 128 96z" />
+<glyph unicode="&#xe015;" glyph-name="media" d="M0 832v-768h1024v768h-1024zM192 128h-128v128h128v-128zM192 384h-128v128h128v-128zM192 640h-128v128h128v-128zM768 128h-512v640h512v-640zM960 128h-128v128h128v-128zM960 384h-128v128h128v-128zM960 640h-128v128h128v-128zM384 640v-384l256 192z" />
+<glyph unicode="&#xe016;" glyph-name="help" d="M448 256h128v-128h-128zM704 704c35.346 0 64-28.654 64-64v-192l-192-128h-128v64l192 128v64h-320v128h384zM512 864c-111.118 0-215.584-43.272-294.156-121.844s-121.844-183.038-121.844-294.156c0-111.118 43.272-215.584 121.844-294.156s183.038-121.844 294.156-121.844c111.118 0 215.584 43.272 294.156 121.844s121.844 183.038 121.844 294.156c0 111.118-43.272 215.584-121.844 294.156s-183.038 121.844-294.156 121.844zM512 960v0c282.77 0 512-229.23 512-512s-229.23-512-512-512c-282.77 0-512 229.23-512 512s229.23 512 512 512z" />
+<glyph unicode="&#xe017;" glyph-name="code" d="M320 704l-256-256 256-256h128l-256 256 256 256zM704 704h-128l256-256-256-256h128l256 256z" />
+<glyph unicode="&#xe018;" glyph-name="inserttime" d="M512 768c-212.076 0-384-171.922-384-384s171.922-384 384-384c212.074 0 384 171.922 384 384s-171.926 384-384 384zM715.644 180.354c-54.392-54.396-126.716-84.354-203.644-84.354s-149.25 29.958-203.646 84.354c-54.396 54.394-84.354 126.718-84.354 203.646s29.958 149.25 84.354 203.646c54.396 54.396 126.718 84.354 203.646 84.354s149.252-29.958 203.642-84.354c54.402-54.396 84.358-126.718 84.358-203.646s-29.958-149.252-84.356-203.646zM325.93 756.138l-42.94 85.878c-98.874-49.536-179.47-130.132-229.006-229.008l85.876-42.94c40.248 80.336 105.732 145.822 186.070 186.070zM884.134 570.070l85.878 42.938c-49.532 98.876-130.126 179.472-229.004 229.008l-42.944-85.878c80.338-40.248 145.824-105.732 186.070-186.068zM512 576h-64v-192c0-10.11 4.7-19.11 12.022-24.972l-0.012-0.016 160-128 39.976 49.976-147.986 118.39v176.622z" />
+<glyph unicode="&#xe019;" glyph-name="preview" d="M512 640c-209.368 0-395.244-100.556-512-256 116.756-155.446 302.632-256 512-256s395.244 100.554 512 256c-116.756 155.444-302.632 256-512 256zM448 512c35.346 0 64-28.654 64-64s-28.654-64-64-64-64 28.654-64 64 28.654 64 64 64zM773.616 254.704c-39.648-20.258-81.652-35.862-124.846-46.376-44.488-10.836-90.502-16.328-136.77-16.328-46.266 0-92.282 5.492-136.768 16.324-43.194 10.518-85.198 26.122-124.846 46.376-63.020 32.202-120.222 76.41-167.64 129.298 47.418 52.888 104.62 97.1 167.64 129.298 32.336 16.522 66.242 29.946 101.082 40.040-19.888-30.242-31.468-66.434-31.468-105.336 0-106.040 85.962-192 192-192s192 85.96 192 192c0 38.902-11.582 75.094-31.466 105.34 34.838-10.096 68.744-23.52 101.082-40.042 63.022-32.198 120.218-76.408 167.638-129.298-47.42-52.886-104.618-97.1-167.638-129.296zM860.918 716.278c-108.72 55.554-226.112 83.722-348.918 83.722s-240.198-28.168-348.918-83.722c-58.772-30.032-113.732-67.904-163.082-112.076v-109.206c55.338 58.566 120.694 107.754 192.194 144.29 99.62 50.904 207.218 76.714 319.806 76.714s220.186-25.81 319.804-76.716c71.502-36.536 136.858-85.724 192.196-144.29v109.206c-49.35 44.174-104.308 82.046-163.082 112.078z" />
+<glyph unicode="&#xe01a;" glyph-name="forecolor" d="M322.018 128l57.6 192h264.764l57.6-192h113.632l-191.996 640h-223.236l-192-640h113.636zM475.618 640h72.764l57.6-192h-187.964l57.6 192z" />
+<glyph unicode="&#xe01b;" glyph-name="table" d="M0 896v-896h1024v896h-1024zM384 320v192h256v-192h-256zM640 256v-192h-256v192h256zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM64 512h256v-192h-256v192zM704 512h256v-192h-256v192zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192zM704 64v192h256v-192h-256z" />
+<glyph unicode="&#xe01c;" glyph-name="hr" d="M0 512h1024v-128h-1024z" />
+<glyph unicode="&#xe01d;" glyph-name="removeformat" d="M0 64h576v-128h-576zM192 960h704v-128h-704zM277.388 128l204.688 784.164 123.85-32.328-196.25-751.836zM929.774-64l-129.774 129.774-129.774-129.774-62.226 62.226 129.774 129.774-129.774 129.774 62.226 62.226 129.774-129.774 129.774 129.774 62.226-62.226-129.774-129.774 129.774-129.774z" />
+<glyph unicode="&#xe01e;" glyph-name="sub" d="M768 50v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM676 704h-136l-188-188-188 188h-136l256-256-256-256h136l188 188 188-188h136l-256 256z" />
+<glyph unicode="&#xe01f;" glyph-name="sup" d="M768 754v-50h128v-64h-192v146l128 60v50h-128v64h192v-146zM676 704h-136l-188-188-188 188h-136l256-256-256-256h136l188 188 188-188h136l-256 256z" />
+<glyph unicode="&#xe020;" glyph-name="charmap" d="M704 64h256l64 128v-256h-384v214.214c131.112 56.484 224 197.162 224 361.786 0 214.432-157.598 382.266-352 382.266-194.406 0-352-167.832-352-382.266 0-164.624 92.886-305.302 224-361.786v-214.214h-384v256l64-128h256v32.59c-187.63 66.46-320 227.402-320 415.41 0 247.424 229.23 448 512 448s512-200.576 512-448c0-188.008-132.37-348.95-320-415.41v-32.59z" />
+<glyph unicode="&#xe021;" glyph-name="emoticons" d="M512 960c-282.77 0-512-229.228-512-512 0-282.77 229.228-512 512-512 282.77 0 512 229.23 512 512 0 282.772-229.23 512-512 512zM512 16c-238.586 0-432 193.412-432 432 0 238.586 193.414 432 432 432 238.59 0 432-193.414 432-432 0-238.588-193.41-432-432-432zM384 640c0-35.346-28.654-64-64-64s-64 28.654-64 64 28.654 64 64 64 64-28.654 64-64zM768 640c0-35.346-28.652-64-64-64s-64 28.654-64 64 28.652 64 64 64 64-28.654 64-64zM512 308c141.074 0 262.688 57.532 318.462 123.192-20.872-171.22-156.288-303.192-318.462-303.192-162.118 0-297.498 132.026-318.444 303.168 55.786-65.646 177.386-123.168 318.444-123.168z" />
+<glyph unicode="&#xe022;" glyph-name="print" d="M256 896h512v-128h-512zM960 704h-896c-35.2 0-64-28.8-64-64v-320c0-35.2 28.796-64 64-64h192v-256h512v256h192c35.2 0 64 28.8 64 64v320c0 35.2-28.8 64-64 64zM704 64h-384v320h384v-320zM974.4 608c0-25.626-20.774-46.4-46.398-46.4-25.626 0-46.402 20.774-46.402 46.4s20.776 46.4 46.402 46.4c25.626 0 46.398-20.774 46.398-46.4z" />
+<glyph unicode="&#xe023;" glyph-name="fullscreen" d="M1024 960v-384l-138.26 138.26-212-212-107.48 107.48 212 212-138.26 138.26zM245.74 821.74l212-212-107.48-107.48-212 212-138.26-138.26v384h384zM885.74 181.74l138.26 138.26v-384h-384l138.26 138.26-212 212 107.48 107.48zM457.74 286.26l-212-212 138.26-138.26h-384v384l138.26-138.26 212 212z" />
+<glyph unicode="&#xe024;" glyph-name="spellchecker" d="M128 704h128v-192h64v384c0 35.2-28.8 64-64 64h-128c-35.2 0-64-28.8-64-64v-384h64v192zM128 896h128v-128h-128v128zM960 896v64h-192c-35.202 0-64-28.8-64-64v-320c0-35.2 28.798-64 64-64h192v64h-192v320h192zM640 800v96c0 35.2-28.8 64-64 64h-192v-448h192c35.2 0 64 28.8 64 64v96c0 35.2-8.8 64-44 64 35.2 0 44 28.8 44 64zM576 576h-128v128h128v-128zM576 768h-128v128h128v-128zM832 384l-416-448-224 288 82 70 142-148 352 302z" />
+<glyph unicode="&#xe025;" glyph-name="nonbreaking" d="M448 384h-192v128h192v192h128v-192h192v-128h-192v-192h-128zM1024 320v-384h-1024v384h128v-256h768v256z" />
+<glyph unicode="&#xe026;" glyph-name="template" d="M384 768h128v-64h-128zM576 768h128v-64h-128zM896 768v-256h-192v64h128v128h-64v64zM320 576h128v-64h-128zM512 576h128v-64h-128zM192 704v-128h64v-64h-128v256h192v-64zM384 384h128v-64h-128zM576 384h128v-64h-128zM896 384v-256h-192v64h128v128h-64v64zM320 192h128v-64h-128zM512 192h128v-64h-128zM192 320v-128h64v-64h-128v256h192v-64zM960 896h-896v-896h896v896zM1024 960v0-1024h-1024v1024h1024z" />
+<glyph unicode="&#xe027;" glyph-name="pagebreak" d="M0 448h128v-64h-128zM192 448h192v-64h-192zM448 448h128v-64h-128zM640 448h192v-64h-192zM896 448h128v-64h-128zM880 960l16-448h-768l16 448h32l16-384h640l16 384zM144-64l-16 384h768l-16-384h-32l-16 320h-640l-16-320z" />
+<glyph unicode="&#xe028;" glyph-name="restoredraft" d="M576 896c247.424 0 448-200.576 448-448s-200.576-448-448-448v96c94.024 0 182.418 36.614 248.902 103.098s103.098 154.878 103.098 248.902c0 94.022-36.614 182.418-103.098 248.902s-154.878 103.098-248.902 103.098c-94.022 0-182.418-36.614-248.902-103.098-51.14-51.138-84.582-115.246-97.306-184.902h186.208l-224-256-224 256h164.57c31.060 217.102 217.738 384 443.43 384zM768 512v-128h-256v320h128v-192z" />
+<glyph unicode="&#xe02a;" glyph-name="bold" d="M707.88 475.348c37.498 44.542 60.12 102.008 60.12 164.652 0 141.16-114.842 256-256 256h-320v-896h384c141.158 0 256 114.842 256 256 0 92.956-49.798 174.496-124.12 219.348zM384 768h101.5c55.968 0 101.5-57.42 101.5-128s-45.532-128-101.5-128h-101.5v256zM543 128h-159v256h159c58.45 0 106-57.42 106-128s-47.55-128-106-128z" />
+<glyph unicode="&#xe02b;" glyph-name="italic" d="M896 896v-64h-128l-320-768h128v-64h-448v64h128l320 768h-128v64z" />
+<glyph unicode="&#xe02c;" glyph-name="underline" d="M704 896h128v-416c0-159.058-143.268-288-320-288-176.73 0-320 128.942-320 288v416h128v-416c0-40.166 18.238-78.704 51.354-108.506 36.896-33.204 86.846-51.494 140.646-51.494s103.75 18.29 140.646 51.494c33.116 29.802 51.354 68.34 51.354 108.506v416zM192 128h640v-128h-640z" />
+<glyph unicode="&#xe02d;" glyph-name="strikethrough" d="M731.42 442.964c63.92-47.938 100.58-116.086 100.58-186.964s-36.66-139.026-100.58-186.964c-59.358-44.518-137.284-69.036-219.42-69.036-82.138 0-160.062 24.518-219.42 69.036-63.92 47.938-100.58 116.086-100.58 186.964h128c0-69.382 87.926-128 192-128s192 58.618 192 128c0 69.382-87.926 128-192 128-82.138 0-160.062 24.518-219.42 69.036-63.92 47.94-100.58 116.086-100.58 186.964s36.66 139.024 100.58 186.964c59.358 44.518 137.282 69.036 219.42 69.036 82.136 0 160.062-24.518 219.42-69.036 63.92-47.94 100.58-116.086 100.58-186.964h-128c0 69.382-87.926 128-192 128s-192-58.618-192-128c0-69.382 87.926-128 192-128 82.136 0 160.062-24.518 219.42-69.036zM0 448h1024v-64h-1024z" />
+<glyph unicode="&#xe02e;" glyph-name="visualchars" d="M384 896h512v-128h-128v-768h-128v768h-128v-768h-128v448c-123.712 0-224 100.288-224 224s100.288 224 224 224z" />
+<glyph unicode="&#xe02f;" glyph-name="ltr" d="M448 896h512v-128h-128v-768h-128v768h-128v-768h-128v448c-123.712 0-224 100.288-224 224s100.288 224 224 224zM64 512l256-224-256-224z" />
+<glyph unicode="&#xe030;" glyph-name="rtl" d="M256 896h512v-128h-128v-768h-128v768h-128v-768h-128v448c-123.712 0-224 100.288-224 224s100.288 224 224 224zM960 64l-256 224 256 224z" />
+<glyph unicode="&#xe031;" glyph-name="copy" d="M832 704h-192v64l-192 192h-448v-768h384v-256h640v576l-192 192zM832 613.49l101.49-101.49h-101.49v101.49zM448 869.49l101.49-101.49h-101.49v101.49zM64 896h320v-192h192v-448h-512v640zM960 0h-512v192h192v448h128v-192h192v-448z" />
+<glyph unicode="&#xe032;" glyph-name="resize" d="M768 704h64v-64h-64zM640 576h64v-64h-64zM640 448h64v-64h-64zM640 320h64v-64h-64zM512 448h64v-64h-64zM512 320h64v-64h-64zM384 320h64v-64h-64zM768 576h64v-64h-64zM768 448h64v-64h-64zM768 320h64v-64h-64zM768 192h64v-64h-64zM640 192h64v-64h-64zM512 192h64v-64h-64zM384 192h64v-64h-64zM256 192h64v-64h-64z" />
+<glyph unicode="&#xe033;" glyph-name="checkbox" d="M128 416l288-288 480 480-128 128-352-352-160 160z" />
+<glyph unicode="&#xe034;" glyph-name="browse" d="M928 832h-416l-32 64h-352l-64-128h896zM904.34 256h74.86l44.8 448h-1024l64-640h484.080c-104.882 37.776-180.080 138.266-180.080 256 0 149.982 122.018 272 272 272 149.98 0 272-122.018 272-272 0-21.678-2.622-43.15-7.66-64zM1002.996 46.25l-198.496 174.692c17.454 28.92 27.5 62.814 27.5 99.058 0 106.040-85.96 192-192 192s-192-85.96-192-192 85.96-192 192-192c36.244 0 70.138 10.046 99.058 27.5l174.692-198.496c22.962-26.678 62.118-28.14 87.006-3.252l5.492 5.492c24.888 24.888 23.426 64.044-3.252 87.006zM640 196c-68.484 0-124 55.516-124 124s55.516 124 124 124 124-55.516 124-124-55.516-124-124-124z" />
+<glyph unicode="&#xe035;" glyph-name="pastetext" d="M512 448v-128h32l32 64h64v-256h-48v-64h224v64h-48v256h64l32-64h32v128zM832 640v160c0 17.6-14.4 32-32 32h-224v64c0 35.2-28.8 64-64 64h-128c-35.204 0-64-28.8-64-64v-64h-224c-17.602 0-32-14.4-32-32v-640c0-17.6 14.398-32 32-32h288v-192h640v704h-192zM384 895.886c0.034 0.038 0.072 0.078 0.114 0.114h127.768c0.042-0.036 0.082-0.076 0.118-0.114v-63.886h-128v63.886zM192 704v64h512v-64h-512zM960 0h-512v576h512v-576z" />
+<glyph unicode="&#xe600;" glyph-name="gamma" d="M483.2 320l-147.2 336c-9.6 25.6-19.2 44.8-25.6 54.4s-16 12.8-25.6 12.8c-16 0-25.6-3.2-28.8-3.2v70.4c9.6 6.4 25.6 6.4 38.4 9.6 32 0 57.6-6.4 73.6-22.4 6.4-6.4 12.8-16 19.2-25.6 6.4-12.8 12.8-25.6 16-41.6l121.6-291.2 150.4 371.2h92.8l-198.4-470.4v-224h-86.4v224zM0 960v-1024h1024v1024h-1024zM960 0h-896v896h896v-896z" />
+<glyph unicode="&#xe601;" glyph-name="orientation" d="M627.2 80h-579.2v396.8h579.2v-396.8zM553.6 406.4h-435.2v-256h435.2v256zM259.2 732.8c176 176 457.6 176 633.6 0s176-457.6 0-633.6c-121.6-121.6-297.6-160-454.4-108.8 121.6-28.8 262.4 9.6 361.6 108.8 150.4 150.4 160 384 22.4 521.6-121.6 121.6-320 128-470.4 19.2l86.4-86.4-294.4-22.4 22.4 294.4 92.8-92.8z" />
+<glyph unicode="&#xe602;" glyph-name="invert" d="M892.8-22.4l-89.6 89.6c-70.4-80-172.8-131.2-288-131.2-208 0-380.8 166.4-384 377.6 0 0 0 0 0 0 0 3.2 0 3.2 0 6.4s0 3.2 0 6.4v0c0 0 0 0 0 3.2 0 0 0 3.2 0 3.2 3.2 105.6 48 211.2 105.6 304l-192 192 44.8 44.8 182.4-182.4c0 0 0 0 0 0l569.6-569.6c0 0 0 0 0 0l99.2-99.2-48-44.8zM896 326.4c0 0 0 0 0 0 0 3.2 0 6.4 0 6.4-9.6 316.8-384 627.2-384 627.2s-108.8-89.6-208-220.8l70.4-70.4c6.4 9.6 16 22.4 22.4 32 41.6 51.2 83.2 96 115.2 128v0c32-32 73.6-76.8 115.2-128 108.8-137.6 169.6-265.6 172.8-371.2 0 0 0-3.2 0-3.2v0 0c0-3.2 0-3.2 0-6.4s0-3.2 0-3.2v0 0c0-22.4-3.2-41.6-9.6-64l76.8-76.8c16 41.6 28.8 89.6 28.8 137.6 0 0 0 0 0 0 0 3.2 0 3.2 0 6.4s0 3.2 0 6.4z" />
+<glyph unicode="&#xe603;" glyph-name="codesample" d="M199.995 578.002v104.002c0 43.078 34.923 78.001 78.001 78.001h26v104.002h-26c-100.518 0-182.003-81.485-182.003-182.003v-104.002c0-43.078-34.923-78.001-78.001-78.001h-26v-104.002h26c43.078 0 78.001-34.923 78.001-78.001v-104.002c0-100.515 81.485-182.003 182.003-182.003h26v104.002h-26c-43.078 0-78.001 34.923-78.001 78.001v104.002c0 50.931-20.928 96.966-54.646 130.002 33.716 33.036 54.646 79.072 54.646 130.002zM824.005 578.002v104.002c0 43.078-34.923 78.001-78.001 78.001h-26v104.002h26c100.515 0 182.003-81.485 182.003-182.003v-104.002c0-43.078 34.923-78.001 78.001-78.001h26v-104.002h-26c-43.078 0-78.001-34.923-78.001-78.001v-104.002c0-100.515-81.488-182.003-182.003-182.003h-26v104.002h26c43.078 0 78.001 34.923 78.001 78.001v104.002c0 50.931 20.928 96.966 54.646 130.002-33.716 33.036-54.646 79.072-54.646 130.002zM616.002 603.285c0-57.439-46.562-104.002-104.002-104.002s-104.002 46.562-104.002 104.002c0 57.439 46.562 104.002 104.002 104.002s104.002-46.562 104.002-104.002zM512 448.717c-57.439 0-104.002-46.562-104.002-104.002 0-55.845 26-100.115 105.752-103.88-23.719-33.417-59.441-46.612-105.752-50.944v-61.751c0 0 208.003-18.144 208.003 216.577-0.202 57.441-46.56 104.004-104.002 104.004z" />
+<glyph unicode="&#xe604;" glyph-name="tablerowprops" d="M0 896v-896h1024v896h-1024zM640 256v-192h-256v192h256zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192zM704 64v192h256v-192h-256z" />
+<glyph unicode="&#xe605;" glyph-name="tablecellprops" d="M0 896v-896h1024v896h-1024zM640 256v-192h-256v192h256zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM64 512h256v-192h-256v192zM704 512h256v-192h-256v192zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192zM704 64v192h256v-192h-256z" />
+<glyph unicode="&#xe606;" glyph-name="table2" d="M0 896v-832h1024v832h-1024zM320 128h-256v192h256v-192zM320 384h-256v192h256v-192zM640 128h-256v192h256v-192zM640 384h-256v192h256v-192zM960 128h-256v192h256v-192zM960 384h-256v192h256v-192zM960 640h-896v192h896v-192z" />
+<glyph unicode="&#xe607;" glyph-name="tablemergecells" d="M0 896v-896h1024v896h-1024zM384 64v448h576v-448h-576zM640 768v-192h-256v192h256zM320 768v-192h-256v192h256zM64 512h256v-192h-256v192zM704 576v192h256v-192h-256zM64 256h256v-192h-256v192z" />
+<glyph unicode="&#xe608;" glyph-name="tableinsertcolbefore" d="M320 188.8v182.4h-182.4v89.6h182.4v182.4h86.4v-182.4h185.6v-89.6h-185.6v-182.4zM0 896v-896h1024v896h-1024zM640 64h-576v704h576v-704zM960 64h-256v192h256v-192zM960 320h-256v192h256v-192zM960 576h-256v192h256v-192z" />
+<glyph unicode="&#xe609;" glyph-name="tableinsertcolafter" d="M704 643.2v-182.4h182.4v-89.6h-182.4v-182.4h-86.4v182.4h-185.6v89.6h185.6v182.4zM0 896v-896h1024v896h-1024zM320 64h-256v192h256v-192zM320 320h-256v192h256v-192zM320 576h-256v192h256v-192zM960 64h-576v704h576v-704z" />
+<glyph unicode="&#xe60a;" glyph-name="tableinsertrowbefore" d="M691.2 508.8h-144v-144h-70.4v144h-144v67.2h144v144h70.4v-144h144zM0 896v-896h1024v896h-1024zM320 64h-256v192h256v-192zM640 64h-256v192h256v-192zM960 64h-256v192h256v-192zM960 316.8h-896v451.2h896v-451.2z" />
+<glyph unicode="&#xe60b;" glyph-name="tableinsertrowafter" d="M332.8 323.2h144v144h70.4v-144h144v-67.2h-144v-144h-70.4v144h-144zM0 896v-896h1024v896h-1024zM384 768h256v-192h-256v192zM64 768h256v-192h-256v192zM960 64h-896v451.2h896v-451.2zM960 576h-256v192h256v-192z" />
+<glyph unicode="&#xe60d;" glyph-name="tablesplitcells" d="M0 896v-896h1024v896h-1024zM384 768h256v-192h-256v192zM320 64h-256v192h256v-192zM320 320h-256v192h256v-192zM320 576h-256v192h256v-192zM960 64h-576v448h576v-448zM960 576h-256v192h256v-192zM864 156.8l-60.8-60.8-131.2 131.2-131.2-131.2-60.8 60.8 131.2 131.2-131.2 131.2 60.8 60.8 131.2-131.2 131.2 131.2 60.8-60.8-131.2-131.2z" />
+<glyph unicode="&#xe60e;" glyph-name="tabledelete" d="M0 896h1024v-896h-1024v896zM60.8 768v-704h899.2v704h-899.2zM809.6 211.2l-96-96-204.8 204.8-204.8-204.8-96 96 204.8 204.8-204.8 204.8 96 96 204.8-204.8 204.8 204.8 96-96-204.8-204.8z" />
+<glyph unicode="&#xe62a;" glyph-name="tableleftheader" d="M0 896v-832h1024v832h-1024zM640 128h-256v192h256v-192zM640 384h-256v192h256v-192zM640 640h-256v192h256v-192zM960 128h-256v192h256v-192zM960 384h-256v192h256v-192zM960 640h-256v192h256v-192z" />
+<glyph unicode="&#xe62b;" glyph-name="tabletopheader" d="M0 896v-832h1024v832h-1024zM320 128h-256v192h256v-192zM320 384h-256v192h256v-192zM640 128h-256v192h256v-192zM640 384h-256v192h256v-192zM960 128h-256v192h256v-192zM960 384h-256v192h256v-192z" />
+<glyph unicode="&#xe800;" glyph-name="tabledeleterow" d="M886.4 572.8l-156.8-156.8 160-160-76.8-76.8-160 160-156.8-156.8-76.8 73.6 160 160-163.2 163.2 76.8 76.8 163.2-163.2 156.8 156.8 73.6-76.8zM0 896v-896h1024v896h-1024zM960 576h-22.4l-64-64h86.4v-192h-89.6l64-64h25.6v-192h-896v192h310.4l64 64h-374.4v192h371.2l-64 64h-307.2v192h896v-192z" />
+<glyph unicode="&#xe801;" glyph-name="tabledeletecol" d="M320 499.2l64-64v-12.8l-64-64v140.8zM640 422.4l64-64v137.6l-64-64v-9.6zM1024 896v-896h-1024v896h1024zM960 768h-256v-51.2l-12.8 12.8-51.2-51.2v89.6h-256v-89.6l-51.2 51.2-12.8-12.8v51.2h-256v-704h256v118.4l35.2-35.2 28.8 28.8v-115.2h256v115.2l48-48 16 16v-83.2h256v707.2zM672 662.4l-156.8-156.8-163.2 163.2-76.8-76.8 163.2-163.2-156.8-156.8 76.8-76.8 156.8 156.8 160-160 76.8 76.8-160 160 156.8 156.8-76.8 76.8z" />
+<glyph unicode="&#xe900;" glyph-name="a11y" d="M960 704v64l-448-128-448 128v-64l320-128v-256l-128-448h64l192 448 192-448h64l-128 448v256zM416 800q0 40 28 68t68 28 68-28 28-68-28-68-68-28-68 28-28 68z" />
+<glyph unicode="&#xe901;" glyph-name="toc" d="M0 896h128v-128h-128v128zM192 896h832v-128h-832v128zM192 704h128v-128h-128v128zM384 704h640v-128h-640v128zM384 512h128v-128h-128v128zM576 512h448v-128h-448v128zM0 320h128v-128h-128v128zM192 320h832v-128h-832v128zM192 128h128v-128h-128v128zM384 128h640v-128h-640v128z" />
+<glyph unicode="&#xe902;" glyph-name="fill" d="M521.6 915.2l-67.2-67.2-86.4 86.4-86.4-86.4 86.4-86.4-368-368 432-432 518.4 518.4-428.8 435.2zM435.2 134.4l-262.4 262.4 35.2 35.2 576 51.2-348.8-348.8zM953.6 409.6c-6.4-6.4-16-16-28.8-32-28.8-32-41.6-64-41.6-89.6v0 0 0 0 0 0 0c0-16 6.4-35.2 22.4-48 12.8-12.8 32-22.4 48-22.4s35.2 6.4 48 22.4 22.4 32 22.4 48v0 0 0 0 0 0 0c0 25.6-12.8 54.4-41.6 89.6-9.6 16-22.4 25.6-28.8 32v0z" />
+<glyph unicode="&#xe903;" glyph-name="borderwidth" d="M0 265.6h1024v-128h-1024v128zM0 32h1024v-64h-1024v64zM0 566.4h1024v-192h-1024v192zM0 928h1024v-256h-1024v256z" />
+<glyph unicode="&#xe904;" glyph-name="line" d="M739.2 627.2l-502.4-502.4h-185.6v185.6l502.4 502.4 185.6-185.6zM803.2 688l-185.6 185.6 67.2 67.2c22.4 22.4 54.4 22.4 76.8 0l108.8-108.8c22.4-22.4 22.4-54.4 0-76.8l-67.2-67.2zM41.6 48h940.8v-112h-940.8v112z" />
+<glyph unicode="&#xe905;" glyph-name="count" d="M0 480h1024v-64h-1024v64zM304 912v-339.2h-67.2v272h-67.2v67.2zM444.8 694.4v-54.4h134.4v-67.2h-201.6v153.6l134.4 64v54.4h-134.4v67.2h201.6v-153.6zM854.4 912v-339.2h-204.8v67.2h137.6v67.2h-137.6v70.4h137.6v67.2h-137.6v67.2zM115.2 166.4c3.2 57.6 38.4 83.2 108.8 83.2 38.4 0 67.2-9.6 86.4-25.6s25.6-35.2 25.6-70.4v-112c0-25.6 0-28.8 9.6-41.6h-73.6c-3.2 9.6-3.2 9.6-6.4 19.2-22.4-19.2-41.6-25.6-70.4-25.6-54.4 0-89.6 32-89.6 76.8s28.8 70.4 99.2 80l38.4 6.4c16 3.2 22.4 6.4 22.4 16 0 12.8-12.8 22.4-38.4 22.4s-41.6-9.6-44.8-28.8h-67.2zM262.4 115.2c-6.4-3.2-12.8-6.4-25.6-6.4l-25.6-6.4c-25.6-6.4-38.4-16-38.4-28.8 0-16 12.8-25.6 35.2-25.6s41.6 9.6 54.4 32v35.2zM390.4 336h73.6v-112c22.4 16 41.6 22.4 67.2 22.4 64 0 105.6-51.2 105.6-124.8 0-76.8-44.8-134.4-108.8-134.4-32 0-48 9.6-67.2 35.2v-28.8h-70.4v342.4zM460.8 121.6c0-41.6 22.4-70.4 51.2-70.4s51.2 28.8 51.2 70.4c0 44.8-19.2 70.4-51.2 70.4-28.8 0-51.2-28.8-51.2-70.4zM851.2 153.6c-3.2 22.4-19.2 35.2-44.8 35.2-32 0-51.2-25.6-51.2-70.4 0-48 19.2-73.6 51.2-73.6 25.6 0 41.6 12.8 44.8 41.6l70.4-3.2c-9.6-60.8-54.4-96-118.4-96-73.6 0-121.6 51.2-121.6 128 0 80 48 131.2 124.8 131.2 64 0 108.8-35.2 112-96h-67.2z" />
+<glyph unicode="&#xe906;" glyph-name="reload" d="M889.68 793.68c-93.608 102.216-228.154 166.32-377.68 166.32-282.77 0-512-229.23-512-512h96c0 229.75 186.25 416 416 416 123.020 0 233.542-53.418 309.696-138.306l-149.696-149.694h352v352l-134.32-134.32zM928 448c0-229.75-186.25-416-416-416-123.020 0-233.542 53.418-309.694 138.306l149.694 149.694h-352v-352l134.32 134.32c93.608-102.216 228.154-166.32 377.68-166.32 282.77 0 512 229.23 512 512h-96z" />
+<glyph unicode="&#xe907;" glyph-name="translate" d="M553.6 304l-118.4 118.4c80 89.6 137.6 195.2 172.8 304h137.6v92.8h-326.4v92.8h-92.8v-92.8h-326.4v-92.8h518.4c-32-89.6-80-176-147.2-249.6-44.8 48-80 99.2-108.8 156.8h-92.8c35.2-76.8 80-147.2 137.6-211.2l-236.8-233.6 67.2-67.2 233.6 233.6 144-144c3.2 0 38.4 92.8 38.4 92.8zM816 540.8h-92.8l-208-560h92.8l51.2 140.8h220.8l51.2-140.8h92.8l-208 560zM691.2 214.4l76.8 201.6 76.8-201.6h-153.6z" />
+<glyph unicode="&#xe908;" glyph-name="drag" d="M576 896h128v-128h-128v128zM576 640h128v-128h-128v128zM320 640h128v-128h-128v128zM576 384h128v-128h-128v128zM320 384h128v-128h-128v128zM320 128h128v-128h-128v128zM576 128h128v-128h-128v128zM320 896h128v-128h-128v128z" />
+<glyph unicode="&#xe90b;" glyph-name="home" d="M1024 369.556l-512 397.426-512-397.428v162.038l512 397.426 512-397.428zM896 384v-384h-256v256h-256v-256h-256v384l384 288z" />
+<glyph unicode="&#xe911;" glyph-name="books" d="M576.234 670.73l242.712 81.432 203.584-606.784-242.712-81.432zM0 64h256v704h-256v-704zM64 640h128v-64h-128v64zM320 64h256v704h-256v-704zM384 640h128v-64h-128v64z" />
+<glyph unicode="&#xe914;" glyph-name="upload" d="M839.432 760.57c27.492-27.492 50.554-78.672 55.552-120.57h-318.984v318.984c41.898-4.998 93.076-28.060 120.568-55.552l142.864-142.862zM512 576v384h-368c-44 0-80-36-80-80v-864c0-44 36-80 80-80h672c44 0 80 36 80 80v560h-384zM576 192v-192h-192v192h-160l256 256 256-256h-160z" />
+<glyph unicode="&#xe915;" glyph-name="editimage" d="M768 416v-352h-640v640h352l128 128h-512c-52.8 0-96-43.2-96-96v-704c0-52.8 43.2-96 96-96h704c52.798 0 96 43.2 96 96v512l-128-128zM864 960l-608-608v-160h160l608 608c0 96-64 160-160 160zM416 320l-48 48 480 480 48-48-480-480z" />
+<glyph unicode="&#xe91c;" glyph-name="bubble" d="M928 896h-832c-52.8 0-96-43.2-96-96v-512c0-52.8 43.2-96 96-96h160v-256l307.2 256h364.8c52.8 0 96 43.2 96 96v512c0 52.8-43.2 96-96 96zM896 320h-379.142l-196.858-174.714v174.714h-192v448h768v-448z" />
+<glyph unicode="&#xe91d;" glyph-name="user" d="M622.826 257.264c-22.11 3.518-22.614 64.314-22.614 64.314s64.968 64.316 79.128 150.802c38.090 0 61.618 91.946 23.522 124.296 1.59 34.054 48.96 267.324-190.862 267.324s-192.45-233.27-190.864-267.324c-38.094-32.35-14.57-124.296 23.522-124.296 14.158-86.486 79.128-150.802 79.128-150.802s-0.504-60.796-22.614-64.314c-71.22-11.332-337.172-128.634-337.172-257.264h896c0 128.63-265.952 245.932-337.174 257.264z" />
+<glyph unicode="&#xe926;" glyph-name="lock" d="M592 512h-16v192c0 105.87-86.13 192-192 192h-128c-105.87 0-192-86.13-192-192v-192h-16c-26.4 0-48-21.6-48-48v-480c0-26.4 21.6-48 48-48h544c26.4 0 48 21.6 48 48v480c0 26.4-21.6 48-48 48zM192 704c0 35.29 28.71 64 64 64h128c35.29 0 64-28.71 64-64v-192h-256v192z" />
+<glyph unicode="&#xe927;" glyph-name="unlock" d="M768 896c105.87 0 192-86.13 192-192v-192h-128v192c0 35.29-28.71 64-64 64h-128c-35.29 0-64-28.71-64-64v-192h16c26.4 0 48-21.6 48-48v-480c0-26.4-21.6-48-48-48h-544c-26.4 0-48 21.6-48 48v480c0 26.4 21.6 48 48 48h400v192c0 105.87 86.13 192 192 192h128z" />
+<glyph unicode="&#xe928;" glyph-name="settings" d="M448 832v16c0 26.4-21.6 48-48 48h-160c-26.4 0-48-21.6-48-48v-16h-192v-128h192v-16c0-26.4 21.6-48 48-48h160c26.4 0 48 21.6 48 48v16h576v128h-576zM256 704v128h128v-128h-128zM832 528c0 26.4-21.6 48-48 48h-160c-26.4 0-48-21.6-48-48v-16h-576v-128h576v-16c0-26.4 21.6-48 48-48h160c26.4 0 48 21.6 48 48v16h192v128h-192v16zM640 384v128h128v-128h-128zM448 208c0 26.4-21.6 48-48 48h-160c-26.4 0-48-21.6-48-48v-16h-192v-128h192v-16c0-26.4 21.6-48 48-48h160c26.4 0 48 21.6 48 48v16h576v128h-576v16zM256 64v128h128v-128h-128z" />
+<glyph unicode="&#xe92a;" glyph-name="remove2" d="M192-64h640l64 704h-768zM640 832v128h-256v-128h-320v-192l64 64h768l64-64v192h-320zM576 832h-128v64h128v-64z" />
+<glyph unicode="&#xe92d;" glyph-name="menu" d="M384 896h256v-256h-256zM384 576h256v-256h-256zM384 256h256v-256h-256z" />
+<glyph unicode="&#xe930;" glyph-name="warning" d="M1009.956 44.24l-437.074 871.112c-16.742 29.766-38.812 44.648-60.882 44.648s-44.14-14.882-60.884-44.648l-437.074-871.112c-33.486-59.532-5-108.24 63.304-108.24h869.308c68.302 0 96.792 48.708 63.302 108.24zM512 64c-35.346 0-64 28.654-64 64 0 35.348 28.654 64 64 64 35.348 0 64-28.652 64-64 0-35.346-28.652-64-64-64zM556 256h-88l-20 256c0 35.346 28.654 64 64 64s64-28.654 64-64l-20-256z" />
+<glyph unicode="&#xe931;" glyph-name="question" d="M448 256h128v-128h-128zM704 704c35.346 0 64-28.654 64-64v-192l-192-128h-128v64l192 128v64h-320v128h384zM512 864c-111.118 0-215.584-43.272-294.156-121.844s-121.844-183.038-121.844-294.156c0-111.118 43.272-215.584 121.844-294.156s183.038-121.844 294.156-121.844c111.118 0 215.584 43.272 294.156 121.844s121.844 183.038 121.844 294.156c0 111.118-43.272 215.584-121.844 294.156s-183.038 121.844-294.156 121.844zM512 960v0c282.77 0 512-229.23 512-512s-229.23-512-512-512c-282.77 0-512 229.23-512 512s229.23 512 512 512z" />
+<glyph unicode="&#xe932;" glyph-name="pluscircle" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM512 64c-212.078 0-384 171.922-384 384s171.922 384 384 384c212.078 0 384-171.922 384-384s-171.922-384-384-384zM768 384h-192v-192h-128v192h-192v128h192v192h128v-192h192z" />
+<glyph unicode="&#xe933;" glyph-name="info" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM448 768h128v-128h-128v128zM640 128h-256v64h64v256h-64v64h192v-320h64v-64z" />
+<glyph unicode="&#xe934;" glyph-name="notice" d="M1024 224l-288 736h-448l-288-288v-448l288-288h448l288 288v448l-288 288zM576 128h-128v128h128v-128zM576 384h-128v384h128v-384z" />
+<glyph unicode="&#xe935;" glyph-name="drop" d="M864.626 486.838c-65.754 183.44-205.11 348.15-352.626 473.162-147.516-125.012-286.87-289.722-352.626-473.162-40.664-113.436-44.682-236.562 12.584-345.4 65.846-125.14 198.632-205.438 340.042-205.438s274.196 80.298 340.040 205.44c57.27 108.838 53.25 231.962 12.586 345.398zM738.764 201.044c-43.802-83.252-132.812-137.044-226.764-137.044-55.12 0-108.524 18.536-152.112 50.652 13.242-1.724 26.632-2.652 40.112-2.652 117.426 0 228.668 67.214 283.402 171.242 44.878 85.292 40.978 173.848 23.882 244.338 14.558-28.15 26.906-56.198 36.848-83.932 22.606-63.062 40.024-156.34-5.368-242.604z" />
+<glyph unicode="&#xe939;" glyph-name="minus" d="M0 544v-192c0-17.672 14.328-32 32-32h960c17.672 0 32 14.328 32 32v192c0 17.672-14.328 32-32 32h-960c-17.672 0-32-14.328-32-32z" />
+<glyph unicode="&#xe93a;" glyph-name="plus" d="M992 576h-352v352c0 17.672-14.328 32-32 32h-192c-17.672 0-32-14.328-32-32v-352h-352c-17.672 0-32-14.328-32-32v-192c0-17.672 14.328-32 32-32h352v-352c0-17.672 14.328-32 32-32h192c17.672 0 32 14.328 32 32v352h352c17.672 0 32 14.328 32 32v192c0 17.672-14.328 32-32 32z" />
+<glyph unicode="&#xe93b;" glyph-name="arrowup" d="M0 320l192-192 320 320 320-320 192 192-511.998 512z" />
+<glyph unicode="&#xe93c;" glyph-name="arrowright" d="M384 960l-192-192 320-320-320-320 192-192 512 512z" />
+<glyph unicode="&#xe93d;" glyph-name="arrowdown" d="M1024 576l-192 192-320-320-320 320-192-192 512-511.998z" />
+<glyph unicode="&#xe93f;" glyph-name="arrowup2" d="M768 320l-256 256-256-256z" />
+<glyph unicode="&#xe940;" glyph-name="arrowdown2" d="M256 576l256-256 256 256z" />
+<glyph unicode="&#xe941;" glyph-name="menu2" d="M256 704l256-256 256 256zM255.996 384.004l256-256 256 256z" />
+<glyph unicode="&#xe961;" glyph-name="newtab" d="M704 384l128 128v-512h-768v768h512l-128-128h-256v-512h512zM960 896v-352l-130.744 130.744-354.746-354.744h-90.51v90.512l354.744 354.744-130.744 130.744z" />
+<glyph unicode="&#xeaa8;" glyph-name="rotateleft" d="M607.998 831.986c-212.070 0-383.986-171.916-383.986-383.986h-191.994l246.848-246.848 246.848 246.848h-191.994c0 151.478 122.798 274.276 274.276 274.276 151.48 0 274.276-122.798 274.276-274.276 0-151.48-122.796-274.276-274.276-274.276v-109.71c212.070 0 383.986 171.916 383.986 383.986s-171.916 383.986-383.986 383.986z" />
+<glyph unicode="&#xeaa9;" glyph-name="rotateright" d="M416.002 831.986c212.070 0 383.986-171.916 383.986-383.986h191.994l-246.848-246.848-246.848 246.848h191.994c0 151.478-122.798 274.276-274.276 274.276-151.48 0-274.276-122.798-274.276-274.276 0-151.48 122.796-274.276 274.276-274.276v-109.71c-212.070 0-383.986 171.916-383.986 383.986s171.916 383.986 383.986 383.986z" />
+<glyph unicode="&#xeaaa;" glyph-name="flipv" d="M0 576h1024v384zM1024 0v384h-1024z" />
+<glyph unicode="&#xeaac;" glyph-name="fliph" d="M576 960v-1024h384zM0-64h384v1024z" />
+<glyph unicode="&#xeb35;" glyph-name="zoomin" d="M992.262 88.604l-242.552 206.294c-25.074 22.566-51.89 32.926-73.552 31.926 57.256 67.068 91.842 154.078 91.842 249.176 0 212.078-171.922 384-384 384-212.076 0-384-171.922-384-384s171.922-384 384-384c95.098 0 182.108 34.586 249.176 91.844-1-21.662 9.36-48.478 31.926-73.552l206.294-242.552c35.322-39.246 93.022-42.554 128.22-7.356s31.892 92.898-7.354 128.22zM384 320c-141.384 0-256 114.616-256 256s114.616 256 256 256 256-114.616 256-256-114.614-256-256-256zM448 768h-128v-128h-128v-128h128v-128h128v128h128v128h-128z" />
+<glyph unicode="&#xeb36;" glyph-name="zoomout" d="M992.262 88.604l-242.552 206.294c-25.074 22.566-51.89 32.926-73.552 31.926 57.256 67.068 91.842 154.078 91.842 249.176 0 212.078-171.922 384-384 384-212.076 0-384-171.922-384-384s171.922-384 384-384c95.098 0 182.108 34.586 249.176 91.844-1-21.662 9.36-48.478 31.926-73.552l206.294-242.552c35.322-39.246 93.022-42.554 128.22-7.356s31.892 92.898-7.354 128.22zM384 320c-141.384 0-256 114.616-256 256s114.616 256 256 256 256-114.616 256-256-114.614-256-256-256zM192 640h384v-128h-384z" />
+<glyph unicode="&#xeba7;" glyph-name="sharpen" d="M768 832h-512l-256-256 512-576 512 576-256 256zM512 181.334v2.666h-2.37l-14.222 16h16.592v16h-30.814l-14.222 16h45.036v16h-59.258l-14.222 16h73.48v16h-87.704l-14.222 16h101.926v16h-116.148l-14.222 16h130.37v16h-144.592l-14.222 16h158.814v16h-173.038l-14.222 16h187.26v16h-201.482l-14.222 16h215.704v16h-229.926l-14.222 16h244.148v16h-258.372l-14.222 16h272.594v16h-286.816l-14.222 16h301.038v16h-315.26l-14.222 16h329.482v16h-343.706l-7.344 8.262 139.072 139.072h211.978v-3.334h215.314l16-16h-231.314v-16h247.314l16-16h-263.314v-16h279.314l16-16h-295.314v-16h311.314l16-16h-327.314v-16h343.312l7.738-7.738-351.050-394.928z" />
+<glyph unicode="&#xec6a;" glyph-name="options" d="M64 768h896v-192h-896zM64 512h896v-192h-896zM64 256h896v-192h-896z" />
+<glyph unicode="&#xeccc;" glyph-name="sun" d="M512 128c35.346 0 64-28.654 64-64v-64c0-35.346-28.654-64-64-64s-64 28.654-64 64v64c0 35.346 28.654 64 64 64zM512 768c-35.346 0-64 28.654-64 64v64c0 35.346 28.654 64 64 64s64-28.654 64-64v-64c0-35.346-28.654-64-64-64zM960 512c35.346 0 64-28.654 64-64s-28.654-64-64-64h-64c-35.348 0-64 28.654-64 64s28.652 64 64 64h64zM192 448c0-35.346-28.654-64-64-64h-64c-35.346 0-64 28.654-64 64s28.654 64 64 64h64c35.346 0 64-28.654 64-64zM828.784 221.726l45.256-45.258c24.992-24.99 24.992-65.516 0-90.508-24.994-24.992-65.518-24.992-90.51 0l-45.256 45.256c-24.992 24.99-24.992 65.516 0 90.51 24.994 24.992 65.518 24.992 90.51 0zM195.216 674.274l-45.256 45.256c-24.994 24.994-24.994 65.516 0 90.51s65.516 24.994 90.51 0l45.256-45.256c24.994-24.994 24.994-65.516 0-90.51s-65.516-24.994-90.51 0zM828.784 674.274c-24.992-24.992-65.516-24.992-90.51 0-24.992 24.994-24.992 65.516 0 90.51l45.256 45.254c24.992 24.994 65.516 24.994 90.51 0 24.992-24.994 24.992-65.516 0-90.51l-45.256-45.254zM195.216 221.726c24.992 24.992 65.518 24.992 90.508 0 24.994-24.994 24.994-65.52 0-90.51l-45.254-45.256c-24.994-24.992-65.516-24.992-90.51 0s-24.994 65.518 0 90.508l45.256 45.258zM512 704c-141.384 0-256-114.616-256-256 0-141.382 114.616-256 256-256 141.382 0 256 114.618 256 256 0 141.384-114.616 256-256 256zM512 288c-88.366 0-160 71.634-160 160s71.634 160 160 160 160-71.634 160-160-71.634-160-160-160z" />
+<glyph unicode="&#xeccd;" glyph-name="moon" d="M715.812 895.52c-60.25 34.784-124.618 55.904-189.572 64.48 122.936-160.082 144.768-384.762 37.574-570.42-107.2-185.67-312.688-279.112-512.788-252.68 39.898-51.958 90.376-97.146 150.628-131.934 245.908-141.974 560.37-57.72 702.344 188.198 141.988 245.924 57.732 560.372-188.186 702.356z" />
+<glyph unicode="&#xecd4;" glyph-name="contrast" d="M512 960c-282.77 0-512-229.23-512-512s229.23-512 512-512 512 229.23 512 512-229.23 512-512 512zM128 448c0 212.078 171.922 384 384 384v-768c-212.078 0-384 171.922-384 384z" />
+<glyph unicode="&#xed6a;" glyph-name="remove22" d="M893.254 738.746l-90.508 90.508-290.746-290.744-290.746 290.744-90.508-90.506 290.746-290.748-290.746-290.746 90.508-90.508 290.746 290.746 290.746-290.746 90.508 90.51-290.744 290.744z" />
+<glyph unicode="&#xedc0;" glyph-name="arrowleft" d="M672-64l192 192-320 320 320 320-192 192-512-512z" />
+<glyph unicode="&#xedf9;" glyph-name="resize2" d="M0 896v-384c0-35.346 28.654-64 64-64s64 28.654 64 64v229.488l677.488-677.488h-229.488c-35.346 0-64-28.652-64-64 0-35.346 28.654-64 64-64h384c35.346 0 64 28.654 64 64v384c0 35.348-28.654 64-64 64s-64-28.652-64-64v-229.488l-677.488 677.488h229.488c35.346 0 64 28.654 64 64s-28.652 64-64 64h-384c-35.346 0-64-28.654-64-64z" />
+<glyph unicode="&#xee78;" glyph-name="crop" d="M832 704l192 192-64 64-192-192h-448v192h-128v-192h-192v-128h192v-512h512v-192h128v192h192v128h-192v448zM320 640h320l-320-320v320zM384 256l320 320v-320h-320z" />
+</font></defs></svg>

 Binary files /dev/null and b/tinymce4/js/tinymce/skins/lightgray/fonts/tinymce.ttf differ
 Binary files /dev/null and b/tinymce4/js/tinymce/skins/lightgray/fonts/tinymce.woff differ
 Binary files /dev/null and b/tinymce4/js/tinymce/skins/lightgray/img/anchor.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/skins/lightgray/img/loader.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/skins/lightgray/img/object.gif differ
 Binary files /dev/null and b/tinymce4/js/tinymce/skins/lightgray/img/trans.gif differ
--- /dev/null
+++ b/tinymce4/js/tinymce/skins/lightgray/skin.ie7.min.css
@@ -1,1 +1,1 @@
-
+.mce-container,.mce-container *,.mce-widget,.mce-widget *,.mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:#333;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;-webkit-tap-highlight-color:transparent;line-height:normal;font-weight:normal;text-align:left;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-widget button{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.mce-container *[unselectable]{-moz-user-select:none;-webkit-user-select:none;-o-user-select:none;user-select:none}.mce-fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.mce-fade.mce-in{opacity:1}.mce-tinymce{visibility:inherit !important;position:relative}.mce-fullscreen{border:0;padding:0;margin:0;overflow:hidden;height:100%;z-index:100}div.mce-fullscreen{position:fixed;top:0;left:0;width:100%;height:auto}.mce-tinymce{display:block}.mce-wordcount{position:absolute;top:0;right:0;padding:8px}div.mce-edit-area{background:#FFF;filter:none}.mce-statusbar{position:relative}.mce-statusbar .mce-container-body{position:relative}.mce-fullscreen .mce-resizehandle{display:none}.mce-charmap{border-collapse:collapse}.mce-charmap td{cursor:default;border:1px solid rgba(0,0,0,0.2);width:20px;height:20px;line-height:20px;text-align:center;vertical-align:middle;padding:2px}.mce-charmap td div{text-align:center}.mce-charmap td:hover{background:#D9D9D9}.mce-grid td.mce-grid-cell div{border:1px solid #d6d6d6;width:15px;height:15px;margin:0;cursor:pointer}.mce-grid td.mce-grid-cell div:focus{border-color:#3498db}.mce-grid td.mce-grid-cell div[disabled]{cursor:not-allowed}.mce-grid{border-spacing:2px;border-collapse:separate}.mce-grid a{display:block;border:1px solid transparent}.mce-grid a:hover,.mce-grid a:focus{border-color:#3498db}.mce-grid-border{margin:0 4px 0 4px}.mce-grid-border a{border-color:#d6d6d6;width:13px;height:13px}.mce-grid-border a:hover,.mce-grid-border a.mce-active{border-color:#3498db;background:#3498db}.mce-text-center{text-align:center}div.mce-tinymce-inline{width:100%}.mce-colorbtn-trans div{text-align:center;vertical-align:middle;font-weight:bold;font-size:20px;line-height:16px;color:#707070}.mce-monospace{font-family:"Courier New",Courier,monospace}.mce-toolbar-grp{padding:2px 0}.mce-toolbar-grp .mce-flow-layout-item{margin-bottom:0}.mce-rtl .mce-wordcount{left:0;right:auto}.mce-croprect-container{position:absolute;top:0;left:0}.mce-croprect-handle{position:absolute;top:0;left:0;width:20px;height:20px;border:2px solid white}.mce-croprect-handle-nw{border-width:2px 0 0 2px;margin:-2px 0 0 -2px;cursor:nw-resize;top:100px;left:100px}.mce-croprect-handle-ne{border-width:2px 2px 0 0;margin:-2px 0 0 -20px;cursor:ne-resize;top:100px;left:200px}.mce-croprect-handle-sw{border-width:0 0 2px 2px;margin:-20px 2px 0 -2px;cursor:sw-resize;top:200px;left:100px}.mce-croprect-handle-se{border-width:0 2px 2px 0;margin:-20px 0 0 -20px;cursor:se-resize;top:200px;left:200px}.mce-croprect-handle-move{position:absolute;cursor:move;border:0}.mce-croprect-block{opacity:.3;filter:alpha(opacity=30);zoom:1;position:absolute;background:black}.mce-croprect-handle:focus{border-color:#3498db}.mce-croprect-handle-move:focus{outline:1px solid #3498db}.mce-imagepanel{overflow:auto;background:black}.mce-imagepanel-bg{position:absolute;background:url('data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==')}.mce-imagepanel img{position:absolute}.mce-imagetool.mce-btn .mce-ico{display:block;width:20px;height:20px;text-align:center;line-height:20px;font-size:20px;padding:5px}.mce-arrow-up{margin-top:12px}.mce-arrow-down{margin-top:-12px}.mce-arrow:before,.mce-arrow:after{position:absolute;left:50%;display:block;width:0;height:0;border-style:solid;border-color:transparent;content:""}.mce-arrow.mce-arrow-up:before{top:-9px;border-bottom-color:rgba(0,0,0,0.2);border-width:0 9px 9px;margin-left:-9px}.mce-arrow.mce-arrow-down:before{bottom:-9px;border-top-color:rgba(0,0,0,0.2);border-width:9px 9px 0;margin-left:-9px}.mce-arrow.mce-arrow-up:after{top:-8px;border-bottom-color:#f0f0f0;border-width:0 8px 8px;margin-left:-8px}.mce-arrow.mce-arrow-down:after{bottom:-8px;border-top-color:#f0f0f0;border-width:8px 8px 0;margin-left:-8px}.mce-arrow.mce-arrow-left:before,.mce-arrow.mce-arrow-left:after{margin:0}.mce-arrow.mce-arrow-left:before{left:8px}.mce-arrow.mce-arrow-left:after{left:9px}.mce-arrow.mce-arrow-right:before,.mce-arrow.mce-arrow-right:after{left:auto;margin:0}.mce-arrow.mce-arrow-right:before{right:8px}.mce-arrow.mce-arrow-right:after{right:9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left:before{left:-9px;top:50%;border-right-color:rgba(0,0,0,0.2);border-width:9px 9px 9px 0;margin-top:-9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left:after{left:-8px;top:50%;border-right-color:#f0f0f0;border-width:8px 8px 8px 0;margin-top:-8px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left{margin-left:12px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right:before{right:-9px;top:50%;border-left-color:rgba(0,0,0,0.2);border-width:9px 0 9px 9px;margin-top:-9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right:after{right:-8px;top:50%;border-left-color:#f0f0f0;border-width:8px 0 8px 8px;margin-top:-8px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right{margin-left:-14px}.mce-container,.mce-container-body{display:block}.mce-autoscroll{overflow:hidden}.mce-scrollbar{position:absolute;width:7px;height:100%;top:2px;right:2px;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-scrollbar-h{top:auto;right:auto;left:2px;bottom:2px;width:100%;height:7px}.mce-scrollbar-thumb{position:absolute;background-color:#000;border:1px solid #888;border-color:rgba(85,85,85,0.6);width:5px;height:100%}.mce-scrollbar-h .mce-scrollbar-thumb{width:100%;height:5px}.mce-scrollbar:hover,.mce-scrollbar.mce-active{background-color:#AAA;opacity:.6;filter:alpha(opacity=60);zoom:1}.mce-scroll{position:relative}.mce-panel{border:0 solid #cacaca;border:0 solid rgba(0,0,0,0.2);background-color:#f0f0f0}.mce-floatpanel{position:absolute}.mce-floatpanel.mce-fixed{position:fixed}.mce-floatpanel .mce-arrow,.mce-floatpanel .mce-arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.mce-floatpanel .mce-arrow{border-width:11px}.mce-floatpanel .mce-arrow:after{border-width:10px;content:""}.mce-floatpanel.mce-popover{filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;top:0;left:0;background:#FFF;border:1px solid rgba(0,0,0,0.2);border:1px solid rgba(0,0,0,0.25)}.mce-floatpanel.mce-popover.mce-bottom{margin-top:10px;*margin-top:0}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,0.2);border-bottom-color:rgba(0,0,0,0.25);top:-11px}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#FFF}.mce-floatpanel.mce-popover.mce-bottom.mce-start{margin-left:-22px}.mce-floatpanel.mce-popover.mce-bottom.mce-start>.mce-arrow{left:20px}.mce-floatpanel.mce-popover.mce-bottom.mce-end{margin-left:22px}.mce-floatpanel.mce-popover.mce-bottom.mce-end>.mce-arrow{right:10px;left:auto}.mce-fullscreen{border:0;padding:0;margin:0;overflow:hidden;height:100%}div.mce-fullscreen{position:fixed;top:0;left:0}#mce-modal-block{opacity:0;filter:alpha(opacity=0);zoom:1;position:fixed;left:0;top:0;width:100%;height:100%;background:#000}#mce-modal-block.mce-in{opacity:.3;filter:alpha(opacity=30);zoom:1}.mce-window-move{cursor:move}.mce-window{filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;background:#FFF;position:fixed;top:0;left:0;opacity:0;transform:scale(.1);transition:transform 100ms ease-in,opacity 150ms ease-in}.mce-window.mce-in{transform:scale(1);opacity:1}.mce-window-head{padding:9px 15px;border-bottom:1px solid #c5c5c5;position:relative}.mce-window-head .mce-close{position:absolute;right:0;top:0;height:38px;width:38px;text-align:center;cursor:pointer}.mce-window-head .mce-close i{color:#858585}.mce-close:hover i{color:#adadad}.mce-window-head .mce-title{line-height:20px;font-size:20px;font-weight:bold;text-rendering:optimizelegibility;padding-right:20px}.mce-window .mce-container-body{display:block}.mce-foot{display:block;background-color:#FFF;border-top:1px solid #c5c5c5}.mce-window-head .mce-dragh{position:absolute;top:0;left:0;cursor:move;width:90%;height:100%}.mce-window iframe{width:100%;height:100%}.mce-window-body .mce-listbox{border-color:#ccc}.mce-rtl .mce-window-head .mce-close{position:absolute;right:auto;left:15px}.mce-rtl .mce-window-head .mce-dragh{left:auto;right:0}.mce-rtl .mce-window-head .mce-title{direction:rtl;text-align:right}.mce-tooltip{position:absolute;padding:5px;opacity:.8;filter:alpha(opacity=80);zoom:1}.mce-tooltip-inner{font-size:11px;background-color:#000;color:white;max-width:200px;padding:5px 8px 4px 8px;text-align:center;white-space:normal}.mce-tooltip-arrow{position:absolute;width:0;height:0;line-height:0;border:5px dashed #000}.mce-tooltip-arrow-n{border-bottom-color:#000}.mce-tooltip-arrow-s{border-top-color:#000}.mce-tooltip-arrow-e{border-left-color:#000}.mce-tooltip-arrow-w{border-right-color:#000}.mce-tooltip-nw,.mce-tooltip-sw{margin-left:-14px}.mce-tooltip-ne,.mce-tooltip-se{margin-left:14px}.mce-tooltip-n .mce-tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-nw .mce-tooltip-arrow{top:0;left:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-ne .mce-tooltip-arrow{top:0;right:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-s .mce-tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-sw .mce-tooltip-arrow{bottom:0;left:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-se .mce-tooltip-arrow{bottom:0;right:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-e .mce-tooltip-arrow{right:0;top:50%;margin-top:-5px;border-left-style:solid;border-right:none;border-top-color:transparent;border-bottom-color:transparent}.mce-tooltip-w .mce-tooltip-arrow{left:0;top:50%;margin-top:-5px;border-right-style:solid;border-left:none;border-top-color:transparent;border-bottom-color:transparent}.mce-progress{display:inline-block;position:relative;height:20px}.mce-progress .mce-bar-container{display:inline-block;width:100px;height:100%;margin-right:8px;border:1px solid #ccc;overflow:hidden}.mce-progress .mce-text{display:inline-block;margin-top:auto;margin-bottom:auto;font-size:14px;width:40px;color:#333}.mce-bar{display:block;width:0;height:100%;background-color:#d7d7d7;-webkit-transition:width .2s ease;transition:width .2s ease}.mce-notification{position:absolute;background-color:#F0F0F0;padding:5px;margin-top:5px;border-width:1px;border-style:solid;border-color:#CCCCCC;transition:transform 100ms ease-in,opacity 150ms ease-in;opacity:0}.mce-notification.mce-in{opacity:1}.mce-notification-success{background-color:#dff0d8;border-color:#d6e9c6}.mce-notification-info{background-color:#d9edf7;border-color:#779ECB}.mce-notification-warning{background-color:#fcf8e3;border-color:#faebcc}.mce-notification-error{background-color:#f2dede;border-color:#ebccd1}.mce-notification.mce-has-close{padding-right:15px}.mce-notification .mce-ico{margin-top:5px}.mce-notification-inner{display:inline-block;font-size:14px;margin:5px 8px 4px 8px;text-align:center;white-space:normal;color:#31708f}.mce-notification-inner a{text-decoration:underline;cursor:pointer}.mce-notification .mce-progress{margin-right:8px}.mce-notification .mce-progress .mce-text{margin-top:5px}.mce-notification *,.mce-notification .mce-progress .mce-text{color:#333333}.mce-notification .mce-progress .mce-bar-container{border-color:#CCCCCC}.mce-notification .mce-progress .mce-bar-container .mce-bar{background-color:#333333}.mce-notification-success *,.mce-notification-success .mce-progress .mce-text{color:#3c763d}.mce-notification-success .mce-progress .mce-bar-container{border-color:#d6e9c6}.mce-notification-success .mce-progress .mce-bar-container .mce-bar{background-color:#3c763d}.mce-notification-info *,.mce-notification-info .mce-progress .mce-text{color:#31708f}.mce-notification-info .mce-progress .mce-bar-container{border-color:#779ECB}.mce-notification-info .mce-progress .mce-bar-container .mce-bar{background-color:#31708f}.mce-notification-warning *,.mce-notification-warning .mce-progress .mce-text{color:#8a6d3b}.mce-notification-warning .mce-progress .mce-bar-container{border-color:#faebcc}.mce-notification-warning .mce-progress .mce-bar-container .mce-bar{background-color:#8a6d3b}.mce-notification-error *,.mce-notification-error .mce-progress .mce-text{color:#a94442}.mce-notification-error .mce-progress .mce-bar-container{border-color:#ebccd1}.mce-notification-error .mce-progress .mce-bar-container .mce-bar{background-color:#a94442}.mce-notification .mce-close{position:absolute;top:6px;right:8px;font-size:20px;font-weight:bold;line-height:20px;color:#858585;cursor:pointer;height:20px;overflow:hidden}.mce-abs-layout{position:relative}body .mce-abs-layout-item,.mce-abs-end{position:absolute}.mce-abs-end{width:1px;height:1px}.mce-container-body.mce-abs-layout{overflow:hidden}.mce-btn{border:1px solid #b1b1b1;border-color:transparent transparent transparent transparent;position:relative;text-shadow:0 1px 1px rgba(255,255,255,0.75);display:inline-block;*display:inline;*zoom:1;background-color:#f0f0f0}.mce-btn:hover,.mce-btn:focus{color:#333;background-color:#e3e3e3;border-color:#ccc}.mce-btn.mce-disabled button,.mce-btn.mce-disabled:hover button{cursor:default;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-btn.mce-active,.mce-btn.mce-active:hover{background-color:#dbdbdb;border-color:#ccc}.mce-btn:active{background-color:#e0e0e0;border-color:#ccc}.mce-btn button{padding:4px 8px;font-size:14px;line-height:20px;*line-height:16px;cursor:pointer;color:#333;text-align:center;overflow:visible;-webkit-appearance:none}.mce-btn button::-moz-focus-inner{border:0;padding:0}.mce-btn i{text-shadow:1px 1px none}.mce-primary.mce-btn-has-text{min-width:50px}.mce-primary{color:#fff;border:1px solid transparent;border-color:transparent;background-color:#2d8ac7}.mce-primary:hover,.mce-primary:focus{background-color:#257cb6;border-color:transparent}.mce-primary.mce-disabled button,.mce-primary.mce-disabled:hover button{cursor:default;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-primary.mce-active,.mce-primary.mce-active:hover,.mce-primary:not(.mce-disabled):active{background-color:#206ea1}.mce-primary button,.mce-primary button i{color:#fff;text-shadow:1px 1px none}.mce-btn .mce-txt{font-size:inherit;line-height:inherit;color:inherit}.mce-btn-large button{padding:9px 14px;font-size:16px;line-height:normal}.mce-btn-large i{margin-top:2px}.mce-btn-small button{padding:1px 5px;font-size:12px;*padding-bottom:2px}.mce-btn-small i{line-height:20px;vertical-align:top;*line-height:18px}.mce-btn .mce-caret{margin-top:8px;margin-left:0}.mce-btn-small .mce-caret{margin-top:8px;margin-left:0}.mce-caret{display:inline-block;*display:inline;*zoom:1;width:0;height:0;vertical-align:top;border-top:4px solid #333;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.mce-disabled .mce-caret{border-top-color:#aaa}.mce-caret.mce-up{border-bottom:4px solid #333;border-top:0}.mce-btn-flat{border:0;background:transparent;filter:none}.mce-btn-flat:hover,.mce-btn-flat.mce-active,.mce-btn-flat:focus,.mce-btn-flat:active{border:0;background:#e6e6e6;filter:none}.mce-btn-has-text .mce-ico{padding-right:5px}.mce-rtl .mce-btn button{direction:rtl}.mce-btn-group .mce-btn{border-width:1px;margin:0;margin-left:2px}.mce-btn-group:not(:first-child){border-left:1px solid #d9d9d9;padding-left:3px;margin-left:3px}.mce-btn-group .mce-first{margin-left:0}.mce-btn-group .mce-btn.mce-flow-layout-item{margin:0}.mce-rtl .mce-btn-group .mce-btn{margin-left:0;margin-right:2px}.mce-rtl .mce-btn-group .mce-first{margin-right:0}.mce-rtl .mce-btn-group:not(:first-child){border-left:none;border-right:1px solid #d9d9d9;padding-right:4px;margin-right:4px}.mce-checkbox{cursor:pointer}i.mce-i-checkbox{margin:0 3px 0 0;border:1px solid #c5c5c5;background-color:#f0f0f0;text-indent:-10em;*font-size:0;*line-height:0;*text-indent:0;overflow:hidden}.mce-checked i.mce-i-checkbox{color:#333;font-size:16px;line-height:16px;text-indent:0}.mce-checkbox:focus i.mce-i-checkbox,.mce-checkbox.mce-focus i.mce-i-checkbox{border:1px solid rgba(82,168,236,0.8)}.mce-checkbox.mce-disabled .mce-label,.mce-checkbox.mce-disabled i.mce-i-checkbox{color:#acacac}.mce-checkbox .mce-label{vertical-align:middle}.mce-rtl .mce-checkbox{direction:rtl;text-align:right}.mce-rtl i.mce-i-checkbox{margin:0 0 0 3px}.mce-combobox{position:relative;display:inline-block;*display:inline;*zoom:1;*height:32px}.mce-combobox input{border:1px solid #c5c5c5;border-right-color:#c5c5c5;height:28px}.mce-combobox.mce-disabled input{color:#adadad}.mce-combobox .mce-btn{border:1px solid #c5c5c5;border-left:0;margin:0}.mce-combobox button{padding-right:8px;padding-left:8px}.mce-combobox.mce-disabled .mce-btn button{cursor:default;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-combobox .mce-status{position:absolute;right:2px;top:50%;line-height:16px;margin-top:-8px;font-size:12px;width:15px;height:15px;text-align:center;cursor:pointer}.mce-combobox.mce-has-status input{padding-right:20px}.mce-combobox.mce-has-open .mce-status{right:37px}.mce-combobox .mce-status.mce-i-warning{color:#c09853}.mce-combobox .mce-status.mce-i-checkmark{color:#468847}.mce-menu.mce-combobox-menu{border-top:0;margin-top:0;max-height:200px}.mce-menu.mce-combobox-menu .mce-menu-item{padding:4px 6px 4px 4px;font-size:11px}.mce-menu.mce-combobox-menu .mce-menu-item-sep{padding:0}.mce-menu.mce-combobox-menu .mce-text{font-size:11px}.mce-menu.mce-combobox-menu .mce-menu-item-link,.mce-menu.mce-combobox-menu .mce-menu-item-link b{font-size:11px}.mce-menu.mce-combobox-menu .mce-text b{font-size:11px}.mce-colorbox i{border:1px solid #c5c5c5;width:14px;height:14px}.mce-colorbutton .mce-ico{position:relative}.mce-colorbutton-grid{margin:4px}.mce-colorbutton button{padding-right:6px;padding-left:6px}.mce-colorbutton .mce-preview{padding-right:3px;display:block;position:absolute;left:50%;top:50%;margin-left:-17px;margin-top:7px;background:gray;width:13px;height:2px;overflow:hidden}.mce-colorbutton.mce-btn-small .mce-preview{margin-left:-16px;padding-right:0;width:16px}.mce-colorbutton .mce-open{padding-left:4px;padding-right:4px;border-left:1px solid transparent}.mce-colorbutton:hover .mce-open{border-color:#ccc}.mce-colorbutton.mce-btn-small .mce-open{padding:0 3px 0 3px}.mce-rtl .mce-colorbutton{direction:rtl}.mce-rtl .mce-colorbutton .mce-preview{margin-left:0;padding-right:0;padding-left:3px}.mce-rtl .mce-colorbutton.mce-btn-small .mce-preview{margin-left:0;padding-right:0;padding-left:2px}.mce-rtl .mce-colorbutton .mce-open{padding-left:4px;padding-right:4px;border-left:0}.mce-colorpicker{position:relative;width:250px;height:220px}.mce-colorpicker-sv{position:absolute;top:0;left:0;width:90%;height:100%;border:1px solid #c5c5c5;cursor:crosshair;overflow:hidden}.mce-colorpicker-h-chunk{width:100%}.mce-colorpicker-overlay1,.mce-colorpicker-overlay2{width:100%;height:100%;position:absolute;top:0;left:0}.mce-colorpicker-overlay1{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr='#ffffff', endColorstr='#00ffffff');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr='#ffffff', endColorstr='#00ffffff')";background:linear-gradient(to right, #fff, rgba(255,255,255,0))}.mce-colorpicker-overlay2{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#00000000', endColorstr='#000000');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#00000000', endColorstr='#000000')";background:linear-gradient(to bottom, rgba(0,0,0,0), #000)}.mce-colorpicker-selector1{background:none;position:absolute;width:12px;height:12px;margin:-8px 0 0 -8px;border:1px solid black;border-radius:50%}.mce-colorpicker-selector2{position:absolute;width:10px;height:10px;border:1px solid white;border-radius:50%}.mce-colorpicker-h{position:absolute;top:0;right:0;width:6.5%;height:100%;border:1px solid #c5c5c5;cursor:crosshair}.mce-colorpicker-h-marker{margin-top:-4px;position:absolute;top:0;left:-1px;width:100%;border:1px solid #333;background:#fff;height:4px;z-index:100}.mce-path{display:inline-block;*display:inline;*zoom:1;padding:8px;white-space:normal}.mce-path .mce-txt{display:inline-block;padding-right:3px}.mce-path .mce-path-body{display:inline-block}.mce-path-item{display:inline-block;*display:inline;*zoom:1;cursor:pointer;color:#333}.mce-path-item:hover{text-decoration:underline}.mce-path-item:focus{background:#666;color:#fff}.mce-path .mce-divider{display:inline}.mce-disabled .mce-path-item{color:#aaa}.mce-rtl .mce-path{direction:rtl}.mce-fieldset{border:0 solid #9E9E9E}.mce-fieldset>.mce-container-body{margin-top:-15px}.mce-fieldset-title{margin-left:5px;padding:0 5px 0 5px}.mce-fit-layout{display:inline-block;*display:inline;*zoom:1}.mce-fit-layout-item{position:absolute}.mce-flow-layout-item{display:inline-block;*display:inline;*zoom:1}.mce-flow-layout-item{margin:2px 0 2px 2px}.mce-flow-layout-item.mce-last{margin-right:2px}.mce-flow-layout{white-space:normal}.mce-tinymce-inline .mce-flow-layout{white-space:nowrap}.mce-rtl .mce-flow-layout{text-align:right;direction:rtl}.mce-rtl .mce-flow-layout-item{margin:2px 2px 2px 0}.mce-rtl .mce-flow-layout-item.mce-last{margin-left:2px}.mce-iframe{border:0 solid rgba(0,0,0,0.2);width:100%;height:100%}.mce-infobox{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 1px rgba(255,255,255,0.75);overflow:hidden;border:1px solid red}.mce-infobox div{display:block;margin:5px}.mce-infobox div button{position:absolute;top:50%;right:4px;cursor:pointer;margin-top:-8px;display:none}.mce-infobox div button:focus{outline:2px solid #ccc}.mce-infobox.mce-has-help div{margin-right:25px}.mce-infobox.mce-has-help button{display:block}.mce-infobox.mce-success{background:#dff0d8;border-color:#d6e9c6}.mce-infobox.mce-success div{color:#3c763d}.mce-infobox.mce-warning{background:#fcf8e3;border-color:#faebcc}.mce-infobox.mce-warning div{color:#8a6d3b}.mce-infobox.mce-error{background:#f2dede;border-color:#ebccd1}.mce-infobox.mce-error div{color:#a94442}.mce-rtl .mce-infobox div{text-align:right;direction:rtl}.mce-label{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 1px rgba(255,255,255,0.75);overflow:hidden}.mce-label.mce-autoscroll{overflow:auto}.mce-label.mce-disabled{color:#aaa}.mce-label.mce-multiline{white-space:pre-wrap}.mce-label.mce-success{color:#468847}.mce-label.mce-warning{color:#c09853}.mce-label.mce-error{color:#b94a48}.mce-rtl .mce-label{text-align:right;direction:rtl}.mce-menubar .mce-menubtn{border-color:transparent;background:transparent;filter:none}.mce-menubar .mce-menubtn button{color:#333}.mce-menubar{border:1px solid rgba(217,217,217,0.52)}.mce-menubar .mce-menubtn button span{color:#333}.mce-menubar .mce-caret{border-top-color:#333}.mce-menubar .mce-menubtn:hover,.mce-menubar .mce-menubtn.mce-active,.mce-menubar .mce-menubtn:focus{border-color:#ccc;background:#fff;filter:none}.mce-menubtn button{color:#333}.mce-menubtn.mce-btn-small span{font-size:12px}.mce-menubtn.mce-fixed-width span{display:inline-block;overflow-x:hidden;text-overflow:ellipsis;width:90px}.mce-menubtn.mce-fixed-width.mce-btn-small span{width:70px}.mce-menubtn .mce-caret{*margin-top:6px}.mce-rtl .mce-menubtn button{direction:rtl;text-align:right}.mce-menu-item{display:block;padding:6px 15px 6px 12px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap;cursor:pointer;line-height:normal;border-left:4px solid transparent;margin-bottom:1px}.mce-menu-item .mce-ico,.mce-menu-item .mce-text{color:#333}.mce-menu-item.mce-disabled .mce-text,.mce-menu-item.mce-disabled .mce-ico{color:#adadad}.mce-menu-item:hover .mce-text,.mce-menu-item.mce-selected .mce-text,.mce-menu-item:focus .mce-text{color:white}.mce-menu-item:hover .mce-ico,.mce-menu-item.mce-selected .mce-ico,.mce-menu-item:focus .mce-ico{color:white}.mce-menu-item.mce-disabled:hover{background:#CCC}.mce-menu-shortcut{display:inline-block;color:#adadad}.mce-menu-shortcut{display:inline-block;*display:inline;*zoom:1;padding:0 15px 0 20px}.mce-menu-item:hover .mce-menu-shortcut,.mce-menu-item.mce-selected .mce-menu-shortcut,.mce-menu-item:focus .mce-menu-shortcut{color:white}.mce-menu-item .mce-caret{margin-top:4px;*margin-top:3px;margin-right:6px;border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:4px solid #333}.mce-menu-item.mce-selected .mce-caret,.mce-menu-item:focus .mce-caret,.mce-menu-item:hover .mce-caret{border-left-color:white}.mce-menu-align .mce-menu-shortcut{*margin-top:-2px}.mce-menu-align .mce-menu-shortcut,.mce-menu-align .mce-caret{position:absolute;right:0}.mce-menu-item.mce-active i{visibility:visible}.mce-menu-item-normal.mce-active{background-color:#3498db}.mce-menu-item-preview.mce-active{border-left:5px solid #aaa}.mce-menu-item-normal.mce-active .mce-text{color:white}.mce-menu-item-normal.mce-active:hover .mce-text,.mce-menu-item-normal.mce-active:hover .mce-ico{color:white}.mce-menu-item-normal.mce-active:focus .mce-text,.mce-menu-item-normal.mce-active:focus .mce-ico{color:white}.mce-menu-item:hover,.mce-menu-item.mce-selected,.mce-menu-item:focus{text-decoration:none;color:white;background-color:#2d8ac7}.mce-menu-item-link{color:#093;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mce-menu-item-link b{color:#093}.mce-menu-item-ellipsis{display:block;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mce-menu-item:hover *,.mce-menu-item.mce-selected *,.mce-menu-item:focus *{color:white}div.mce-menu .mce-menu-item-sep,.mce-menu-item-sep:hover{border:0;padding:0;height:1px;margin:9px 1px;overflow:hidden;background:transparent;border-bottom:1px solid rgba(0,0,0,0.1);cursor:default;filter:none}div.mce-menu .mce-menu-item b{font-weight:bold}.mce-menu-item-indent-1{padding-left:20px}.mce-menu-item-indent-2{padding-left:35px}.mce-menu-item-indent-2{padding-left:35px}.mce-menu-item-indent-3{padding-left:40px}.mce-menu-item-indent-4{padding-left:45px}.mce-menu-item-indent-5{padding-left:50px}.mce-menu-item-indent-6{padding-left:55px}.mce-menu.mce-rtl{direction:rtl}.mce-rtl .mce-menu-item{text-align:right;direction:rtl;padding:6px 12px 6px 15px}.mce-menu-align.mce-rtl .mce-menu-shortcut,.mce-menu-align.mce-rtl .mce-caret{right:auto;left:0}.mce-rtl .mce-menu-item .mce-caret{margin-left:6px;margin-right:0;border-right:4px solid #333;border-left:0}.mce-rtl .mce-menu-item.mce-selected .mce-caret,.mce-rtl .mce-menu-item:focus .mce-caret,.mce-rtl .mce-menu-item:hover .mce-caret{border-left-color:transparent;border-right-color:white}.mce-throbber{position:absolute;top:0;left:0;width:100%;height:100%;opacity:.6;filter:alpha(opacity=60);zoom:1;background:#fff url('img/loader.gif') no-repeat center center}.mce-throbber-inline{position:static;height:50px}.mce-menu .mce-throbber-inline{height:25px;background-size:contain}.mce-menu{position:absolute;left:0;top:0;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;z-index:1000;padding:5px 0 5px 0;margin:-1px 0 0;min-width:160px;background:#fff;border:1px solid #989898;border:1px solid rgba(0,0,0,0.2);z-index:1002;max-height:400px;overflow:auto;overflow-x:hidden}.mce-menu i{display:none}.mce-menu-has-icons i{display:inline-block;*display:inline}.mce-menu-sub-tr-tl{margin:-6px 0 0 -1px}.mce-menu-sub-br-bl{margin:6px 0 0 -1px}.mce-menu-sub-tl-tr{margin:-6px 0 0 1px}.mce-menu-sub-bl-br{margin:6px 0 0 1px}.mce-listbox button{text-align:left;padding-right:20px;position:relative}.mce-listbox .mce-caret{position:absolute;margin-top:-2px;right:8px;top:50%}.mce-rtl .mce-listbox .mce-caret{right:auto;left:8px}.mce-rtl .mce-listbox button{padding-right:10px;padding-left:20px}.mce-container-body .mce-resizehandle{position:absolute;right:0;bottom:0;width:16px;height:16px;visibility:visible;cursor:s-resize;margin:0}.mce-container-body .mce-resizehandle-both{cursor:se-resize}i.mce-i-resize{color:#333}.mce-selectbox{background:#fff;border:1px solid #c5c5c5}.mce-slider{border:1px solid #AAA;background:#EEE;width:100px;height:10px;position:relative;display:block}.mce-slider.mce-vertical{width:10px;height:100px}.mce-slider-handle{border:1px solid #BBB;background:#DDD;display:block;width:13px;height:13px;position:absolute;top:0;left:0;margin-left:-1px;margin-top:-2px}.mce-slider-handle:focus{background:#BBB}.mce-spacer{visibility:hidden}.mce-splitbtn .mce-open{border-left:1px solid transparent}.mce-splitbtn:hover .mce-open{border-left-color:#ccc}.mce-splitbtn button{padding-right:6px;padding-left:6px}.mce-splitbtn .mce-open{padding-right:4px;padding-left:4px}.mce-splitbtn .mce-open.mce-active{background-color:#dbdbdb;outline:1px solid #ccc}.mce-splitbtn.mce-btn-small .mce-open{padding:0 3px 0 3px}.mce-rtl .mce-splitbtn{direction:rtl;text-align:right}.mce-rtl .mce-splitbtn button{padding-right:4px;padding-left:4px}.mce-rtl .mce-splitbtn .mce-open{border-left:0}.mce-stack-layout-item{display:block}.mce-tabs{display:block;border-bottom:1px solid #c5c5c5}.mce-tabs,.mce-tabs+.mce-container-body{background:#FFF}.mce-tab{display:inline-block;*display:inline;*zoom:1;border:1px solid #c5c5c5;border-width:0 1px 0 0;background:#ffffff;padding:8px;text-shadow:0 1px 1px rgba(255,255,255,0.75);height:13px;cursor:pointer}.mce-tab:hover{background:#FDFDFD}.mce-tab.mce-active{background:#FDFDFD;border-bottom-color:transparent;margin-bottom:-1px;height:14px}.mce-rtl .mce-tabs{text-align:right;direction:rtl}.mce-rtl .mce-tab{border-width:0 0 0 1px}.mce-textbox{background:#fff;border:1px solid #c5c5c5;display:inline-block;-webkit-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;height:28px;resize:none;padding:0 4px 0 4px;white-space:pre-wrap;*white-space:pre;color:#333}.mce-textbox:focus,.mce-textbox.mce-focus{border-color:#3498db}.mce-placeholder .mce-textbox{color:#aaa}.mce-textbox.mce-multiline{padding:4px;height:auto}.mce-textbox.mce-disabled{color:#adadad}.mce-rtl .mce-textbox{text-align:right;direction:rtl}@font-face{font-family:'tinymce';src:url('fonts/tinymce.eot');src:url('fonts/tinymce.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce.woff') format('woff'),url('fonts/tinymce.ttf') format('truetype'),url('fonts/tinymce.svg#tinymce') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'tinymce-small';src:url('fonts/tinymce-small.eot');src:url('fonts/tinymce-small.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce-small.woff') format('woff'),url('fonts/tinymce-small.ttf') format('truetype'),url('fonts/tinymce-small.svg#tinymce') format('svg');font-weight:normal;font-style:normal}.mce-ico{font-family:'tinymce';font-style:normal;font-weight:normal;font-size:16px;line-height:16px;vertical-align:text-top;-webkit-font-smoothing:antialiased;display:inline-block;background:transparent center center;width:16px;height:16px;color:#333;-ie7-icon:' '}.mce-btn-small .mce-ico{font-family:'tinymce-small'}.mce-ico,i.mce-i-checkbox{zoom:expression(this.runtimeStyle['zoom'] = '1', this.innerHTML = this.currentStyle['-ie7-icon'].substr(1, 1) + '&nbsp;')}.mce-i-save{-ie7-icon:"\e000"}.mce-i-newdocument{-ie7-icon:"\e001"}.mce-i-fullpage{-ie7-icon:"\e002"}.mce-i-alignleft{-ie7-icon:"\e003"}.mce-i-aligncenter{-ie7-icon:"\e004"}.mce-i-alignright{-ie7-icon:"\e005"}.mce-i-alignjustify{-ie7-icon:"\e006"}.mce-i-alignnone{-ie7-icon:"\e003"}.mce-i-cut{-ie7-icon:"\e007"}.mce-i-paste{-ie7-icon:"\e008"}.mce-i-searchreplace{-ie7-icon:"\e009"}.mce-i-bullist{-ie7-icon:"\e00a"}.mce-i-numlist{-ie7-icon:"\e00b"}.mce-i-indent{-ie7-icon:"\e00c"}.mce-i-outdent{-ie7-icon:"\e00d"}.mce-i-blockquote{-ie7-icon:"\e00e"}.mce-i-undo{-ie7-icon:"\e00f"}.mce-i-redo{-ie7-icon:"\e010"}.mce-i-link{-ie7-icon:"\e011"}.mce-i-unlink{-ie7-icon:"\e012"}.mce-i-anchor{-ie7-icon:"\e013"}.mce-i-image{-ie7-icon:"\e014"}.mce-i-media{-ie7-icon:"\e015"}.mce-i-help{-ie7-icon:"\e016"}.mce-i-code{-ie7-icon:"\e017"}.mce-i-insertdatetime{-ie7-icon:"\e018"}.mce-i-preview{-ie7-icon:"\e019"}.mce-i-forecolor{-ie7-icon:"\e01a"}.mce-i-backcolor{-ie7-icon:"\e01a"}.mce-i-table{-ie7-icon:"\e01b"}.mce-i-hr{-ie7-icon:"\e01c"}.mce-i-removeformat{-ie7-icon:"\e01d"}.mce-i-subscript{-ie7-icon:"\e01e"}.mce-i-superscript{-ie7-icon:"\e01f"}.mce-i-charmap{-ie7-icon:"\e020"}.mce-i-emoticons{-ie7-icon:"\e021"}.mce-i-print{-ie7-icon:"\e022"}.mce-i-fullscreen{-ie7-icon:"\e023"}.mce-i-spellchecker{-ie7-icon:"\e024"}.mce-i-nonbreaking{-ie7-icon:"\e025"}.mce-i-template{-ie7-icon:"\e026"}.mce-i-pagebreak{-ie7-icon:"\e027"}.mce-i-restoredraft{-ie7-icon:"\e028"}.mce-i-untitled{-ie7-icon:"\e029"}.mce-i-bold{-ie7-icon:"\e02a"}.mce-i-italic{-ie7-icon:"\e02b"}.mce-i-underline{-ie7-icon:"\e02c"}.mce-i-strikethrough{-ie7-icon:"\e02d"}.mce-i-visualchars{-ie7-icon:"\e02e"}.mce-i-ltr{-ie7-icon:"\e02f"}.mce-i-rtl{-ie7-icon:"\e030"}.mce-i-copy{-ie7-icon:"\e031"}.mce-i-resize{-ie7-icon:"\e032"}.mce-i-browse{-ie7-icon:"\e034"}.mce-i-pastetext{-ie7-icon:"\e035"}.mce-i-rotateleft{-ie7-icon:"\eaa8"}.mce-i-rotateright{-ie7-icon:"\eaa9"}.mce-i-crop{-ie7-icon:"\ee78"}.mce-i-editimage{-ie7-icon:"\e914"}.mce-i-options{-ie7-icon:"\ec6a"}.mce-i-flipv{-ie7-icon:"\eaaa"}.mce-i-fliph{-ie7-icon:"\eaac"}.mce-i-zoomin{-ie7-icon:"\eb35"}.mce-i-zoomout{-ie7-icon:"\eb36"}.mce-i-sun{-ie7-icon:"\eccc"}.mce-i-moon{-ie7-icon:"\eccd"}.mce-i-arrowleft{-ie7-icon:"\edc0"}.mce-i-arrowright{-ie7-icon:"\edb8"}.mce-i-drop{-ie7-icon:"\e934"}.mce-i-contrast{-ie7-icon:"\ecd4"}.mce-i-sharpen{-ie7-icon:"\eba7"}.mce-i-palette{-ie7-icon:"\e92a"}.mce-i-resize2{-ie7-icon:"\edf9"}.mce-i-orientation{-ie7-icon:"\e601"}.mce-i-invert{-ie7-icon:"\e602"}.mce-i-gamma{-ie7-icon:"\e600"}.mce-i-remove{-ie7-icon:"\ed6a"}.mce-i-codesample{-ie7-icon:"\e603"}.mce-i-checkbox,.mce-i-selected{-ie7-icon:"\e033"}.mce-i-selected{visibility:hidden}.mce-i-backcolor{background:#BBB}

--- /dev/null
+++ b/tinymce4/js/tinymce/skins/lightgray/skin.min.css
@@ -1,1 +1,1 @@
-
+.mce-container,.mce-container *,.mce-widget,.mce-widget *,.mce-reset{margin:0;padding:0;border:0;outline:0;vertical-align:top;background:transparent;text-decoration:none;color:#333;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;text-shadow:none;float:none;position:static;width:auto;height:auto;white-space:nowrap;cursor:inherit;-webkit-tap-highlight-color:transparent;line-height:normal;font-weight:normal;text-align:left;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;direction:ltr;max-width:none}.mce-widget button{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.mce-container *[unselectable]{-moz-user-select:none;-webkit-user-select:none;-o-user-select:none;user-select:none}.mce-fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.mce-fade.mce-in{opacity:1}.mce-tinymce{visibility:inherit !important;position:relative}.mce-fullscreen{border:0;padding:0;margin:0;overflow:hidden;height:100%;z-index:100}div.mce-fullscreen{position:fixed;top:0;left:0;width:100%;height:auto}.mce-tinymce{display:block}.mce-wordcount{position:absolute;top:0;right:0;padding:8px}div.mce-edit-area{background:#FFF;filter:none}.mce-statusbar{position:relative}.mce-statusbar .mce-container-body{position:relative}.mce-fullscreen .mce-resizehandle{display:none}.mce-charmap{border-collapse:collapse}.mce-charmap td{cursor:default;border:1px solid rgba(0,0,0,0.2);width:20px;height:20px;line-height:20px;text-align:center;vertical-align:middle;padding:2px}.mce-charmap td div{text-align:center}.mce-charmap td:hover{background:#D9D9D9}.mce-grid td.mce-grid-cell div{border:1px solid #d6d6d6;width:15px;height:15px;margin:0;cursor:pointer}.mce-grid td.mce-grid-cell div:focus{border-color:#3498db}.mce-grid td.mce-grid-cell div[disabled]{cursor:not-allowed}.mce-grid{border-spacing:2px;border-collapse:separate}.mce-grid a{display:block;border:1px solid transparent}.mce-grid a:hover,.mce-grid a:focus{border-color:#3498db}.mce-grid-border{margin:0 4px 0 4px}.mce-grid-border a{border-color:#d6d6d6;width:13px;height:13px}.mce-grid-border a:hover,.mce-grid-border a.mce-active{border-color:#3498db;background:#3498db}.mce-text-center{text-align:center}div.mce-tinymce-inline{width:100%}.mce-colorbtn-trans div{text-align:center;vertical-align:middle;font-weight:bold;font-size:20px;line-height:16px;color:#707070}.mce-monospace{font-family:"Courier New",Courier,monospace}.mce-toolbar-grp{padding:2px 0}.mce-toolbar-grp .mce-flow-layout-item{margin-bottom:0}.mce-rtl .mce-wordcount{left:0;right:auto}.mce-croprect-container{position:absolute;top:0;left:0}.mce-croprect-handle{position:absolute;top:0;left:0;width:20px;height:20px;border:2px solid white}.mce-croprect-handle-nw{border-width:2px 0 0 2px;margin:-2px 0 0 -2px;cursor:nw-resize;top:100px;left:100px}.mce-croprect-handle-ne{border-width:2px 2px 0 0;margin:-2px 0 0 -20px;cursor:ne-resize;top:100px;left:200px}.mce-croprect-handle-sw{border-width:0 0 2px 2px;margin:-20px 2px 0 -2px;cursor:sw-resize;top:200px;left:100px}.mce-croprect-handle-se{border-width:0 2px 2px 0;margin:-20px 0 0 -20px;cursor:se-resize;top:200px;left:200px}.mce-croprect-handle-move{position:absolute;cursor:move;border:0}.mce-croprect-block{opacity:.3;filter:alpha(opacity=30);zoom:1;position:absolute;background:black}.mce-croprect-handle:focus{border-color:#3498db}.mce-croprect-handle-move:focus{outline:1px solid #3498db}.mce-imagepanel{overflow:auto;background:black}.mce-imagepanel-bg{position:absolute;background:url('data:image/gif;base64,R0lGODdhDAAMAIABAMzMzP///ywAAAAADAAMAAACFoQfqYeabNyDMkBQb81Uat85nxguUAEAOw==')}.mce-imagepanel img{position:absolute}.mce-imagetool.mce-btn .mce-ico{display:block;width:20px;height:20px;text-align:center;line-height:20px;font-size:20px;padding:5px}.mce-arrow-up{margin-top:12px}.mce-arrow-down{margin-top:-12px}.mce-arrow:before,.mce-arrow:after{position:absolute;left:50%;display:block;width:0;height:0;border-style:solid;border-color:transparent;content:""}.mce-arrow.mce-arrow-up:before{top:-9px;border-bottom-color:rgba(0,0,0,0.2);border-width:0 9px 9px;margin-left:-9px}.mce-arrow.mce-arrow-down:before{bottom:-9px;border-top-color:rgba(0,0,0,0.2);border-width:9px 9px 0;margin-left:-9px}.mce-arrow.mce-arrow-up:after{top:-8px;border-bottom-color:#f0f0f0;border-width:0 8px 8px;margin-left:-8px}.mce-arrow.mce-arrow-down:after{bottom:-8px;border-top-color:#f0f0f0;border-width:8px 8px 0;margin-left:-8px}.mce-arrow.mce-arrow-left:before,.mce-arrow.mce-arrow-left:after{margin:0}.mce-arrow.mce-arrow-left:before{left:8px}.mce-arrow.mce-arrow-left:after{left:9px}.mce-arrow.mce-arrow-right:before,.mce-arrow.mce-arrow-right:after{left:auto;margin:0}.mce-arrow.mce-arrow-right:before{right:8px}.mce-arrow.mce-arrow-right:after{right:9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left:before{left:-9px;top:50%;border-right-color:rgba(0,0,0,0.2);border-width:9px 9px 9px 0;margin-top:-9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left:after{left:-8px;top:50%;border-right-color:#f0f0f0;border-width:8px 8px 8px 0;margin-top:-8px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-left{margin-left:12px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right:before{right:-9px;top:50%;border-left-color:rgba(0,0,0,0.2);border-width:9px 0 9px 9px;margin-top:-9px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right:after{right:-8px;top:50%;border-left-color:#f0f0f0;border-width:8px 0 8px 8px;margin-top:-8px}.mce-arrow.mce-arrow-center.mce-arrow.mce-arrow-right{margin-left:-14px}.mce-edit-aria-container>.mce-container-body{display:flex}.mce-edit-aria-container>.mce-container-body .mce-edit-area{flex:1}.mce-edit-aria-container>.mce-container-body .mce-sidebar>.mce-container-body{display:flex;align-items:stretch;height:100%}.mce-edit-aria-container>.mce-container-body .mce-sidebar-panel{min-width:250px;max-width:250px;position:relative}.mce-edit-aria-container>.mce-container-body .mce-sidebar-panel>.mce-container-body{position:absolute;width:100%;height:100%;overflow:auto;top:0;left:0}.mce-sidebar-toolbar{border:0 solid rgba(0,0,0,0.2);border-left-width:1px}.mce-sidebar-toolbar .mce-btn.mce-active,.mce-sidebar-toolbar .mce-btn.mce-active:hover{border:1px solid transparent;border-color:transparent;background-color:#2d8ac7}.mce-sidebar-toolbar .mce-btn.mce-active button,.mce-sidebar-toolbar .mce-btn.mce-active:hover button,.mce-sidebar-toolbar .mce-btn.mce-active button i,.mce-sidebar-toolbar .mce-btn.mce-active:hover button i{color:#fff;text-shadow:1px 1px none}.mce-sidebar-panel{border:0 solid rgba(0,0,0,0.2);border-left-width:1px}.mce-container,.mce-container-body{display:block}.mce-autoscroll{overflow:hidden}.mce-scrollbar{position:absolute;width:7px;height:100%;top:2px;right:2px;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-scrollbar-h{top:auto;right:auto;left:2px;bottom:2px;width:100%;height:7px}.mce-scrollbar-thumb{position:absolute;background-color:#000;border:1px solid #888;border-color:rgba(85,85,85,0.6);width:5px;height:100%}.mce-scrollbar-h .mce-scrollbar-thumb{width:100%;height:5px}.mce-scrollbar:hover,.mce-scrollbar.mce-active{background-color:#AAA;opacity:.6;filter:alpha(opacity=60);zoom:1}.mce-scroll{position:relative}.mce-panel{border:0 solid #cacaca;border:0 solid rgba(0,0,0,0.2);background-color:#f0f0f0}.mce-floatpanel{position:absolute}.mce-floatpanel.mce-fixed{position:fixed}.mce-floatpanel .mce-arrow,.mce-floatpanel .mce-arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.mce-floatpanel .mce-arrow{border-width:11px}.mce-floatpanel .mce-arrow:after{border-width:10px;content:""}.mce-floatpanel.mce-popover{filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;top:0;left:0;background:#FFF;border:1px solid rgba(0,0,0,0.2);border:1px solid rgba(0,0,0,0.25)}.mce-floatpanel.mce-popover.mce-bottom{margin-top:10px;*margin-top:0}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:rgba(0,0,0,0.2);border-bottom-color:rgba(0,0,0,0.25);top:-11px}.mce-floatpanel.mce-popover.mce-bottom>.mce-arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#FFF}.mce-floatpanel.mce-popover.mce-bottom.mce-start{margin-left:-22px}.mce-floatpanel.mce-popover.mce-bottom.mce-start>.mce-arrow{left:20px}.mce-floatpanel.mce-popover.mce-bottom.mce-end{margin-left:22px}.mce-floatpanel.mce-popover.mce-bottom.mce-end>.mce-arrow{right:10px;left:auto}.mce-fullscreen{border:0;padding:0;margin:0;overflow:hidden;height:100%}div.mce-fullscreen{position:fixed;top:0;left:0}#mce-modal-block{opacity:0;filter:alpha(opacity=0);zoom:1;position:fixed;left:0;top:0;width:100%;height:100%;background:#000}#mce-modal-block.mce-in{opacity:.3;filter:alpha(opacity=30);zoom:1}.mce-window-move{cursor:move}.mce-window{filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;background:#FFF;position:fixed;top:0;left:0;opacity:0;transform:scale(.1);transition:transform 100ms ease-in,opacity 150ms ease-in}.mce-window.mce-in{transform:scale(1);opacity:1}.mce-window-head{padding:9px 15px;border-bottom:1px solid #c5c5c5;position:relative}.mce-window-head .mce-close{position:absolute;right:0;top:0;height:38px;width:38px;text-align:center;cursor:pointer}.mce-window-head .mce-close i{color:#858585}.mce-close:hover i{color:#adadad}.mce-window-head .mce-title{line-height:20px;font-size:20px;font-weight:bold;text-rendering:optimizelegibility;padding-right:20px}.mce-window .mce-container-body{display:block}.mce-foot{display:block;background-color:#FFF;border-top:1px solid #c5c5c5}.mce-window-head .mce-dragh{position:absolute;top:0;left:0;cursor:move;width:90%;height:100%}.mce-window iframe{width:100%;height:100%}.mce-window-body .mce-listbox{border-color:#ccc}.mce-rtl .mce-window-head .mce-close{position:absolute;right:auto;left:15px}.mce-rtl .mce-window-head .mce-dragh{left:auto;right:0}.mce-rtl .mce-window-head .mce-title{direction:rtl;text-align:right}.mce-tooltip{position:absolute;padding:5px;opacity:.8;filter:alpha(opacity=80);zoom:1}.mce-tooltip-inner{font-size:11px;background-color:#000;color:white;max-width:200px;padding:5px 8px 4px 8px;text-align:center;white-space:normal}.mce-tooltip-arrow{position:absolute;width:0;height:0;line-height:0;border:5px dashed #000}.mce-tooltip-arrow-n{border-bottom-color:#000}.mce-tooltip-arrow-s{border-top-color:#000}.mce-tooltip-arrow-e{border-left-color:#000}.mce-tooltip-arrow-w{border-right-color:#000}.mce-tooltip-nw,.mce-tooltip-sw{margin-left:-14px}.mce-tooltip-ne,.mce-tooltip-se{margin-left:14px}.mce-tooltip-n .mce-tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-nw .mce-tooltip-arrow{top:0;left:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-ne .mce-tooltip-arrow{top:0;right:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-s .mce-tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-sw .mce-tooltip-arrow{bottom:0;left:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-se .mce-tooltip-arrow{bottom:0;right:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.mce-tooltip-e .mce-tooltip-arrow{right:0;top:50%;margin-top:-5px;border-left-style:solid;border-right:none;border-top-color:transparent;border-bottom-color:transparent}.mce-tooltip-w .mce-tooltip-arrow{left:0;top:50%;margin-top:-5px;border-right-style:solid;border-left:none;border-top-color:transparent;border-bottom-color:transparent}.mce-progress{display:inline-block;position:relative;height:20px}.mce-progress .mce-bar-container{display:inline-block;width:100px;height:100%;margin-right:8px;border:1px solid #ccc;overflow:hidden}.mce-progress .mce-text{display:inline-block;margin-top:auto;margin-bottom:auto;font-size:14px;width:40px;color:#333}.mce-bar{display:block;width:0;height:100%;background-color:#d7d7d7;-webkit-transition:width .2s ease;transition:width .2s ease}.mce-notification{position:absolute;background-color:#F0F0F0;padding:5px;margin-top:5px;border-width:1px;border-style:solid;border-color:#CCCCCC;transition:transform 100ms ease-in,opacity 150ms ease-in;opacity:0}.mce-notification.mce-in{opacity:1}.mce-notification-success{background-color:#dff0d8;border-color:#d6e9c6}.mce-notification-info{background-color:#d9edf7;border-color:#779ECB}.mce-notification-warning{background-color:#fcf8e3;border-color:#faebcc}.mce-notification-error{background-color:#f2dede;border-color:#ebccd1}.mce-notification.mce-has-close{padding-right:15px}.mce-notification .mce-ico{margin-top:5px}.mce-notification-inner{display:inline-block;font-size:14px;margin:5px 8px 4px 8px;text-align:center;white-space:normal;color:#31708f}.mce-notification-inner a{text-decoration:underline;cursor:pointer}.mce-notification .mce-progress{margin-right:8px}.mce-notification .mce-progress .mce-text{margin-top:5px}.mce-notification *,.mce-notification .mce-progress .mce-text{color:#333333}.mce-notification .mce-progress .mce-bar-container{border-color:#CCCCCC}.mce-notification .mce-progress .mce-bar-container .mce-bar{background-color:#333333}.mce-notification-success *,.mce-notification-success .mce-progress .mce-text{color:#3c763d}.mce-notification-success .mce-progress .mce-bar-container{border-color:#d6e9c6}.mce-notification-success .mce-progress .mce-bar-container .mce-bar{background-color:#3c763d}.mce-notification-info *,.mce-notification-info .mce-progress .mce-text{color:#31708f}.mce-notification-info .mce-progress .mce-bar-container{border-color:#779ECB}.mce-notification-info .mce-progress .mce-bar-container .mce-bar{background-color:#31708f}.mce-notification-warning *,.mce-notification-warning .mce-progress .mce-text{color:#8a6d3b}.mce-notification-warning .mce-progress .mce-bar-container{border-color:#faebcc}.mce-notification-warning .mce-progress .mce-bar-container .mce-bar{background-color:#8a6d3b}.mce-notification-error *,.mce-notification-error .mce-progress .mce-text{color:#a94442}.mce-notification-error .mce-progress .mce-bar-container{border-color:#ebccd1}.mce-notification-error .mce-progress .mce-bar-container .mce-bar{background-color:#a94442}.mce-notification .mce-close{position:absolute;top:6px;right:8px;font-size:20px;font-weight:bold;line-height:20px;color:#858585;cursor:pointer;height:20px;overflow:hidden}.mce-abs-layout{position:relative}body .mce-abs-layout-item,.mce-abs-end{position:absolute}.mce-abs-end{width:1px;height:1px}.mce-container-body.mce-abs-layout{overflow:hidden}.mce-btn{border:1px solid #b1b1b1;border-color:transparent transparent transparent transparent;position:relative;text-shadow:0 1px 1px rgba(255,255,255,0.75);display:inline-block;*display:inline;*zoom:1;background-color:#f0f0f0}.mce-btn:hover,.mce-btn:focus{color:#333;background-color:#e3e3e3;border-color:#ccc}.mce-btn.mce-disabled button,.mce-btn.mce-disabled:hover button{cursor:default;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-btn.mce-active,.mce-btn.mce-active:hover{background-color:#dbdbdb;border-color:#ccc}.mce-btn:active{background-color:#e0e0e0;border-color:#ccc}.mce-btn button{padding:4px 8px;font-size:14px;line-height:20px;*line-height:16px;cursor:pointer;color:#333;text-align:center;overflow:visible;-webkit-appearance:none}.mce-btn button::-moz-focus-inner{border:0;padding:0}.mce-btn i{text-shadow:1px 1px none}.mce-primary.mce-btn-has-text{min-width:50px}.mce-primary{color:#fff;border:1px solid transparent;border-color:transparent;background-color:#2d8ac7}.mce-primary:hover,.mce-primary:focus{background-color:#257cb6;border-color:transparent}.mce-primary.mce-disabled button,.mce-primary.mce-disabled:hover button{cursor:default;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-primary.mce-active,.mce-primary.mce-active:hover,.mce-primary:not(.mce-disabled):active{background-color:#206ea1}.mce-primary button,.mce-primary button i{color:#fff;text-shadow:1px 1px none}.mce-btn .mce-txt{font-size:inherit;line-height:inherit;color:inherit}.mce-btn-large button{padding:9px 14px;font-size:16px;line-height:normal}.mce-btn-large i{margin-top:2px}.mce-btn-small button{padding:1px 5px;font-size:12px;*padding-bottom:2px}.mce-btn-small i{line-height:20px;vertical-align:top;*line-height:18px}.mce-btn .mce-caret{margin-top:8px;margin-left:0}.mce-btn-small .mce-caret{margin-top:8px;margin-left:0}.mce-caret{display:inline-block;*display:inline;*zoom:1;width:0;height:0;vertical-align:top;border-top:4px solid #333;border-right:4px solid transparent;border-left:4px solid transparent;content:""}.mce-disabled .mce-caret{border-top-color:#aaa}.mce-caret.mce-up{border-bottom:4px solid #333;border-top:0}.mce-btn-flat{border:0;background:transparent;filter:none}.mce-btn-flat:hover,.mce-btn-flat.mce-active,.mce-btn-flat:focus,.mce-btn-flat:active{border:0;background:#e6e6e6;filter:none}.mce-btn-has-text .mce-ico{padding-right:5px}.mce-rtl .mce-btn button{direction:rtl}.mce-btn-group .mce-btn{border-width:1px;margin:0;margin-left:2px}.mce-btn-group:not(:first-child){border-left:1px solid #d9d9d9;padding-left:3px;margin-left:3px}.mce-btn-group .mce-first{margin-left:0}.mce-btn-group .mce-btn.mce-flow-layout-item{margin:0}.mce-rtl .mce-btn-group .mce-btn{margin-left:0;margin-right:2px}.mce-rtl .mce-btn-group .mce-first{margin-right:0}.mce-rtl .mce-btn-group:not(:first-child){border-left:none;border-right:1px solid #d9d9d9;padding-right:4px;margin-right:4px}.mce-checkbox{cursor:pointer}i.mce-i-checkbox{margin:0 3px 0 0;border:1px solid #c5c5c5;background-color:#f0f0f0;text-indent:-10em;*font-size:0;*line-height:0;*text-indent:0;overflow:hidden}.mce-checked i.mce-i-checkbox{color:#333;font-size:16px;line-height:16px;text-indent:0}.mce-checkbox:focus i.mce-i-checkbox,.mce-checkbox.mce-focus i.mce-i-checkbox{border:1px solid rgba(82,168,236,0.8)}.mce-checkbox.mce-disabled .mce-label,.mce-checkbox.mce-disabled i.mce-i-checkbox{color:#acacac}.mce-checkbox .mce-label{vertical-align:middle}.mce-rtl .mce-checkbox{direction:rtl;text-align:right}.mce-rtl i.mce-i-checkbox{margin:0 0 0 3px}.mce-combobox{position:relative;display:inline-block;*display:inline;*zoom:1;*height:32px}.mce-combobox input{border:1px solid #c5c5c5;border-right-color:#c5c5c5;height:28px}.mce-combobox.mce-disabled input{color:#adadad}.mce-combobox .mce-btn{border:1px solid #c5c5c5;border-left:0;margin:0}.mce-combobox button{padding-right:8px;padding-left:8px}.mce-combobox.mce-disabled .mce-btn button{cursor:default;opacity:.4;filter:alpha(opacity=40);zoom:1}.mce-combobox .mce-status{position:absolute;right:2px;top:50%;line-height:16px;margin-top:-8px;font-size:12px;width:15px;height:15px;text-align:center;cursor:pointer}.mce-combobox.mce-has-status input{padding-right:20px}.mce-combobox.mce-has-open .mce-status{right:37px}.mce-combobox .mce-status.mce-i-warning{color:#c09853}.mce-combobox .mce-status.mce-i-checkmark{color:#468847}.mce-menu.mce-combobox-menu{border-top:0;margin-top:0;max-height:200px}.mce-menu.mce-combobox-menu .mce-menu-item{padding:4px 6px 4px 4px;font-size:11px}.mce-menu.mce-combobox-menu .mce-menu-item-sep{padding:0}.mce-menu.mce-combobox-menu .mce-text{font-size:11px}.mce-menu.mce-combobox-menu .mce-menu-item-link,.mce-menu.mce-combobox-menu .mce-menu-item-link b{font-size:11px}.mce-menu.mce-combobox-menu .mce-text b{font-size:11px}.mce-colorbox i{border:1px solid #c5c5c5;width:14px;height:14px}.mce-colorbutton .mce-ico{position:relative}.mce-colorbutton-grid{margin:4px}.mce-colorbutton button{padding-right:6px;padding-left:6px}.mce-colorbutton .mce-preview{padding-right:3px;display:block;position:absolute;left:50%;top:50%;margin-left:-17px;margin-top:7px;background:gray;width:13px;height:2px;overflow:hidden}.mce-colorbutton.mce-btn-small .mce-preview{margin-left:-16px;padding-right:0;width:16px}.mce-colorbutton .mce-open{padding-left:4px;padding-right:4px;border-left:1px solid transparent}.mce-colorbutton:hover .mce-open{border-color:#ccc}.mce-colorbutton.mce-btn-small .mce-open{padding:0 3px 0 3px}.mce-rtl .mce-colorbutton{direction:rtl}.mce-rtl .mce-colorbutton .mce-preview{margin-left:0;padding-right:0;padding-left:3px}.mce-rtl .mce-colorbutton.mce-btn-small .mce-preview{margin-left:0;padding-right:0;padding-left:2px}.mce-rtl .mce-colorbutton .mce-open{padding-left:4px;padding-right:4px;border-left:0}.mce-colorpicker{position:relative;width:250px;height:220px}.mce-colorpicker-sv{position:absolute;top:0;left:0;width:90%;height:100%;border:1px solid #c5c5c5;cursor:crosshair;overflow:hidden}.mce-colorpicker-h-chunk{width:100%}.mce-colorpicker-overlay1,.mce-colorpicker-overlay2{width:100%;height:100%;position:absolute;top:0;left:0}.mce-colorpicker-overlay1{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=1, startColorstr='#ffffff', endColorstr='#00ffffff');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=1,startColorstr='#ffffff', endColorstr='#00ffffff')";background:linear-gradient(to right, #fff, rgba(255,255,255,0))}.mce-colorpicker-overlay2{filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0, startColorstr='#00000000', endColorstr='#000000');-ms-filter:"progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr='#00000000', endColorstr='#000000')";background:linear-gradient(to bottom, rgba(0,0,0,0), #000)}.mce-colorpicker-selector1{background:none;position:absolute;width:12px;height:12px;margin:-8px 0 0 -8px;border:1px solid black;border-radius:50%}.mce-colorpicker-selector2{position:absolute;width:10px;height:10px;border:1px solid white;border-radius:50%}.mce-colorpicker-h{position:absolute;top:0;right:0;width:6.5%;height:100%;border:1px solid #c5c5c5;cursor:crosshair}.mce-colorpicker-h-marker{margin-top:-4px;position:absolute;top:0;left:-1px;width:100%;border:1px solid #333;background:#fff;height:4px;z-index:100}.mce-path{display:inline-block;*display:inline;*zoom:1;padding:8px;white-space:normal}.mce-path .mce-txt{display:inline-block;padding-right:3px}.mce-path .mce-path-body{display:inline-block}.mce-path-item{display:inline-block;*display:inline;*zoom:1;cursor:pointer;color:#333}.mce-path-item:hover{text-decoration:underline}.mce-path-item:focus{background:#666;color:#fff}.mce-path .mce-divider{display:inline}.mce-disabled .mce-path-item{color:#aaa}.mce-rtl .mce-path{direction:rtl}.mce-fieldset{border:0 solid #9E9E9E}.mce-fieldset>.mce-container-body{margin-top:-15px}.mce-fieldset-title{margin-left:5px;padding:0 5px 0 5px}.mce-fit-layout{display:inline-block;*display:inline;*zoom:1}.mce-fit-layout-item{position:absolute}.mce-flow-layout-item{display:inline-block;*display:inline;*zoom:1}.mce-flow-layout-item{margin:2px 0 2px 2px}.mce-flow-layout-item.mce-last{margin-right:2px}.mce-flow-layout{white-space:normal}.mce-tinymce-inline .mce-flow-layout{white-space:nowrap}.mce-rtl .mce-flow-layout{text-align:right;direction:rtl}.mce-rtl .mce-flow-layout-item{margin:2px 2px 2px 0}.mce-rtl .mce-flow-layout-item.mce-last{margin-left:2px}.mce-iframe{border:0 solid rgba(0,0,0,0.2);width:100%;height:100%}.mce-infobox{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 1px rgba(255,255,255,0.75);overflow:hidden;border:1px solid red}.mce-infobox div{display:block;margin:5px}.mce-infobox div button{position:absolute;top:50%;right:4px;cursor:pointer;margin-top:-8px;display:none}.mce-infobox div button:focus{outline:2px solid #ccc}.mce-infobox.mce-has-help div{margin-right:25px}.mce-infobox.mce-has-help button{display:block}.mce-infobox.mce-success{background:#dff0d8;border-color:#d6e9c6}.mce-infobox.mce-success div{color:#3c763d}.mce-infobox.mce-warning{background:#fcf8e3;border-color:#faebcc}.mce-infobox.mce-warning div{color:#8a6d3b}.mce-infobox.mce-error{background:#f2dede;border-color:#ebccd1}.mce-infobox.mce-error div{color:#a94442}.mce-rtl .mce-infobox div{text-align:right;direction:rtl}.mce-label{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 1px rgba(255,255,255,0.75);overflow:hidden}.mce-label.mce-autoscroll{overflow:auto}.mce-label.mce-disabled{color:#aaa}.mce-label.mce-multiline{white-space:pre-wrap}.mce-label.mce-success{color:#468847}.mce-label.mce-warning{color:#c09853}.mce-label.mce-error{color:#b94a48}.mce-rtl .mce-label{text-align:right;direction:rtl}.mce-menubar .mce-menubtn{border-color:transparent;background:transparent;filter:none}.mce-menubar .mce-menubtn button{color:#333}.mce-menubar{border:1px solid rgba(217,217,217,0.52)}.mce-menubar .mce-menubtn button span{color:#333}.mce-menubar .mce-caret{border-top-color:#333}.mce-menubar .mce-menubtn:hover,.mce-menubar .mce-menubtn.mce-active,.mce-menubar .mce-menubtn:focus{border-color:#ccc;background:#fff;filter:none}.mce-menubtn button{color:#333}.mce-menubtn.mce-btn-small span{font-size:12px}.mce-menubtn.mce-fixed-width span{display:inline-block;overflow-x:hidden;text-overflow:ellipsis;width:90px}.mce-menubtn.mce-fixed-width.mce-btn-small span{width:70px}.mce-menubtn .mce-caret{*margin-top:6px}.mce-rtl .mce-menubtn button{direction:rtl;text-align:right}.mce-menu-item{display:block;padding:6px 15px 6px 12px;clear:both;font-weight:normal;line-height:20px;color:#333;white-space:nowrap;cursor:pointer;line-height:normal;border-left:4px solid transparent;margin-bottom:1px}.mce-menu-item .mce-ico,.mce-menu-item .mce-text{color:#333}.mce-menu-item.mce-disabled .mce-text,.mce-menu-item.mce-disabled .mce-ico{color:#adadad}.mce-menu-item:hover .mce-text,.mce-menu-item.mce-selected .mce-text,.mce-menu-item:focus .mce-text{color:white}.mce-menu-item:hover .mce-ico,.mce-menu-item.mce-selected .mce-ico,.mce-menu-item:focus .mce-ico{color:white}.mce-menu-item.mce-disabled:hover{background:#CCC}.mce-menu-shortcut{display:inline-block;color:#adadad}.mce-menu-shortcut{display:inline-block;*display:inline;*zoom:1;padding:0 15px 0 20px}.mce-menu-item:hover .mce-menu-shortcut,.mce-menu-item.mce-selected .mce-menu-shortcut,.mce-menu-item:focus .mce-menu-shortcut{color:white}.mce-menu-item .mce-caret{margin-top:4px;*margin-top:3px;margin-right:6px;border-top:4px solid transparent;border-bottom:4px solid transparent;border-left:4px solid #333}.mce-menu-item.mce-selected .mce-caret,.mce-menu-item:focus .mce-caret,.mce-menu-item:hover .mce-caret{border-left-color:white}.mce-menu-align .mce-menu-shortcut{*margin-top:-2px}.mce-menu-align .mce-menu-shortcut,.mce-menu-align .mce-caret{position:absolute;right:0}.mce-menu-item.mce-active i{visibility:visible}.mce-menu-item-normal.mce-active{background-color:#3498db}.mce-menu-item-preview.mce-active{border-left:5px solid #aaa}.mce-menu-item-normal.mce-active .mce-text{color:white}.mce-menu-item-normal.mce-active:hover .mce-text,.mce-menu-item-normal.mce-active:hover .mce-ico{color:white}.mce-menu-item-normal.mce-active:focus .mce-text,.mce-menu-item-normal.mce-active:focus .mce-ico{color:white}.mce-menu-item:hover,.mce-menu-item.mce-selected,.mce-menu-item:focus{text-decoration:none;color:white;background-color:#2d8ac7}.mce-menu-item-link{color:#093;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.mce-menu-item-link b{color:#093}.mce-menu-item-ellipsis{display:block;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.mce-menu-item:hover *,.mce-menu-item.mce-selected *,.mce-menu-item:focus *{color:white}div.mce-menu .mce-menu-item-sep,.mce-menu-item-sep:hover{border:0;padding:0;height:1px;margin:9px 1px;overflow:hidden;background:transparent;border-bottom:1px solid rgba(0,0,0,0.1);cursor:default;filter:none}div.mce-menu .mce-menu-item b{font-weight:bold}.mce-menu-item-indent-1{padding-left:20px}.mce-menu-item-indent-2{padding-left:35px}.mce-menu-item-indent-2{padding-left:35px}.mce-menu-item-indent-3{padding-left:40px}.mce-menu-item-indent-4{padding-left:45px}.mce-menu-item-indent-5{padding-left:50px}.mce-menu-item-indent-6{padding-left:55px}.mce-menu.mce-rtl{direction:rtl}.mce-rtl .mce-menu-item{text-align:right;direction:rtl;padding:6px 12px 6px 15px}.mce-menu-align.mce-rtl .mce-menu-shortcut,.mce-menu-align.mce-rtl .mce-caret{right:auto;left:0}.mce-rtl .mce-menu-item .mce-caret{margin-left:6px;margin-right:0;border-right:4px solid #333;border-left:0}.mce-rtl .mce-menu-item.mce-selected .mce-caret,.mce-rtl .mce-menu-item:focus .mce-caret,.mce-rtl .mce-menu-item:hover .mce-caret{border-left-color:transparent;border-right-color:white}.mce-throbber{position:absolute;top:0;left:0;width:100%;height:100%;opacity:.6;filter:alpha(opacity=60);zoom:1;background:#fff url('img/loader.gif') no-repeat center center}.mce-throbber-inline{position:static;height:50px}.mce-menu .mce-throbber-inline{height:25px;background-size:contain}.mce-menu{position:absolute;left:0;top:0;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);background:transparent;z-index:1000;padding:5px 0 5px 0;margin:-1px 0 0;min-width:160px;background:#fff;border:1px solid #989898;border:1px solid rgba(0,0,0,0.2);z-index:1002;max-height:400px;overflow:auto;overflow-x:hidden}.mce-menu i{display:none}.mce-menu-has-icons i{display:inline-block;*display:inline}.mce-menu-sub-tr-tl{margin:-6px 0 0 -1px}.mce-menu-sub-br-bl{margin:6px 0 0 -1px}.mce-menu-sub-tl-tr{margin:-6px 0 0 1px}.mce-menu-sub-bl-br{margin:6px 0 0 1px}.mce-listbox button{text-align:left;padding-right:20px;position:relative}.mce-listbox .mce-caret{position:absolute;margin-top:-2px;right:8px;top:50%}.mce-rtl .mce-listbox .mce-caret{right:auto;left:8px}.mce-rtl .mce-listbox button{padding-right:10px;padding-left:20px}.mce-container-body .mce-resizehandle{position:absolute;right:0;bottom:0;width:16px;height:16px;visibility:visible;cursor:s-resize;margin:0}.mce-container-body .mce-resizehandle-both{cursor:se-resize}i.mce-i-resize{color:#333}.mce-selectbox{background:#fff;border:1px solid #c5c5c5}.mce-slider{border:1px solid #AAA;background:#EEE;width:100px;height:10px;position:relative;display:block}.mce-slider.mce-vertical{width:10px;height:100px}.mce-slider-handle{border:1px solid #BBB;background:#DDD;display:block;width:13px;height:13px;position:absolute;top:0;left:0;margin-left:-1px;margin-top:-2px}.mce-slider-handle:focus{background:#BBB}.mce-spacer{visibility:hidden}.mce-splitbtn .mce-open{border-left:1px solid transparent}.mce-splitbtn:hover .mce-open{border-left-color:#ccc}.mce-splitbtn button{padding-right:6px;padding-left:6px}.mce-splitbtn .mce-open{padding-right:4px;padding-left:4px}.mce-splitbtn .mce-open.mce-active{background-color:#dbdbdb;outline:1px solid #ccc}.mce-splitbtn.mce-btn-small .mce-open{padding:0 3px 0 3px}.mce-rtl .mce-splitbtn{direction:rtl;text-align:right}.mce-rtl .mce-splitbtn button{padding-right:4px;padding-left:4px}.mce-rtl .mce-splitbtn .mce-open{border-left:0}.mce-stack-layout-item{display:block}.mce-tabs{display:block;border-bottom:1px solid #c5c5c5}.mce-tabs,.mce-tabs+.mce-container-body{background:#FFF}.mce-tab{display:inline-block;*display:inline;*zoom:1;border:1px solid #c5c5c5;border-width:0 1px 0 0;background:#ffffff;padding:8px;text-shadow:0 1px 1px rgba(255,255,255,0.75);height:13px;cursor:pointer}.mce-tab:hover{background:#FDFDFD}.mce-tab.mce-active{background:#FDFDFD;border-bottom-color:transparent;margin-bottom:-1px;height:14px}.mce-rtl .mce-tabs{text-align:right;direction:rtl}.mce-rtl .mce-tab{border-width:0 0 0 1px}.mce-textbox{background:#fff;border:1px solid #c5c5c5;display:inline-block;-webkit-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;height:28px;resize:none;padding:0 4px 0 4px;white-space:pre-wrap;*white-space:pre;color:#333}.mce-textbox:focus,.mce-textbox.mce-focus{border-color:#3498db}.mce-placeholder .mce-textbox{color:#aaa}.mce-textbox.mce-multiline{padding:4px;height:auto}.mce-textbox.mce-disabled{color:#adadad}.mce-rtl .mce-textbox{text-align:right;direction:rtl}@font-face{font-family:'tinymce';src:url('fonts/tinymce.eot');src:url('fonts/tinymce.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce.woff') format('woff'),url('fonts/tinymce.ttf') format('truetype'),url('fonts/tinymce.svg#tinymce') format('svg');font-weight:normal;font-style:normal}@font-face{font-family:'tinymce-small';src:url('fonts/tinymce-small.eot');src:url('fonts/tinymce-small.eot?#iefix') format('embedded-opentype'),url('fonts/tinymce-small.woff') format('woff'),url('fonts/tinymce-small.ttf') format('truetype'),url('fonts/tinymce-small.svg#tinymce') format('svg');font-weight:normal;font-style:normal}.mce-ico{font-family:'tinymce',Arial;font-style:normal;font-weight:normal;font-variant:normal;font-size:16px;line-height:16px;speak:none;vertical-align:text-top;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;display:inline-block;background:transparent center center;background-size:cover;width:16px;height:16px;color:#333}.mce-btn-small .mce-ico{font-family:'tinymce-small',Arial}.mce-i-save:before{content:"\e000"}.mce-i-newdocument:before{content:"\e001"}.mce-i-fullpage:before{content:"\e002"}.mce-i-alignleft:before{content:"\e003"}.mce-i-aligncenter:before{content:"\e004"}.mce-i-alignright:before{content:"\e005"}.mce-i-alignjustify:before{content:"\e006"}.mce-i-alignnone:before{content:"\e003"}.mce-i-cut:before{content:"\e007"}.mce-i-paste:before{content:"\e008"}.mce-i-searchreplace:before{content:"\e009"}.mce-i-bullist:before{content:"\e00a"}.mce-i-numlist:before{content:"\e00b"}.mce-i-indent:before{content:"\e00c"}.mce-i-outdent:before{content:"\e00d"}.mce-i-blockquote:before{content:"\e00e"}.mce-i-undo:before{content:"\e00f"}.mce-i-redo:before{content:"\e010"}.mce-i-link:before{content:"\e011"}.mce-i-unlink:before{content:"\e012"}.mce-i-anchor:before{content:"\e013"}.mce-i-image:before{content:"\e014"}.mce-i-media:before{content:"\e015"}.mce-i-help:before{content:"\e016"}.mce-i-code:before{content:"\e017"}.mce-i-insertdatetime:before{content:"\e018"}.mce-i-preview:before{content:"\e019"}.mce-i-forecolor:before{content:"\e01a"}.mce-i-backcolor:before{content:"\e01a"}.mce-i-table:before{content:"\e01b"}.mce-i-hr:before{content:"\e01c"}.mce-i-removeformat:before{content:"\e01d"}.mce-i-subscript:before{content:"\e01e"}.mce-i-superscript:before{content:"\e01f"}.mce-i-charmap:before{content:"\e020"}.mce-i-emoticons:before{content:"\e021"}.mce-i-print:before{content:"\e022"}.mce-i-fullscreen:before{content:"\e023"}.mce-i-spellchecker:before{content:"\e024"}.mce-i-nonbreaking:before{content:"\e025"}.mce-i-template:before{content:"\e026"}.mce-i-pagebreak:before{content:"\e027"}.mce-i-restoredraft:before{content:"\e028"}.mce-i-bold:before{content:"\e02a"}.mce-i-italic:before{content:"\e02b"}.mce-i-underline:before{content:"\e02c"}.mce-i-strikethrough:before{content:"\e02d"}.mce-i-visualchars:before{content:"\e02e"}.mce-i-visualblocks:before{content:"\e02e"}.mce-i-ltr:before{content:"\e02f"}.mce-i-rtl:before{content:"\e030"}.mce-i-copy:before{content:"\e031"}.mce-i-resize:before{content:"\e032"}.mce-i-browse:before{content:"\e034"}.mce-i-pastetext:before{content:"\e035"}.mce-i-rotateleft:before{content:"\eaa8"}.mce-i-rotateright:before{content:"\eaa9"}.mce-i-crop:before{content:"\ee78"}.mce-i-editimage:before{content:"\e915"}.mce-i-options:before{content:"\ec6a"}.mce-i-flipv:before{content:"\eaaa"}.mce-i-fliph:before{content:"\eaac"}.mce-i-zoomin:before{content:"\eb35"}.mce-i-zoomout:before{content:"\eb36"}.mce-i-sun:before{content:"\eccc"}.mce-i-moon:before{content:"\eccd"}.mce-i-arrowleft:before{content:"\edc0"}.mce-i-arrowright:before{content:"\e93c"}.mce-i-drop:before{content:"\e935"}.mce-i-contrast:before{content:"\ecd4"}.mce-i-sharpen:before{content:"\eba7"}.mce-i-resize2:before{content:"\edf9"}.mce-i-orientation:before{content:"\e601"}.mce-i-invert:before{content:"\e602"}.mce-i-gamma:before{content:"\e600"}.mce-i-remove:before{content:"\ed6a"}.mce-i-tablerowprops:before{content:"\e604"}.mce-i-tablecellprops:before{content:"\e605"}.mce-i-table2:before{content:"\e606"}.mce-i-tablemergecells:before{content:"\e607"}.mce-i-tableinsertcolbefore:before{content:"\e608"}.mce-i-tableinsertcolafter:before{content:"\e609"}.mce-i-tableinsertrowbefore:before{content:"\e60a"}.mce-i-tableinsertrowafter:before{content:"\e60b"}.mce-i-tablesplitcells:before{content:"\e60d"}.mce-i-tabledelete:before{content:"\e60e"}.mce-i-tableleftheader:before{content:"\e62a"}.mce-i-tabletopheader:before{content:"\e62b"}.mce-i-tabledeleterow:before{content:"\e800"}.mce-i-tabledeletecol:before{content:"\e801"}.mce-i-codesample:before{content:"\e603"}.mce-i-fill:before{content:"\e902"}.mce-i-borderwidth:before{content:"\e903"}.mce-i-line:before{content:"\e904"}.mce-i-count:before{content:"\e905"}.mce-i-translate:before{content:"\e907"}.mce-i-drag:before{content:"\e908"}.mce-i-home:before{content:"\e90b"}.mce-i-upload:before{content:"\e914"}.mce-i-bubble:before{content:"\e91c"}.mce-i-user:before{content:"\e91d"}.mce-i-lock:before{content:"\e926"}.mce-i-unlock:before{content:"\e927"}.mce-i-settings:before{content:"\e928"}.mce-i-remove2:before{content:"\e92a"}.mce-i-menu:before{content:"\e92d"}.mce-i-warning:before{content:"\e930"}.mce-i-question:before{content:"\e931"}.mce-i-pluscircle:before{content:"\e932"}.mce-i-info:before{content:"\e933"}.mce-i-notice:before{content:"\e934"}.mce-i-arrowup:before{content:"\e93b"}.mce-i-arrowdown:before{content:"\e93d"}.mce-i-arrowup2:before{content:"\e93f"}.mce-i-arrowdown2:before{content:"\e940"}.mce-i-menu2:before{content:"\e941"}.mce-i-newtab:before{content:"\e961"}.mce-i-a11y:before{content:"\e900"}.mce-i-plus:before{content:"\e93a"}.mce-i-insert:before{content:"\e93a"}.mce-i-minus:before{content:"\e939"}.mce-i-books:before{content:"\e911"}.mce-i-reload:before{content:"\e906"}.mce-i-toc:before{content:"\e901"}.mce-i-checkmark:before{content:"\e033"}.mce-i-checkbox:before,.mce-i-selected:before{content:"\e033"}.mce-i-insert{font-size:14px}.mce-i-selected{visibility:hidden}i.mce-i-backcolor{text-shadow:none;background:#BBB}

--- /dev/null
+++ b/tinymce4/js/tinymce/themes/inlite/theme.min.js
@@ -1,1 +1,1 @@
-
+!function(){var e={},t=function(t){for(var n=e[t],i=n.deps,o=n.defn,a=i.length,s=new Array(a),l=0;l<a;++l)s[l]=r(i[l]);var c=o.apply(null,s);if(void 0===c)throw"module ["+t+"] returned undefined";n.instance=c},n=function(t,n,r){if("string"!=typeof t)throw"module id must be a string";if(void 0===n)throw"no dependencies for "+t;if(void 0===r)throw"no definition function for "+t;e[t]={deps:n,defn:r,instance:void 0}},r=function(n){var r=e[n];if(void 0===r)throw"module ["+n+"] was undefined";return void 0===r.instance&&t(n),r.instance},i=function(e,t){for(var n=e.length,i=new Array(n),o=0;o<n;++o)i.push(r(e[o]));t.apply(null,t)},o={};o.bolt={module:{api:{define:n,require:i,demand:r}}};var a=n,s=function(e,t){a(e,[],function(){return t})};s("1",tinymce.ThemeManager),s("2",tinymce.util.Delay),s("c",tinymce.util.Tools),s("d",tinymce.ui.Factory),s("e",tinymce.DOM),a("j",[],function(){var e=function(e){return function(t){return typeof t===e}},t=function(e){return Array.isArray(e)},n=function(e){return null===e},r=function(e){return function(r){return!n(r)&&!t(r)&&e(r)}};return{isString:e("string"),isNumber:e("number"),isBoolean:e("boolean"),isFunction:e("function"),isObject:r(e("object")),isNull:n,isArray:t}}),a("f",["c","d","j"],function(e,t,n){var r=function(e,t){var n=function(e,t){return{selector:e,handler:t}},r=function(e){t.active(e)},i=function(e){t.disabled(e)};return t.settings.stateSelector?n(t.settings.stateSelector,r):t.settings.disabledStateSelector?n(t.settings.disabledStateSelector,i):null},i=function(e,t,n){return function(){var i=r(t,n);null!==i&&e.selection.selectorChanged(i.selector,i.handler)}},o=function(e){return n.isArray(e)?e:n.isString(e)?e.split(/[ ,]/):[]},a=function(n,r,a){var s,l=[];if(a)return e.each(o(a),function(e){var r;"|"==e?s=null:t.has(e)?(e={type:e},l.push(e),s=null):n.buttons[e]&&(s||(s={type:"buttongroup",items:[]},l.push(s)),r=e,e=n.buttons[r],"function"==typeof e&&(e=e()),e.type=e.type||"button",e=t.create(e),e.on("postRender",i(n,r,e)),s.items.push(e))}),t.create({type:"toolbar",layout:"flow",name:r,items:l})};return{create:a}}),s("o",tinymce.util.Promise),a("p",[],function(){var e=0,t=function(){var e=function(){return Math.round(4294967295*Math.random()).toString(36)};return"s"+Date.now().toString(36)+e()+e()+e()},n=function(n){return n+e++ +t()};return{uuid:n}}),a("u",[],function(){var e=function(e,t){function n(n){var i,o,a;o=t[n?"startContainer":"endContainer"],a=t[n?"startOffset":"endOffset"],1==o.nodeType&&(i=e.create("span",{"data-mce-type":"bookmark"}),o.hasChildNodes()?(a=Math.min(a,o.childNodes.length-1),n?o.insertBefore(i,o.childNodes[a]):e.insertAfter(i,o.childNodes[a])):o.appendChild(i),o=i,a=0),r[n?"startContainer":"endContainer"]=o,r[n?"startOffset":"endOffset"]=a}var r={};return n(!0),t.collapsed||n(),r},t=function(e,t){function n(n){function r(e){for(var t=e.parentNode.firstChild,n=0;t;){if(t==e)return n;1==t.nodeType&&"bookmark"==t.getAttribute("data-mce-type")||n++,t=t.nextSibling}return-1}var i,o,a;i=a=t[n?"startContainer":"endContainer"],o=t[n?"startOffset":"endOffset"],i&&(1==i.nodeType&&(o=r(i),i=i.parentNode,e.remove(a)),t[n?"startContainer":"endContainer"]=i,t[n?"startOffset":"endOffset"]=o)}n(!0),n();var r=e.createRng();return r.setStart(t.startContainer,t.startOffset),t.endContainer&&r.setEnd(t.endContainer,t.endOffset),r};return{create:e,resolve:t}}),s("v",tinymce.dom.TreeWalker),s("w",tinymce.dom.RangeUtils),a("q",["u","c","v","w"],function(e,t,n,r){var i=function(e,t,r){var i,o,a=[];for(i=new n(t,e),o=t;o&&(1===o.nodeType&&a.push(o),o!==r);o=i.next());return a},o=function(n,r){var i,o,a;o=n.dom,a=n.selection,i=e.create(o,a.getRng()),t.each(r,function(e){n.dom.remove(e,!0)}),a.setRng(e.resolve(o,i))},a=function(e){return"A"===e.nodeName&&e.hasAttribute("href")},s=function(e,t){var n=e.getParent(t,a);return n?n:t},l=function(e){var n,o,l,c,u,d,f;return u=e.selection,d=e.dom,f=u.getRng(),n=s(d,r.getNode(f.startContainer,f.startOffset)),o=r.getNode(f.endContainer,f.endOffset),l=e.getBody(),c=t.grep(i(l,n,o),a)},c=function(e){o(e,l(e))};return{unlinkSelection:c}}),a("m",["p","q"],function(e,t){var n=function(e,t){var n,r,i;for(i='<table data-mce-id="mce" style="width: 100%">',i+="<tbody>",r=0;r<t;r++){for(i+="<tr>",n=0;n<e;n++)i+="<td><br></td>";i+="</tr>"}return i+="</tbody>",i+="</table>"},r=function(e){var t=e.dom.select("*[data-mce-id]");return t[0]},i=function(e,t,i){e.undoManager.transact(function(){var o,a;e.insertContent(n(t,i)),o=r(e),o.removeAttribute("data-mce-id"),a=e.dom.select("td,th",o),e.selection.setCursorLocation(a[0],0)})},o=function(e,t){e.execCommand("FormatBlock",!1,t)},a=function(t,n,r){var i,o;i=t.editorUpload.blobCache,o=i.create(e.uuid("mceu"),r,n),i.add(o),t.insertContent(t.dom.createHTML("img",{src:o.blobUri()}))},s=function(e){e.selection.collapse(!1)},l=function(e){e.focus(),t.unlinkSelection(e),s(e)},c=function(e,t,n){e.focus(),e.dom.setAttrib(t,"href",n),s(e)},u=function(e,t){e.execCommand("mceInsertLink",!1,{href:t}),s(e)},d=function(e,t){var n=e.dom.getParent(e.selection.getStart(),"a[href]");n?c(e,n,t):u(e,t)},f=function(e,t){0===t.trim().length?l(e):d(e,t)};return{insertTable:i,formatBlock:o,insertBlob:a,createLink:f,unlink:l}}),a("r",[],function(){var e=function(e){return/^www\.|\.(com|org|edu|gov|uk|net|ca|de|jp|fr|au|us|ru|ch|it|nl|se|no|es|mil)$/i.test(e.trim())},t=function(e){return/^https?:\/\//.test(e.trim())};return{isDomainLike:e,isAbsolute:t}}),a("g",["c","d","o","m","r"],function(e,t,n,r,i){var o=function(e){e.find("textbox").eq(0).each(function(e){e.focus()})},a=function(n,r){var i=t.create(e.extend({type:"form",layout:"flex",direction:"row",padding:5,name:n,spacing:3},r));return i.on("show",function(){o(i)}),i},s=function(e,t){return t?e.show():e.hide()},l=function(e,t){return new n(function(n){e.windowManager.confirm("The URL you entered seems to be an external link. Do you want to add the required http:// prefix?",function(e){var r=e===!0?"http://"+t:t;n(r)})})},c=function(e,t){return!i.isAbsolute(t)&&i.isDomainLike(t)?l(e,t):n.resolve(t)},u=function(e,t){var n={},i=function(){e.focus(),r.unlink(e),t()},o=function(e){var t=e.meta;t&&t.attach&&(n={href:this.value(),attach:t.attach})},l=function(t){if(t.control===this){var n,r="";n=e.dom.getParent(e.selection.getStart(),"a[href]"),n&&(r=e.dom.getAttrib(n,"href")),this.fromJSON({linkurl:r}),s(this.find("#unlink"),n),this.find("#linkurl")[0].focus()}};return a("quicklink",{items:[{type:"button",name:"unlink",icon:"unlink",onclick:i,tooltip:"Remove link"},{type:"filepicker",name:"linkurl",placeholder:"Paste or type a link",filetype:"file",onchange:o},{type:"button",icon:"checkmark",subtype:"primary",tooltip:"Ok",onclick:"submit"}],onshow:l,onsubmit:function(i){c(e,i.data.linkurl).then(function(i){e.undoManager.transact(function(){i===n.href&&(n.attach(),n={}),r.createLink(e,i)}),t()})}})};return{createQuickLinkForm:u}}),s("s",tinymce.geom.Rect),a("t",[],function(){var e=function(e){return{x:e.left,y:e.top,w:e.width,h:e.height}},t=function(e){return{left:e.x,top:e.y,width:e.w,height:e.h,right:e.x+e.w,bottom:e.y+e.h}};return{fromClientRect:e,toClientRect:t}}),a("h",["e","s","t"],function(e,t,n){var r=function(t){var n=e.getViewPort();return{x:t.x+n.x,y:t.y+n.y,w:t.w,h:t.h}},i=function(e){var t=e.getBoundingClientRect();return r({x:t.left,y:t.top,w:Math.max(e.clientWidth,e.offsetWidth),h:Math.max(e.clientHeight,e.offsetHeight)})},o=function(e,t){return i(t)},a=function(e){return i(e.getElement().ownerDocument.body)},s=function(e){return i(e.getContentAreaContainer()||e.getBody())},l=function(e){var t=e.selection.getBoundingClientRect();return t?r(n.fromClientRect(t)):null};return{getElementRect:o,getPageAreaRect:a,getContentAreaRect:s,getSelectionRect:l}}),a("i",["s","t"],function(e,t){var n=function(e,t){return{rect:e,position:t}},r=function(e,t){return{x:t.x,y:t.y,w:e.w,h:e.h}},i=function(t,i,o,a,s){var l,c,u;return l=e.findBestRelativePosition(s,o,a,t),o=e.clamp(o,a),l?(c=e.relativePosition(s,o,l),u=r(s,c),n(u,l)):(o=e.intersect(a,o),o?(l=e.findBestRelativePosition(s,o,a,i))?(c=e.relativePosition(s,o,l),u=r(s,c),n(u,l)):(u=r(s,o),n(u,l)):null)},o=function(e,t,n){return i(["cr-cl","cl-cr"],["bc-tc","bl-tl","br-tr"],e,t,n)},a=function(e,t,n){return i(["tc-bc","bc-tc","tl-bl","bl-tl","tr-br","br-tr"],["bc-tc","bl-tl","br-tr"],e,t,n)},s=function(e,n,r,i){var o;return"function"==typeof e?(o=e({elementRect:t.toClientRect(n),contentAreaRect:t.toClientRect(r),panelRect:t.toClientRect(i)}),t.fromClientRect(o)):i},l=function(e){return e.panelRect};return{calcInsert:o,calc:a,userConstrain:s,defaultHandler:l}}),a("a",["j"],function(e){var t=function(e,t){if(t(e))return!0;throw new Error("Default value doesn't match requested type.")},n=function(e){return function(n,r,i){var o=n.settings;return t(i,e),r in o&&e(o[r])?o[r]:i}},r=function(e,t){return e.split(t).filter(function(e){return e.length>0})},i=function(t,n){var i=function(e){return"string"==typeof e?r(e,/[ ,]/):e},o=function(e,t){return e===!1?[]:t};return e.isArray(t)?t:e.isString(t)?i(t):e.isBoolean(t)?o(t,n):n},o=function(e){return function(n,r,o){var a=r in n.settings?n.settings[r]:o;return t(o,e),i(a,o)}};return{getStringOr:n(e.isString),getBoolOr:n(e.isBoolean),getNumberOr:n(e.isNumber),getHandlerOr:n(e.isFunction),getToolbarItemsOr:o(e.isArray)}}),a("3",["c","d","e","f","g","h","i","a"],function(e,t,n,r,i,o,a,s){return function(){var l,c,u=["bold","italic","|","quicklink","h2","h3","blockquote"],d=["quickimage","quicktable"],f=function(t,n){return e.map(n,function(e){return r.create(t,e.id,e.items)})},p=function(e){return s.getToolbarItemsOr(e,"selection_toolbar",u)},m=function(e){return s.getToolbarItemsOr(e,"insert_toolbar",d)},h=function(e){return e.items().length>0},g=function(n,o){var a=f(n,o).concat([r.create(n,"text",p(n)),r.create(n,"insert",m(n)),i.createQuickLinkForm(n,k)]);return t.create({type:"floatpanel",role:"dialog",classes:"tinymce tinymce-inline arrow",ariaLabel:"Inline toolbar",layout:"flex",direction:"column",align:"stretch",autohide:!1,autofix:!0,fixed:!0,border:1,items:e.grep(a,h),oncancel:function(){n.focus()}})},v=function(e){e&&e.show()},b=function(e,t){e.moveTo(t.x,t.y)},y=function(t,n){n=n?n.substr(0,2):"",e.each({t:"down",b:"up",c:"center"},function(e,r){t.classes.toggle("arrow-"+e,r===n.substr(0,1))}),"cr"===n?(t.classes.toggle("arrow-left",!0),t.classes.toggle("arrow-right",!1)):"cl"===n?(t.classes.toggle("arrow-left",!0),t.classes.toggle("arrow-right",!0)):e.each({l:"left",r:"right"},function(e,r){t.classes.toggle("arrow-"+e,r===n.substr(1,1))})},C=function(e,t){var n=e.items().filter("#"+t);return n.length>0&&(n[0].show(),e.reflow(),!0)},x=function(e,t,r,i){var l,u,d,f;return f=s.getHandlerOr(r,"inline_toolbar_position_handler",a.defaultHandler),l=o.getContentAreaRect(r),u=n.getRect(e.getEl()),d="insert"===t?a.calcInsert(i,l,u):a.calc(i,l,u),!!d&&(u=d.rect,c=i,b(e,a.userConstrain(f,i,l,u)),y(e,d.position),!0)},w=function(e,t,n,r){return v(e),e.items().hide(),C(e,t)?void(x(e,t,n,r)===!1&&k(e)):void k(e)},N=function(){return l.items().filter("form:visible").length>0},E=function(e,t){if(l){if(l.items().hide(),!C(l,t))return void k(l);var r,i,u,d;v(l),l.items().hide(),C(l,t),d=s.getHandlerOr(e,"inline_toolbar_position_handler",a.defaultHandler),r=o.getContentAreaRect(e),i=n.getRect(l.getEl()),u=a.calc(c,r,i),u&&(i=u.rect,b(l,a.userConstrain(d,c,r,i)),y(l,u.position))}},S=function(e,t,n,r){l||(l=g(e,r),l.renderTo(document.body).reflow().moveTo(n.x,n.y),e.nodeChanged()),w(l,t,e,n)},_=function(e,t,n){l&&x(l,t,e,n)},k=function(){l&&l.hide()},T=function(){l&&l.find("toolbar:visible").eq(0).each(function(e){e.focus(!0)})},R=function(){l&&(l.remove(),l=null)},A=function(){return l&&l.visible()&&N()};return{show:S,showForm:E,reposition:_,inForm:A,hide:k,focus:T,remove:R}}}),a("k",["o"],function(e){var t=function(t){return new e(function(e){var n=new FileReader;n.onloadend=function(){e(n.result.split(",")[1])},n.readAsDataURL(t)})};return{blobToBase64:t}}),a("l",["o"],function(e){var t=function(){return new e(function(e){var t;t=document.createElement("input"),t.type="file",t.style.position="fixed",t.style.left=0,t.style.top=0,t.style.opacity=.001,document.body.appendChild(t),t.onchange=function(t){e(Array.prototype.slice.call(t.target.files))},t.click(),t.parentNode.removeChild(t)})};return{pickFile:t}}),a("4",["3","k","l","m"],function(e,t,n,r){var i=function(e){for(var t=function(t){return function(){r.formatBlock(e,t)}},n=1;n<6;n++){var i="h"+n;e.addButton(i,{text:i.toUpperCase(),tooltip:"Heading "+n,stateSelector:i,onclick:t(i),onPostRender:function(){var e=this.getEl().firstChild.firstChild;e.style.fontWeight="bold"}})}},o=function(e,o){e.addButton("quicklink",{icon:"link",tooltip:"Insert/Edit link",stateSelector:"a[href]",onclick:function(){o.showForm(e,"quicklink")}}),e.addButton("quickimage",{icon:"image",tooltip:"Insert image",onclick:function(){n.pickFile().then(function(n){var i=n[0];t.blobToBase64(i).then(function(t){r.insertBlob(e,t,i)})})}}),e.addButton("quicktable",{icon:"table",tooltip:"Insert table",onclick:function(){o.hide(),r.insertTable(e,2,2)}}),i(e)};return{addToEditor:o}}),s("n",tinymce.EditorManager),a("5",["n","e"],function(e,t){var n=function(e,t){var n=function(){e._skinLoaded=!0,e.fire("SkinLoaded"),t()};e.initialized?n():e.on("init",n)},r=function(t){var n=e.baseURL+"/skins/";return t?n+t:n+"lightgray"},i=function(e,t){return e.documentBaseURI.toAbsolute(t)},o=function(e,o){var a=e.settings,s=a.skin_url?i(e,a.skin_url):r(a.skin),l=function(){n(e,o)};t.styleSheetLoader.load(s+"/skin.min.css",l),e.contentCSS.push(s+"/content.inline.min.css")};return{load:o}}),a("8",[],function(){var e=function(e,t){return{id:e,rect:t}},t=function(e,t){for(var n=0;n<t.length;n++){var r=t[n],i=r(e);if(i)return i}return null};return{match:t,result:e}}),a("6",["8","h"],function(e,t){var n=function(n){return function(r){return r.selection.isCollapsed()?null:e.result(n,t.getSelectionRect(r))}},r=function(n,r){return function(i){var o,a=i.schema.getTextBlockElements();for(o=0;o<n.length;o++)if("TABLE"===n[o].nodeName)return null;for(o=0;o<n.length;o++)if(n[o].nodeName in a)return i.dom.isEmpty(n[o])?e.result(r,t.getSelectionRect(i)):null;return null}};return{textSelection:n,emptyTextBlock:r}}),a("7",["8","h"],function(e,t){var n=function(n,r){return function(i){for(var o=0;o<r.length;o++)if(r[o].predicate(n))return e.result(r[o].id,t.getElementRect(i,n));return null}},r=function(n,r){return function(i){for(var o=0;o<n.length;o++)for(var a=0;a<r.length;a++)if(r[a].predicate(n[o]))return e.result(r[a].id,t.getElementRect(i,n[o]));return null}};return{element:n,parent:r}}),a("9",[],function(){var e=function(t){return t.reduce(function(t,n){return Array.isArray(n)?t.concat(e(n)):t.concat(n)},[])};return{flatten:e}}),a("b",["c"],function(e){var t=function(e,t){return{id:e,predicate:t}},n=function(n){return e.map(n,function(e){return t(e.id,e.predicate)})};return{create:t,fromContextToolbars:n}}),a("0",["1","2","3","4","5","6","7","8","9","a","b"],function(e,t,n,r,i,o,a,s,l,c,u){var d=function(e){var t=e.selection.getNode(),n=e.dom.getParents(t);return n},f=function(e,t,n,r){var i=function(n){return e.dom.is(n,t)};return{predicate:i,id:n,items:r}},p=function(e){var t=e.contextToolbars;return l.flatten([t?t:[],f(e,"img","image","alignleft aligncenter alignright")])},m=function(e,t){var n,r,i;return r=d(e),i=u.fromContextToolbars(t),n=s.match(e,[a.element(r[0],i),o.textSelection("text"),o.emptyTextBlock(r,"insert"),a.parent(r,i)]),n&&n.rect?n:null},h=function(e,t){var n=function(){var n=p(e),r=m(e,n);r?t.show(e,r.id,r.rect,n):t.hide()};return function(){e.removed||n()}},g=function(e,t){return function(){var n=p(e),r=m(e,n);r&&t.reposition(e,r.id,r.rect)}},v=function(e,t){return function(){e.inForm()||t()}},b=function(e,n){var r=t.throttle(h(e,n),0),i=t.throttle(v(n,h(e,n)),0);e.on("blur hide ObjectResizeStart",n.hide),e.on("click",r),e.on("nodeChange mouseup",i),e.on("ResizeEditor keyup",r),e.on("ResizeWindow",g(e,n)),e.on("remove",n.remove),e.shortcuts.add("Alt+F10","",n.focus)},y=function(e,t){e.shortcuts.remove("meta+k"),e.shortcuts.add("meta+k","",function(){var n=p(e),r=r=s.match(e,[o.textSelection("quicklink")]);r&&t.show(e,r.id,r.rect,n)})},C=function(e,t){return i.load(e,function(){b(e,t),y(e,t)}),{}},x=function(e){throw new Error(e)};return e.add("inlite",function(e){var t=new n;r.addToEditor(e,t);var i=function(){return e.inline?C(e,t):x("inlite theme only supports inline mode.")};return{renderUI:i}}),function(){}}),r("0")()}();

--- /dev/null
+++ b/tinymce4/js/tinymce/themes/modern/theme.min.js
@@ -1,1 +1,1 @@
-
+!function(){var e={},t=function(t){for(var n=e[t],i=n.deps,o=n.defn,a=i.length,s=new Array(a),l=0;l<a;++l)s[l]=r(i[l]);var c=o.apply(null,s);if(void 0===c)throw"module ["+t+"] returned undefined";n.instance=c},n=function(t,n,r){if("string"!=typeof t)throw"module id must be a string";if(void 0===n)throw"no dependencies for "+t;if(void 0===r)throw"no definition function for "+t;e[t]={deps:n,defn:r,instance:void 0}},r=function(n){var r=e[n];if(void 0===r)throw"module ["+n+"] was undefined";return void 0===r.instance&&t(n),r.instance},i=function(e,t){for(var n=e.length,i=new Array(n),o=0;o<n;++o)i.push(r(e[o]));t.apply(null,t)},o={};o.bolt={module:{api:{define:n,require:i,demand:r}}};var a=n,s=function(e,t){a(e,[],function(){return t})};s("1",tinymce.Env),s("2",tinymce.EditorManager),s("3",tinymce.ThemeManager),s("8",tinymce.util.Tools),s("9",tinymce.ui.Factory),s("a",tinymce.DOM),a("b",["8","9"],function(e,t){var n="undo redo | styleselect | bold italic | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent | link image",r=function(n,r,i){var o,a=[];if(r)return e.each(r.split(/[ ,]/),function(e){var r,s=function(){var t=n.selection;e.settings.stateSelector&&t.selectorChanged(e.settings.stateSelector,function(t){e.active(t)},!0),e.settings.disabledStateSelector&&t.selectorChanged(e.settings.disabledStateSelector,function(t){e.disabled(t)})};"|"==e?o=null:t.has(e)?(e={type:e,size:i},a.push(e),o=null):(o||(o={type:"buttongroup",items:[]},a.push(o)),n.buttons[e]&&(r=e,e=n.buttons[r],"function"==typeof e&&(e=e()),e.type=e.type||"button",e.size=i,e=t.create(e),o.items.push(e),n.initialized?s():n.on("init",s)))}),{type:"toolbar",layout:"flow",items:a}},i=function(t,i){var o=[],a=t.settings,s=function(e){if(e)return o.push(r(t,e,i)),!0};if(e.isArray(a.toolbar)){if(0===a.toolbar.length)return;e.each(a.toolbar,function(e,t){a["toolbar"+(t+1)]=e}),delete a.toolbar}for(var l=1;l<10&&s(a["toolbar"+l]);l++);if(o.length||a.toolbar===!1||s(a.toolbar||n),o.length)return{type:"panel",layout:"stack",classes:"toolbar-grp",ariaRoot:!0,ariaRemember:!0,items:o}};return{createToolbar:r,createToolbars:i}}),a("c",["8"],function(e){var t={file:{title:"File",items:"newdocument"},edit:{title:"Edit",items:"undo redo | cut copy paste pastetext | selectall"},insert:{title:"Insert",items:"|"},view:{title:"View",items:"visualaid |"},format:{title:"Format",items:"bold italic underline strikethrough superscript subscript | formats | removeformat"},table:{title:"Table"},tools:{title:"Tools"}},n=function(e,t){var n;return"|"==t?{text:"|"}:n=e[t]},r=function(r,i,o){var a,s,l,c,u;if(u=e.makeMap((i.removed_menuitems||"").split(/[ ,]/)),i.menu?(s=i.menu[o],c=!0):s=t[o],s){a={text:s.title},l=[],e.each((s.items||"").split(/[ ,]/),function(e){var t=n(r,e);t&&!u[e]&&l.push(n(r,e))}),c||e.each(r,function(e){e.context==o&&("before"==e.separator&&l.push({text:"|"}),e.prependToContext?l.unshift(e):l.push(e),"after"==e.separator&&l.push({text:"|"}))});for(var d=0;d<l.length;d++)"|"==l[d].text&&(0!==d&&d!=l.length-1||l.splice(d,1));if(a.menu=l,!a.menu.length)return null}return a},i=function(e){var n,i=[],o=e.settings,a=[];if(o.menu)for(n in o.menu)a.push(n);else for(n in t)a.push(n);for(var s="string"==typeof o.menubar?o.menubar.split(/[ ,]/):a,l=0;l<s.length;l++){var c=s[l];c=r(e.menuItems,e.settings,c),c&&i.push(c)}return i};return{createMenuButtons:i}}),s("j",tinymce.util.Delay),s("k",tinymce.geom.Rect),a("d",["a","8","j","b","9","k"],function(e,t,n,r,i,o){var a=function(e){return{left:e.x,top:e.y,width:e.w,height:e.h,right:e.x+e.w,bottom:e.y+e.h}},s=function(e){t.each(e.contextToolbars,function(e){e.panel&&e.panel.hide()})},l=function(e,t){e.moveTo(t.left,t.top)},c=function(e,n,r){n=n?n.substr(0,2):"",t.each({t:"down",b:"up"},function(t,i){e.classes.toggle("arrow-"+t,r(i,n.substr(0,1)))}),t.each({l:"left",r:"right"},function(t,i){e.classes.toggle("arrow-"+t,r(i,n.substr(1,1)))})},u=function(e,t,n,r,i,o){return o=a({x:t,y:n,w:o.w,h:o.h}),e&&(o=e({elementRect:a(r),contentAreaRect:a(i),panelRect:o})),o},d=function(a){var d,f=a.settings,p=function(){return a.contextToolbars||[]},m=function(t){var n,r,i;return n=e.getPos(a.getContentAreaContainer()),r=a.dom.getRect(t),i=a.dom.getRoot(),"BODY"===i.nodeName&&(r.x-=i.ownerDocument.documentElement.scrollLeft||i.scrollLeft,r.y-=i.ownerDocument.documentElement.scrollTop||i.scrollTop),r.x+=n.x,r.y+=n.y,r},h=function(t,n){var r,i,d,p,h,g,v,b,y=f.inline_toolbar_position_handler;if(!a.removed){if(!t||!t.toolbar.panel)return void s(a);v=["bc-tc","tc-bc","tl-bl","bl-tl","tr-br","br-tr"],h=t.toolbar.panel,n&&h.show(),d=m(t.element),i=e.getRect(h.getEl()),p=e.getRect(a.getContentAreaContainer()||a.getBody()),b=25,"inline"!==e.getStyle(t.element,"display",!0)&&(d.w=t.element.clientWidth,d.h=t.element.clientHeight),a.inline||(p.w=a.getDoc().documentElement.offsetWidth),a.selection.controlSelection.isResizable(t.element)&&d.w<b&&(d=o.inflate(d,0,8)),r=o.findBestRelativePosition(i,d,p,v),d=o.clamp(d,p),r?(g=o.relativePosition(i,d,r),l(h,u(y,g.x,g.y,d,p,i))):(p.h+=i.h,d=o.intersect(p,d),d?(r=o.findBestRelativePosition(i,d,p,["bc-tc","bl-tl","br-tr"]),r?(g=o.relativePosition(i,d,r),l(h,u(y,g.x,g.y,d,p,i))):l(h,u(y,d.x,d.y,d,p,i))):h.hide()),c(h,r,function(e,t){return e===t})}},g=function(e){return function(){var t=function(){a.selection&&h(C(a.selection.getNode()),e)};n.requestAnimationFrame(t)}},v=function(){d||(d=a.selection.getScrollContainer()||a.getWin(),e.bind(d,"scroll",g(!0)),a.on("remove",function(){e.unbind(d,"scroll")}))},b=function(e){var t;return e.toolbar.panel?(e.toolbar.panel.show(),void h(e)):(v(),t=i.create({type:"floatpanel",role:"dialog",classes:"tinymce tinymce-inline arrow",ariaLabel:"Inline toolbar",layout:"flex",direction:"column",align:"stretch",autohide:!1,autofix:!0,fixed:!0,border:1,items:r.createToolbar(a,e.toolbar.items),oncancel:function(){a.focus()}}),e.toolbar.panel=t,t.renderTo(document.body).reflow(),void h(e))},y=function(){t.each(p(),function(e){e.panel&&e.panel.hide()})},C=function(e){var t,n,r,i=p();for(r=a.$(e).parents().add(e),t=r.length-1;t>=0;t--)for(n=i.length-1;n>=0;n--)if(i[n].predicate(r[t]))return{toolbar:i[n],element:r[t]};return null};a.on("click keyup setContent ObjectResized",function(e){("setcontent"!==e.type||e.selection)&&n.setEditorTimeout(a,function(){var e;e=C(a.selection.getNode()),e?(y(),b(e)):y()})}),a.on("blur hide contextmenu",y),a.on("ObjectResizeStart",function(){var e=C(a.selection.getNode());e&&e.toolbar.panel&&e.toolbar.panel.hide()}),a.on("ResizeEditor ResizeWindow",g(!0)),a.on("nodeChange",g(!1)),a.on("remove",function(){t.each(p(),function(e){e.panel&&e.panel.remove()}),a.contextToolbars={}}),a.shortcuts.add("ctrl+shift+e > ctrl+shift+p","",function(){var e=C(a.selection.getNode());e&&e.toolbar.panel&&e.toolbar.panel.items()[0].focus()})};return{addContextualToolbars:d}}),a("e",[],function(){var e=function(e,t){return function(){var n=e.find(t)[0];n&&n.focus(!0)}},t=function(t,n){t.shortcuts.add("Alt+F9","",e(n,"menubar")),t.shortcuts.add("Alt+F10,F10","",e(n,"toolbar")),t.shortcuts.add("Alt+F11","",e(n,"elementpath")),n.on("cancel",function(){t.focus()})};return{addKeys:t}}),a("f",["8","9","1"],function(e,t,n){var r=function(e){return{element:function(){return e}}},i=function(e,t,n){var i=e.settings[n];i&&i(r(t.getEl("body")))},o=function(t,n,r){e.each(r,function(e){var r=n.items().filter("#"+e.name)[0];r&&r.visible()&&e.name!==t&&(i(e,r,"onhide"),r.visible(!1))})},a=function(e){e.items().each(function(e){e.active(!1)})},s=function(t,n){return e.grep(t,function(e){return e.name===n})[0]},l=function(e,n,r){return function(l){var c=l.control,u=c.parents().filter("panel")[0],d=u.find("#"+n)[0],f=s(r,n);o(n,u,r),a(c.parent()),d&&d.visible()?(i(f,d,"onhide"),d.hide(),c.active(!1)):(d?(d.show(),i(f,d,"onshow")):(d=t.create({type:"container",name:n,layout:"stack",classes:"sidebar-panel",html:""}),u.prepend(d),i(f,d,"onrender"),i(f,d,"onshow")),c.active(!0)),e.fire("ResizeEditor")}},c=function(){return!n.ie||n.ie>=11},u=function(e){return!(!c()||!e.sidebars)&&e.sidebars.length>0},d=function(t){var n=e.map(t.sidebars,function(e){var n=e.settings;return{type:"button",icon:n.icon,image:n.image,tooltip:n.tooltip,onclick:l(t,e.name,t.sidebars)}});return{type:"panel",name:"sidebar",layout:"stack",classes:"sidebar",items:[{type:"toolbar",layout:"stack",classes:"sidebar-toolbar",items:n}]}};return{hasSidebar:u,createSidebar:d}}),a("g",[],function(){var e=function(e){var t=function(){e._skinLoaded=!0,e.fire("SkinLoaded")};return function(){e.initialized?t():e.on("init",t)}};return{fireSkinLoaded:e}}),a("6",["a"],function(e){var t=function(e){return{width:e.clientWidth,height:e.clientHeight}},n=function(n,r,i){var o,a,s,l,c=n.settings;o=n.getContainer(),a=n.getContentAreaContainer().firstChild,s=t(o),l=t(a),null!==r&&(r=Math.max(c.min_width||100,r),r=Math.min(c.max_width||65535,r),e.setStyle(o,"width",r+(s.width-l.width)),e.setStyle(a,"width",r)),i=Math.max(c.min_height||100,i),i=Math.min(c.max_height||65535,i),e.setStyle(a,"height",i),n.fire("ResizeEditor")},r=function(e,t,r){var i=e.getContentAreaContainer();n(e,i.clientWidth+t,i.clientHeight+r)};return{resizeTo:n,resizeBy:r}}),a("4",["8","9","a","b","c","d","e","f","g","6"],function(e,t,n,r,i,o,a,s,l,c){var u=function(e){return function(t){e.find("*").disabled("readonly"===t.mode)}},d=function(e){return{type:"panel",name:"iframe",layout:"stack",classes:"edit-area",border:e,html:""}},f=function(e){return{type:"panel",layout:"stack",classes:"edit-aria-container",border:"1 0 0 0",items:[d("0"),s.createSidebar(e)]}},p=function(e,p,m){var h,g,v,b=e.settings;return m.skinUiCss&&n.styleSheetLoader.load(m.skinUiCss,l.fireSkinLoaded(e)),h=p.panel=t.create({type:"panel",role:"application",classes:"tinymce",style:"visibility: hidden",layout:"stack",border:1,items:[b.menubar===!1?null:{type:"menubar",border:"0 0 1 0",items:i.createMenuButtons(e)},r.createToolbars(e,b.toolbar_items_size),s.hasSidebar(e)?f(e):d("1 0 0 0")]}),b.resize!==!1&&(g={type:"resizehandle",direction:b.resize,onResizeStart:function(){var t=e.getContentAreaContainer().firstChild;v={width:t.clientWidth,height:t.clientHeight}},onResize:function(t){"both"===b.resize?c.resizeTo(e,v.width+t.deltaX,v.height+t.deltaY):c.resizeTo(e,null,v.height+t.deltaY)}}),b.statusbar!==!1&&h.add({type:"panel",name:"statusbar",classes:"statusbar",layout:"flow",border:"1 0 0 0",ariaRoot:!0,items:[{type:"elementpath",editor:e},g]}),e.fire("BeforeRenderUI"),e.on("SwitchMode",u(h)),h.renderBefore(m.targetNode).reflow(),b.readonly&&e.setMode("readonly"),b.width&&n.setStyle(h.getEl(),"width",b.width),e.on("remove",function(){h.remove(),h=null}),a.addKeys(e,h),o.addContextualToolbars(e),{iframeContainer:h.find("#iframe")[0].getEl(),editorContainer:h.getEl()}};return{render:p}}),s("h",tinymce.ui.FloatPanel),a("5",["8","9","a","h","b","c","d","e","g"],function(e,t,n,r,i,o,a,s,l){var c=function(e,c,u){var d,f,p=e.settings;p.fixed_toolbar_container&&(f=n.select(p.fixed_toolbar_container)[0]);var m=function(){if(d&&d.moveRel&&d.visible()&&!d._fixed){var t=e.selection.getScrollContainer(),r=e.getBody(),i=0,o=0;if(t){var a=n.getPos(r),s=n.getPos(t);i=Math.max(0,s.x-a.x),o=Math.max(0,s.y-a.y)}d.fixed(!1).moveRel(r,e.rtl?["tr-br","br-tr"]:["tl-bl","bl-tl","tr-br"]).moveBy(i,o)}},h=function(){d&&(d.show(),m(),n.addClass(e.getBody(),"mce-edit-focus"))},g=function(){d&&(d.hide(),r.hideAll(),n.removeClass(e.getBody(),"mce-edit-focus"))},v=function(){return d?void(d.visible()||h()):(d=c.panel=t.create({type:f?"panel":"floatpanel",role:"application",classes:"tinymce tinymce-inline",layout:"flex",direction:"column",align:"stretch",autohide:!1,autofix:!0,fixed:!!f,border:1,items:[p.menubar===!1?null:{type:"menubar",border:"0 0 1 0",items:o.createMenuButtons(e)},i.createToolbars(e,p.toolbar_items_size)]}),e.fire("BeforeRenderUI"),d.renderTo(f||document.body).reflow(),s.addKeys(e,d),h(),a.addContextualToolbars(e),e.on("nodeChange",m),e.on("activate",h),e.on("deactivate",g),void e.nodeChanged())};return p.content_editable=!0,e.on("focus",function(){u.skinUiCss?n.styleSheetLoader.load(u.skinUiCss,v,v):v()}),e.on("blur hide",g),e.on("remove",function(){d&&(d.remove(),d=null)}),u.skinUiCss&&n.styleSheetLoader.load(u.skinUiCss,l.fireSkinLoaded(e)),{}};return{render:c}}),s("i",tinymce.ui.Throbber),a("7",["i"],function(e){var t=function(t,n){var r;t.on("ProgressState",function(t){r=r||new e(n.panel.getEl("body")),t.state?r.show(t.time):r.hide()})};return{setup:t}}),a("0",["1","2","3","4","5","6","7"],function(e,t,n,r,i,o,a){var s=function(n,o,s){var l=n.settings,c=l.skin!==!1&&(l.skin||"lightgray");if(c){var u=l.skin_url;u=u?n.documentBaseURI.toAbsolute(u):t.baseURL+"/skins/"+c,e.documentMode<=7?s.skinUiCss=u+"/skin.ie7.min.css":s.skinUiCss=u+"/skin.min.css",n.contentCSS.push(u+"/content"+(n.inline?".inline":"")+".min.css")}return a.setup(n,o),l.inline?i.render(n,o,s):r.render(n,o,s)};return n.add("modern",function(e){return{renderUI:function(t){return s(e,this,t)},resizeTo:function(t,n){return o.resizeTo(e,t,n)},resizeBy:function(t,n){return o.resizeBy(e,t,n)}}}),function(){}}),r("0")()}();

--- /dev/null
+++ b/tinymce4/js/tinymce/tinymce.min.js
@@ -1,1 +1,14 @@
-
+// 4.5.3 (2017-02-01)
+!function(e,t){"use strict";function n(e,t){for(var n,r=[],i=0;i<e.length;++i){if(n=s[e[i]]||o(e[i]),!n)throw"module definition dependecy not found: "+e[i];r.push(n)}t.apply(null,r)}function r(e,r,i){if("string"!=typeof e)throw"invalid module definition, module id must be defined and be a string";if(r===t)throw"invalid module definition, dependencies must be specified";if(i===t)throw"invalid module definition, definition function must be specified";n(r,function(){s[e]=i.apply(null,arguments)})}function i(e){return!!s[e]}function o(t){for(var n=e,r=t.split(/[.\/]/),i=0;i<r.length;++i){if(!n[r[i]])return;n=n[r[i]]}return n}function a(n){var r,i,o,a,l;for(r=0;r<n.length;r++){i=e,o=n[r],a=o.split(/[.\/]/);for(var u=0;u<a.length-1;++u)i[a[u]]===t&&(i[a[u]]={}),i=i[a[u]];i[a[a.length-1]]=s[o]}if(e.AMDLC_TESTS){l=e.privateModules||{};for(o in s)l[o]=s[o];for(r=0;r<n.length;r++)delete l[n[r]];e.privateModules=l}}var s={},l="tinymce/geom/Rect",u="tinymce/util/Promise",c="tinymce/util/Delay",d="tinymce/Env",f="tinymce/dom/EventUtils",p="tinymce/dom/Sizzle",h="tinymce/util/Arr",m="tinymce/util/Tools",g="tinymce/dom/DomQuery",v="tinymce/html/Styles",y="tinymce/dom/TreeWalker",b="tinymce/dom/Range",C="tinymce/html/Entities",x="tinymce/dom/StyleSheetLoader",w="tinymce/dom/DOMUtils",E="tinymce/dom/ScriptLoader",N="tinymce/AddOnManager",_="tinymce/dom/NodeType",S="tinymce/text/Zwsp",k="tinymce/caret/CaretContainer",T="tinymce/dom/RangeUtils",R="tinymce/NodeChange",A="tinymce/html/Node",B="tinymce/html/Schema",D="tinymce/html/SaxParser",L="tinymce/html/DomParser",M="tinymce/html/Writer",P="tinymce/html/Serializer",O="tinymce/dom/Serializer",H="tinymce/dom/TridentSelection",I="tinymce/util/VK",F="tinymce/dom/ControlSelection",z="tinymce/util/Fun",U="tinymce/caret/CaretCandidate",W="tinymce/geom/ClientRect",V="tinymce/text/ExtendingChar",$="tinymce/caret/CaretPosition",q="tinymce/caret/CaretBookmark",j="tinymce/dom/BookmarkManager",Y="tinymce/dom/Selection",X="tinymce/dom/ElementUtils",K="tinymce/fmt/Preview",G="tinymce/fmt/Hooks",J="tinymce/Formatter",Q="tinymce/undo/Diff",Z="tinymce/undo/Fragments",ee="tinymce/undo/Levels",te="tinymce/UndoManager",ne="tinymce/EnterKey",re="tinymce/ForceBlocks",ie="tinymce/caret/CaretUtils",oe="tinymce/caret/CaretWalker",ae="tinymce/InsertList",se="tinymce/InsertContent",le="tinymce/EditorCommands",ue="tinymce/util/URI",ce="tinymce/util/Class",de="tinymce/util/EventDispatcher",fe="tinymce/data/Binding",pe="tinymce/util/Observable",he="tinymce/data/ObservableObject",me="tinymce/ui/Selector",ge="tinymce/ui/Collection",ve="tinymce/ui/DomUtils",ye="tinymce/ui/BoxUtils",be="tinymce/ui/ClassList",Ce="tinymce/ui/ReflowQueue",xe="tinymce/ui/Control",we="tinymce/ui/Factory",Ee="tinymce/ui/KeyboardNavigation",Ne="tinymce/ui/Container",_e="tinymce/ui/DragHelper",Se="tinymce/ui/Scrollable",ke="tinymce/ui/Panel",Te="tinymce/ui/Movable",Re="tinymce/ui/Resizable",Ae="tinymce/ui/FloatPanel",Be="tinymce/ui/Window",De="tinymce/ui/MessageBox",Le="tinymce/WindowManager",Me="tinymce/ui/Tooltip",Pe="tinymce/ui/Widget",Oe="tinymce/ui/Progress",He="tinymce/ui/Notification",Ie="tinymce/NotificationManager",Fe="tinymce/dom/NodePath",ze="tinymce/util/Quirks",Ue="tinymce/EditorObservable",We="tinymce/Mode",Ve="tinymce/Shortcuts",$e="tinymce/file/Uploader",qe="tinymce/file/Conversions",je="tinymce/file/ImageScanner",Ye="tinymce/file/BlobCache",Xe="tinymce/file/UploadStatus",Ke="tinymce/ErrorReporter",Ge="tinymce/EditorUpload",Je="tinymce/caret/FakeCaret",Qe="tinymce/dom/Dimensions",Ze="tinymce/caret/LineWalker",et="tinymce/caret/LineUtils",tt="tinymce/dom/MousePosition",nt="tinymce/DragDropOverrides",rt="tinymce/SelectionOverrides",it="tinymce/util/Uuid",ot="tinymce/ui/Sidebar",at="tinymce/Editor",st="tinymce/util/I18n",lt="tinymce/FocusManager",ut="tinymce/EditorManager",ct="tinymce/LegacyInput",dt="tinymce/util/XHR",ft="tinymce/util/JSON",pt="tinymce/util/JSONRequest",ht="tinymce/util/JSONP",mt="tinymce/util/LocalStorage",gt="tinymce/Compat",vt="tinymce/ui/Layout",yt="tinymce/ui/AbsoluteLayout",bt="tinymce/ui/Button",Ct="tinymce/ui/ButtonGroup",xt="tinymce/ui/Checkbox",wt="tinymce/ui/ComboBox",Et="tinymce/ui/ColorBox",Nt="tinymce/ui/PanelButton",_t="tinymce/ui/ColorButton",St="tinymce/util/Color",kt="tinymce/ui/ColorPicker",Tt="tinymce/ui/Path",Rt="tinymce/ui/ElementPath",At="tinymce/ui/FormItem",Bt="tinymce/ui/Form",Dt="tinymce/ui/FieldSet",Lt="tinymce/content/LinkTargets",Mt="tinymce/ui/FilePicker",Pt="tinymce/ui/FitLayout",Ot="tinymce/ui/FlexLayout",Ht="tinymce/ui/FlowLayout",It="tinymce/fmt/FontInfo",Ft="tinymce/ui/FormatControls",zt="tinymce/ui/GridLayout",Ut="tinymce/ui/Iframe",Wt="tinymce/ui/InfoBox",Vt="tinymce/ui/Label",$t="tinymce/ui/Toolbar",qt="tinymce/ui/MenuBar",jt="tinymce/ui/MenuButton",Yt="tinymce/ui/MenuItem",Xt="tinymce/ui/Throbber",Kt="tinymce/ui/Menu",Gt="tinymce/ui/ListBox",Jt="tinymce/ui/Radio",Qt="tinymce/ui/ResizeHandle",Zt="tinymce/ui/SelectBox",en="tinymce/ui/Slider",tn="tinymce/ui/Spacer",nn="tinymce/ui/SplitButton",rn="tinymce/ui/StackLayout",on="tinymce/ui/TabPanel",an="tinymce/ui/TextBox",sn="tinymce/Register";r(l,[],function(){function e(e,t,n){var r,i,a,s,l,c;return r=t.x,i=t.y,a=e.w,s=e.h,l=t.w,c=t.h,n=(n||"").split(""),"b"===n[0]&&(i+=c),"r"===n[1]&&(r+=l),"c"===n[0]&&(i+=u(c/2)),"c"===n[1]&&(r+=u(l/2)),"b"===n[3]&&(i-=s),"r"===n[4]&&(r-=a),"c"===n[3]&&(i-=u(s/2)),"c"===n[4]&&(r-=u(a/2)),o(r,i,a,s)}function t(t,n,r,i){var o,a;for(a=0;a<i.length;a++)if(o=e(t,n,i[a]),o.x>=r.x&&o.x+o.w<=r.w+r.x&&o.y>=r.y&&o.y+o.h<=r.h+r.y)return i[a];return null}function n(e,t,n){return o(e.x-t,e.y-n,e.w+2*t,e.h+2*n)}function r(e,t){var n,r,i,a;return n=l(e.x,t.x),r=l(e.y,t.y),i=s(e.x+e.w,t.x+t.w),a=s(e.y+e.h,t.y+t.h),i-n<0||a-r<0?null:o(n,r,i-n,a-r)}function i(e,t,n){var r,i,a,s,u,c,d,f,p,h;return u=e.x,c=e.y,d=e.x+e.w,f=e.y+e.h,p=t.x+t.w,h=t.y+t.h,r=l(0,t.x-u),i=l(0,t.y-c),a=l(0,d-p),s=l(0,f-h),u+=r,c+=i,n&&(d+=r,f+=i,u-=a,c-=s),d-=a,f-=s,o(u,c,d-u,f-c)}function o(e,t,n,r){return{x:e,y:t,w:n,h:r}}function a(e){return o(e.left,e.top,e.width,e.height)}var s=Math.min,l=Math.max,u=Math.round;return{inflate:n,relativePosition:e,findBestRelativePosition:t,intersect:r,clamp:i,create:o,fromClientRect:a}}),r(u,[],function(){function e(e,t){return function(){e.apply(t,arguments)}}function t(t){if("object"!=typeof this)throw new TypeError("Promises must be constructed via new");if("function"!=typeof t)throw new TypeError("not a function");this._state=null,this._value=null,this._deferreds=[],s(t,e(r,this),e(i,this))}function n(e){var t=this;return null===this._state?void this._deferreds.push(e):void l(function(){var n=t._state?e.onFulfilled:e.onRejected;if(null===n)return void(t._state?e.resolve:e.reject)(t._value);var r;try{r=n(t._value)}catch(i){return void e.reject(i)}e.resolve(r)})}function r(t){try{if(t===this)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"==typeof t||"function"==typeof t)){var n=t.then;if("function"==typeof n)return void s(e(n,t),e(r,this),e(i,this))}this._state=!0,this._value=t,o.call(this)}catch(a){i.call(this,a)}}function i(e){this._state=!1,this._value=e,o.call(this)}function o(){for(var e=0,t=this._deferreds.length;e<t;e++)n.call(this,this._deferreds[e]);this._deferreds=null}function a(e,t,n,r){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.resolve=n,this.reject=r}function s(e,t,n){var r=!1;try{e(function(e){r||(r=!0,t(e))},function(e){r||(r=!0,n(e))})}catch(i){if(r)return;r=!0,n(i)}}if(window.Promise)return window.Promise;var l=t.immediateFn||"function"==typeof setImmediate&&setImmediate||function(e){setTimeout(e,1)},u=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)};return t.prototype["catch"]=function(e){return this.then(null,e)},t.prototype.then=function(e,r){var i=this;return new t(function(t,o){n.call(i,new a(e,r,t,o))})},t.all=function(){var e=Array.prototype.slice.call(1===arguments.length&&u(arguments[0])?arguments[0]:arguments);return new t(function(t,n){function r(o,a){try{if(a&&("object"==typeof a||"function"==typeof a)){var s=a.then;if("function"==typeof s)return void s.call(a,function(e){r(o,e)},n)}e[o]=a,0===--i&&t(e)}catch(l){n(l)}}if(0===e.length)return t([]);for(var i=e.length,o=0;o<e.length;o++)r(o,e[o])})},t.resolve=function(e){return e&&"object"==typeof e&&e.constructor===t?e:new t(function(t){t(e)})},t.reject=function(e){return new t(function(t,n){n(e)})},t.race=function(e){return new t(function(t,n){for(var r=0,i=e.length;r<i;r++)e[r].then(t,n)})},t}),r(c,[u],function(e){function t(e,t){function n(e){window.setTimeout(e,0)}var r,i=window.requestAnimationFrame,o=["ms","moz","webkit"];for(r=0;r<o.length&&!i;r++)i=window[o[r]+"RequestAnimationFrame"];i||(i=n),i(e,t)}function n(e,t){return"number"!=typeof t&&(t=0),setTimeout(e,t)}function r(e,t){return"number"!=typeof t&&(t=1),setInterval(e,t)}function i(e){return clearTimeout(e)}function o(e){return clearInterval(e)}function a(e,t){var r,i;return i=function(){var i=arguments;clearTimeout(r),r=n(function(){e.apply(this,i)},t)},i.stop=function(){clearTimeout(r)},i}var s;return{requestAnimationFrame:function(n,r){return s?void s.then(n):void(s=new e(function(e){r||(r=document.body),t(e,r)}).then(n))},setTimeout:n,setInterval:r,setEditorTimeout:function(e,t,r){return n(function(){e.removed||t()},r)},setEditorInterval:function(e,t,n){var i;return i=r(function(){e.removed?clearInterval(i):t()},n)},debounce:a,throttle:a,clearInterval:o,clearTimeout:i}}),r(d,[],function(){function e(e){return"matchMedia"in window&&matchMedia(e).matches}var t=navigator,n=t.userAgent,r,i,o,a,s,l,u,c,d,f,p,h,m;r=window.opera&&window.opera.buildNumber,d=/Android/.test(n),i=/WebKit/.test(n),o=!i&&!r&&/MSIE/gi.test(n)&&/Explorer/gi.test(t.appName),o=o&&/MSIE (\w+)\./.exec(n)[1],a=n.indexOf("Trident/")!=-1&&(n.indexOf("rv:")!=-1||t.appName.indexOf("Netscape")!=-1)&&11,s=n.indexOf("Edge/")!=-1&&!o&&!a&&12,o=o||a||s,l=!i&&!a&&/Gecko/.test(n),u=n.indexOf("Mac")!=-1,c=/(iPad|iPhone)/.test(n),f="FormData"in window&&"FileReader"in window&&"URL"in window&&!!URL.createObjectURL,p=e("only screen and (max-device-width: 480px)")&&(d||c),h=e("only screen and (min-width: 800px)")&&(d||c),m=n.indexOf("Windows Phone")!=-1,s&&(i=!1);var g=!c||f||n.match(/AppleWebKit\/(\d*)/)[1]>=534;return{opera:r,webkit:i,ie:o,gecko:l,mac:u,iOS:c,android:d,contentEditable:g,transparentSrc:"data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",caretAfter:8!=o,range:window.getSelection&&"Range"in window,documentMode:o&&!s?document.documentMode||7:10,fileApi:f,ceFalse:o===!1||o>8,canHaveCSP:o===!1||o>11,desktop:!p&&!h,windowsPhone:m}}),r(f,[c,d],function(e,t){function n(e,t,n,r){e.addEventListener?e.addEventListener(t,n,r||!1):e.attachEvent&&e.attachEvent("on"+t,n)}function r(e,t,n,r){e.removeEventListener?e.removeEventListener(t,n,r||!1):e.detachEvent&&e.detachEvent("on"+t,n)}function i(e,t){var n,r=t;return n=e.path,n&&n.length>0&&(r=n[0]),e.deepPath&&(n=e.deepPath(),n&&n.length>0&&(r=n[0])),r}function o(e,n){function r(){return!1}function o(){return!0}var a,s=n||{},l;for(a in e)c[a]||(s[a]=e[a]);if(s.target||(s.target=s.srcElement||document),t.experimentalShadowDom&&(s.target=i(e,s.target)),e&&u.test(e.type)&&e.pageX===l&&e.clientX!==l){var d=s.target.ownerDocument||document,f=d.documentElement,p=d.body;s.pageX=e.clientX+(f&&f.scrollLeft||p&&p.scrollLeft||0)-(f&&f.clientLeft||p&&p.clientLeft||0),s.pageY=e.clientY+(f&&f.scrollTop||p&&p.scrollTop||0)-(f&&f.clientTop||p&&p.clientTop||0)}return s.preventDefault=function(){s.isDefaultPrevented=o,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},s.stopPropagation=function(){s.isPropagationStopped=o,e&&(e.stopPropagation?e.stopPropagation():e.cancelBubble=!0)},s.stopImmediatePropagation=function(){s.isImmediatePropagationStopped=o,s.stopPropagation()},s.isDefaultPrevented||(s.isDefaultPrevented=r,s.isPropagationStopped=r,s.isImmediatePropagationStopped=r),"undefined"==typeof s.metaKey&&(s.metaKey=!1),s}function a(t,i,o){function a(){o.domLoaded||(o.domLoaded=!0,i(c))}function s(){("complete"===u.readyState||"interactive"===u.readyState&&u.body)&&(r(u,"readystatechange",s),a())}function l(){try{u.documentElement.doScroll("left")}catch(t){return void e.setTimeout(l)}a()}var u=t.document,c={type:"ready"};return o.domLoaded?void i(c):(u.addEventListener?"complete"===u.readyState?a():n(t,"DOMContentLoaded",a):(n(u,"readystatechange",s),u.documentElement.doScroll&&t.self===t.top&&l()),void n(t,"load",a))}function s(){function e(e,t){var n,r,o,a,s=i[t];if(n=s&&s[e.type])for(r=0,o=n.length;r<o;r++)if(a=n[r],a&&a.func.call(a.scope,e)===!1&&e.preventDefault(),e.isImmediatePropagationStopped())return}var t=this,i={},s,u,c,d,f;u=l+(+new Date).toString(32),d="onmouseenter"in document.documentElement,c="onfocusin"in document.documentElement,f={mouseenter:"mouseover",mouseleave:"mouseout"},s=1,t.domLoaded=!1,t.events=i,t.bind=function(r,l,p,h){function m(t){e(o(t||E.event),g)}var g,v,y,b,C,x,w,E=window;if(r&&3!==r.nodeType&&8!==r.nodeType){for(r[u]?g=r[u]:(g=s++,r[u]=g,i[g]={}),h=h||r,l=l.split(" "),y=l.length;y--;)b=l[y],x=m,C=w=!1,"DOMContentLoaded"===b&&(b="ready"),t.domLoaded&&"ready"===b&&"complete"==r.readyState?p.call(h,o({type:b})):(d||(C=f[b],C&&(x=function(t){var n,r;if(n=t.currentTarget,r=t.relatedTarget,r&&n.contains)r=n.contains(r);else for(;r&&r!==n;)r=r.parentNode;r||(t=o(t||E.event),t.type="mouseout"===t.type?"mouseleave":"mouseenter",t.target=n,e(t,g))})),c||"focusin"!==b&&"focusout"!==b||(w=!0,C="focusin"===b?"focus":"blur",x=function(t){t=o(t||E.event),t.type="focus"===t.type?"focusin":"focusout",e(t,g)}),v=i[g][b],v?"ready"===b&&t.domLoaded?p({type:b}):v.push({func:p,scope:h}):(i[g][b]=v=[{func:p,scope:h}],v.fakeName=C,v.capture=w,v.nativeHandler=x,"ready"===b?a(r,x,t):n(r,C||b,x,w)));return r=v=0,p}},t.unbind=function(e,n,o){var a,s,l,c,d,f;if(!e||3===e.nodeType||8===e.nodeType)return t;if(a=e[u]){if(f=i[a],n){for(n=n.split(" "),l=n.length;l--;)if(d=n[l],s=f[d]){if(o)for(c=s.length;c--;)if(s[c].func===o){var p=s.nativeHandler,h=s.fakeName,m=s.capture;s=s.slice(0,c).concat(s.slice(c+1)),s.nativeHandler=p,s.fakeName=h,s.capture=m,f[d]=s}o&&0!==s.length||(delete f[d],r(e,s.fakeName||d,s.nativeHandler,s.capture))}}else{for(d in f)s=f[d],r(e,s.fakeName||d,s.nativeHandler,s.capture);f={}}for(d in f)return t;delete i[a];try{delete e[u]}catch(g){e[u]=null}}return t},t.fire=function(n,r,i){var a;if(!n||3===n.nodeType||8===n.nodeType)return t;i=o(null,i),i.type=r,i.target=n;do a=n[u],a&&e(i,a),n=n.parentNode||n.ownerDocument||n.defaultView||n.parentWindow;while(n&&!i.isPropagationStopped());return t},t.clean=function(e){var n,r,i=t.unbind;if(!e||3===e.nodeType||8===e.nodeType)return t;if(e[u]&&i(e),e.getElementsByTagName||(e=e.document),e&&e.getElementsByTagName)for(i(e),r=e.getElementsByTagName("*"),n=r.length;n--;)e=r[n],e[u]&&i(e);return t},t.destroy=function(){i={}},t.cancel=function(e){return e&&(e.preventDefault(),e.stopImmediatePropagation()),!1}}var l="mce-data-",u=/^(?:mouse|contextmenu)|click/,c={keyLocation:1,layerX:1,layerY:1,returnValue:1,webkitMovementX:1,webkitMovementY:1,keyIdentifier:1};return s.Event=new s,s.Event.bind(window,"ready",function(){}),s}),r(p,[],function(){function e(e,t,n,r){var i,o,a,s,l,u,d,p,h,m;if((t?t.ownerDocument||t:z)!==D&&B(t),t=t||D,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(M&&!r){if(i=ve.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&I(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return Z.apply(n,t.getElementsByTagName(e)),n;if((a=i[3])&&x.getElementsByClassName)return Z.apply(n,t.getElementsByClassName(a)),n}if(x.qsa&&(!P||!P.test(e))){if(p=d=F,h=t,m=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){for(u=_(e),(d=t.getAttribute("id"))?p=d.replace(be,"\\$&"):t.setAttribute("id",p),p="[id='"+p+"'] ",l=u.length;l--;)u[l]=p+f(u[l]);h=ye.test(e)&&c(t.parentNode)||t,m=u.join(",")}if(m)try{return Z.apply(n,h.querySelectorAll(m)),n}catch(g){}finally{d||t.removeAttribute("id")}}}return k(e.replace(se,"$1"),t,n,r)}function n(){function e(n,r){return t.push(n+" ")>w.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[F]=!0,e}function i(e){var t=D.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=e.length;r--;)w.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||X)-(~e.sourceIndex||X);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function l(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function u(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&typeof e.getElementsByTagName!==Y&&e}function d(){}function f(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function p(e,t,n){var r=t.dir,i=n&&"parentNode"===r,o=W++;return t.first?function(t,n,o){for(;t=t[r];)if(1===t.nodeType||i)return e(t,n,o)}:function(t,n,a){var s,l,u=[U,o];if(a){for(;t=t[r];)if((1===t.nodeType||i)&&e(t,n,a))return!0}else for(;t=t[r];)if(1===t.nodeType||i){if(l=t[F]||(t[F]={}),(s=l[r])&&s[0]===U&&s[1]===o)return u[2]=s[2];if(l[r]=u,u[2]=e(t,n,a))return!0}}}function h(e){return e.length>1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function m(t,n,r){for(var i=0,o=n.length;i<o;i++)e(t,n[i],r);return r}function g(e,t,n,r,i){for(var o,a=[],s=0,l=e.length,u=null!=t;s<l;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),u&&t.push(s)));return a}function v(e,t,n,i,o,a){return i&&!i[F]&&(i=v(i)),o&&!o[F]&&(o=v(o,a)),r(function(r,a,s,l){var u,c,d,f=[],p=[],h=a.length,v=r||m(t||"*",s.nodeType?[s]:s,[]),y=!e||!r&&t?v:g(v,f,e,s,l),b=n?o||(r?e:h||i)?[]:a:y;if(n&&n(y,b,s,l),i)for(u=g(b,p),i(u,[],s,l),c=u.length;c--;)(d=u[c])&&(b[p[c]]=!(y[p[c]]=d));if(r){if(o||e){if(o){for(u=[],c=b.length;c--;)(d=b[c])&&u.push(y[c]=d);o(null,b=[],u,l)}for(c=b.length;c--;)(d=b[c])&&(u=o?te.call(r,d):f[c])>-1&&(r[u]=!(a[u]=d))}}else b=g(b===a?b.splice(h,b.length):b),o?o(null,a,b,l):Z.apply(a,b)})}function y(e){for(var t,n,r,i=e.length,o=w.relative[e[0].type],a=o||w.relative[" "],s=o?1:0,l=p(function(e){return e===t},a,!0),u=p(function(e){return te.call(t,e)>-1},a,!0),c=[function(e,n,r){return!o&&(r||n!==T)||((t=n).nodeType?l(e,n,r):u(e,n,r))}];s<i;s++)if(n=w.relative[e[s].type])c=[p(h(c),n)];else{if(n=w.filter[e[s].type].apply(null,e[s].matches),n[F]){for(r=++s;r<i&&!w.relative[e[r].type];r++);return v(s>1&&h(c),s>1&&f(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s<r&&y(e.slice(s,r)),r<i&&y(e=e.slice(r)),r<i&&f(e))}c.push(n)}return h(c)}function b(t,n){var i=n.length>0,o=t.length>0,a=function(r,a,s,l,u){var c,d,f,p=0,h="0",m=r&&[],v=[],y=T,b=r||o&&w.find.TAG("*",u),C=U+=null==y?1:Math.random()||.1,x=b.length;for(u&&(T=a!==D&&a);h!==x&&null!=(c=b[h]);h++){if(o&&c){for(d=0;f=t[d++];)if(f(c,a,s)){l.push(c);break}u&&(U=C)}i&&((c=!f&&c)&&p--,r&&m.push(c))}if(p+=h,i&&h!==p){for(d=0;f=n[d++];)f(m,v,a,s);if(r){if(p>0)for(;h--;)m[h]||v[h]||(v[h]=J.call(l));v=g(v)}Z.apply(l,v),u&&!r&&v.length>0&&p+n.length>1&&e.uniqueSort(l)}return u&&(U=C,T=y),m};return i?r(a):a}var C,x,w,E,N,_,S,k,T,R,A,B,D,L,M,P,O,H,I,F="sizzle"+-new Date,z=window.document,U=0,W=0,V=n(),$=n(),q=n(),j=function(e,t){return e===t&&(A=!0),0},Y=typeof t,X=1<<31,K={}.hasOwnProperty,G=[],J=G.pop,Q=G.push,Z=G.push,ee=G.slice,te=G.indexOf||function(e){for(var t=0,n=this.length;t<n;t++)if(this[t]===e)return t;return-1},ne="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",re="[\\x20\\t\\r\\n\\f]",ie="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",oe="\\["+re+"*("+ie+")(?:"+re+"*([*^$|!~]?=)"+re+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+ie+"))|)"+re+"*\\]",ae=":("+ie+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+oe+")*)|.*)\\)|)",se=new RegExp("^"+re+"+|((?:^|[^\\\\])(?:\\\\.)*)"+re+"+$","g"),le=new RegExp("^"+re+"*,"+re+"*"),ue=new RegExp("^"+re+"*([>+~]|"+re+")"+re+"*"),ce=new RegExp("="+re+"*([^\\]'\"]*?)"+re+"*\\]","g"),de=new RegExp(ae),fe=new RegExp("^"+ie+"$"),pe={ID:new RegExp("^#("+ie+")"),CLASS:new RegExp("^\\.("+ie+")"),TAG:new RegExp("^("+ie+"|[*])"),ATTR:new RegExp("^"+oe),PSEUDO:new RegExp("^"+ae),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+re+"*(even|odd|(([+-]|)(\\d*)n|)"+re+"*(?:([+-]|)"+re+"*(\\d+)|))"+re+"*\\)|)","i"),bool:new RegExp("^(?:"+ne+")$","i"),needsContext:new RegExp("^"+re+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+re+"*((?:-\\d)?\\d*)"+re+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,me=/^h\d$/i,ge=/^[^{]+\{\s*\[native \w/,ve=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ye=/[+~]/,be=/'|\\/g,Ce=new RegExp("\\\\([\\da-f]{1,6}"+re+"?|("+re+")|.)","ig"),xe=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)};try{Z.apply(G=ee.call(z.childNodes),z.childNodes),G[z.childNodes.length].nodeType}catch(we){Z={apply:G.length?function(e,t){Q.apply(e,ee.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}x=e.support={},N=e.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},B=e.setDocument=function(e){function t(e){try{return e.top}catch(t){}return null}var n,r=e?e.ownerDocument||e:z,o=r.defaultView;return r!==D&&9===r.nodeType&&r.documentElement?(D=r,L=r.documentElement,M=!N(r),o&&o!==t(o)&&(o.addEventListener?o.addEventListener("unload",function(){B()},!1):o.attachEvent&&o.attachEvent("onunload",function(){B()})),x.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),x.getElementsByTagName=i(function(e){return e.appendChild(r.createComment("")),!e.getElementsByTagName("*").length}),x.getElementsByClassName=ge.test(r.getElementsByClassName),x.getById=i(function(e){return L.appendChild(e).id=F,!r.getElementsByName||!r.getElementsByName(F).length}),x.getById?(w.find.ID=function(e,t){if(typeof t.getElementById!==Y&&M){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},w.filter.ID=function(e){var t=e.replace(Ce,xe);return function(e){return e.getAttribute("id")===t}}):(delete w.find.ID,w.filter.ID=function(e){var t=e.replace(Ce,xe);return function(e){var n=typeof e.getAttributeNode!==Y&&e.getAttributeNode("id");return n&&n.value===t}}),w.find.TAG=x.getElementsByTagName?function(e,t){if(typeof t.getElementsByTagName!==Y)return t.getElementsByTagName(e)}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},w.find.CLASS=x.getElementsByClassName&&function(e,t){if(M)return t.getElementsByClassName(e)},O=[],P=[],(x.qsa=ge.test(r.querySelectorAll))&&(i(function(e){e.innerHTML="<select msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&P.push("[*^$]="+re+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||P.push("\\["+re+"*(?:value|"+ne+")"),e.querySelectorAll(":checked").length||P.push(":checked")}),i(function(e){var t=r.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&P.push("name"+re+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||P.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),P.push(",.*:")})),(x.matchesSelector=ge.test(H=L.matches||L.webkitMatchesSelector||L.mozMatchesSelector||L.oMatchesSelector||L.msMatchesSelector))&&i(function(e){x.disconnectedMatch=H.call(e,"div"),H.call(e,"[s!='']:x"),O.push("!=",ae)}),P=P.length&&new RegExp(P.join("|")),O=O.length&&new RegExp(O.join("|")),n=ge.test(L.compareDocumentPosition),I=n||ge.test(L.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},j=n?function(e,t){if(e===t)return A=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!x.sortDetached&&t.compareDocumentPosition(e)===n?e===r||e.ownerDocument===z&&I(z,e)?-1:t===r||t.ownerDocument===z&&I(z,t)?1:R?te.call(R,e)-te.call(R,t):0:4&n?-1:1)}:function(e,t){if(e===t)return A=!0,0;var n,i=0,o=e.parentNode,s=t.parentNode,l=[e],u=[t];if(!o||!s)return e===r?-1:t===r?1:o?-1:s?1:R?te.call(R,e)-te.call(R,t):0;if(o===s)return a(e,t);for(n=e;n=n.parentNode;)l.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;l[i]===u[i];)i++;return i?a(l[i],u[i]):l[i]===z?-1:u[i]===z?1:0},r):D},e.matches=function(t,n){return e(t,null,null,n)},e.matchesSelector=function(t,n){if((t.ownerDocument||t)!==D&&B(t),n=n.replace(ce,"='$1']"),x.matchesSelector&&M&&(!O||!O.test(n))&&(!P||!P.test(n)))try{var r=H.call(t,n);if(r||x.disconnectedMatch||t.document&&11!==t.document.nodeType)return r}catch(i){}return e(n,D,null,[t]).length>0},e.contains=function(e,t){return(e.ownerDocument||e)!==D&&B(e),I(e,t)},e.attr=function(e,n){(e.ownerDocument||e)!==D&&B(e);var r=w.attrHandle[n.toLowerCase()],i=r&&K.call(w.attrHandle,n.toLowerCase())?r(e,n,!M):t;return i!==t?i:x.attributes||!M?e.getAttribute(n):(i=e.getAttributeNode(n))&&i.specified?i.value:null},e.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},e.uniqueSort=function(e){var t,n=[],r=0,i=0;if(A=!x.detectDuplicates,R=!x.sortStable&&e.slice(0),e.sort(j),A){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return R=null,e},E=e.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=E(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=E(t);return n},w=e.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(Ce,xe),e[3]=(e[3]||e[4]||e[5]||"").replace(Ce,xe),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(t){return t[1]=t[1].toLowerCase(),"nth"===t[1].slice(0,3)?(t[3]||e.error(t[0]),t[4]=+(t[4]?t[5]+(t[6]||1):2*("even"===t[3]||"odd"===t[3])),t[5]=+(t[7]+t[8]||"odd"===t[3])):t[3]&&e.error(t[0]),t},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&de.test(n)&&(t=_(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(Ce,xe).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=V[e+" "];return t||(t=new RegExp("(^|"+re+")"+e+"("+re+"|$)"))&&V(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==Y&&e.getAttribute("class")||"")})},ATTR:function(t,n,r){return function(i){var o=e.attr(i,t);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,d,f,p,h,m=o!==a?"nextSibling":"previousSibling",g=t.parentNode,v=s&&t.nodeName.toLowerCase(),y=!l&&!s;if(g){if(o){for(;m;){for(d=t;d=d[m];)if(s?d.nodeName.toLowerCase()===v:1===d.nodeType)return!1;h=m="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?g.firstChild:g.lastChild],a&&y){for(c=g[F]||(g[F]={}),u=c[e]||[],p=u[0]===U&&u[1],f=u[0]===U&&u[2],d=p&&g.childNodes[p];d=++p&&d&&d[m]||(f=p=0)||h.pop();)if(1===d.nodeType&&++f&&d===t){c[e]=[U,p,f];break}}else if(y&&(u=(t[F]||(t[F]={}))[e])&&u[0]===U)f=u[1];else for(;(d=++p&&d&&d[m]||(f=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==v:1!==d.nodeType)||!++f||(y&&((d[F]||(d[F]={}))[e]=[U,f]),d!==t)););return f-=i,f===r||f%r===0&&f/r>=0}}},PSEUDO:function(t,n){var i,o=w.pseudos[t]||w.setFilters[t.toLowerCase()]||e.error("unsupported pseudo: "+t);return o[F]?o(n):o.length>1?(i=[t,t,"",n],w.setFilters.hasOwnProperty(t.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=te.call(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=S(e.replace(se,"$1"));return i[F]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),!n.pop()}}),has:r(function(t){return function(n){return e(t,n).length>0}}),contains:r(function(e){return e=e.replace(Ce,xe),function(t){return(t.textContent||t.innerText||E(t)).indexOf(e)>-1}}),lang:r(function(t){return fe.test(t||"")||e.error("unsupported lang: "+t),t=t.replace(Ce,xe).toLowerCase(),function(e){var n;do if(n=M?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return n=n.toLowerCase(),n===t||0===n.indexOf(t+"-");while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=window.location&&window.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===L},focus:function(e){return e===D.activeElement&&(!D.hasFocus||D.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!w.pseudos.empty(e)},header:function(e){return me.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:u(function(){return[0]}),last:u(function(e,t){return[t-1]}),eq:u(function(e,t,n){return[n<0?n+t:n]}),even:u(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:u(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:u(function(e,t,n){for(var r=n<0?n+t:n;--r>=0;)e.push(r);return e}),gt:u(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}},w.pseudos.nth=w.pseudos.eq;for(C in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})w.pseudos[C]=s(C);for(C in{submit:!0,reset:!0})w.pseudos[C]=l(C);return d.prototype=w.filters=w.pseudos,w.setFilters=new d,_=e.tokenize=function(t,n){var r,i,o,a,s,l,u,c=$[t+" "];if(c)return n?0:c.slice(0);for(s=t,l=[],u=w.preFilter;s;){r&&!(i=le.exec(s))||(i&&(s=s.slice(i[0].length)||s),l.push(o=[])),r=!1,(i=ue.exec(s))&&(r=i.shift(),o.push({value:r,type:i[0].replace(se," ")}),s=s.slice(r.length));for(a in w.filter)!(i=pe[a].exec(s))||u[a]&&!(i=u[a](i))||(r=i.shift(),o.push({value:r,type:a,matches:i}),s=s.slice(r.length));if(!r)break}return n?s.length:s?e.error(t):$(t,l).slice(0)},S=e.compile=function(e,t){var n,r=[],i=[],o=q[e+" "];if(!o){for(t||(t=_(e)),n=t.length;n--;)o=y(t[n]),o[F]?r.push(o):i.push(o);o=q(e,b(i,r)),o.selector=e}return o},k=e.select=function(e,t,n,r){var i,o,a,s,l,u="function"==typeof e&&e,d=!r&&_(e=u.selector||e);
+if(n=n||[],1===d.length){if(o=d[0]=d[0].slice(0),o.length>2&&"ID"===(a=o[0]).type&&x.getById&&9===t.nodeType&&M&&w.relative[o[1].type]){if(t=(w.find.ID(a.matches[0].replace(Ce,xe),t)||[])[0],!t)return n;u&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!w.relative[s=a.type]);)if((l=w.find[s])&&(r=l(a.matches[0].replace(Ce,xe),ye.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&f(o),!e)return Z.apply(n,r),n;break}}return(u||S(e,d))(r,t,!M,n,ye.test(e)&&c(t.parentNode)||t),n},x.sortStable=F.split("").sort(j).join("")===F,x.detectDuplicates=!!A,B(),x.sortDetached=i(function(e){return 1&e.compareDocumentPosition(D.createElement("div"))}),i(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),x.attributes&&i(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(ne,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),e}),r(h,[],function(){function e(e){var t=e,n,r;if(!c(e))for(t=[],n=0,r=e.length;n<r;n++)t[n]=e[n];return t}function n(e,n,r){var i,o;if(!e)return 0;if(r=r||e,e.length!==t){for(i=0,o=e.length;i<o;i++)if(n.call(r,e[i],i,e)===!1)return 0}else for(i in e)if(e.hasOwnProperty(i)&&n.call(r,e[i],i,e)===!1)return 0;return 1}function r(e,t){var r=[];return n(e,function(n,i){r.push(t(n,i,e))}),r}function i(e,t){var r=[];return n(e,function(n,i){t&&!t(n,i,e)||r.push(n)}),r}function o(e,t){var n,r;if(e)for(n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1}function a(e,t,n,r){var i=0;for(arguments.length<3&&(n=e[0]);i<e.length;i++)n=t.call(r,n,e[i],i);return n}function s(e,t,n){var r,i;for(r=0,i=e.length;r<i;r++)if(t.call(n,e[r],r,e))return r;return-1}function l(e,n,r){var i=s(e,n,r);return i!==-1?e[i]:t}function u(e){return e[e.length-1]}var c=Array.isArray||function(e){return"[object Array]"===Object.prototype.toString.call(e)};return{isArray:c,toArray:e,each:n,map:r,filter:i,indexOf:o,reduce:a,findIndex:s,find:l,last:u}}),r(m,[d,h],function(e,n){function r(e){return null===e||e===t?"":(""+e).replace(h,"")}function i(e,r){return r?!("array"!=r||!n.isArray(e))||typeof e==r:e!==t}function o(e,t,n){var r;for(e=e||[],t=t||",","string"==typeof e&&(e=e.split(t)),n=n||{},r=e.length;r--;)n[e[r]]={};return n}function a(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function s(e,t,n){var r=this,i,o,a,s,l,u=0;if(e=/^((static) )?([\w.]+)(:([\w.]+))?/.exec(e),a=e[3].match(/(^|\.)(\w+)$/i)[2],o=r.createNS(e[3].replace(/\.\w+$/,""),n),!o[a]){if("static"==e[2])return o[a]=t,void(this.onCreate&&this.onCreate(e[2],e[3],o[a]));t[a]||(t[a]=function(){},u=1),o[a]=t[a],r.extend(o[a].prototype,t),e[5]&&(i=r.resolve(e[5]).prototype,s=e[5].match(/\.(\w+)$/i)[1],l=o[a],u?o[a]=function(){return i[s].apply(this,arguments)}:o[a]=function(){return this.parent=i[s],l.apply(this,arguments)},o[a].prototype[a]=o[a],r.each(i,function(e,t){o[a].prototype[t]=i[t]}),r.each(t,function(e,t){i[t]?o[a].prototype[t]=function(){return this.parent=i[t],e.apply(this,arguments)}:t!=a&&(o[a].prototype[t]=e)})),r.each(t["static"],function(e,t){o[a][t]=e})}}function l(e,n){var r,i,o,a=arguments,s;for(r=1,i=a.length;r<i;r++){n=a[r];for(o in n)n.hasOwnProperty(o)&&(s=n[o],s!==t&&(e[o]=s))}return e}function u(e,t,r,i){i=i||this,e&&(r&&(e=e[r]),n.each(e,function(e,n){return t.call(i,e,n,r)!==!1&&void u(e,t,r,i)}))}function c(e,t){var n,r;for(t=t||window,e=e.split("."),n=0;n<e.length;n++)r=e[n],t[r]||(t[r]={}),t=t[r];return t}function d(e,t){var n,r;for(t=t||window,e=e.split("."),n=0,r=e.length;n<r&&(t=t[e[n]],t);n++);return t}function f(e,t){return!e||i(e,"array")?e:n.map(e.split(t||","),r)}function p(t){var n=e.cacheSuffix;return n&&(t+=(t.indexOf("?")===-1?"?":"&")+n),t}var h=/^\s*|\s*$/g;return{trim:r,isArray:n.isArray,is:i,toArray:n.toArray,makeMap:o,each:n.each,map:n.map,grep:n.filter,inArray:n.indexOf,hasOwn:a,extend:l,create:s,walk:u,createNS:c,resolve:d,explode:f,_addCacheSuffix:p}}),r(g,[f,p,m,d],function(e,n,r,i){function o(e){return"undefined"!=typeof e}function a(e){return"string"==typeof e}function s(e){return e&&e==e.window}function l(e,t){var n,r,i;for(t=t||w,i=t.createElement("div"),n=t.createDocumentFragment(),i.innerHTML=e;r=i.firstChild;)n.appendChild(r);return n}function u(e,t,n,r){var i;if(a(t))t=l(t,v(e[0]));else if(t.length&&!t.nodeType){if(t=f.makeArray(t),r)for(i=t.length-1;i>=0;i--)u(e,t[i],n,r);else for(i=0;i<t.length;i++)u(e,t[i],n,r);return e}if(t.nodeType)for(i=e.length;i--;)n.call(e[i],t);return e}function c(e,t){return e&&t&&(" "+e.className+" ").indexOf(" "+t+" ")!==-1}function d(e,t,n){var r,i;return t=f(t)[0],e.each(function(){var e=this;n&&r==e.parentNode?i.appendChild(e):(r=e.parentNode,i=t.cloneNode(!1),e.parentNode.insertBefore(i,e),i.appendChild(e))}),e}function f(e,t){return new f.fn.init(e,t)}function p(e,t){var n;if(t.indexOf)return t.indexOf(e);for(n=t.length;n--;)if(t[n]===e)return n;return-1}function h(e){return null===e||e===k?"":(""+e).replace(P,"")}function m(e,t){var n,r,i,o,a;if(e)if(n=e.length,n===o){for(r in e)if(e.hasOwnProperty(r)&&(a=e[r],t.call(a,r,a)===!1))break}else for(i=0;i<n&&(a=e[i],t.call(a,i,a)!==!1);i++);return e}function g(e,t){var n=[];return m(e,function(e,r){t(r,e)&&n.push(r)}),n}function v(e){return e?9==e.nodeType?e:e.ownerDocument:w}function y(e,n,r){var i=[],o=e[n];for("string"!=typeof r&&r instanceof f&&(r=r[0]);o&&9!==o.nodeType;){if(r!==t){if(o===r)break;if("string"==typeof r&&f(o).is(r))break}1===o.nodeType&&i.push(o),o=o[n]}return i}function b(e,n,r,i){var o=[];for(i instanceof f&&(i=i[0]);e;e=e[n])if(!r||e.nodeType===r){if(i!==t){if(e===i)break;if("string"==typeof i&&f(e).is(i))break}o.push(e)}return o}function C(e,t,n){for(e=e[t];e;e=e[t])if(e.nodeType==n)return e;return null}function x(e,t,n){m(n,function(n,r){e[n]=e[n]||{},e[n][t]=r})}var w=document,E=Array.prototype.push,N=Array.prototype.slice,_=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,S=e.Event,k,T=r.makeMap("children,contents,next,prev"),R=r.makeMap("fillOpacity fontWeight lineHeight opacity orphans widows zIndex zoom"," "),A=r.makeMap("checked compact declare defer disabled ismap multiple nohref noshade nowrap readonly selected"," "),B={"for":"htmlFor","class":"className",readonly:"readOnly"},D={"float":"cssFloat"},L={},M={},P=/^\s*|\s*$/g;return f.fn=f.prototype={constructor:f,selector:"",context:null,length:0,init:function(e,t){var n=this,r,i;if(!e)return n;if(e.nodeType)return n.context=n[0]=e,n.length=1,n;if(t&&t.nodeType)n.context=t;else{if(t)return f(e).attr(t);n.context=t=document}if(a(e)){if(n.selector=e,r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:_.exec(e),!r)return f(t).find(e);if(r[1])for(i=l(e,v(t)).firstChild;i;)E.call(n,i),i=i.nextSibling;else{if(i=v(t).getElementById(r[2]),!i)return n;if(i.id!==r[2])return n.find(e);n.length=1,n[0]=i}}else this.add(e,!1);return n},toArray:function(){return r.toArray(this)},add:function(e,t){var n=this,r,i;if(a(e))return n.add(f(e));if(t!==!1)for(r=f.unique(n.toArray().concat(f.makeArray(e))),n.length=r.length,i=0;i<r.length;i++)n[i]=r[i];else E.apply(n,f.makeArray(e));return n},attr:function(e,t){var n=this,r;if("object"==typeof e)m(e,function(e,t){n.attr(e,t)});else{if(!o(t)){if(n[0]&&1===n[0].nodeType){if(r=L[e],r&&r.get)return r.get(n[0],e);if(A[e])return n.prop(e)?e:k;t=n[0].getAttribute(e,2),null===t&&(t=k)}return t}this.each(function(){var n;if(1===this.nodeType){if(n=L[e],n&&n.set)return void n.set(this,t);null===t?this.removeAttribute(e,2):this.setAttribute(e,t,2)}})}return n},removeAttr:function(e){return this.attr(e,null)},prop:function(e,t){var n=this;if(e=B[e]||e,"object"==typeof e)m(e,function(e,t){n.prop(e,t)});else{if(!o(t))return n[0]&&n[0].nodeType&&e in n[0]?n[0][e]:t;this.each(function(){1==this.nodeType&&(this[e]=t)})}return n},css:function(e,t){function n(e){return e.replace(/-(\D)/g,function(e,t){return t.toUpperCase()})}function r(e){return e.replace(/[A-Z]/g,function(e){return"-"+e})}var i=this,a,s;if("object"==typeof e)m(e,function(e,t){i.css(e,t)});else if(o(t))e=n(e),"number"!=typeof t||R[e]||(t+="px"),i.each(function(){var n=this.style;if(s=M[e],s&&s.set)return void s.set(this,t);try{this.style[D[e]||e]=t}catch(i){}null!==t&&""!==t||(n.removeProperty?n.removeProperty(r(e)):n.removeAttribute(e))});else{if(a=i[0],s=M[e],s&&s.get)return s.get(a);if(a.ownerDocument.defaultView)try{return a.ownerDocument.defaultView.getComputedStyle(a,null).getPropertyValue(r(e))}catch(l){return k}else if(a.currentStyle)return a.currentStyle[n(e)]}return i},remove:function(){for(var e=this,t,n=this.length;n--;)t=e[n],S.clean(t),t.parentNode&&t.parentNode.removeChild(t);return this},empty:function(){for(var e=this,t,n=this.length;n--;)for(t=e[n];t.firstChild;)t.removeChild(t.firstChild);return this},html:function(e){var t=this,n;if(o(e)){n=t.length;try{for(;n--;)t[n].innerHTML=e}catch(r){f(t[n]).empty().append(e)}return t}return t[0]?t[0].innerHTML:""},text:function(e){var t=this,n;if(o(e)){for(n=t.length;n--;)"innerText"in t[n]?t[n].innerText=e:t[0].textContent=e;return t}return t[0]?t[0].innerText||t[0].textContent:""},append:function(){return u(this,arguments,function(e){(1===this.nodeType||this.host&&1===this.host.nodeType)&&this.appendChild(e)})},prepend:function(){return u(this,arguments,function(e){(1===this.nodeType||this.host&&1===this.host.nodeType)&&this.insertBefore(e,this.firstChild)},!0)},before:function(){var e=this;return e[0]&&e[0].parentNode?u(e,arguments,function(e){this.parentNode.insertBefore(e,this)}):e},after:function(){var e=this;return e[0]&&e[0].parentNode?u(e,arguments,function(e){this.parentNode.insertBefore(e,this.nextSibling)},!0):e},appendTo:function(e){return f(e).append(this),this},prependTo:function(e){return f(e).prepend(this),this},replaceWith:function(e){return this.before(e).remove()},wrap:function(e){return d(this,e)},wrapAll:function(e){return d(this,e,!0)},wrapInner:function(e){return this.each(function(){f(this).contents().wrapAll(e)}),this},unwrap:function(){return this.parent().each(function(){f(this).replaceWith(this.childNodes)})},clone:function(){var e=[];return this.each(function(){e.push(this.cloneNode(!0))}),f(e)},addClass:function(e){return this.toggleClass(e,!0)},removeClass:function(e){return this.toggleClass(e,!1)},toggleClass:function(e,t){var n=this;return"string"!=typeof e?n:(e.indexOf(" ")!==-1?m(e.split(" "),function(){n.toggleClass(this,t)}):n.each(function(n,r){var i,o;o=c(r,e),o!==t&&(i=r.className,o?r.className=h((" "+i+" ").replace(" "+e+" "," ")):r.className+=i?" "+e:e)}),n)},hasClass:function(e){return c(this[0],e)},each:function(e){return m(this,e)},on:function(e,t){return this.each(function(){S.bind(this,e,t)})},off:function(e,t){return this.each(function(){S.unbind(this,e,t)})},trigger:function(e){return this.each(function(){"object"==typeof e?S.fire(this,e.type,e):S.fire(this,e)})},show:function(){return this.css("display","")},hide:function(){return this.css("display","none")},slice:function(){return new f(N.apply(this,arguments))},eq:function(e){return e===-1?this.slice(e):this.slice(e,+e+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},find:function(e){var t,n,r=[];for(t=0,n=this.length;t<n;t++)f.find(e,this[t],r);return f(r)},filter:function(e){return f("function"==typeof e?g(this.toArray(),function(t,n){return e(n,t)}):f.filter(e,this.toArray()))},closest:function(e){var t=[];return e instanceof f&&(e=e[0]),this.each(function(n,r){for(;r;){if("string"==typeof e&&f(r).is(e)){t.push(r);break}if(r==e){t.push(r);break}r=r.parentNode}}),f(t)},offset:function(e){var t,n,r,i=0,o=0,a;return e?this.css(e):(t=this[0],t&&(n=t.ownerDocument,r=n.documentElement,t.getBoundingClientRect&&(a=t.getBoundingClientRect(),i=a.left+(r.scrollLeft||n.body.scrollLeft)-r.clientLeft,o=a.top+(r.scrollTop||n.body.scrollTop)-r.clientTop)),{left:i,top:o})},push:E,sort:[].sort,splice:[].splice},r.extend(f,{extend:r.extend,makeArray:function(e){return s(e)||e.nodeType?[e]:r.toArray(e)},inArray:p,isArray:r.isArray,each:m,trim:h,grep:g,find:n,expr:n.selectors,unique:n.uniqueSort,text:n.getText,contains:n.contains,filter:function(e,t,n){var r=t.length;for(n&&(e=":not("+e+")");r--;)1!=t[r].nodeType&&t.splice(r,1);return t=1===t.length?f.find.matchesSelector(t[0],e)?[t[0]]:[]:f.find.matches(e,t)}}),m({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return y(e,"parentNode")},next:function(e){return C(e,"nextSibling",1)},prev:function(e){return C(e,"previousSibling",1)},children:function(e){return b(e.firstChild,"nextSibling",1)},contents:function(e){return r.toArray(("iframe"===e.nodeName?e.contentDocument||e.contentWindow.document:e).childNodes)}},function(e,t){f.fn[e]=function(n){var r=this,i=[];return r.each(function(){var e=t.call(i,this,n,i);e&&(f.isArray(e)?i.push.apply(i,e):i.push(e))}),this.length>1&&(T[e]||(i=f.unique(i)),0===e.indexOf("parents")&&(i=i.reverse())),i=f(i),n?i.filter(n):i}}),m({parentsUntil:function(e,t){return y(e,"parentNode",t)},nextUntil:function(e,t){return b(e,"nextSibling",1,t).slice(1)},prevUntil:function(e,t){return b(e,"previousSibling",1,t).slice(1)}},function(e,t){f.fn[e]=function(n,r){var i=this,o=[];return i.each(function(){var e=t.call(o,this,n,o);e&&(f.isArray(e)?o.push.apply(o,e):o.push(e))}),this.length>1&&(o=f.unique(o),0!==e.indexOf("parents")&&"prevUntil"!==e||(o=o.reverse())),o=f(o),r?o.filter(r):o}}),f.fn.is=function(e){return!!e&&this.filter(e).length>0},f.fn.init.prototype=f.fn,f.overrideDefaults=function(e){function t(r,i){return n=n||e(),0===arguments.length&&(r=n.element),i||(i=n.context),new t.fn.init(r,i)}var n;return f.extend(t,this),t},i.ie&&i.ie<8&&(x(L,"get",{maxlength:function(e){var t=e.maxLength;return 2147483647===t?k:t},size:function(e){var t=e.size;return 20===t?k:t},"class":function(e){return e.className},style:function(e){var t=e.style.cssText;return 0===t.length?k:t}}),x(L,"set",{"class":function(e,t){e.className=t},style:function(e,t){e.style.cssText=t}})),i.ie&&i.ie<9&&(D["float"]="styleFloat",x(M,"set",{opacity:function(e,t){var n=e.style;null===t||""===t?n.removeAttribute("filter"):(n.zoom=1,n.filter="alpha(opacity="+100*t+")")}})),f.attrHooks=L,f.cssHooks=M,f}),r(v,[],function(){return function(e,t){function n(e,t,n,r){function i(e){return e=parseInt(e,10).toString(16),e.length>1?e:"0"+e}return"#"+i(t)+i(n)+i(r)}var r=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,i=/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,o=/\s*([^:]+):\s*([^;]+);?/g,a=/\s+$/,s,l={},u,c,d,f="\ufeff";for(e=e||{},t&&(c=t.getValidStyles(),d=t.getInvalidStyles()),u=("\\\" \\' \\; \\: ; : "+f).split(" "),s=0;s<u.length;s++)l[u[s]]=f+s,l[f+s]=u[s];return{toHex:function(e){return e.replace(r,n)},parse:function(t){function u(e,t,n){var r,i,o,a;if(r=y[e+"-top"+t],r&&(i=y[e+"-right"+t],i&&(o=y[e+"-bottom"+t],o&&(a=y[e+"-left"+t])))){var l=[r,i,o,a];for(s=l.length-1;s--&&l[s]===l[s+1];);s>-1&&n||(y[e+t]=s==-1?l[0]:l.join(" "),delete y[e+"-top"+t],delete y[e+"-right"+t],delete y[e+"-bottom"+t],delete y[e+"-left"+t])}}function c(e){var t=y[e],n;if(t){for(t=t.split(" "),n=t.length;n--;)if(t[n]!==t[0])return!1;return y[e]=t[0],!0}}function d(e,t,n,r){c(t)&&c(n)&&c(r)&&(y[e]=y[t]+" "+y[n]+" "+y[r],delete y[t],delete y[n],delete y[r])}function p(e){return w=!0,l[e]}function h(e,t){return w&&(e=e.replace(/\uFEFF[0-9]/g,function(e){return l[e]})),t||(e=e.replace(/\\([\'\";:])/g,"$1")),e}function m(e){return String.fromCharCode(parseInt(e.slice(1),16))}function g(e){return e.replace(/\\[0-9a-f]+/gi,m)}function v(t,n,r,i,o,a){if(o=o||a)return o=h(o),"'"+o.replace(/\'/g,"\\'")+"'";if(n=h(n||r||i),!e.allow_script_urls){var s=n.replace(/[\s\r\n]+/g,"");if(/(java|vb)script:/i.test(s))return"";if(!e.allow_svg_data_urls&&/^data:image\/svg/i.test(s))return""}return E&&(n=E.call(N,n,"style")),"url('"+n.replace(/\'/g,"\\'")+"')"}var y={},b,C,x,w,E=e.url_converter,N=e.url_converter_scope||this;if(t){for(t=t.replace(/[\u0000-\u001F]/g,""),t=t.replace(/\\[\"\';:\uFEFF]/g,p).replace(/\"[^\"]+\"|\'[^\']+\'/g,function(e){return e.replace(/[;:]/g,p)});b=o.exec(t);)if(o.lastIndex=b.index+b[0].length,C=b[1].replace(a,"").toLowerCase(),x=b[2].replace(a,""),C&&x){if(C=g(C),x=g(x),C.indexOf(f)!==-1||C.indexOf('"')!==-1)continue;if(!e.allow_script_urls&&("behavior"==C||/expression\s*\(|\/\*|\*\//.test(x)))continue;"font-weight"===C&&"700"===x?x="bold":"color"!==C&&"background-color"!==C||(x=x.toLowerCase()),x=x.replace(r,n),x=x.replace(i,v),y[C]=w?h(x,!0):x}u("border","",!0),u("border","-width"),u("border","-color"),u("border","-style"),u("padding",""),u("margin",""),d("border","border-width","border-style","border-color"),"medium none"===y.border&&delete y.border,"none"===y["border-image"]&&delete y["border-image"]}return y},serialize:function(e,t){function n(t){var n,r,o,a;if(n=c[t])for(r=0,o=n.length;r<o;r++)t=n[r],a=e[t],a&&(i+=(i.length>0?" ":"")+t+": "+a+";")}function r(e,t){var n;return n=d["*"],(!n||!n[e])&&(n=d[t],!n||!n[e])}var i="",o,a;if(t&&c)n("*"),n(t);else for(o in e)a=e[o],!a||d&&!r(o,t)||(i+=(i.length>0?" ":"")+o+": "+a+";");return i}}}}),r(y,[],function(){return function(e,t){function n(e,n,r,i){var o,a;if(e){if(!i&&e[n])return e[n];if(e!=t){if(o=e[r])return o;for(a=e.parentNode;a&&a!=t;a=a.parentNode)if(o=a[r])return o}}}function r(e,n,r,i){var o,a,s;if(e){if(o=e[r],t&&o===t)return;if(o){if(!i)for(s=o[n];s;s=s[n])if(!s[n])return s;return o}if(a=e.parentNode,a&&a!==t)return a}}var i=e;this.current=function(){return i},this.next=function(e){return i=n(i,"firstChild","nextSibling",e)},this.prev=function(e){return i=n(i,"lastChild","previousSibling",e)},this.prev2=function(e){return i=r(i,"lastChild","previousSibling",e)}}}),r(b,[m],function(e){function t(n){function r(){return P.createDocumentFragment()}function i(e,t){E(F,e,t)}function o(e,t){E(z,e,t)}function a(e){i(e.parentNode,j(e))}function s(e){i(e.parentNode,j(e)+1)}function l(e){o(e.parentNode,j(e))}function u(e){o(e.parentNode,j(e)+1)}function c(e){e?(M[V]=M[W],M[$]=M[U]):(M[W]=M[V],M[U]=M[$]),M.collapsed=F}function d(e){a(e),u(e)}function f(e){i(e,0),o(e,1===e.nodeType?e.childNodes.length:e.nodeValue.length)}function p(e,t){var n=M[W],r=M[U],i=M[V],o=M[$],a=t.startContainer,s=t.startOffset,l=t.endContainer,u=t.endOffset;return 0===e?w(n,r,a,s):1===e?w(i,o,a,s):2===e?w(i,o,l,u):3===e?w(n,r,l,u):void 0}function h(){N(I)}function m(){return N(O)}function g(){return N(H)}function v(e){var t=this[W],r=this[U],i,o;3!==t.nodeType&&4!==t.nodeType||!t.nodeValue?(t.childNodes.length>0&&(o=t.childNodes[r]),o?t.insertBefore(e,o):3==t.nodeType?n.insertAfter(e,t):t.appendChild(e)):r?r>=t.nodeValue.length?n.insertAfter(e,t):(i=t.splitText(r),t.parentNode.insertBefore(e,i)):t.parentNode.insertBefore(e,t)}function y(e){var t=M.extractContents();M.insertNode(e),e.appendChild(t),M.selectNode(e)}function b(){return q(new t(n),{startContainer:M[W],startOffset:M[U],endContainer:M[V],endOffset:M[$],collapsed:M.collapsed,commonAncestorContainer:M.commonAncestorContainer})}function C(e,t){var n;if(3==e.nodeType)return e;if(t<0)return e;for(n=e.firstChild;n&&t>0;)--t,n=n.nextSibling;return n?n:e}function x(){return M[W]==M[V]&&M[U]==M[$]}function w(e,t,r,i){var o,a,s,l,u,c;if(e==r)return t==i?0:t<i?-1:1;for(o=r;o&&o.parentNode!=e;)o=o.parentNode;if(o){for(a=0,s=e.firstChild;s!=o&&a<t;)a++,s=s.nextSibling;return t<=a?-1:1}for(o=e;o&&o.parentNode!=r;)o=o.parentNode;if(o){for(a=0,s=r.firstChild;s!=o&&a<i;)a++,s=s.nextSibling;return a<i?-1:1}for(l=n.findCommonAncestor(e,r),u=e;u&&u.parentNode!=l;)u=u.parentNode;for(u||(u=l),c=r;c&&c.parentNode!=l;)c=c.parentNode;if(c||(c=l),u==c)return 0;for(s=l.firstChild;s;){if(s==u)return-1;if(s==c)return 1;s=s.nextSibling}}function E(e,t,r){var i,o;for(e?(M[W]=t,M[U]=r):(M[V]=t,M[$]=r),i=M[V];i.parentNode;)i=i.parentNode;for(o=M[W];o.parentNode;)o=o.parentNode;o==i?w(M[W],M[U],M[V],M[$])>0&&M.collapse(e):M.collapse(e),M.collapsed=x(),M.commonAncestorContainer=n.findCommonAncestor(M[W],M[V])}function N(e){var t,n=0,r=0,i,o,a,s,l,u;if(M[W]==M[V])return _(e);for(t=M[V],i=t.parentNode;i;t=i,i=i.parentNode){if(i==M[W])return S(t,e);++n}for(t=M[W],i=t.parentNode;i;t=i,i=i.parentNode){if(i==M[V])return k(t,e);++r}for(o=r-n,a=M[W];o>0;)a=a.parentNode,o--;for(s=M[V];o<0;)s=s.parentNode,o++;for(l=a.parentNode,u=s.parentNode;l!=u;l=l.parentNode,u=u.parentNode)a=l,s=u;return T(a,s,e)}function _(e){var t,n,i,o,a,s,l,u,c;if(e!=I&&(t=r()),M[U]==M[$])return t;if(3==M[W].nodeType){if(n=M[W].nodeValue,i=n.substring(M[U],M[$]),e!=H&&(o=M[W],u=M[U],c=M[$]-M[U],0===u&&c>=o.nodeValue.length-1?o.parentNode.removeChild(o):o.deleteData(u,c),M.collapse(F)),e==I)return;return i.length>0&&t.appendChild(P.createTextNode(i)),t}for(o=C(M[W],M[U]),a=M[$]-M[U];o&&a>0;)s=o.nextSibling,l=D(o,e),t&&t.appendChild(l),--a,o=s;return e!=H&&M.collapse(F),t}function S(e,t){var n,i,o,a,s,l;if(t!=I&&(n=r()),i=R(e,t),n&&n.appendChild(i),o=j(e),a=o-M[U],a<=0)return t!=H&&(M.setEndBefore(e),M.collapse(z)),n;for(i=e.previousSibling;a>0;)s=i.previousSibling,l=D(i,t),n&&n.insertBefore(l,n.firstChild),--a,i=s;return t!=H&&(M.setEndBefore(e),M.collapse(z)),n}function k(e,t){var n,i,o,a,s,l;for(t!=I&&(n=r()),o=A(e,t),n&&n.appendChild(o),i=j(e),++i,a=M[$]-i,o=e.nextSibling;o&&a>0;)s=o.nextSibling,l=D(o,t),n&&n.appendChild(l),--a,o=s;return t!=H&&(M.setStartAfter(e),M.collapse(F)),n}function T(e,t,n){var i,o,a,s,l,u,c;for(n!=I&&(o=r()),i=A(e,n),o&&o.appendChild(i),a=j(e),s=j(t),++a,l=s-a,u=e.nextSibling;l>0;)c=u.nextSibling,i=D(u,n),o&&o.appendChild(i),u=c,--l;return i=R(t,n),o&&o.appendChild(i),n!=H&&(M.setStartAfter(e),M.collapse(F)),o}function R(e,t){var n=C(M[V],M[$]-1),r,i,o,a,s,l=n!=M[V];if(n==e)return B(n,l,z,t);for(r=n.parentNode,i=B(r,z,z,t);r;){for(;n;)o=n.previousSibling,a=B(n,l,z,t),t!=I&&i.insertBefore(a,i.firstChild),l=F,n=o;if(r==e)return i;n=r.previousSibling,r=r.parentNode,s=B(r,z,z,t),t!=I&&s.appendChild(i),i=s}}function A(e,t){var n=C(M[W],M[U]),r=n!=M[W],i,o,a,s,l;if(n==e)return B(n,r,F,t);for(i=n.parentNode,o=B(i,z,F,t);i;){for(;n;)a=n.nextSibling,s=B(n,r,F,t),t!=I&&o.appendChild(s),r=F,n=a;if(i==e)return o;n=i.nextSibling,i=i.parentNode,l=B(i,z,F,t),t!=I&&l.appendChild(o),o=l}}function B(e,t,r,i){var o,a,s,l,u;if(t)return D(e,i);if(3==e.nodeType){if(o=e.nodeValue,r?(l=M[U],a=o.substring(l),s=o.substring(0,l)):(l=M[$],a=o.substring(0,l),s=o.substring(l)),i!=H&&(e.nodeValue=s),i==I)return;return u=n.clone(e,z),u.nodeValue=a,u}if(i!=I)return n.clone(e,z)}function D(e,t){return t!=I?t==H?n.clone(e,F):e:void e.parentNode.removeChild(e)}function L(){return n.create("body",null,g()).outerText}var M=this,P=n.doc,O=0,H=1,I=2,F=!0,z=!1,U="startOffset",W="startContainer",V="endContainer",$="endOffset",q=e.extend,j=n.nodeIndex;return q(M,{startContainer:P,startOffset:0,endContainer:P,endOffset:0,collapsed:F,commonAncestorContainer:P,START_TO_START:0,START_TO_END:1,END_TO_END:2,END_TO_START:3,setStart:i,setEnd:o,setStartBefore:a,setStartAfter:s,setEndBefore:l,setEndAfter:u,collapse:c,selectNode:d,selectNodeContents:f,compareBoundaryPoints:p,deleteContents:h,extractContents:m,cloneContents:g,insertNode:v,surroundContents:y,cloneRange:b,toStringIE:L}),M}return t.prototype.toString=function(){return this.toStringIE()},t}),r(C,[m],function(e){function t(e){var t;return t=document.createElement("div"),t.innerHTML=e,t.textContent||t.innerText||e}function n(e,t){var n,r,i,a={};if(e){for(e=e.split(","),t=t||10,n=0;n<e.length;n+=2)r=String.fromCharCode(parseInt(e[n],t)),o[r]||(i="&"+e[n+1]+";",a[r]=i,a[i]=r);return a}}var r=e.makeMap,i,o,a,s=/[&<>\"\u0060\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,l=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,u=/[<>&\"\']/g,c=/&#([a-z0-9]+);?|&([a-z0-9]+);/gi,d={128:"\u20ac",130:"\u201a",131:"\u0192",132:"\u201e",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02c6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017d",145:"\u2018",146:"\u2019",147:"\u201c",148:"\u201d",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02dc",153:"\u2122",154:"\u0161",155:"\u203a",156:"\u0153",158:"\u017e",159:"\u0178"};o={'"':"&quot;","'":"&#39;","<":"&lt;",">":"&gt;","&":"&amp;","`":"&#96;"},a={"&lt;":"<","&gt;":">","&amp;":"&","&quot;":'"',"&apos;":"'"},i=n("50,nbsp,51,iexcl,52,cent,53,pound,54,curren,55,yen,56,brvbar,57,sect,58,uml,59,copy,5a,ordf,5b,laquo,5c,not,5d,shy,5e,reg,5f,macr,5g,deg,5h,plusmn,5i,sup2,5j,sup3,5k,acute,5l,micro,5m,para,5n,middot,5o,cedil,5p,sup1,5q,ordm,5r,raquo,5s,frac14,5t,frac12,5u,frac34,5v,iquest,60,Agrave,61,Aacute,62,Acirc,63,Atilde,64,Auml,65,Aring,66,AElig,67,Ccedil,68,Egrave,69,Eacute,6a,Ecirc,6b,Euml,6c,Igrave,6d,Iacute,6e,Icirc,6f,Iuml,6g,ETH,6h,Ntilde,6i,Ograve,6j,Oacute,6k,Ocirc,6l,Otilde,6m,Ouml,6n,times,6o,Oslash,6p,Ugrave,6q,Uacute,6r,Ucirc,6s,Uuml,6t,Yacute,6u,THORN,6v,szlig,70,agrave,71,aacute,72,acirc,73,atilde,74,auml,75,aring,76,aelig,77,ccedil,78,egrave,79,eacute,7a,ecirc,7b,euml,7c,igrave,7d,iacute,7e,icirc,7f,iuml,7g,eth,7h,ntilde,7i,ograve,7j,oacute,7k,ocirc,7l,otilde,7m,ouml,7n,divide,7o,oslash,7p,ugrave,7q,uacute,7r,ucirc,7s,uuml,7t,yacute,7u,thorn,7v,yuml,ci,fnof,sh,Alpha,si,Beta,sj,Gamma,sk,Delta,sl,Epsilon,sm,Zeta,sn,Eta,so,Theta,sp,Iota,sq,Kappa,sr,Lambda,ss,Mu,st,Nu,su,Xi,sv,Omicron,t0,Pi,t1,Rho,t3,Sigma,t4,Tau,t5,Upsilon,t6,Phi,t7,Chi,t8,Psi,t9,Omega,th,alpha,ti,beta,tj,gamma,tk,delta,tl,epsilon,tm,zeta,tn,eta,to,theta,tp,iota,tq,kappa,tr,lambda,ts,mu,tt,nu,tu,xi,tv,omicron,u0,pi,u1,rho,u2,sigmaf,u3,sigma,u4,tau,u5,upsilon,u6,phi,u7,chi,u8,psi,u9,omega,uh,thetasym,ui,upsih,um,piv,812,bull,816,hellip,81i,prime,81j,Prime,81u,oline,824,frasl,88o,weierp,88h,image,88s,real,892,trade,89l,alefsym,8cg,larr,8ch,uarr,8ci,rarr,8cj,darr,8ck,harr,8dl,crarr,8eg,lArr,8eh,uArr,8ei,rArr,8ej,dArr,8ek,hArr,8g0,forall,8g2,part,8g3,exist,8g5,empty,8g7,nabla,8g8,isin,8g9,notin,8gb,ni,8gf,prod,8gh,sum,8gi,minus,8gn,lowast,8gq,radic,8gt,prop,8gu,infin,8h0,ang,8h7,and,8h8,or,8h9,cap,8ha,cup,8hb,int,8hk,there4,8hs,sim,8i5,cong,8i8,asymp,8j0,ne,8j1,equiv,8j4,le,8j5,ge,8k2,sub,8k3,sup,8k4,nsub,8k6,sube,8k7,supe,8kl,oplus,8kn,otimes,8l5,perp,8m5,sdot,8o8,lceil,8o9,rceil,8oa,lfloor,8ob,rfloor,8p9,lang,8pa,rang,9ea,loz,9j0,spades,9j3,clubs,9j5,hearts,9j6,diams,ai,OElig,aj,oelig,b0,Scaron,b1,scaron,bo,Yuml,m6,circ,ms,tilde,802,ensp,803,emsp,809,thinsp,80c,zwnj,80d,zwj,80e,lrm,80f,rlm,80j,ndash,80k,mdash,80o,lsquo,80p,rsquo,80q,sbquo,80s,ldquo,80t,rdquo,80u,bdquo,810,dagger,811,Dagger,81g,permil,81p,lsaquo,81q,rsaquo,85c,euro",32);var f={encodeRaw:function(e,t){return e.replace(t?s:l,function(e){return o[e]||e})},encodeAllRaw:function(e){return(""+e).replace(u,function(e){return o[e]||e})},encodeNumeric:function(e,t){return e.replace(t?s:l,function(e){return e.length>1?"&#"+(1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536)+";":o[e]||"&#"+e.charCodeAt(0)+";"})},encodeNamed:function(e,t,n){return n=n||i,e.replace(t?s:l,function(e){return o[e]||n[e]||e})},getEncodeFunc:function(e,t){function a(e,n){return e.replace(n?s:l,function(e){return o[e]||t[e]||"&#"+e.charCodeAt(0)+";"||e})}function u(e,n){return f.encodeNamed(e,n,t)}return t=n(t)||i,e=r(e.replace(/\+/g,",")),e.named&&e.numeric?a:e.named?t?u:f.encodeNamed:e.numeric?f.encodeNumeric:f.encodeRaw},decode:function(e){return e.replace(c,function(e,n){return n?(n="x"===n.charAt(0).toLowerCase()?parseInt(n.substr(1),16):parseInt(n,10),n>65535?(n-=65536,String.fromCharCode(55296+(n>>10),56320+(1023&n))):d[n]||String.fromCharCode(n)):a[e]||i[e]||t(e)})}};return f}),r(x,[m,c],function(e,t){return function(n,r){function i(e){n.getElementsByTagName("head")[0].appendChild(e)}function o(r,o,u){function c(){for(var e=b.passed,t=e.length;t--;)e[t]();b.status=2,b.passed=[],b.failed=[]}function d(){for(var e=b.failed,t=e.length;t--;)e[t]();b.status=3,b.passed=[],b.failed=[]}function f(){var e=navigator.userAgent.match(/WebKit\/(\d*)/);return!!(e&&e[1]<536)}function p(e,n){e()||((new Date).getTime()-y<l?t.setTimeout(n):d())}function h(){p(function(){for(var e=n.styleSheets,t,r=e.length,i;r--;)if(t=e[r],i=t.ownerNode?t.ownerNode:t.owningElement,i&&i.id===g.id)return c(),!0},h)}function m(){p(function(){try{var e=v.sheet.cssRules;return c(),!!e}catch(t){}},m)}var g,v,y,b;if(r=e._addCacheSuffix(r),s[r]?b=s[r]:(b={passed:[],failed:[]},s[r]=b),o&&b.passed.push(o),u&&b.failed.push(u),1!=b.status){if(2==b.status)return void c();if(3==b.status)return void d();if(b.status=1,g=n.createElement("link"),g.rel="stylesheet",g.type="text/css",g.id="u"+a++,g.async=!1,g.defer=!1,y=(new Date).getTime(),"onload"in g&&!f())g.onload=h,g.onerror=d;else{if(navigator.userAgent.indexOf("Firefox")>0)return v=n.createElement("style"),v.textContent='@import "'+r+'"',m(),void i(v);h()}i(g),g.href=r}}var a=0,s={},l;r=r||{},l=r.maxLoadTime||5e3,this.load=o}}),r(w,[p,g,v,f,y,b,C,d,m,x],function(e,n,r,i,o,a,s,l,u,c){function d(e,t){var n={},r=t.keep_values,i;return i={set:function(n,r,i){t.url_converter&&(r=t.url_converter.call(t.url_converter_scope||e,r,i,n[0])),n.attr("data-mce-"+i,r).attr(i,r)},get:function(e,t){return e.attr("data-mce-"+t)||e.attr(t)}},n={style:{set:function(e,t){return null!==t&&"object"==typeof t?void e.css(t):(r&&e.attr("data-mce-style",t),void e.attr("style",t))},get:function(t){var n=t.attr("data-mce-style")||t.attr("style");return n=e.serializeStyle(e.parseStyle(n),t[0].nodeName)}}},r&&(n.href=n.src=i),n}function f(e,t){var n=t.attr("style");n=e.serializeStyle(e.parseStyle(n),t[0].nodeName),n||(n=null),t.attr("data-mce-style",n)}function p(e,t){var n=0,r,i;if(e)for(r=e.nodeType,e=e.previousSibling;e;e=e.previousSibling)i=e.nodeType,(!t||3!=i||i!=r&&e.nodeValue.length)&&(n++,r=i);return n}function h(e,t){var o=this,a;o.doc=e,o.win=window,o.files={},o.counter=0,o.stdMode=!b||e.documentMode>=8,o.boxModel=!b||"CSS1Compat"==e.compatMode||o.stdMode,o.styleSheetLoader=new c(e),o.boundEvents=[],o.settings=t=t||{},o.schema=t.schema,o.styles=new r({url_converter:t.url_converter,url_converter_scope:t.url_converter_scope},t.schema),o.fixDoc(e),o.events=t.ownEvents?new i(t.proxy):i.Event,o.attrHooks=d(o,t),a=t.schema?t.schema.getBlockElements():{},o.$=n.overrideDefaults(function(){return{context:e,element:o.getRoot()}}),o.isBlock=function(e){if(!e)return!1;var t=e.nodeType;return t?!(1!==t||!a[e.nodeName]):!!a[e]}}var m=u.each,g=u.is,v=u.grep,y=u.trim,b=l.ie,C=/^([a-z0-9],?)+$/i,x=/^[ \t\r\n]*$/;return h.prototype={$$:function(e){return"string"==typeof e&&(e=this.get(e)),this.$(e)},root:null,fixDoc:function(e){var t=this.settings,n;if(b&&t.schema){"abbr article aside audio canvas details figcaption figure footer header hgroup mark menu meter nav output progress section summary time video".replace(/\w+/g,function(t){e.createElement(t)});for(n in t.schema.getCustomElements())e.createElement(n)}},clone:function(e,t){var n=this,r,i;return!b||1!==e.nodeType||t?e.cloneNode(t):(i=n.doc,t?r.firstChild:(r=i.createElement(e.nodeName),m(n.getAttribs(e),function(t){n.setAttrib(r,t.nodeName,n.getAttrib(e,t.nodeName))}),r))},getRoot:function(){var e=this;return e.settings.root_element||e.doc.body},getViewPort:function(e){var t,n;return e=e?e:this.win,t=e.document,n=this.boxModel?t.documentElement:t.body,{x:e.pageXOffset||n.scrollLeft,y:e.pageYOffset||n.scrollTop,w:e.innerWidth||n.clientWidth,h:e.innerHeight||n.clientHeight}},getRect:function(e){var t=this,n,r;return e=t.get(e),n=t.getPos(e),r=t.getSize(e),{x:n.x,y:n.y,w:r.w,h:r.h}},getSize:function(e){var t=this,n,r;return e=t.get(e),n=t.getStyle(e,"width"),r=t.getStyle(e,"height"),n.indexOf("px")===-1&&(n=0),r.indexOf("px")===-1&&(r=0),
+{w:parseInt(n,10)||e.offsetWidth||e.clientWidth,h:parseInt(r,10)||e.offsetHeight||e.clientHeight}},getParent:function(e,t,n){return this.getParents(e,t,n,!1)},getParents:function(e,n,r,i){var o=this,a,s=[];for(e=o.get(e),i=i===t,r=r||("BODY"!=o.getRoot().nodeName?o.getRoot().parentNode:null),g(n,"string")&&(a=n,n="*"===n?function(e){return 1==e.nodeType}:function(e){return o.is(e,a)});e&&e!=r&&e.nodeType&&9!==e.nodeType;){if(!n||n(e)){if(!i)return e;s.push(e)}e=e.parentNode}return i?s:null},get:function(e){var t;return e&&this.doc&&"string"==typeof e&&(t=e,e=this.doc.getElementById(e),e&&e.id!==t)?this.doc.getElementsByName(t)[1]:e},getNext:function(e,t){return this._findSib(e,t,"nextSibling")},getPrev:function(e,t){return this._findSib(e,t,"previousSibling")},select:function(t,n){var r=this;return e(t,r.get(n)||r.settings.root_element||r.doc,[])},is:function(n,r){var i;if(n.length===t){if("*"===r)return 1==n.nodeType;if(C.test(r)){for(r=r.toLowerCase().split(/,/),n=n.nodeName.toLowerCase(),i=r.length-1;i>=0;i--)if(r[i]==n)return!0;return!1}}if(n.nodeType&&1!=n.nodeType)return!1;var o=n.nodeType?[n]:n;return e(r,o[0].ownerDocument||o[0],null,o).length>0},add:function(e,t,n,r,i){var o=this;return this.run(e,function(e){var a;return a=g(t,"string")?o.doc.createElement(t):t,o.setAttribs(a,n),r&&(r.nodeType?a.appendChild(r):o.setHTML(a,r)),i?a:e.appendChild(a)})},create:function(e,t,n){return this.add(this.doc.createElement(e),e,t,n,1)},createHTML:function(e,t,n){var r="",i;r+="<"+e;for(i in t)t.hasOwnProperty(i)&&null!==t[i]&&"undefined"!=typeof t[i]&&(r+=" "+i+'="'+this.encode(t[i])+'"');return"undefined"!=typeof n?r+">"+n+"</"+e+">":r+" />"},createFragment:function(e){var t,n,r=this.doc,i;for(i=r.createElement("div"),t=r.createDocumentFragment(),e&&(i.innerHTML=e);n=i.firstChild;)t.appendChild(n);return t},remove:function(e,t){return e=this.$$(e),t?e.each(function(){for(var e;e=this.firstChild;)3==e.nodeType&&0===e.data.length?this.removeChild(e):this.parentNode.insertBefore(e,this)}).remove():e.remove(),e.length>1?e.toArray():e[0]},setStyle:function(e,t,n){e=this.$$(e).css(t,n),this.settings.update_styles&&f(this,e)},getStyle:function(e,n,r){return e=this.$$(e),r?e.css(n):(n=n.replace(/-(\D)/g,function(e,t){return t.toUpperCase()}),"float"==n&&(n=l.ie&&l.ie<12?"styleFloat":"cssFloat"),e[0]&&e[0].style?e[0].style[n]:t)},setStyles:function(e,t){e=this.$$(e).css(t),this.settings.update_styles&&f(this,e)},removeAllAttribs:function(e){return this.run(e,function(e){var t,n=e.attributes;for(t=n.length-1;t>=0;t--)e.removeAttributeNode(n.item(t))})},setAttrib:function(e,t,n){var r=this,i,o,a=r.settings;""===n&&(n=null),e=r.$$(e),i=e.attr(t),e.length&&(o=r.attrHooks[t],o&&o.set?o.set(e,n,t):e.attr(t,n),i!=n&&a.onSetAttrib&&a.onSetAttrib({attrElm:e,attrName:t,attrValue:n}))},setAttribs:function(e,t){var n=this;n.$$(e).each(function(e,r){m(t,function(e,t){n.setAttrib(r,t,e)})})},getAttrib:function(e,t,n){var r=this,i,o;return e=r.$$(e),e.length&&(i=r.attrHooks[t],o=i&&i.get?i.get(e,t):e.attr(t)),"undefined"==typeof o&&(o=n||""),o},getPos:function(e,t){var r=this,i=0,o=0,a,s=r.doc,l=s.body,u;if(e=r.get(e),t=t||l,e){if(t===l&&e.getBoundingClientRect&&"static"===n(l).css("position"))return u=e.getBoundingClientRect(),t=r.boxModel?s.documentElement:l,i=u.left+(s.documentElement.scrollLeft||l.scrollLeft)-t.clientLeft,o=u.top+(s.documentElement.scrollTop||l.scrollTop)-t.clientTop,{x:i,y:o};for(a=e;a&&a!=t&&a.nodeType;)i+=a.offsetLeft||0,o+=a.offsetTop||0,a=a.offsetParent;for(a=e.parentNode;a&&a!=t&&a.nodeType;)i-=a.scrollLeft||0,o-=a.scrollTop||0,a=a.parentNode}return{x:i,y:o}},parseStyle:function(e){return this.styles.parse(e)},serializeStyle:function(e,t){return this.styles.serialize(e,t)},addStyle:function(e){var t=this,n=t.doc,r,i;if(t!==h.DOM&&n===document){var o=h.DOM.addedStyles;if(o=o||[],o[e])return;o[e]=!0,h.DOM.addedStyles=o}i=n.getElementById("mceDefaultStyles"),i||(i=n.createElement("style"),i.id="mceDefaultStyles",i.type="text/css",r=n.getElementsByTagName("head")[0],r.firstChild?r.insertBefore(i,r.firstChild):r.appendChild(i)),i.styleSheet?i.styleSheet.cssText+=e:i.appendChild(n.createTextNode(e))},loadCSS:function(e){var t=this,n=t.doc,r;return t!==h.DOM&&n===document?void h.DOM.loadCSS(e):(e||(e=""),r=n.getElementsByTagName("head")[0],void m(e.split(","),function(e){var i;e=u._addCacheSuffix(e),t.files[e]||(t.files[e]=!0,i=t.create("link",{rel:"stylesheet",href:e}),b&&n.documentMode&&n.recalc&&(i.onload=function(){n.recalc&&n.recalc(),i.onload=null}),r.appendChild(i))}))},addClass:function(e,t){this.$$(e).addClass(t)},removeClass:function(e,t){this.toggleClass(e,t,!1)},hasClass:function(e,t){return this.$$(e).hasClass(t)},toggleClass:function(e,t,r){this.$$(e).toggleClass(t,r).each(function(){""===this.className&&n(this).attr("class",null)})},show:function(e){this.$$(e).show()},hide:function(e){this.$$(e).hide()},isHidden:function(e){return"none"==this.$$(e).css("display")},uniqueId:function(e){return(e?e:"mce_")+this.counter++},setHTML:function(e,t){e=this.$$(e),b?e.each(function(e,r){if(r.canHaveHTML!==!1){for(;r.firstChild;)r.removeChild(r.firstChild);try{r.innerHTML="<br>"+t,r.removeChild(r.firstChild)}catch(i){n("<div></div>").html("<br>"+t).contents().slice(1).appendTo(r)}return t}}):e.html(t)},getOuterHTML:function(e){return e=this.get(e),1==e.nodeType&&"outerHTML"in e?e.outerHTML:n("<div></div>").append(n(e).clone()).html()},setOuterHTML:function(e,t){var r=this;r.$$(e).each(function(){try{if("outerHTML"in this)return void(this.outerHTML=t)}catch(e){}r.remove(n(this).html(t),!0)})},decode:s.decode,encode:s.encodeAllRaw,insertAfter:function(e,t){return t=this.get(t),this.run(e,function(e){var n,r;return n=t.parentNode,r=t.nextSibling,r?n.insertBefore(e,r):n.appendChild(e),e})},replace:function(e,t,n){var r=this;return r.run(t,function(t){return g(t,"array")&&(e=e.cloneNode(!0)),n&&m(v(t.childNodes),function(t){e.appendChild(t)}),t.parentNode.replaceChild(e,t)})},rename:function(e,t){var n=this,r;return e.nodeName!=t.toUpperCase()&&(r=n.create(t),m(n.getAttribs(e),function(t){n.setAttrib(r,t.nodeName,n.getAttrib(e,t.nodeName))}),n.replace(r,e,1)),r||e},findCommonAncestor:function(e,t){for(var n=e,r;n;){for(r=t;r&&n!=r;)r=r.parentNode;if(n==r)break;n=n.parentNode}return!n&&e.ownerDocument?e.ownerDocument.documentElement:n},toHex:function(e){return this.styles.toHex(u.trim(e))},run:function(e,t,n){var r=this,i;return"string"==typeof e&&(e=r.get(e)),!!e&&(n=n||this,e.nodeType||!e.length&&0!==e.length?t.call(n,e):(i=[],m(e,function(e,o){e&&("string"==typeof e&&(e=r.get(e)),i.push(t.call(n,e,o)))}),i))},getAttribs:function(e){var t;if(e=this.get(e),!e)return[];if(b){if(t=[],"OBJECT"==e.nodeName)return e.attributes;"OPTION"===e.nodeName&&this.getAttrib(e,"selected")&&t.push({specified:1,nodeName:"selected"});var n=/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi;return e.cloneNode(!1).outerHTML.replace(n,"").replace(/[\w:\-]+/gi,function(e){t.push({specified:1,nodeName:e})}),t}return e.attributes},isEmpty:function(e,t){var n=this,r,i,a,s,l,u,c=0;if(e=e.firstChild){l=new o(e,e.parentNode),t=t||(n.schema?n.schema.getNonEmptyElements():null),s=n.schema?n.schema.getWhiteSpaceElements():{};do{if(a=e.nodeType,1===a){var d=e.getAttribute("data-mce-bogus");if(d){e=l.next("all"===d);continue}if(u=e.nodeName.toLowerCase(),t&&t[u]){if("br"===u){c++,e=l.next();continue}return!1}for(i=n.getAttribs(e),r=i.length;r--;)if(u=i[r].nodeName,"name"===u||"data-mce-bookmark"===u)return!1}if(8==a)return!1;if(3===a&&!x.test(e.nodeValue))return!1;if(3===a&&e.parentNode&&s[e.parentNode.nodeName]&&x.test(e.nodeValue))return!1;e=l.next()}while(e)}return c<=1},createRng:function(){var e=this.doc;return e.createRange?e.createRange():new a(this)},nodeIndex:p,split:function(e,t,n){function r(e){function t(e){var t=e.previousSibling&&"SPAN"==e.previousSibling.nodeName,n=e.nextSibling&&"SPAN"==e.nextSibling.nodeName;return t&&n}var n,o=e.childNodes,a=e.nodeType;if(1!=a||"bookmark"!=e.getAttribute("data-mce-type")){for(n=o.length-1;n>=0;n--)r(o[n]);if(9!=a){if(3==a&&e.nodeValue.length>0){var s=y(e.nodeValue).length;if(!i.isBlock(e.parentNode)||s>0||0===s&&t(e))return}else if(1==a&&(o=e.childNodes,1==o.length&&o[0]&&1==o[0].nodeType&&"bookmark"==o[0].getAttribute("data-mce-type")&&e.parentNode.insertBefore(o[0],e),o.length||/^(br|hr|input|img)$/i.test(e.nodeName)))return;i.remove(e)}return e}}var i=this,o=i.createRng(),a,s,l;if(e&&t)return o.setStart(e.parentNode,i.nodeIndex(e)),o.setEnd(t.parentNode,i.nodeIndex(t)),a=o.extractContents(),o=i.createRng(),o.setStart(t.parentNode,i.nodeIndex(t)+1),o.setEnd(e.parentNode,i.nodeIndex(e)+1),s=o.extractContents(),l=e.parentNode,l.insertBefore(r(a),e),n?l.insertBefore(n,e):l.insertBefore(t,e),l.insertBefore(r(s),e),i.remove(e),n||t},bind:function(e,t,n,r){var i=this;if(u.isArray(e)){for(var o=e.length;o--;)e[o]=i.bind(e[o],t,n,r);return e}return!i.settings.collect||e!==i.doc&&e!==i.win||i.boundEvents.push([e,t,n,r]),i.events.bind(e,t,n,r||i)},unbind:function(e,t,n){var r=this,i;if(u.isArray(e)){for(i=e.length;i--;)e[i]=r.unbind(e[i],t,n);return e}if(r.boundEvents&&(e===r.doc||e===r.win))for(i=r.boundEvents.length;i--;){var o=r.boundEvents[i];e!=o[0]||t&&t!=o[1]||n&&n!=o[2]||this.events.unbind(o[0],o[1],o[2])}return this.events.unbind(e,t,n)},fire:function(e,t,n){return this.events.fire(e,t,n)},getContentEditable:function(e){var t;return e&&1==e.nodeType?(t=e.getAttribute("data-mce-contenteditable"),t&&"inherit"!==t?t:"inherit"!==e.contentEditable?e.contentEditable:null):null},getContentEditableParent:function(e){for(var t=this.getRoot(),n=null;e&&e!==t&&(n=this.getContentEditable(e),null===n);e=e.parentNode);return n},destroy:function(){var t=this;if(t.boundEvents){for(var n=t.boundEvents.length;n--;){var r=t.boundEvents[n];this.events.unbind(r[0],r[1],r[2])}t.boundEvents=null}e.setDocument&&e.setDocument(),t.win=t.doc=t.root=t.events=t.frag=null},isChildOf:function(e,t){for(;e;){if(t===e)return!0;e=e.parentNode}return!1},dumpRng:function(e){return"startContainer: "+e.startContainer.nodeName+", startOffset: "+e.startOffset+", endContainer: "+e.endContainer.nodeName+", endOffset: "+e.endOffset},_findSib:function(e,t,n){var r=this,i=t;if(e)for("string"==typeof i&&(i=function(e){return r.is(e,t)}),e=e[n];e;e=e[n])if(i(e))return e;return null}},h.DOM=new h(document),h.nodeIndex=p,h}),r(E,[w,m],function(e,t){function n(){function e(e,n,i){function o(){l.remove(c),u&&(u.onreadystatechange=u.onload=u=null),n()}function s(){a(i)?i():"undefined"!=typeof console&&console.log&&console.log("Failed to load script: "+e)}var l=r,u,c;c=l.uniqueId(),u=document.createElement("script"),u.id=c,u.type="text/javascript",u.src=t._addCacheSuffix(e),"onreadystatechange"in u?u.onreadystatechange=function(){/loaded|complete/.test(u.readyState)&&o()}:u.onload=o,u.onerror=s,(document.getElementsByTagName("head")[0]||document.body).appendChild(u)}var n=0,s=1,l=2,u=3,c={},d=[],f={},p=[],h=0,m;this.isDone=function(e){return c[e]==l},this.markDone=function(e){c[e]=l},this.add=this.load=function(e,t,r,i){var o=c[e];o==m&&(d.push(e),c[e]=n),t&&(f[e]||(f[e]=[]),f[e].push({success:t,failure:i,scope:r||this}))},this.remove=function(e){delete c[e],delete f[e]},this.loadQueue=function(e,t,n){this.loadScripts(d,e,t,n)},this.loadScripts=function(t,n,r,d){function g(e,t){i(f[t],function(t){a(t[e])&&t[e].call(t.scope)}),f[t]=m}var v,y=[];p.push({success:n,failure:d,scope:r||this}),(v=function(){var n=o(t);t.length=0,i(n,function(t){return c[t]===l?void g("success",t):c[t]===u?void g("failure",t):void(c[t]!==s&&(c[t]=s,h++,e(t,function(){c[t]=l,h--,g("success",t),v()},function(){c[t]=u,h--,y.push(t),g("failure",t),v()})))}),h||(i(p,function(e){0===y.length?a(e.success)&&e.success.call(e.scope):a(e.failure)&&e.failure.call(e.scope,y)}),p.length=0)})()}}var r=e.DOM,i=t.each,o=t.grep,a=function(e){return"function"==typeof e};return n.ScriptLoader=new n,n}),r(N,[E,m],function(e,n){function r(){var e=this;e.items=[],e.urls={},e.lookup={}}var i=n.each;return r.prototype={get:function(e){return this.lookup[e]?this.lookup[e].instance:t},dependencies:function(e){var t;return this.lookup[e]&&(t=this.lookup[e].dependencies),t||[]},requireLangPack:function(t,n){var i=r.language;if(i&&r.languageLoad!==!1){if(n)if(n=","+n+",",n.indexOf(","+i.substr(0,2)+",")!=-1)i=i.substr(0,2);else if(n.indexOf(","+i+",")==-1)return;e.ScriptLoader.add(this.urls[t]+"/langs/"+i+".js")}},add:function(e,t,n){return this.items.push(t),this.lookup[e]={instance:t,dependencies:n},t},remove:function(e){delete this.urls[e],delete this.lookup[e]},createUrl:function(e,t){return"object"==typeof t?t:{prefix:e.prefix,resource:t,suffix:e.suffix}},addComponents:function(t,n){var r=this.urls[t];i(n,function(t){e.ScriptLoader.add(r+"/"+t)})},load:function(n,o,a,s,l){function u(){var r=c.dependencies(n);i(r,function(e){var n=c.createUrl(o,e);c.load(n.resource,n,t,t)}),a&&(s?a.call(s):a.call(e))}var c=this,d=o;c.urls[n]||("object"==typeof o&&(d=o.prefix+o.resource+o.suffix),0!==d.indexOf("/")&&d.indexOf("://")==-1&&(d=r.baseURL+"/"+d),c.urls[n]=d.substring(0,d.lastIndexOf("/")),c.lookup[n]?u():e.ScriptLoader.add(d,u,s,l))}},r.PluginManager=new r,r.ThemeManager=new r,r}),r(_,[],function(){function e(e){return function(t){return!!t&&t.nodeType==e}}function t(e){return e=e.toLowerCase().split(" "),function(t){var n,r;if(t&&t.nodeType)for(r=t.nodeName.toLowerCase(),n=0;n<e.length;n++)if(r===e[n])return!0;return!1}}function n(e,t){return t=t.toLowerCase().split(" "),function(n){var r,i;if(s(n))for(r=0;r<t.length;r++)if(i=getComputedStyle(n,null).getPropertyValue(e),i===t[r])return!0;return!1}}function r(e,t){return function(n){return s(n)&&n[e]===t}}function i(e,t){return function(n){return s(n)&&n.getAttribute(e)===t}}function o(e){return s(e)&&e.hasAttribute("data-mce-bogus")}function a(e){return function(t){if(s(t)){if(t.contentEditable===e)return!0;if(t.getAttribute("data-mce-contenteditable")===e)return!0}return!1}}var s=e(1);return{isText:e(3),isElement:s,isComment:e(8),isBr:t("br"),isContentEditableTrue:a("true"),isContentEditableFalse:a("false"),matchNodeNames:t,hasPropValue:r,hasAttributeValue:i,matchStyleValues:n,isBogus:o}}),r(S,[],function(){function e(e){return e==n}function t(e){return e.replace(new RegExp(n,"g"),"")}var n="\ufeff";return{isZwsp:e,ZWSP:n,trim:t}}),r(k,[_,S],function(e,t){function n(e){return y(e)&&(e=e.parentNode),v(e)&&e.hasAttribute("data-mce-caret")}function r(e){return y(e)&&t.isZwsp(e.data)}function i(e){return n(e)||r(e)}function o(e){var t=e.parentNode;t&&t.removeChild(e)}function a(e){try{return e.nodeValue}catch(t){return""}}function s(e,t){0===t.length?o(e):e.nodeValue=t}function l(e,n){var r,o,a,s;if(r=e.ownerDocument,a=r.createTextNode(t.ZWSP),s=e.parentNode,n){if(o=e.previousSibling,y(o)){if(i(o))return o;if(h(o))return o.splitText(o.data.length-1)}s.insertBefore(a,e)}else{if(o=e.nextSibling,y(o)){if(i(o))return o;if(p(o))return o.splitText(1),o}e.nextSibling?s.insertBefore(a,e.nextSibling):s.appendChild(a)}return a}function u(){var e=document.createElement("br");return e.setAttribute("data-mce-bogus","1"),e}function c(e,t,n){var r,i,o;return r=t.ownerDocument,i=r.createElement(e),i.setAttribute("data-mce-caret",n?"before":"after"),i.setAttribute("data-mce-bogus","all"),i.appendChild(u()),o=t.parentNode,n?o.insertBefore(i,t):t.nextSibling?o.insertBefore(i,t.nextSibling):o.appendChild(i),i}function d(t){return t.firstChild!==t.lastChild||!e.isBr(t.firstChild)}function f(e){if(v(e)&&i(e)&&(d(e)?e.removeAttribute("data-mce-caret"):o(e)),y(e)){var n=t.trim(a(e));s(e,n)}}function p(e){return y(e)&&e.data[0]==t.ZWSP}function h(e){return y(e)&&e.data[e.data.length-1]==t.ZWSP}function m(t){var n=t.getElementsByTagName("br"),r=n[n.length-1];e.isBogus(r)&&r.parentNode.removeChild(r)}function g(e){return e&&e.hasAttribute("data-mce-caret")?(m(e),e.removeAttribute("data-mce-caret"),e.removeAttribute("data-mce-bogus"),e.removeAttribute("style"),e.removeAttribute("_moz_abspos"),e):null}var v=e.isElement,y=e.isText;return{isCaretContainer:i,isCaretContainerBlock:n,isCaretContainerInline:r,showCaretContainerBlock:g,insertInline:l,insertBlock:c,hasContent:d,remove:f,startsWithCaretContainer:p,endsWithCaretContainer:h}}),r(T,[m,y,_,b,k],function(e,t,n,r,i){function o(e){return m(e)||g(e)}function a(e,t){var n=e.childNodes;return t--,t>n.length-1?t=n.length-1:t<0&&(t=0),n[t]||e}function s(e,t,n){for(;e&&e!==t;){if(n(e))return e;e=e.parentNode}return null}function l(e,t,n){return null!==s(e,t,n)}function u(e){return"_mce_caret"===e.id}function c(e,t){return v(e)&&l(e,t,u)===!1}function d(e){this.walk=function(t,n){function r(e){var t;return t=e[0],3===t.nodeType&&t===l&&u>=t.nodeValue.length&&e.splice(0,1),t=e[e.length-1],0===d&&e.length>0&&t===c&&3===t.nodeType&&e.splice(e.length-1,1),e}function i(e,t,n){for(var r=[];e&&e!=n;e=e[t])r.push(e);return r}function o(e,t){do{if(e.parentNode==t)return e;e=e.parentNode}while(e)}function s(e,t,o){var a=o?"nextSibling":"previousSibling";for(g=e,v=g.parentNode;g&&g!=t;g=v)v=g.parentNode,y=i(g==e?g:g[a],a),y.length&&(o||y.reverse(),n(r(y)))}var l=t.startContainer,u=t.startOffset,c=t.endContainer,d=t.endOffset,f,p,m,g,v,y,b;if(b=e.select("td[data-mce-selected],th[data-mce-selected]"),b.length>0)return void h(b,function(e){n([e])});if(1==l.nodeType&&l.hasChildNodes()&&(l=l.childNodes[u]),1==c.nodeType&&c.hasChildNodes()&&(c=a(c,d)),l==c)return n(r([l]));for(f=e.findCommonAncestor(l,c),g=l;g;g=g.parentNode){if(g===c)return s(l,f,!0);if(g===f)break}for(g=c;g;g=g.parentNode){if(g===l)return s(c,f);if(g===f)break}p=o(l,f)||l,m=o(c,f)||c,s(l,p,!0),y=i(p==l?p:p.nextSibling,"nextSibling",m==c?m.nextSibling:m),y.length&&n(r(y)),s(c,m)},this.split=function(e){function t(e,t){return e.splitText(t)}var n=e.startContainer,r=e.startOffset,i=e.endContainer,o=e.endOffset;return n==i&&3==n.nodeType?r>0&&r<n.nodeValue.length&&(i=t(n,r),n=i.previousSibling,o>r?(o-=r,n=i=t(i,o).previousSibling,o=i.nodeValue.length,r=0):o=0):(3==n.nodeType&&r>0&&r<n.nodeValue.length&&(n=t(n,r),r=0),3==i.nodeType&&o>0&&o<i.nodeValue.length&&(i=t(i,o).previousSibling,o=i.nodeValue.length)),{startContainer:n,startOffset:r,endContainer:i,endOffset:o}},this.normalize=function(n){function r(r){function a(e){return e&&/^(TD|TH|CAPTION)$/.test(e.nodeName)}function s(n,r){for(var i=new t(n,e.getParent(n.parentNode,e.isBlock)||m);n=i[r?"prev":"next"]();)if("BR"===n.nodeName)return!0}function l(e){for(;e&&e!=m;){if(g(e))return!0;e=e.parentNode}return!1}function u(e,t){return e.previousSibling&&e.previousSibling.nodeName==t}function d(n,r){var a,s,l;if(r=r||f,l=e.getParent(r.parentNode,e.isBlock)||m,n&&"BR"==r.nodeName&&x&&e.isEmpty(l))return f=r.parentNode,p=e.nodeIndex(r),void(i=!0);for(a=new t(r,l);y=a[n?"prev":"next"]();){if("false"===e.getContentEditableParent(y)||c(y,e.getRoot()))return;if(3===y.nodeType&&y.nodeValue.length>0)return f=y,p=n?y.nodeValue.length:0,void(i=!0);if(e.isBlock(y)||b[y.nodeName.toLowerCase()])return;s=y}o&&s&&(f=s,i=!0,p=0)}var f,p,h,m=e.getRoot(),y,b,C,x;if(f=n[(r?"start":"end")+"Container"],p=n[(r?"start":"end")+"Offset"],x=1==f.nodeType&&p===f.childNodes.length,b=e.schema.getNonEmptyElements(),C=r,!v(f)){if(1==f.nodeType&&p>f.childNodes.length-1&&(C=!1),9===f.nodeType&&(f=e.getRoot(),p=0),f===m){if(C&&(y=f.childNodes[p>0?p-1:0])){if(v(y))return;if(b[y.nodeName]||"TABLE"==y.nodeName)return}if(f.hasChildNodes()){if(p=Math.min(!C&&p>0?p-1:p,f.childNodes.length-1),f=f.childNodes[p],p=0,!o&&f===m.lastChild&&"TABLE"===f.nodeName)return;if(l(f)||v(f))return;if(f.hasChildNodes()&&!/TABLE/.test(f.nodeName)){y=f,h=new t(f,m);do{if(g(y)||v(y)){i=!1;break}if(3===y.nodeType&&y.nodeValue.length>0){p=C?0:y.nodeValue.length,f=y,i=!0;break}if(b[y.nodeName.toLowerCase()]&&!a(y)){p=e.nodeIndex(y),f=y.parentNode,"IMG"!=y.nodeName||C||p++,i=!0;break}}while(y=C?h.next():h.prev())}}}o&&(3===f.nodeType&&0===p&&d(!0),1===f.nodeType&&(y=f.childNodes[p],y||(y=f.childNodes[p-1]),!y||"BR"!==y.nodeName||u(y,"A")||s(y)||s(y,!0)||d(!0,y))),C&&!o&&3===f.nodeType&&p===f.nodeValue.length&&d(!1),i&&n["set"+(r?"Start":"End")](f,p)}}var i,o;return o=n.collapsed,r(!0),o||r(),i&&o&&n.collapse(!0),i}}function f(t,n,r){var i,o,a;if(i=r.elementFromPoint(t,n),o=r.body.createTextRange(),i&&"HTML"!=i.tagName||(i=r.body),o.moveToElementText(i),a=e.toArray(o.getClientRects()),a=a.sort(function(e,t){return e=Math.abs(Math.max(e.top-n,e.bottom-n)),t=Math.abs(Math.max(t.top-n,t.bottom-n)),e-t}),a.length>0){n=(a[0].bottom+a[0].top)/2;try{return o.moveToPoint(t,n),o.collapse(!0),o}catch(s){}}return null}function p(e,t){var n=e&&e.parentElement?e.parentElement():null;return g(s(n,t,o))?null:e}var h=e.each,m=n.isContentEditableTrue,g=n.isContentEditableFalse,v=i.isCaretContainer;return d.compareRanges=function(e,t){if(e&&t){if(!e.item&&!e.duplicate)return e.startContainer==t.startContainer&&e.startOffset==t.startOffset;if(e.item&&t.item&&e.item(0)===t.item(0))return!0;if(e.isEqual&&t.isEqual&&t.isEqual(e))return!0}return!1},d.getCaretRangeFromPoint=function(e,t,n){var r,i;if(n.caretPositionFromPoint)i=n.caretPositionFromPoint(e,t),r=n.createRange(),r.setStart(i.offsetNode,i.offset),r.collapse(!0);else if(n.caretRangeFromPoint)r=n.caretRangeFromPoint(e,t);else if(n.body.createTextRange){r=n.body.createTextRange();try{r.moveToPoint(e,t),r.collapse(!0)}catch(o){r=f(e,t,n)}return p(r,n.body)}return r},d.getSelectedNode=function(e){var t=e.startContainer,n=e.startOffset;return t.hasChildNodes()&&e.endOffset==n+1?t.childNodes[n]:null},d.getNode=function(e,t){return 1==e.nodeType&&e.hasChildNodes()&&(t>=e.childNodes.length&&(t=e.childNodes.length-1),e=e.childNodes[t]),e},d}),r(R,[T,d,c],function(e,t,n){return function(r){function i(e){var t,n;if(n=r.$(e).parentsUntil(r.getBody()).add(e),n.length===a.length){for(t=n.length;t>=0&&n[t]===a[t];t--);if(t===-1)return a=n,!0}return a=n,!1}var o,a=[];"onselectionchange"in r.getDoc()||r.on("NodeChange Click MouseUp KeyUp Focus",function(t){var n,i;n=r.selection.getRng(),i={startContainer:n.startContainer,startOffset:n.startOffset,endContainer:n.endContainer,endOffset:n.endOffset},"nodechange"!=t.type&&e.compareRanges(i,o)||r.fire("SelectionChange"),o=i}),r.on("contextmenu",function(){r.fire("SelectionChange")}),r.on("SelectionChange",function(){var e=r.selection.getStart(!0);!t.range&&r.selection.isCollapsed()||!i(e)&&r.dom.isChildOf(e,r.getBody())&&r.nodeChanged({selectionChange:!0})}),r.on("MouseUp",function(e){e.isDefaultPrevented()||("IMG"==r.selection.getNode().nodeName?n.setEditorTimeout(r,function(){r.nodeChanged()}):r.nodeChanged())}),this.nodeChanged=function(e){var t=r.selection,n,i,o;r.initialized&&t&&!r.settings.disable_nodechange&&!r.readonly&&(o=r.getBody(),n=t.getStart()||o,n.ownerDocument==r.getDoc()&&r.dom.isChildOf(n,o)||(n=o),"IMG"==n.nodeName&&t.isCollapsed()&&(n=n.parentNode),i=[],r.dom.getParent(n,function(e){return e===o||void i.push(e)}),e=e||{},e.element=n,e.parents=i,r.fire("NodeChange",e))}}}),r(A,[],function(){function e(e,t,n){var r,i,o=n?"lastChild":"firstChild",a=n?"prev":"next";if(e[o])return e[o];if(e!==t){if(r=e[a])return r;for(i=e.parent;i&&i!==t;i=i.parent)if(r=i[a])return r}}function t(e,t){this.name=e,this.type=t,1===t&&(this.attributes=[],this.attributes.map={})}var n=/^[ \t\r\n]*$/,r={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11};return t.prototype={replace:function(e){var t=this;return e.parent&&e.remove(),t.insert(e,t),t.remove(),t},attr:function(e,t){var n=this,r,i,o;if("string"!=typeof e){for(i in e)n.attr(i,e[i]);return n}if(r=n.attributes){if(t!==o){if(null===t){if(e in r.map)for(delete r.map[e],i=r.length;i--;)if(r[i].name===e)return r=r.splice(i,1),n;return n}if(e in r.map){for(i=r.length;i--;)if(r[i].name===e){r[i].value=t;break}}else r.push({name:e,value:t});return r.map[e]=t,n}return r.map[e]}},clone:function(){var e=this,n=new t(e.name,e.type),r,i,o,a,s;if(o=e.attributes){for(s=[],s.map={},r=0,i=o.length;r<i;r++)a=o[r],"id"!==a.name&&(s[s.length]={name:a.name,value:a.value},s.map[a.name]=a.value);n.attributes=s}return n.value=e.value,n.shortEnded=e.shortEnded,n},wrap:function(e){var t=this;return t.parent.insert(e,t),e.append(t),t},unwrap:function(){var e=this,t,n;for(t=e.firstChild;t;)n=t.next,e.insert(t,e,!0),t=n;e.remove()},remove:function(){var e=this,t=e.parent,n=e.next,r=e.prev;return t&&(t.firstChild===e?(t.firstChild=n,n&&(n.prev=null)):r.next=n,t.lastChild===e?(t.lastChild=r,r&&(r.next=null)):n.prev=r,e.parent=e.next=e.prev=null),e},append:function(e){var t=this,n;return e.parent&&e.remove(),n=t.lastChild,n?(n.next=e,e.prev=n,t.lastChild=e):t.lastChild=t.firstChild=e,e.parent=t,e},insert:function(e,t,n){var r;return e.parent&&e.remove(),r=t.parent||this,n?(t===r.firstChild?r.firstChild=e:t.prev.next=e,e.prev=t.prev,e.next=t,t.prev=e):(t===r.lastChild?r.lastChild=e:t.next.prev=e,e.next=t.next,e.prev=t,t.next=e),e.parent=r,e},getAll:function(t){var n=this,r,i=[];for(r=n.firstChild;r;r=e(r,n))r.name===t&&i.push(r);return i},empty:function(){var t=this,n,r,i;if(t.firstChild){for(n=[],i=t.firstChild;i;i=e(i,t))n.push(i);for(r=n.length;r--;)i=n[r],i.parent=i.firstChild=i.lastChild=i.next=i.prev=null}return t.firstChild=t.lastChild=null,t},isEmpty:function(t,r){var i=this,o=i.firstChild,a,s;if(r=r||{},o)do{if(1===o.type){if(o.attributes.map["data-mce-bogus"])continue;if(t[o.name])return!1;for(a=o.attributes.length;a--;)if(s=o.attributes[a].name,"name"===s||0===s.indexOf("data-mce-bookmark"))return!1}if(8===o.type)return!1;if(3===o.type&&!n.test(o.value))return!1;if(3===o.type&&o.parent&&r[o.parent.name]&&n.test(o.value))return!1}while(o=e(o,i));return!0},walk:function(t){return e(this,null,t)}},t.create=function(e,n){var i,o;if(i=new t(e,r[e]||1),n)for(o in n)i.attr(o,n[o]);return i},t}),r(B,[m],function(e){function t(t,n){return t=e.trim(t),t?t.split(n||" "):[]}function n(e){function n(e,n,r){function i(e,t){var n={},r,i;for(r=0,i=e.length;r<i;r++)n[e[r]]=t||{};return n}var s,u,c;for(r=r||[],n=n||"","string"==typeof r&&(r=t(r)),e=t(e),s=e.length;s--;)u=t([l,n].join(" ")),c={attributes:i(u),attributesOrder:u,children:i(r,o)},a[e[s]]=c}function r(e,n){var r,i,o,s;for(e=t(e),r=e.length,n=t(n);r--;)for(i=a[e[r]],o=0,s=n.length;o<s;o++)i.attributes[n[o]]={},i.attributesOrder.push(n[o])}var a={},l,u,c,d,f,p;return i[e]?i[e]:(l="id accesskey class dir lang style tabindex title",u="address blockquote div dl fieldset form h1 h2 h3 h4 h5 h6 hr menu ol p pre table ul",c="a abbr b bdo br button cite code del dfn em embed i iframe img input ins kbd label map noscript object q s samp script select small span strong sub sup textarea u var #text #comment","html4"!=e&&(l+=" contenteditable contextmenu draggable dropzone hidden spellcheck translate",u+=" article aside details dialog figure header footer hgroup section nav",c+=" audio canvas command datalist mark meter output picture progress time wbr video ruby bdi keygen"),"html5-strict"!=e&&(l+=" xml:lang",p="acronym applet basefont big font strike tt",c=[c,p].join(" "),s(t(p),function(e){n(e,"",c)}),f="center dir isindex noframes",u=[u,f].join(" "),d=[u,c].join(" "),s(t(f),function(e){n(e,"",d)})),d=d||[u,c].join(" "),n("html","manifest","head body"),n("head","","base command link meta noscript script style title"),n("title hr noscript br"),n("base","href target"),n("link","href rel media hreflang type sizes hreflang"),n("meta","name http-equiv content charset"),n("style","media type scoped"),n("script","src async defer type charset"),n("body","onafterprint onbeforeprint onbeforeunload onblur onerror onfocus onhashchange onload onmessage onoffline ononline onpagehide onpageshow onpopstate onresize onscroll onstorage onunload",d),n("address dt dd div caption","",d),n("h1 h2 h3 h4 h5 h6 pre p abbr code var samp kbd sub sup i b u bdo span legend em strong small s cite dfn","",c),n("blockquote","cite",d),n("ol","reversed start type","li"),n("ul","","li"),n("li","value",d),n("dl","","dt dd"),n("a","href target rel media hreflang type",c),n("q","cite",c),n("ins del","cite datetime",d),n("img","src sizes srcset alt usemap ismap width height"),n("iframe","src name width height",d),n("embed","src type width height"),n("object","data type typemustmatch name usemap form width height",[d,"param"].join(" ")),n("param","name value"),n("map","name",[d,"area"].join(" ")),n("area","alt coords shape href target rel media hreflang type"),n("table","border","caption colgroup thead tfoot tbody tr"+("html4"==e?" col":"")),n("colgroup","span","col"),n("col","span"),n("tbody thead tfoot","","tr"),n("tr","","td th"),n("td","colspan rowspan headers",d),n("th","colspan rowspan headers scope abbr",d),n("form","accept-charset action autocomplete enctype method name novalidate target",d),n("fieldset","disabled form name",[d,"legend"].join(" ")),n("label","form for",c),n("input","accept alt autocomplete checked dirname disabled form formaction formenctype formmethod formnovalidate formtarget height list max maxlength min multiple name pattern readonly required size src step type value width"),n("button","disabled form formaction formenctype formmethod formnovalidate formtarget name type value","html4"==e?d:c),n("select","disabled form multiple name required size","option optgroup"),n("optgroup","disabled label","option"),n("option","disabled label selected value"),n("textarea","cols dirname disabled form maxlength name readonly required rows wrap"),n("menu","type label",[d,"li"].join(" ")),n("noscript","",d),"html4"!=e&&(n("wbr"),n("ruby","",[c,"rt rp"].join(" ")),n("figcaption","",d),n("mark rt rp summary bdi","",c),n("canvas","width height",d),n("video","src crossorigin poster preload autoplay mediagroup loop muted controls width height buffered",[d,"track source"].join(" ")),n("audio","src crossorigin preload autoplay mediagroup loop muted controls buffered volume",[d,"track source"].join(" ")),n("picture","","img source"),n("source","src srcset type media sizes"),n("track","kind src srclang label default"),n("datalist","",[c,"option"].join(" ")),n("article section nav aside header footer","",d),n("hgroup","","h1 h2 h3 h4 h5 h6"),n("figure","",[d,"figcaption"].join(" ")),n("time","datetime",c),n("dialog","open",d),n("command","type label icon disabled checked radiogroup command"),n("output","for form name",c),n("progress","value max",c),n("meter","value min max low high optimum",c),n("details","open",[d,"summary"].join(" ")),n("keygen","autofocus challenge disabled form keytype name")),"html5-strict"!=e&&(r("script","language xml:space"),r("style","xml:space"),r("object","declare classid code codebase codetype archive standby align border hspace vspace"),r("embed","align name hspace vspace"),r("param","valuetype type"),r("a","charset name rev shape coords"),r("br","clear"),r("applet","codebase archive code object alt name width height align hspace vspace"),r("img","name longdesc align border hspace vspace"),r("iframe","longdesc frameborder marginwidth marginheight scrolling align"),r("font basefont","size color face"),r("input","usemap align"),r("select","onchange"),r("textarea"),r("h1 h2 h3 h4 h5 h6 div p legend caption","align"),r("ul","type compact"),r("li","type"),r("ol dl menu dir","compact"),r("pre","width xml:space"),r("hr","align noshade size width"),r("isindex","prompt"),r("table","summary width frame rules cellspacing cellpadding align bgcolor"),r("col","width align char charoff valign"),r("colgroup","width align char charoff valign"),r("thead","align char charoff valign"),r("tr","align char charoff valign bgcolor"),r("th","axis align char charoff valign nowrap bgcolor width height"),r("form","accept"),r("td","abbr axis scope align char charoff valign nowrap bgcolor width height"),r("tfoot","align char charoff valign"),r("tbody","align char charoff valign"),r("area","nohref"),r("body","background bgcolor text link vlink alink")),"html4"!=e&&(r("input button select textarea","autofocus"),r("input textarea","placeholder"),r("a","download"),
+r("link script img","crossorigin"),r("iframe","sandbox seamless allowfullscreen")),s(t("a form meter progress dfn"),function(e){a[e]&&delete a[e].children[e]}),delete a.caption.children.table,delete a.script,i[e]=a,a)}function r(e,t){var n;return e&&(n={},"string"==typeof e&&(e={"*":e}),s(e,function(e,r){n[r]=n[r.toUpperCase()]="map"==t?a(e,/[, ]/):u(e,/[, ]/)})),n}var i={},o={},a=e.makeMap,s=e.each,l=e.extend,u=e.explode,c=e.inArray;return function(e){function o(t,n,r){var o=e[t];return o?o=a(o,/[, ]/,a(o.toUpperCase(),/[, ]/)):(o=i[t],o||(o=a(n," ",a(n.toUpperCase()," ")),o=l(o,r),i[t]=o)),o}function d(e){return new RegExp("^"+e.replace(/([?+*])/g,".$1")+"$")}function f(e){var n,r,i,o,s,l,u,f,p,h,m,g,v,b,x,w,E,N,_,S=/^([#+\-])?([^\[!\/]+)(?:\/([^\[!]+))?(?:(!?)\[([^\]]+)\])?$/,k=/^([!\-])?(\w+::\w+|[^=:<]+)?(?:([=:<])(.*))?$/,T=/[*?+]/;if(e)for(e=t(e,","),y["@"]&&(w=y["@"].attributes,E=y["@"].attributesOrder),n=0,r=e.length;n<r;n++)if(s=S.exec(e[n])){if(b=s[1],p=s[2],x=s[3],f=s[5],g={},v=[],l={attributes:g,attributesOrder:v},"#"===b&&(l.paddEmpty=!0),"-"===b&&(l.removeEmpty=!0),"!"===s[4]&&(l.removeEmptyAttrs=!0),w){for(N in w)g[N]=w[N];v.push.apply(v,E)}if(f)for(f=t(f,"|"),i=0,o=f.length;i<o;i++)if(s=k.exec(f[i])){if(u={},m=s[1],h=s[2].replace(/::/g,":"),b=s[3],_=s[4],"!"===m&&(l.attributesRequired=l.attributesRequired||[],l.attributesRequired.push(h),u.required=!0),"-"===m){delete g[h],v.splice(c(v,h),1);continue}b&&("="===b&&(l.attributesDefault=l.attributesDefault||[],l.attributesDefault.push({name:h,value:_}),u.defaultValue=_),":"===b&&(l.attributesForced=l.attributesForced||[],l.attributesForced.push({name:h,value:_}),u.forcedValue=_),"<"===b&&(u.validValues=a(_,"?"))),T.test(h)?(l.attributePatterns=l.attributePatterns||[],u.pattern=d(h),l.attributePatterns.push(u)):(g[h]||v.push(h),g[h]=u)}w||"@"!=p||(w=g,E=v),x&&(l.outputName=p,y[x]=l),T.test(p)?(l.pattern=d(p),C.push(l)):y[p]=l}}function p(e){y={},C=[],f(e),s(E,function(e,t){b[t]=e.children})}function h(e){var n=/^(~)?(.+)$/;e&&(i.text_block_elements=i.block_elements=null,s(t(e,","),function(e){var t=n.exec(e),r="~"===t[1],i=r?"span":"div",o=t[2];if(b[o]=b[i],M[o]=i,r||(R[o.toUpperCase()]={},R[o]={}),!y[o]){var a=y[i];a=l({},a),delete a.removeEmptyAttrs,delete a.removeEmpty,y[o]=a}s(b,function(e,t){e[i]&&(b[t]=e=l({},b[t]),e[o]=e[i])})}))}function m(n){var r=/^([+\-]?)(\w+)\[([^\]]+)\]$/;i[e.schema]=null,n&&s(t(n,","),function(e){var n=r.exec(e),i,o;n&&(o=n[1],i=o?b[n[2]]:b[n[2]]={"#comment":{}},i=b[n[2]],s(t(n[3],"|"),function(e){"-"===o?delete i[e]:i[e]={}}))})}function g(e){var t=y[e],n;if(t)return t;for(n=C.length;n--;)if(t=C[n],t.pattern.test(e))return t}var v=this,y={},b={},C=[],x,w,E,N,_,S,k,T,R,A,B,D,L,M={},P={};e=e||{},E=n(e.schema),e.verify_html===!1&&(e.valid_elements="*[*]"),x=r(e.valid_styles),w=r(e.invalid_styles,"map"),T=r(e.valid_classes,"map"),N=o("whitespace_elements","pre script noscript style textarea video audio iframe object code"),_=o("self_closing_elements","colgroup dd dt li option p td tfoot th thead tr"),S=o("short_ended_elements","area base basefont br col frame hr img input isindex link meta param embed source wbr track"),k=o("boolean_attributes","checked compact declare defer disabled ismap multiple nohref noresize noshade nowrap readonly selected autoplay loop controls"),A=o("non_empty_elements","td th iframe video audio object script pre code",S),B=o("move_caret_before_on_enter_elements","table",A),D=o("text_block_elements","h1 h2 h3 h4 h5 h6 p div address pre form blockquote center dir fieldset header footer article section hgroup aside nav figure"),R=o("block_elements","hr table tbody thead tfoot th tr td li ol ul caption dl dt dd noscript menu isindex option datalist select optgroup figcaption",D),L=o("text_inline_elements","span strong b em i font strike u var cite dfn code mark q sup sub samp"),s((e.special||"script noscript style textarea").split(" "),function(e){P[e]=new RegExp("</"+e+"[^>]*>","gi")}),e.valid_elements?p(e.valid_elements):(s(E,function(e,t){y[t]={attributes:e.attributes,attributesOrder:e.attributesOrder},b[t]=e.children}),"html5"!=e.schema&&s(t("strong/b em/i"),function(e){e=t(e,"/"),y[e[1]].outputName=e[0]}),s(t("ol ul sub sup blockquote span font a table tbody tr strong em b i"),function(e){y[e]&&(y[e].removeEmpty=!0)}),s(t("p h1 h2 h3 h4 h5 h6 th td pre div address caption"),function(e){y[e].paddEmpty=!0}),s(t("span"),function(e){y[e].removeEmptyAttrs=!0})),h(e.custom_elements),m(e.valid_children),f(e.extended_valid_elements),m("+ol[ul|ol],+ul[ul|ol]"),s({dd:"dl",dt:"dl",li:"ul ol",td:"tr",th:"tr",tr:"tbody thead tfoot",tbody:"table",thead:"table",tfoot:"table",legend:"fieldset",area:"map",param:"video audio object"},function(e,n){y[n]&&(y[n].parentsRequired=t(e))}),e.invalid_elements&&s(u(e.invalid_elements),function(e){y[e]&&delete y[e]}),g("span")||f("span[!data-mce-type|*]"),v.children=b,v.getValidStyles=function(){return x},v.getInvalidStyles=function(){return w},v.getValidClasses=function(){return T},v.getBoolAttrs=function(){return k},v.getBlockElements=function(){return R},v.getTextBlockElements=function(){return D},v.getTextInlineElements=function(){return L},v.getShortEndedElements=function(){return S},v.getSelfClosingElements=function(){return _},v.getNonEmptyElements=function(){return A},v.getMoveCaretBeforeOnEnterElements=function(){return B},v.getWhiteSpaceElements=function(){return N},v.getSpecialElements=function(){return P},v.isValidChild=function(e,t){var n=b[e];return!(!n||!n[t])},v.isValid=function(e,t){var n,r,i=g(e);if(i){if(!t)return!0;if(i.attributes[t])return!0;if(n=i.attributePatterns)for(r=n.length;r--;)if(n[r].pattern.test(e))return!0}return!1},v.getElementRule=g,v.getCustomElements=function(){return M},v.addValidElements=f,v.setValidElements=p,v.addCustomElements=h,v.addValidChildren=m,v.elements=y}}),r(D,[B,C,m],function(e,t,n){function r(e,t,n){var r=1,i,o,a,s;for(s=e.getShortEndedElements(),a=/<([!?\/])?([A-Za-z0-9\-_\:\.]+)((?:\s+[^"\'>]+(?:(?:"[^"]*")|(?:\'[^\']*\')|[^>]*))*|\/|\s+)>/g,a.lastIndex=i=n;o=a.exec(t);){if(i=a.lastIndex,"/"===o[1])r--;else if(!o[1]){if(o[2]in s)continue;r++}if(0===r)break}return i}function i(i,a){function s(){}var l=this;i=i||{},l.schema=a=a||new e,i.fix_self_closing!==!1&&(i.fix_self_closing=!0),o("comment cdata text start end pi doctype".split(" "),function(e){e&&(l[e]=i[e]||s)}),l.parse=function(e){function o(e){var t,n;for(t=p.length;t--&&p[t].name!==e;);if(t>=0){for(n=p.length-1;n>=t;n--)e=p[n],e.valid&&l.end(e.name);p.length=t}}function s(e,t,n,r,o){var a,s,l=/[\s\u0000-\u001F]+/g;if(t=t.toLowerCase(),n=t in x?t:z(n||r||o||""),E&&!y&&0!==t.indexOf("data-")){if(a=T[t],!a&&R){for(s=R.length;s--&&(a=R[s],!a.pattern.test(t)););s===-1&&(a=null)}if(!a)return;if(a.validValues&&!(n in a.validValues))return}if(W[t]&&!i.allow_script_urls){var u=n.replace(l,"");try{u=decodeURIComponent(u)}catch(c){u=unescape(u)}if(V.test(u))return;if(!i.allow_html_data_urls&&$.test(u)&&!/^data:image\//i.test(u))return}h.map[t]=n,h.push({name:t,value:n})}var l=this,u,c=0,d,f,p=[],h,m,g,v,y,b,C,x,w,E,N,_,S,k,T,R,A,B,D,L,M,P,O,H,I,F=0,z=t.decode,U,W=n.makeMap("src,href,data,background,formaction,poster"),V=/((java|vb)script|mhtml):/i,$=/^data:/i;for(P=new RegExp("<(?:(?:!--([\\w\\W]*?)-->)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:!DOCTYPE([\\w\\W]*?)>)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([^>]+)>)|(?:([A-Za-z0-9\\-_\\:\\.]+)((?:\\s+[^\"'>]+(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>]*))*|\\/|\\s+)>))","g"),O=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g,C=a.getShortEndedElements(),M=i.self_closing_elements||a.getSelfClosingElements(),x=a.getBoolAttrs(),E=i.validate,b=i.remove_internals,U=i.fix_self_closing,H=a.getSpecialElements();u=P.exec(e);){if(c<u.index&&l.text(z(e.substr(c,u.index-c))),d=u[6])d=d.toLowerCase(),":"===d.charAt(0)&&(d=d.substr(1)),o(d);else if(d=u[7]){if(d=d.toLowerCase(),":"===d.charAt(0)&&(d=d.substr(1)),w=d in C,U&&M[d]&&p.length>0&&p[p.length-1].name===d&&o(d),!E||(N=a.getElementRule(d))){if(_=!0,E&&(T=N.attributes,R=N.attributePatterns),(k=u[8])?(y=k.indexOf("data-mce-type")!==-1,y&&b&&(_=!1),h=[],h.map={},k.replace(O,s)):(h=[],h.map={}),E&&!y){if(A=N.attributesRequired,B=N.attributesDefault,D=N.attributesForced,L=N.removeEmptyAttrs,L&&!h.length&&(_=!1),D)for(m=D.length;m--;)S=D[m],v=S.name,I=S.value,"{$uid}"===I&&(I="mce_"+F++),h.map[v]=I,h.push({name:v,value:I});if(B)for(m=B.length;m--;)S=B[m],v=S.name,v in h.map||(I=S.value,"{$uid}"===I&&(I="mce_"+F++),h.map[v]=I,h.push({name:v,value:I}));if(A){for(m=A.length;m--&&!(A[m]in h.map););m===-1&&(_=!1)}if(S=h.map["data-mce-bogus"]){if("all"===S){c=r(a,e,P.lastIndex),P.lastIndex=c;continue}_=!1}}_&&l.start(d,h,w)}else _=!1;if(f=H[d]){f.lastIndex=c=u.index+u[0].length,(u=f.exec(e))?(_&&(g=e.substr(c,u.index-c)),c=u.index+u[0].length):(g=e.substr(c),c=e.length),_&&(g.length>0&&l.text(g,!0),l.end(d)),P.lastIndex=c;continue}w||(k&&k.indexOf("/")==k.length-1?_&&l.end(d):p.push({name:d,valid:_}))}else(d=u[1])?(">"===d.charAt(0)&&(d=" "+d),i.allow_conditional_comments||"[if"!==d.substr(0,3).toLowerCase()||(d=" "+d),l.comment(d)):(d=u[2])?l.cdata(d):(d=u[3])?l.doctype(d):(d=u[4])&&l.pi(d,u[5]);c=u.index+u[0].length}for(c<e.length&&l.text(z(e.substr(c))),m=p.length-1;m>=0;m--)d=p[m],d.valid&&l.end(d.name)}}var o=n.each;return i.findEndTag=r,i}),r(L,[A,B,D,m],function(e,t,n,r){var i=r.makeMap,o=r.each,a=r.explode,s=r.extend,l=function(t,n){t.padd_empty_with_br?n.empty().append(new e("br","1")).shortEnded=!0:n.empty().append(new e("#text","3")).value="\xa0"},u=function(e,t){return e&&e.firstChild===e.lastChild&&e.firstChild.name===t};return function(c,d){function f(t){var n,r,o,a,s,l,c,f,h,m,g,v,y,b,C,x;for(v=i("tr,td,th,tbody,thead,tfoot,table"),m=d.getNonEmptyElements(),g=d.getWhiteSpaceElements(),y=d.getTextBlockElements(),b=d.getSpecialElements(),n=0;n<t.length;n++)if(r=t[n],r.parent&&!r.fixed)if(y[r.name]&&"li"==r.parent.name){for(C=r.next;C&&y[C.name];)C.name="li",C.fixed=!0,r.parent.insert(C,r.parent),C=C.next;r.unwrap(r)}else{for(a=[r],o=r.parent;o&&!d.isValidChild(o.name,r.name)&&!v[o.name];o=o.parent)a.push(o);if(o&&a.length>1){for(a.reverse(),s=l=p.filterNode(a[0].clone()),h=0;h<a.length-1;h++){for(d.isValidChild(l.name,a[h].name)?(c=p.filterNode(a[h].clone()),l.append(c)):c=l,f=a[h].firstChild;f&&f!=a[h+1];)x=f.next,c.append(f),f=x;l=c}s.isEmpty(m,g)?o.insert(r,a[0],!0):(o.insert(s,a[0],!0),o.insert(r,s)),o=a[0],(o.isEmpty(m,g)||u(o,"br"))&&o.empty().remove()}else if(r.parent){if("li"===r.name){if(C=r.prev,C&&("ul"===C.name||"ul"===C.name)){C.append(r);continue}if(C=r.next,C&&("ul"===C.name||"ul"===C.name)){C.insert(r,C.firstChild,!0);continue}r.wrap(p.filterNode(new e("ul",1)));continue}d.isValidChild(r.parent.name,"div")&&d.isValidChild("div",r.name)?r.wrap(p.filterNode(new e("div",1))):b[r.name]?r.empty().remove():r.unwrap()}}}var p=this,h={},m=[],g={},v={};c=c||{},c.validate=!("validate"in c)||c.validate,c.root_name=c.root_name||"body",p.schema=d=d||new t,p.filterNode=function(e){var t,n,r;n in h&&(r=g[n],r?r.push(e):g[n]=[e]),t=m.length;for(;t--;)n=m[t].name,n in e.attributes.map&&(r=v[n],r?r.push(e):v[n]=[e]);return e},p.addNodeFilter=function(e,t){o(a(e),function(e){var n=h[e];n||(h[e]=n=[]),n.push(t)})},p.addAttributeFilter=function(e,t){o(a(e),function(e){var n;for(n=0;n<m.length;n++)if(m[n].name===e)return void m[n].callbacks.push(t);m.push({name:e,callbacks:[t]})})},p.parse=function(t,r){function o(){function e(e){e&&(t=e.firstChild,t&&3==t.type&&(t.value=t.value.replace(A,"")),t=e.lastChild,t&&3==t.type&&(t.value=t.value.replace(L,"")))}var t=b.firstChild,n,r;if(d.isValidChild(b.name,F.toLowerCase())){for(;t;)n=t.next,3==t.type||1==t.type&&"p"!==t.name&&!R[t.name]&&!t.attr("data-mce-type")?r?r.append(t):(r=a(F,1),r.attr(c.forced_root_block_attrs),b.insert(r,t),r.append(t)):(e(r),r=null),t=n;e(r)}}function a(t,n){var r=new e(t,n),i;return t in h&&(i=g[t],i?i.push(r):g[t]=[r]),r}function u(e){var t,n,r,i,o=d.getBlockElements();for(t=e.prev;t&&3===t.type;){if(r=t.value.replace(L,""),r.length>0)return void(t.value=r);if(n=t.next){if(3==n.type&&n.value.length){t=t.prev;continue}if(!o[n.name]&&"script"!=n.name&&"style"!=n.name){t=t.prev;continue}}i=t.prev,t.remove(),t=i}}function p(e){var t,n={};for(t in e)"li"!==t&&"p"!=t&&(n[t]=e[t]);return n}var y,b,C,x,w,E,N,_,S,k,T,R,A,B=[],D,L,M,P,O,H,I,F;if(r=r||{},g={},v={},R=s(i("script,style,head,html,body,title,meta,param"),d.getBlockElements()),I=d.getNonEmptyElements(),H=d.children,T=c.validate,F="forced_root_block"in r?r.forced_root_block:c.forced_root_block,O=d.getWhiteSpaceElements(),A=/^[ \t\r\n]+/,L=/[ \t\r\n]+$/,M=/[ \t\r\n]+/g,P=/^[ \t\r\n]+$/,y=new n({validate:T,allow_script_urls:c.allow_script_urls,allow_conditional_comments:c.allow_conditional_comments,self_closing_elements:p(d.getSelfClosingElements()),cdata:function(e){C.append(a("#cdata",4)).value=e},text:function(e,t){var n;D||(e=e.replace(M," "),C.lastChild&&R[C.lastChild.name]&&(e=e.replace(A,""))),0!==e.length&&(n=a("#text",3),n.raw=!!t,C.append(n).value=e)},comment:function(e){C.append(a("#comment",8)).value=e},pi:function(e,t){C.append(a(e,7)).value=t,u(C)},doctype:function(e){var t;t=C.append(a("#doctype",10)),t.value=e,u(C)},start:function(e,t,n){var r,i,o,s,l;if(o=T?d.getElementRule(e):{}){for(r=a(o.outputName||e,1),r.attributes=t,r.shortEnded=n,C.append(r),l=H[C.name],l&&H[r.name]&&!l[r.name]&&B.push(r),i=m.length;i--;)s=m[i].name,s in t.map&&(S=v[s],S?S.push(r):v[s]=[r]);R[e]&&u(r),n||(C=r),!D&&O[e]&&(D=!0)}},end:function(e){var t,n,r,i,o;if(n=T?d.getElementRule(e):{}){if(R[e]&&!D){if(t=C.firstChild,t&&3===t.type)if(r=t.value.replace(A,""),r.length>0)t.value=r,t=t.next;else for(i=t.next,t.remove(),t=i;t&&3===t.type;)r=t.value,i=t.next,(0===r.length||P.test(r))&&(t.remove(),t=i),t=i;if(t=C.lastChild,t&&3===t.type)if(r=t.value.replace(L,""),r.length>0)t.value=r,t=t.prev;else for(i=t.prev,t.remove(),t=i;t&&3===t.type;)r=t.value,i=t.prev,(0===r.length||P.test(r))&&(t.remove(),t=i),t=i}if(D&&O[e]&&(D=!1),(n.removeEmpty||n.paddEmpty)&&C.isEmpty(I,O))if(n.paddEmpty)l(c,C);else if(!C.attributes.map.name&&!C.attributes.map.id)return o=C.parent,R[C.name]?C.empty().remove():C.unwrap(),void(C=o);C=C.parent}}},d),b=C=new e(r.context||c.root_name,11),y.parse(t),T&&B.length&&(r.context?r.invalid=!0:f(B)),F&&("body"==b.name||r.isRootContent)&&o(),!r.invalid){for(k in g){for(S=h[k],x=g[k],N=x.length;N--;)x[N].parent||x.splice(N,1);for(w=0,E=S.length;w<E;w++)S[w](x,k,r)}for(w=0,E=m.length;w<E;w++)if(S=m[w],S.name in v){for(x=v[S.name],N=x.length;N--;)x[N].parent||x.splice(N,1);for(N=0,_=S.callbacks.length;N<_;N++)S.callbacks[N](x,S.name,r)}}return b},c.remove_trailing_brs&&p.addNodeFilter("br",function(t){var n,r=t.length,i,o=s({},d.getBlockElements()),a=d.getNonEmptyElements(),u,f,p,h,m=d.getNonEmptyElements(),g,v;for(o.body=1,n=0;n<r;n++)if(i=t[n],u=i.parent,o[i.parent.name]&&i===u.lastChild){for(p=i.prev;p;){if(h=p.name,"span"!==h||"bookmark"!==p.attr("data-mce-type")){if("br"!==h)break;if("br"===h){i=null;break}}p=p.prev}i&&(i.remove(),u.isEmpty(a,m)&&(g=d.getElementRule(u.name),g&&(g.removeEmpty?u.remove():g.paddEmpty&&l(c,u))))}else{for(f=i;u&&u.firstChild===f&&u.lastChild===f&&(f=u,!o[u.name]);)u=u.parent;f===u&&c.padd_empty_with_br!==!0&&(v=new e("#text",3),v.value="\xa0",i.replace(v))}}),c.allow_unsafe_link_target||p.addAttributeFilter("href",function(e){function t(e){return e=n(e),e?[e,l].join(" "):l}function n(e){var t=new RegExp("("+l.replace(" ","|")+")","g");return e&&(e=r.trim(e.replace(t,""))),e?e:null}function i(e,r){return r?t(e):n(e)}for(var o=e.length,a,s,l="noopener noreferrer";o--;)a=e[o],s=a.attr("rel"),"a"===a.name&&a.attr("rel",i(s,"_blank"==a.attr("target")))}),c.allow_html_in_named_anchor||p.addAttributeFilter("id,name",function(e){for(var t=e.length,n,r,i,o;t--;)if(o=e[t],"a"===o.name&&o.firstChild&&!o.attr("href")){i=o.parent,n=o.lastChild;do r=n.prev,i.insert(n,o),n=r;while(n)}}),c.fix_list_elements&&p.addNodeFilter("ul,ol",function(t){for(var n=t.length,r,i;n--;)if(r=t[n],i=r.parent,"ul"===i.name||"ol"===i.name)if(r.prev&&"li"===r.prev.name)r.prev.append(r);else{var o=new e("li",1);o.attr("style","list-style-type: none"),r.wrap(o)}}),c.validate&&d.getValidClasses()&&p.addAttributeFilter("class",function(e){for(var t=e.length,n,r,i,o,a,s=d.getValidClasses(),l,u;t--;){for(n=e[t],r=n.attr("class").split(" "),a="",i=0;i<r.length;i++)o=r[i],u=!1,l=s["*"],l&&l[o]&&(u=!0),l=s[n.name],!u&&l&&l[o]&&(u=!0),u&&(a&&(a+=" "),a+=o);a.length||(a=null),n.attr("class",a)}})}}),r(M,[C,m],function(e,t){var n=t.makeMap;return function(t){var r=[],i,o,a,s,l;return t=t||{},i=t.indent,o=n(t.indent_before||""),a=n(t.indent_after||""),s=e.getEncodeFunc(t.entity_encoding||"raw",t.entities),l="html"==t.element_format,{start:function(e,t,n){var u,c,d,f;if(i&&o[e]&&r.length>0&&(f=r[r.length-1],f.length>0&&"\n"!==f&&r.push("\n")),r.push("<",e),t)for(u=0,c=t.length;u<c;u++)d=t[u],r.push(" ",d.name,'="',s(d.value,!0),'"');!n||l?r[r.length]=">":r[r.length]=" />",n&&i&&a[e]&&r.length>0&&(f=r[r.length-1],f.length>0&&"\n"!==f&&r.push("\n"))},end:function(e){var t;r.push("</",e,">"),i&&a[e]&&r.length>0&&(t=r[r.length-1],t.length>0&&"\n"!==t&&r.push("\n"))},text:function(e,t){e.length>0&&(r[r.length]=t?e:s(e))},cdata:function(e){r.push("<![CDATA[",e,"]]>")},comment:function(e){r.push("<!--",e,"-->")},pi:function(e,t){t?r.push("<?",e," ",s(t),"?>"):r.push("<?",e,"?>"),i&&r.push("\n")},doctype:function(e){r.push("<!DOCTYPE",e,">",i?"\n":"")},reset:function(){r.length=0},getContent:function(){return r.join("").replace(/\n$/,"")}}}}),r(P,[M,B],function(e,t){return function(n,r){var i=this,o=new e(n);n=n||{},n.validate=!("validate"in n)||n.validate,i.schema=r=r||new t,i.writer=o,i.serialize=function(e){function t(e){var n=i[e.type],s,l,u,c,d,f,p,h,m;if(n)n(e);else{if(s=e.name,l=e.shortEnded,u=e.attributes,a&&u&&u.length>1&&(f=[],f.map={},m=r.getElementRule(e.name))){for(p=0,h=m.attributesOrder.length;p<h;p++)c=m.attributesOrder[p],c in u.map&&(d=u.map[c],f.map[c]=d,f.push({name:c,value:d}));for(p=0,h=u.length;p<h;p++)c=u[p].name,c in f.map||(d=u.map[c],f.map[c]=d,f.push({name:c,value:d}));u=f}if(o.start(e.name,u,l),!l){if(e=e.firstChild)do t(e);while(e=e.next);o.end(s)}}}var i,a;return a=n.validate,i={3:function(e){o.text(e.value,e.raw)},8:function(e){o.comment(e.value)},7:function(e){o.pi(e.name,e.value)},10:function(e){o.doctype(e.value)},4:function(e){o.cdata(e.value)},11:function(e){if(e=e.firstChild)do t(e);while(e=e.next)}},o.reset(),1!=e.type||n.inner?i[11](e):t(e),o.getContent()}}}),r(O,[w,L,D,C,P,A,B,d,m,S],function(e,t,n,r,i,o,a,s,l,u){function c(e){function t(e){return e&&"br"===e.name}var n,r;n=e.lastChild,t(n)&&(r=n.prev,t(r)&&(n.remove(),r.remove()))}var d=l.each,f=l.trim,p=e.DOM;return function(e,o){function h(e){var t=new RegExp(["<span[^>]+data-mce-bogus[^>]+>[\u200b\ufeff]+<\\/span>","\\s?("+x.join("|")+')="[^"]+"'].join("|"),"gi");return e=u.trim(e.replace(t,""))}function m(e){var t=e,r=/<(\w+) [^>]*data-mce-bogus="all"[^>]*>/g,i,a,s,l,u,c=o.schema;for(t=h(t),u=c.getShortEndedElements();l=r.exec(t);)a=r.lastIndex,s=l[0].length,i=u[l[1]]?a:n.findEndTag(c,t,a),t=t.substring(0,a-s)+t.substring(i),r.lastIndex=a-s;return t}function g(){return m(o.getBody().innerHTML)}function v(e){l.inArray(x,e)===-1&&(C.addAttributeFilter(e,function(e,t){for(var n=e.length;n--;)e[n].attr(t,null)}),x.push(e))}var y,b,C,x=["data-mce-selected"];return o&&(y=o.dom,b=o.schema),y=y||p,b=b||new a(e),e.entity_encoding=e.entity_encoding||"named",e.remove_trailing_brs=!("remove_trailing_brs"in e)||e.remove_trailing_brs,C=new t(e,b),C.addAttributeFilter("data-mce-tabindex",function(e,t){for(var n=e.length,r;n--;)r=e[n],r.attr("tabindex",r.attributes.map["data-mce-tabindex"]),r.attr(t,null)}),C.addAttributeFilter("src,href,style",function(t,n){for(var r=t.length,i,o,a="data-mce-"+n,s=e.url_converter,l=e.url_converter_scope,u;r--;)i=t[r],o=i.attributes.map[a],o!==u?(i.attr(n,o.length>0?o:null),i.attr(a,null)):(o=i.attributes.map[n],"style"===n?o=y.serializeStyle(y.parseStyle(o),i.name):s&&(o=s.call(l,o,n,i.name)),i.attr(n,o.length>0?o:null))}),C.addAttributeFilter("class",function(e){for(var t=e.length,n,r;t--;)n=e[t],r=n.attr("class"),r&&(r=n.attr("class").replace(/(?:^|\s)mce-item-\w+(?!\S)/g,""),n.attr("class",r.length>0?r:null))}),C.addAttributeFilter("data-mce-type",function(e,t,n){for(var r=e.length,i;r--;)i=e[r],"bookmark"!==i.attributes.map["data-mce-type"]||n.cleanup||i.remove()}),C.addNodeFilter("noscript",function(e){for(var t=e.length,n;t--;)n=e[t].firstChild,n&&(n.value=r.decode(n.value))}),C.addNodeFilter("script,style",function(e,t){function n(e){return e.replace(/(<!--\[CDATA\[|\]\]-->)/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*((<!--)?(\s*\/\/)?\s*<!\[CDATA\[|(<!--\s*)?\/\*\s*<!\[CDATA\[\s*\*\/|(\/\/)?\s*<!--|\/\*\s*<!--\s*\*\/)\s*[\r\n]*/gi,"").replace(/\s*(\/\*\s*\]\]>\s*\*\/(-->)?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"")}for(var r=e.length,i,o,a;r--;)i=e[r],o=i.firstChild?i.firstChild.value:"","script"===t?(a=i.attr("type"),a&&i.attr("type","mce-no/type"==a?null:a.replace(/^mce\-/,"")),o.length>0&&(i.firstChild.value="// <![CDATA[\n"+n(o)+"\n// ]]>")):o.length>0&&(i.firstChild.value="<!--\n"+n(o)+"\n-->")}),C.addNodeFilter("#comment",function(e){for(var t=e.length,n;t--;)n=e[t],0===n.value.indexOf("[CDATA[")?(n.name="#cdata",n.type=4,n.value=n.value.replace(/^\[CDATA\[|\]\]$/g,"")):0===n.value.indexOf("mce:protected ")&&(n.name="#text",n.type=3,n.raw=!0,n.value=unescape(n.value).substr(14))}),C.addNodeFilter("xml:namespace,input",function(e,t){for(var n=e.length,r;n--;)r=e[n],7===r.type?r.remove():1===r.type&&("input"!==t||"type"in r.attributes.map||r.attr("type","text"))}),C.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style,data-mce-selected,data-mce-expando,data-mce-type,data-mce-resize",function(e,t){for(var n=e.length;n--;)e[n].attr(t,null)}),{schema:b,addNodeFilter:C.addNodeFilter,addAttributeFilter:C.addAttributeFilter,serialize:function(t,n){var r=this,o,a,l,p,h,m;return s.ie&&y.select("script,style,select,map").length>0?(h=t.innerHTML,t=t.cloneNode(!1),y.setHTML(t,h)):t=t.cloneNode(!0),o=document.implementation,o.createHTMLDocument&&(a=o.createHTMLDocument(""),d("BODY"==t.nodeName?t.childNodes:[t],function(e){a.body.appendChild(a.importNode(e,!0))}),t="BODY"!=t.nodeName?a.body.firstChild:a.body,l=y.doc,y.doc=a),n=n||{},n.format=n.format||"html",n.selection&&(n.forced_root_block=""),n.no_events||(n.node=t,r.onPreProcess(n)),m=C.parse(f(n.getInner?t.innerHTML:y.getOuterHTML(t)),n),c(m),p=new i(e,b),n.content=p.serialize(m),n.cleanup||(n.content=u.trim(n.content),n.content=n.content.replace(/\uFEFF/g,"")),n.no_events||r.onPostProcess(n),l&&(y.doc=l),n.node=null,n.content},addRules:function(e){b.addValidElements(e)},setRules:function(e){b.setValidElements(e)},onPreProcess:function(e){o&&o.fire("PreProcess",e)},onPostProcess:function(e){o&&o.fire("PostProcess",e)},addTempAttr:v,trimHtml:h,getTrimmedContent:g,trimContent:m}}}),r(H,[],function(){function e(e){function t(t,n){var r,i=0,o,a,s,l,u,c,d=-1,f;if(r=t.duplicate(),r.collapse(n),f=r.parentElement(),f.ownerDocument===e.dom.doc){for(;"false"===f.contentEditable;)f=f.parentNode;if(!f.hasChildNodes())return{node:f,inside:1};for(s=f.children,o=s.length-1;i<=o;)if(c=Math.floor((i+o)/2),l=s[c],r.moveToElementText(l),d=r.compareEndPoints(n?"StartToStart":"EndToEnd",t),d>0)o=c-1;else{if(!(d<0))return{node:l};i=c+1}if(d<0)for(l?r.collapse(!1):(r.moveToElementText(f),r.collapse(!0),l=f,a=!0),u=0;0!==r.compareEndPoints(n?"StartToStart":"StartToEnd",t)&&0!==r.move("character",1)&&f==r.parentElement();)u++;else for(r.collapse(!0),u=0;0!==r.compareEndPoints(n?"StartToStart":"StartToEnd",t)&&0!==r.move("character",-1)&&f==r.parentElement();)u++;return{node:l,position:d,offset:u,inside:a}}}function n(){function n(e){var n=t(o,e),r,i,s=0,l,u,c;if(r=n.node,i=n.offset,n.inside&&!r.hasChildNodes())return void a[e?"setStart":"setEnd"](r,0);if(i===u)return void a[e?"setStartBefore":"setEndAfter"](r);if(n.position<0){if(l=n.inside?r.firstChild:r.nextSibling,!l)return void a[e?"setStartAfter":"setEndAfter"](r);if(!i)return void(3==l.nodeType?a[e?"setStart":"setEnd"](l,0):a[e?"setStartBefore":"setEndBefore"](l));for(;l;){if(3==l.nodeType&&(c=l.nodeValue,s+=c.length,s>=i)){r=l,s-=i,s=c.length-s;break}l=l.nextSibling}}else{if(l=r.previousSibling,!l)return a[e?"setStartBefore":"setEndBefore"](r);if(!i)return void(3==r.nodeType?a[e?"setStart":"setEnd"](l,r.nodeValue.length):a[e?"setStartAfter":"setEndAfter"](l));for(;l;){if(3==l.nodeType&&(s+=l.nodeValue.length,s>=i)){r=l,s-=i;break}l=l.previousSibling}}a[e?"setStart":"setEnd"](r,s)}var o=e.getRng(),a=i.createRng(),s,l,u,c,d;if(s=o.item?o.item(0):o.parentElement(),s.ownerDocument!=i.doc)return a;if(l=e.isCollapsed(),o.item)return a.setStart(s.parentNode,i.nodeIndex(s)),a.setEnd(a.startContainer,a.startOffset+1),a;try{n(!0),l||n()}catch(f){if(f.number!=-2147024809)throw f;d=r.getBookmark(2),u=o.duplicate(),u.collapse(!0),s=u.parentElement(),l||(u=o.duplicate(),u.collapse(!1),c=u.parentElement(),c.innerHTML=c.innerHTML),s.innerHTML=s.innerHTML,r.moveToBookmark(d),o=e.getRng(),n(!0),l||n()}return a}var r=this,i=e.dom,o=!1;this.getBookmark=function(n){function r(e){var t,n,r,o,a=[];for(t=e.parentNode,n=i.getRoot().parentNode;t!=n&&9!==t.nodeType;){for(r=t.children,o=r.length;o--;)if(e===r[o]){a.push(o);break}e=t,t=t.parentNode}return a}function o(e){var n;if(n=t(a,e))return{position:n.position,offset:n.offset,indexes:r(n.node),inside:n.inside}}var a=e.getRng(),s={};return 2===n&&(a.item?s.start={ctrl:!0,indexes:r(a.item(0))}:(s.start=o(!0),e.isCollapsed()||(s.end=o()))),s},this.moveToBookmark=function(e){function t(e){var t,n,r,o;for(t=i.getRoot(),n=e.length-1;n>=0;n--)o=t.children,r=e[n],r<=o.length-1&&(t=o[r]);return t}function n(n){var i=e[n?"start":"end"],a,s,l,u;i&&(a=i.position>0,s=o.createTextRange(),s.moveToElementText(t(i.indexes)),u=i.offset,u!==l?(s.collapse(i.inside||a),s.moveStart("character",a?-u:u)):s.collapse(n),r.setEndPoint(n?"StartToStart":"EndToStart",s),n&&r.collapse(!0))}var r,o=i.doc.body;e.start&&(e.start.ctrl?(r=o.createControlRange(),r.addElement(t(e.start.indexes)),r.select()):(r=o.createTextRange(),n(!0),n(),r.select()))},this.addRange=function(t){function n(e){var t,n,a,d,h;a=i.create("a"),t=e?s:u,n=e?l:c,d=r.duplicate(),t!=f&&t!=f.documentElement||(t=p,n=0),3==t.nodeType?(t.parentNode.insertBefore(a,t),d.moveToElementText(a),d.moveStart("character",n),i.remove(a),r.setEndPoint(e?"StartToStart":"EndToEnd",d)):(h=t.childNodes,h.length?(n>=h.length?i.insertAfter(a,h[h.length-1]):t.insertBefore(a,h[n]),d.moveToElementText(a)):t.canHaveHTML&&(t.innerHTML="<span>&#xFEFF;</span>",a=t.firstChild,d.moveToElementText(a),d.collapse(o)),r.setEndPoint(e?"StartToStart":"EndToEnd",d),i.remove(a))}var r,a,s,l,u,c,d,f=e.dom.doc,p=f.body,h,m;if(s=t.startContainer,l=t.startOffset,u=t.endContainer,c=t.endOffset,r=p.createTextRange(),s==u&&1==s.nodeType){if(l==c&&!s.hasChildNodes()){if(s.canHaveHTML)return d=s.previousSibling,d&&!d.hasChildNodes()&&i.isBlock(d)?d.innerHTML="&#xFEFF;":d=null,s.innerHTML="<span>&#xFEFF;</span><span>&#xFEFF;</span>",r.moveToElementText(s.lastChild),r.select(),i.doc.selection.clear(),s.innerHTML="",void(d&&(d.innerHTML=""));l=i.nodeIndex(s),s=s.parentNode}if(l==c-1)try{if(m=s.childNodes[l],a=p.createControlRange(),a.addElement(m),a.select(),h=e.getRng(),h.item&&m===h.item(0))return}catch(g){}}n(!0),n(),r.select()},this.getRangeAt=n}return e}),r(I,[d],function(e){return{BACKSPACE:8,DELETE:46,DOWN:40,ENTER:13,LEFT:37,RIGHT:39,SPACEBAR:32,TAB:9,UP:38,modifierPressed:function(e){return e.shiftKey||e.ctrlKey||e.altKey||this.metaKeyPressed(e)},metaKeyPressed:function(t){return e.mac?t.metaKey:t.ctrlKey&&!t.altKey}}}),r(F,[I,m,c,d,_],function(e,t,n,r,i){function o(e,t){for(;t&&t!=e;){if(s(t)||a(t))return t;t=t.parentNode}return null}var a=i.isContentEditableFalse,s=i.isContentEditableTrue;return function(i,s){function l(e){var t=s.settings.object_resizing;return t!==!1&&!r.iOS&&("string"!=typeof t&&(t="table,img,div"),"false"!==e.getAttribute("data-mce-resize")&&(e!=s.getBody()&&s.dom.is(e,t)))}function u(t){var n,r,i,o,a;n=t.screenX-L,r=t.screenY-M,U=n*B[2]+H,W=r*B[3]+I,U=U<5?5:U,W=W<5?5:W,i="IMG"==k.nodeName&&s.settings.resize_img_proportional!==!1?!e.modifierPressed(t):e.modifierPressed(t)||"IMG"==k.nodeName&&B[2]*B[3]!==0,i&&(j(n)>j(r)?(W=Y(U*F),U=Y(W/F)):(U=Y(W/F),W=Y(U*F))),_.setStyles(T,{width:U,height:W}),o=B.startPos.x+n,a=B.startPos.y+r,o=o>0?o:0,a=a>0?a:0,_.setStyles(R,{left:o,top:a,display:"block"}),R.innerHTML=U+" &times; "+W,B[2]<0&&T.clientWidth<=U&&_.setStyle(T,"left",P+(H-U)),B[3]<0&&T.clientHeight<=W&&_.setStyle(T,"top",O+(I-W)),n=X.scrollWidth-K,r=X.scrollHeight-G,n+r!==0&&_.setStyles(R,{left:o-n,top:a-r}),z||(s.fire("ObjectResizeStart",{target:k,width:H,height:I}),z=!0)}function c(){function e(e,t){t&&(k.style[e]||!s.schema.isValid(k.nodeName.toLowerCase(),e)?_.setStyle(k,e,t):_.setAttrib(k,e,t))}z=!1,e("width",U),e("height",W),_.unbind(V,"mousemove",u),_.unbind(V,"mouseup",c),$!=V&&(_.unbind($,"mousemove",u),_.unbind($,"mouseup",c)),_.remove(T),_.remove(R),q&&"TABLE"!=k.nodeName||d(k),s.fire("ObjectResized",{target:k,width:U,height:W}),_.setAttrib(k,"style",_.getAttrib(k,"style")),s.nodeChanged()}function d(e,t,n){var i,o,a,d,p;f(),x(),i=_.getPos(e,X),P=i.x,O=i.y,p=e.getBoundingClientRect(),o=p.width||p.right-p.left,a=p.height||p.bottom-p.top,k!=e&&(C(),k=e,U=W=0),d=s.fire("ObjectSelected",{target:e}),l(e)&&!d.isDefaultPrevented()?S(A,function(e,i){function s(t){L=t.screenX,M=t.screenY,H=k.clientWidth,I=k.clientHeight,F=I/H,B=e,e.startPos={x:o*e[0]+P,y:a*e[1]+O},K=X.scrollWidth,G=X.scrollHeight,T=k.cloneNode(!0),_.addClass(T,"mce-clonedresizable"),_.setAttrib(T,"data-mce-bogus","all"),T.contentEditable=!1,T.unSelectabe=!0,_.setStyles(T,{left:P,top:O,margin:0}),T.removeAttribute("data-mce-selected"),X.appendChild(T),_.bind(V,"mousemove",u),_.bind(V,"mouseup",c),$!=V&&(_.bind($,"mousemove",u),_.bind($,"mouseup",c)),R=_.add(X,"div",{"class":"mce-resize-helper","data-mce-bogus":"all"},H+" &times; "+I)}var l;return t?void(i==t&&s(n)):(l=_.get("mceResizeHandle"+i),l&&_.remove(l),l=_.add(X,"div",{id:"mceResizeHandle"+i,"data-mce-bogus":"all","class":"mce-resizehandle",unselectable:!0,style:"cursor:"+i+"-resize; margin:0; padding:0"}),r.ie&&(l.contentEditable=!1),_.bind(l,"mousedown",function(e){e.stopImmediatePropagation(),e.preventDefault(),s(e)}),e.elm=l,void _.setStyles(l,{left:o*e[0]+P-l.offsetWidth/2,top:a*e[1]+O-l.offsetHeight/2}))}):f(),k.setAttribute("data-mce-selected","1")}function f(){var e,t;x(),k&&k.removeAttribute("data-mce-selected");for(e in A)t=_.get("mceResizeHandle"+e),t&&(_.unbind(t),_.remove(t))}function p(e){function t(e,t){if(e)do if(e===t)return!0;while(e=e.parentNode)}var n,r;if(!z&&!s.removed)return S(_.select("img[data-mce-selected],hr[data-mce-selected]"),function(e){e.removeAttribute("data-mce-selected")}),r="mousedown"==e.type?e.target:i.getNode(),r=_.$(r).closest(q?"table":"table,img,hr")[0],t(r,X)&&(w(),n=i.getStart(!0),t(n,r)&&t(i.getEnd(!0),r)&&(!q||r!=n&&"IMG"!==n.nodeName))?void d(r):void f()}function h(e,t,n){e&&e.attachEvent&&e.attachEvent("on"+t,n)}function m(e,t,n){e&&e.detachEvent&&e.detachEvent("on"+t,n)}function g(e){var t=e.srcElement,n,r,i,o,a,l,u;n=t.getBoundingClientRect(),l=D.clientX-n.left,u=D.clientY-n.top;for(r in A)if(i=A[r],o=t.offsetWidth*i[0],a=t.offsetHeight*i[1],j(o-l)<8&&j(a-u)<8){B=i;break}z=!0,s.fire("ObjectResizeStart",{target:k,width:k.clientWidth,height:k.clientHeight}),s.getDoc().selection.empty(),d(t,r,D)}function v(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function y(e){return a(o(s.getBody(),e))}function b(e){var t=e.srcElement;if(y(t))return void v(e);if(t!=k){if(s.fire("ObjectSelected",{target:t}),C(),0===t.id.indexOf("mceResizeHandle"))return void(e.returnValue=!1);
+"IMG"!=t.nodeName&&"TABLE"!=t.nodeName||(f(),k=t,h(t,"resizestart",g))}}function C(){m(k,"resizestart",g)}function x(){for(var e in A){var t=A[e];t.elm&&(_.unbind(t.elm),delete t.elm)}}function w(){try{s.getDoc().execCommand("enableObjectResizing",!1,!1)}catch(e){}}function E(e){var t;if(q){t=V.body.createControlRange();try{return t.addElement(e),t.select(),!0}catch(n){}}}function N(){k=T=null,q&&(C(),m(X,"controlselect",b))}var _=s.dom,S=t.each,k,T,R,A,B,D,L,M,P,O,H,I,F,z,U,W,V=s.getDoc(),$=document,q=r.ie&&r.ie<11,j=Math.abs,Y=Math.round,X=s.getBody(),K,G;A={nw:[0,0,-1,-1],ne:[1,0,1,-1],se:[1,1,1,1],sw:[0,1,-1,1]};var J=".mce-content-body";return s.contentStyles.push(J+" div.mce-resizehandle {position: absolute;border: 1px solid black;box-sizing: box-sizing;background: #FFF;width: 7px;height: 7px;z-index: 10000}"+J+" .mce-resizehandle:hover {background: #000}"+J+" img[data-mce-selected],"+J+" hr[data-mce-selected] {outline: 1px solid black;resize: none}"+J+" .mce-clonedresizable {position: absolute;"+(r.gecko?"":"outline: 1px dashed black;")+"opacity: .5;filter: alpha(opacity=50);z-index: 10000}"+J+" .mce-resize-helper {background: #555;background: rgba(0,0,0,0.75);border-radius: 3px;border: 1px;color: white;display: none;font-family: sans-serif;font-size: 12px;white-space: nowrap;line-height: 14px;margin: 5px 10px;padding: 5px;position: absolute;z-index: 10001}"),s.on("init",function(){q?(s.on("ObjectResized",function(e){"TABLE"!=e.target.nodeName&&(f(),E(e.target))}),h(X,"controlselect",b),s.on("mousedown",function(e){D=e})):(w(),r.ie>=11&&(s.on("mousedown click",function(e){var t=e.target,n=t.nodeName;z||!/^(TABLE|IMG|HR)$/.test(n)||y(t)||(s.selection.select(t,"TABLE"==n),"mousedown"==e.type&&s.nodeChanged())}),s.dom.bind(X,"mscontrolselect",function(e){function t(e){n.setEditorTimeout(s,function(){s.selection.select(e)})}return y(e.target)?(e.preventDefault(),void t(e.target)):void(/^(TABLE|IMG|HR)$/.test(e.target.nodeName)&&(e.preventDefault(),"IMG"==e.target.tagName&&t(e.target)))})));var e=n.throttle(function(e){s.composing||p(e)});s.on("nodechange ResizeEditor ResizeWindow drop",e),s.on("keyup compositionend",function(t){k&&"TABLE"==k.nodeName&&e(t)}),s.on("hide blur",f)}),s.on("remove",x),{isResizable:l,showResizeRect:d,hideResizeRect:f,updateResizeRect:p,controlSelect:E,destroy:N}}}),r(z,[],function(){function e(e){return function(){return e}}function t(e){return function(t){return!e(t)}}function n(e,t){return function(n){return e(t(n))}}function r(){var e=s.call(arguments);return function(t){for(var n=0;n<e.length;n++)if(e[n](t))return!0;return!1}}function i(){var e=s.call(arguments);return function(t){for(var n=0;n<e.length;n++)if(!e[n](t))return!1;return!0}}function o(e){var t=s.call(arguments);return t.length-1>=e.length?e.apply(this,t.slice(1)):function(){var e=t.concat([].slice.call(arguments));return o.apply(this,e)}}function a(){}var s=[].slice;return{constant:e,negate:t,and:i,or:r,curry:o,compose:n,noop:a}}),r(U,[_,h,k],function(e,t,n){function r(e){return!m(e)&&(d(e)?!f(e.parentNode):p(e)||c(e)||h(e)||u(e))}function i(e,t){for(e=e.parentNode;e&&e!=t;e=e.parentNode){if(u(e))return!1;if(l(e))return!0}return!0}function o(e){return!!u(e)&&t.reduce(e.getElementsByTagName("*"),function(e,t){return e||l(t)},!1)!==!0}function a(e){return p(e)||o(e)}function s(e,t){return r(e)&&i(e,t)}var l=e.isContentEditableTrue,u=e.isContentEditableFalse,c=e.isBr,d=e.isText,f=e.matchNodeNames("script style textarea"),p=e.matchNodeNames("img input textarea hr iframe video audio object"),h=e.matchNodeNames("table"),m=n.isCaretContainer;return{isCaretCandidate:r,isInEditable:i,isAtomic:a,isEditableCaretCandidate:s}}),r(W,[],function(){function e(e){return e?{left:c(e.left),top:c(e.top),bottom:c(e.bottom),right:c(e.right),width:c(e.width),height:c(e.height)}:{left:0,top:0,bottom:0,right:0,width:0,height:0}}function t(t,n){return t=e(t),n?t.right=t.left:(t.left=t.left+t.width,t.right=t.left),t.width=0,t}function n(e,t){return e.left===t.left&&e.top===t.top&&e.bottom===t.bottom&&e.right===t.right}function r(e,t,n){return e>=0&&e<=Math.min(t.height,n.height)/2}function i(e,t){return e.bottom<t.top||!(e.top>t.bottom)&&r(t.top-e.bottom,e,t)}function o(e,t){return e.top>t.bottom||!(e.bottom<t.top)&&r(t.bottom-e.top,e,t)}function a(e,t){return e.left<t.left}function s(e,t){return e.right>t.right}function l(e,t){return i(e,t)?-1:o(e,t)?1:a(e,t)?-1:s(e,t)?1:0}function u(e,t,n){return t>=e.left&&t<=e.right&&n>=e.top&&n<=e.bottom}var c=Math.round;return{clone:e,collapse:t,isEqual:n,isAbove:i,isBelow:o,isLeft:a,isRight:s,compare:l,containsXY:u}}),r(V,[],function(){function e(e){return"string"==typeof e&&e.charCodeAt(0)>=768&&t.test(e)}var t=new RegExp("[\u0300-\u036f\u0483-\u0487\u0488-\u0489\u0591-\u05bd\u05bf\u05c1-\u05c2\u05c4-\u05c5\u05c7\u0610-\u061a\u064b-\u065f\u0670\u06d6-\u06dc\u06df-\u06e4\u06e7-\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0859-\u085b\u08e3-\u0902\u093a\u093c\u0941-\u0948\u094d\u0951-\u0957\u0962-\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2-\u09e3\u0a01-\u0a02\u0a3c\u0a41-\u0a42\u0a47-\u0a48\u0a4b-\u0a4d\u0a51\u0a70-\u0a71\u0a75\u0a81-\u0a82\u0abc\u0ac1-\u0ac5\u0ac7-\u0ac8\u0acd\u0ae2-\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62-\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c00\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55-\u0c56\u0c62-\u0c63\u0c81\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc-\u0ccd\u0cd5-\u0cd6\u0ce2-\u0ce3\u0d01\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62-\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb-\u0ebc\u0ec8-\u0ecd\u0f18-\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039-\u103a\u103d-\u103e\u1058-\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085-\u1086\u108d\u109d\u135d-\u135f\u1712-\u1714\u1732-\u1734\u1752-\u1753\u1772-\u1773\u17b4-\u17b5\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927-\u1928\u1932\u1939-\u193b\u1a17-\u1a18\u1a1b\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1ab0-\u1abd\u1abe\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80-\u1b81\u1ba2-\u1ba5\u1ba8-\u1ba9\u1bab-\u1bad\u1be6\u1be8-\u1be9\u1bed\u1bef-\u1bf1\u1c2c-\u1c33\u1c36-\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1cf4\u1cf8-\u1cf9\u1dc0-\u1df5\u1dfc-\u1dff\u200c-\u200d\u20d0-\u20dc\u20dd-\u20e0\u20e1\u20e2-\u20e4\u20e5-\u20f0\u2cef-\u2cf1\u2d7f\u2de0-\u2dff\u302a-\u302d\u302e-\u302f\u3099-\u309a\ua66f\ua670-\ua672\ua674-\ua67d\ua69e-\ua69f\ua6f0-\ua6f1\ua802\ua806\ua80b\ua825-\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\ua9e5\uaa29-\uaa2e\uaa31-\uaa32\uaa35-\uaa36\uaa43\uaa4c\uaa7c\uaab0\uaab2-\uaab4\uaab7-\uaab8\uaabe-\uaabf\uaac1\uaaec-\uaaed\uaaf6\uabe5\uabe8\uabed\ufb1e\ufe00-\ufe0f\ufe20-\ufe2f\uff9e-\uff9f]");return{isExtendingChar:e}}),r($,[z,_,w,T,U,W,V],function(e,t,n,r,i,o,a){function s(e){return"createRange"in e?e.createRange():n.DOM.createRng()}function l(e){return e&&/[\r\n\t ]/.test(e)}function u(e){var t=e.startContainer,n=e.startOffset,r;return!!(l(e.toString())&&v(t.parentNode)&&(r=t.data,l(r[n-1])||l(r[n+1])))}function c(e){function t(e){var t=e.ownerDocument,n=s(t),r=t.createTextNode("\xa0"),i=e.parentNode,a;return i.insertBefore(r,e),n.setStart(r,0),n.setEnd(r,1),a=o.clone(n.getBoundingClientRect()),i.removeChild(r),a}function n(e){var n,r;return r=e.getClientRects(),n=r.length>0?o.clone(r[0]):o.clone(e.getBoundingClientRect()),b(e)&&0===n.left?t(e):n}function r(e,t){return e=o.collapse(e,t),e.width=1,e.right=e.left+1,e}function i(e){0!==e.height&&(c.length>0&&o.isEqual(e,c[c.length-1])||c.push(e))}function l(e,t){var o=s(e.ownerDocument);if(t<e.data.length){if(a.isExtendingChar(e.data[t]))return c;if(a.isExtendingChar(e.data[t-1])&&(o.setStart(e,t),o.setEnd(e,t+1),!u(o)))return i(r(n(o),!1)),c}t>0&&(o.setStart(e,t-1),o.setEnd(e,t),u(o)||i(r(n(o),!1))),t<e.data.length&&(o.setStart(e,t),o.setEnd(e,t+1),u(o)||i(r(n(o),!0)))}var c=[],d,p;if(y(e.container()))return l(e.container(),e.offset()),c;if(f(e.container()))if(e.isAtEnd())p=x(e.container(),e.offset()),y(p)&&l(p,p.data.length),g(p)&&!b(p)&&i(r(n(p),!1));else{if(p=x(e.container(),e.offset()),y(p)&&l(p,0),g(p)&&e.isAtEnd())return i(r(n(p),!1)),c;d=x(e.container(),e.offset()-1),g(d)&&!b(d)&&(h(d)||h(p)||!g(p))&&i(r(n(d),!1)),g(p)&&i(r(n(p),!0))}return c}function d(t,n,r){function i(){return y(t)?0===n:0===n}function o(){return y(t)?n>=t.data.length:n>=t.childNodes.length}function a(){var e;return e=s(t.ownerDocument),e.setStart(t,n),e.setEnd(t,n),e}function l(){return r||(r=c(new d(t,n))),r}function u(){return l().length>0}function f(e){return e&&t===e.container()&&n===e.offset()}function p(e){return x(t,e?n-1:n)}return{container:e.constant(t),offset:e.constant(n),toRange:a,getClientRects:l,isVisible:u,isAtStart:i,isAtEnd:o,isEqual:f,getNode:p}}var f=t.isElement,p=i.isCaretCandidate,h=t.matchStyleValues("display","block table"),m=t.matchStyleValues("float","left right"),g=e.and(f,p,e.negate(m)),v=e.negate(t.matchStyleValues("white-space","pre pre-line pre-wrap")),y=t.isText,b=t.isBr,C=n.nodeIndex,x=r.getNode;return d.fromRangeStart=function(e){return new d(e.startContainer,e.startOffset)},d.fromRangeEnd=function(e){return new d(e.endContainer,e.endOffset)},d.after=function(e){return new d(e.parentNode,C(e)+1)},d.before=function(e){return new d(e.parentNode,C(e))},d}),r(q,[_,w,z,h,$],function(e,t,n,r,i){function o(e){var t=e.parentNode;return v(t)?o(t):t}function a(e){return e?r.reduce(e.childNodes,function(e,t){return v(t)&&"BR"!=t.nodeName?e=e.concat(a(t)):e.push(t),e},[]):[]}function s(e,t){for(;(e=e.previousSibling)&&g(e);)t+=e.data.length;return t}function l(e){return function(t){return e===t}}function u(t){var n,i,s;return n=a(o(t)),i=r.findIndex(n,l(t),t),n=n.slice(0,i+1),s=r.reduce(n,function(e,t,r){return g(t)&&g(n[r-1])&&e++,e},0),n=r.filter(n,e.matchNodeNames(t.nodeName)),i=r.findIndex(n,l(t),t),i-s}function c(e){var t;return t=g(e)?"text()":e.nodeName.toLowerCase(),t+"["+u(e)+"]"}function d(e,t,n){var r=[];for(t=t.parentNode;t!=e&&(!n||!n(t));t=t.parentNode)r.push(t);return r}function f(t,i){var o,a,l=[],u,f,p;return o=i.container(),a=i.offset(),g(o)?u=s(o,a):(f=o.childNodes,a>=f.length?(u="after",a=f.length-1):u="before",o=f[a]),l.push(c(o)),p=d(t,o),p=r.filter(p,n.negate(e.isBogus)),l=l.concat(r.map(p,function(e){return c(e)})),l.reverse().join("/")+","+u}function p(t,n,i){var o=a(t);return o=r.filter(o,function(e,t){return!g(e)||!g(o[t-1])}),o=r.filter(o,e.matchNodeNames(n)),o[i]}function h(e,t){for(var n=e,r=0,o;g(n);){if(o=n.data.length,t>=r&&t<=r+o){e=n,t-=r;break}if(!g(n.nextSibling)){e=n,t=o;break}r+=o,n=n.nextSibling}return t>e.data.length&&(t=e.data.length),new i(e,t)}function m(e,t){var n,o,a;return t?(n=t.split(","),t=n[0].split("/"),a=n.length>1?n[1]:"before",o=r.reduce(t,function(e,t){return(t=/([\w\-\(\)]+)\[([0-9]+)\]/.exec(t))?("text()"===t[1]&&(t[1]="#text"),p(e,t[1],parseInt(t[2],10))):null},e),o?g(o)?h(o,parseInt(a,10)):(a="after"===a?y(o)+1:y(o),new i(o.parentNode,a)):null):null}var g=e.isText,v=e.isBogus,y=t.nodeIndex;return{create:f,resolve:m}}),r(j,[d,m,k,q,$,_,T],function(e,t,n,r,i,o,a){function s(s){var u=s.dom;this.getBookmark=function(e,c){function d(e,n){var r=0;return t.each(u.select(e),function(e){if("all"!==e.getAttribute("data-mce-bogus"))return e!=n&&void r++}),r}function f(e){function t(t){var n,r,i,o=t?"start":"end";n=e[o+"Container"],r=e[o+"Offset"],1==n.nodeType&&"TR"==n.nodeName&&(i=n.childNodes,n=i[Math.min(t?r:r-1,i.length-1)],n&&(r=t?0:n.childNodes.length,e["set"+(t?"Start":"End")](n,r)))}return t(!0),t(),e}function p(e){function t(e,t){var r=e[t?"startContainer":"endContainer"],i=e[t?"startOffset":"endOffset"],o=[],a,s,l=0;if(3==r.nodeType){if(c)for(a=r.previousSibling;a&&3==a.nodeType;a=a.previousSibling)i+=a.nodeValue.length;o.push(i)}else s=r.childNodes,i>=s.length&&s.length&&(l=1,i=Math.max(0,s.length-1)),o.push(u.nodeIndex(s[i],c)+l);for(;r&&r!=n;r=r.parentNode)o.push(u.nodeIndex(r,c));return o}var n=u.getRoot(),r={};return r.start=t(e,!0),s.isCollapsed()||(r.end=t(e)),r}function h(e){function t(e,t){var r;if(o.isElement(e)&&(e=a.getNode(e,t),l(e)))return e;if(n.isCaretContainer(e)){if(o.isText(e)&&n.isCaretContainerBlock(e)&&(e=e.parentNode),r=e.previousSibling,l(r))return r;if(r=e.nextSibling,l(r))return r}}return t(e.startContainer,e.startOffset)||t(e.endContainer,e.endOffset)}var m,g,v,y,b,C,x="&#xFEFF;",w;if(2==e)return C=s.getNode(),b=C?C.nodeName:null,m=s.getRng(),l(C)||"IMG"==b?{name:b,index:d(b,C)}:s.tridentSel?s.tridentSel.getBookmark(e):(C=h(m),C?(b=C.tagName,{name:b,index:d(b,C)}):p(m));if(3==e)return m=s.getRng(),{start:r.create(u.getRoot(),i.fromRangeStart(m)),end:r.create(u.getRoot(),i.fromRangeEnd(m))};if(e)return{rng:s.getRng()};if(m=s.getRng(),v=u.uniqueId(),y=s.isCollapsed(),w="overflow:hidden;line-height:0px",m.duplicate||m.item){if(m.item)return C=m.item(0),b=C.nodeName,{name:b,index:d(b,C)};g=m.duplicate();try{m.collapse(),m.pasteHTML('<span data-mce-type="bookmark" id="'+v+'_start" style="'+w+'">'+x+"</span>"),y||(g.collapse(!1),m.moveToElementText(g.parentElement()),0===m.compareEndPoints("StartToEnd",g)&&g.move("character",-1),g.pasteHTML('<span data-mce-type="bookmark" id="'+v+'_end" style="'+w+'">'+x+"</span>"))}catch(E){return null}}else{if(C=s.getNode(),b=C.nodeName,"IMG"==b)return{name:b,index:d(b,C)};g=f(m.cloneRange()),y||(g.collapse(!1),g.insertNode(u.create("span",{"data-mce-type":"bookmark",id:v+"_end",style:w},x))),m=f(m),m.collapse(!0),m.insertNode(u.create("span",{"data-mce-type":"bookmark",id:v+"_start",style:w},x))}return s.moveToBookmark({id:v,keep:1}),{id:v}},this.moveToBookmark=function(n){function i(e){var t=n[e?"start":"end"],r,i,o,a;if(t){for(o=t[0],i=d,r=t.length-1;r>=1;r--){if(a=i.childNodes,t[r]>a.length-1)return;i=a[t[r]]}3===i.nodeType&&(o=Math.min(t[0],i.nodeValue.length)),1===i.nodeType&&(o=Math.min(t[0],i.childNodes.length)),e?c.setStart(i,o):c.setEnd(i,o)}return!0}function o(r){var i=u.get(n.id+"_"+r),o,a,s,l,c=n.keep;if(i&&(o=i.parentNode,"start"==r?(c?(o=i.firstChild,a=1):a=u.nodeIndex(i),f=p=o,h=m=a):(c?(o=i.firstChild,a=1):a=u.nodeIndex(i),p=o,m=a),!c)){for(l=i.previousSibling,s=i.nextSibling,t.each(t.grep(i.childNodes),function(e){3==e.nodeType&&(e.nodeValue=e.nodeValue.replace(/\uFEFF/g,""))});i=u.get(n.id+"_"+r);)u.remove(i,1);l&&s&&l.nodeType==s.nodeType&&3==l.nodeType&&!e.opera&&(a=l.nodeValue.length,l.appendData(s.nodeValue),u.remove(s),"start"==r?(f=p=l,h=m=a):(p=l,m=a))}}function a(t){return!u.isBlock(t)||t.innerHTML||e.ie||(t.innerHTML='<br data-mce-bogus="1" />'),t}function l(){var e,t;return e=u.createRng(),t=r.resolve(u.getRoot(),n.start),e.setStart(t.container(),t.offset()),t=r.resolve(u.getRoot(),n.end),e.setEnd(t.container(),t.offset()),e}var c,d,f,p,h,m;if(n)if(t.isArray(n.start)){if(c=u.createRng(),d=u.getRoot(),s.tridentSel)return s.tridentSel.moveToBookmark(n);i(!0)&&i()&&s.setRng(c)}else"string"==typeof n.start?s.setRng(l(n)):n.id?(o("start"),o("end"),f&&(c=u.createRng(),c.setStart(a(f),h),c.setEnd(a(p),m),s.setRng(c))):n.name?s.select(u.select(n.name)[n.index]):n.rng&&s.setRng(n.rng)}}var l=o.isContentEditableFalse;return s.isBookmarkNode=function(e){return e&&"SPAN"===e.tagName&&"bookmark"===e.getAttribute("data-mce-type")},s}),r(Y,[y,H,F,T,j,_,d,m,$],function(e,n,r,i,o,a,s,l,u){function c(e,t,i,a){var s=this;s.dom=e,s.win=t,s.serializer=i,s.editor=a,s.bookmarkManager=new o(s),s.controlSelection=new r(s,a),s.win.getSelection||(s.tridentSel=new n(s))}var d=l.each,f=l.trim,p=s.ie;return c.prototype={setCursorLocation:function(e,t){var n=this,r=n.dom.createRng();e?(r.setStart(e,t),r.setEnd(e,t),n.setRng(r),n.collapse(!1)):(n._moveEndPoint(r,n.editor.getBody(),!0),n.setRng(r))},getContent:function(e){var n=this,r=n.getRng(),i=n.dom.create("body"),o=n.getSel(),a,s,l;return e=e||{},a=s="",e.get=!0,e.format=e.format||"html",e.selection=!0,n.editor.fire("BeforeGetContent",e),"text"==e.format?n.isCollapsed()?"":r.text||(o.toString?o.toString():""):(r.cloneContents?(l=r.cloneContents(),l&&i.appendChild(l)):r.item!==t||r.htmlText!==t?(i.innerHTML="<br>"+(r.item?r.item(0).outerHTML:r.htmlText),i.removeChild(i.firstChild)):i.innerHTML=r.toString(),/^\s/.test(i.innerHTML)&&(a=" "),/\s+$/.test(i.innerHTML)&&(s=" "),e.getInner=!0,e.content=n.isCollapsed()?"":a+n.serializer.serialize(i,e)+s,n.editor.fire("GetContent",e),e.content)},setContent:function(e,t){var n=this,r=n.getRng(),i,o=n.win.document,a,s;if(t=t||{format:"html"},t.set=!0,t.selection=!0,t.content=e,t.no_events||n.editor.fire("BeforeSetContent",t),e=t.content,r.insertNode){e+='<span id="__caret">_</span>',r.startContainer==o&&r.endContainer==o?o.body.innerHTML=e:(r.deleteContents(),0===o.body.childNodes.length?o.body.innerHTML=e:r.createContextualFragment?r.insertNode(r.createContextualFragment(e)):(a=o.createDocumentFragment(),s=o.createElement("div"),a.appendChild(s),s.outerHTML=e,r.insertNode(a))),i=n.dom.get("__caret"),r=o.createRange(),r.setStartBefore(i),r.setEndBefore(i),n.setRng(r),n.dom.remove("__caret");try{n.setRng(r)}catch(l){}}else r.item&&(o.execCommand("Delete",!1,null),r=n.getRng()),/^\s+/.test(e)?(r.pasteHTML('<span id="__mce_tmp">_</span>'+e),n.dom.remove("__mce_tmp")):r.pasteHTML(e);t.no_events||n.editor.fire("SetContent",t)},getStart:function(e){var t=this,n=t.getRng(),r,i,o,a;if(n.duplicate||n.item){if(n.item)return n.item(0);for(o=n.duplicate(),o.collapse(1),r=o.parentElement(),r.ownerDocument!==t.dom.doc&&(r=t.dom.getRoot()),i=a=n.parentElement();a=a.parentNode;)if(a==r){r=i;break}return r}return r=n.startContainer,1==r.nodeType&&r.hasChildNodes()&&(e&&n.collapsed||(r=r.childNodes[Math.min(r.childNodes.length-1,n.startOffset)])),r&&3==r.nodeType?r.parentNode:r},getEnd:function(e){var t=this,n=t.getRng(),r,i;return n.duplicate||n.item?n.item?n.item(0):(n=n.duplicate(),n.collapse(0),r=n.parentElement(),r.ownerDocument!==t.dom.doc&&(r=t.dom.getRoot()),r&&"BODY"==r.nodeName?r.lastChild||r:r):(r=n.endContainer,i=n.endOffset,1==r.nodeType&&r.hasChildNodes()&&(e&&n.collapsed||(r=r.childNodes[i>0?i-1:i])),r&&3==r.nodeType?r.parentNode:r)},getBookmark:function(e,t){return this.bookmarkManager.getBookmark(e,t)},moveToBookmark:function(e){return this.bookmarkManager.moveToBookmark(e)},select:function(e,t){var n=this,r=n.dom,i=r.createRng(),o;if(n.lastFocusBookmark=null,e){if(!t&&n.controlSelection.controlSelect(e))return;o=r.nodeIndex(e),i.setStart(e.parentNode,o),i.setEnd(e.parentNode,o+1),t&&(n._moveEndPoint(i,e,!0),n._moveEndPoint(i,e)),n.setRng(i)}return e},isCollapsed:function(){var e=this,t=e.getRng(),n=e.getSel();return!(!t||t.item)&&(t.compareEndPoints?0===t.compareEndPoints("StartToEnd",t):!n||t.collapsed)},collapse:function(e){var t=this,n=t.getRng(),r;n.item&&(r=n.item(0),n=t.win.document.body.createTextRange(),n.moveToElementText(r)),n.collapse(!!e),t.setRng(n)},getSel:function(){var e=this.win;return e.getSelection?e.getSelection():e.document.selection},getRng:function(e){function t(e,t,n){try{return t.compareBoundaryPoints(e,n)}catch(r){return-1}}var n=this,r,i,o,a,s,l;if(!n.win)return null;if(a=n.win.document,"undefined"==typeof a||null===a)return null;if(!e&&n.lastFocusBookmark){var u=n.lastFocusBookmark;return u.startContainer?(i=a.createRange(),i.setStart(u.startContainer,u.startOffset),i.setEnd(u.endContainer,u.endOffset)):i=u,i}if(e&&n.tridentSel)return n.tridentSel.getRangeAt(0);try{(r=n.getSel())&&(i=r.rangeCount>0?r.getRangeAt(0):r.createRange?r.createRange():a.createRange())}catch(c){}if(l=n.editor.fire("GetSelectionRange",{range:i}),l.range!==i)return l.range;if(p&&i&&i.setStart&&a.selection){try{s=a.selection.createRange()}catch(c){}s&&s.item&&(o=s.item(0),i=a.createRange(),i.setStartBefore(o),i.setEndAfter(o))}return i||(i=a.createRange?a.createRange():a.body.createTextRange()),i.setStart&&9===i.startContainer.nodeType&&i.collapsed&&(o=n.dom.getRoot(),i.setStart(o,0),i.setEnd(o,0)),n.selectedRange&&n.explicitRange&&(0===t(i.START_TO_START,i,n.selectedRange)&&0===t(i.END_TO_END,i,n.selectedRange)?i=n.explicitRange:(n.selectedRange=null,n.explicitRange=null)),i},setRng:function(e,t){var n=this,r,i,o;if(e)if(e.select){n.explicitRange=null;try{e.select()}catch(a){}}else if(n.tridentSel){if(e.cloneRange)try{n.tridentSel.addRange(e)}catch(a){}}else{if(r=n.getSel(),o=n.editor.fire("SetSelectionRange",{range:e}),e=o.range,r){n.explicitRange=e;try{r.removeAllRanges(),r.addRange(e)}catch(a){}t===!1&&r.extend&&(r.collapse(e.endContainer,e.endOffset),r.extend(e.startContainer,e.startOffset)),n.selectedRange=r.rangeCount>0?r.getRangeAt(0):null}e.collapsed||e.startContainer!=e.endContainer||!r.setBaseAndExtent||s.ie||e.endOffset-e.startOffset<2&&e.startContainer.hasChildNodes()&&(i=e.startContainer.childNodes[e.startOffset],i&&"IMG"==i.tagName&&n.getSel().setBaseAndExtent(i,0,i,1)),n.editor.fire("AfterSetSelectionRange",{range:e})}},setNode:function(e){var t=this;return t.setContent(t.dom.getOuterHTML(e)),e},getNode:function(){function e(e,t){for(var n=e;e&&3===e.nodeType&&0===e.length;)e=t?e.nextSibling:e.previousSibling;return e||n}var t=this,n=t.getRng(),r,i,o,a,s,l=t.dom.getRoot();return n?(i=n.startContainer,o=n.endContainer,a=n.startOffset,s=n.endOffset,n.setStart?(r=n.commonAncestorContainer,!n.collapsed&&(i==o&&s-a<2&&i.hasChildNodes()&&(r=i.childNodes[a]),3===i.nodeType&&3===o.nodeType&&(i=i.length===a?e(i.nextSibling,!0):i.parentNode,o=0===s?e(o.previousSibling,!1):o.parentNode,i&&i===o))?i:r&&3==r.nodeType?r.parentNode:r):(r=n.item?n.item(0):n.parentElement(),r.ownerDocument!==t.win.document&&(r=l),r)):l},getSelectedBlocks:function(t,n){var r=this,i=r.dom,o,a,s=[];if(a=i.getRoot(),t=i.getParent(t||r.getStart(),i.isBlock),n=i.getParent(n||r.getEnd(),i.isBlock),t&&t!=a&&s.push(t),t&&n&&t!=n){o=t;for(var l=new e(t,a);(o=l.next())&&o!=n;)i.isBlock(o)&&s.push(o)}return n&&t!=n&&n!=a&&s.push(n),s},isForward:function(){var e=this.dom,t=this.getSel(),n,r;return!(t&&t.anchorNode&&t.focusNode)||(n=e.createRng(),n.setStart(t.anchorNode,t.anchorOffset),n.collapse(!0),r=e.createRng(),r.setStart(t.focusNode,t.focusOffset),r.collapse(!0),n.compareBoundaryPoints(n.START_TO_START,r)<=0)},normalize:function(){var e=this,t=e.getRng();return s.range&&new i(e.dom).normalize(t)&&e.setRng(t,e.isForward()),t},selectorChanged:function(e,t){var n=this,r;return n.selectorChangedData||(n.selectorChangedData={},r={},n.editor.on("NodeChange",function(e){var t=e.element,i=n.dom,o=i.getParents(t,null,i.getRoot()),a={};d(n.selectorChangedData,function(e,t){d(o,function(n){if(i.is(n,t))return r[t]||(d(e,function(e){e(!0,{node:n,selector:t,parents:o})}),r[t]=e),a[t]=e,!1})}),d(r,function(e,n){a[n]||(delete r[n],d(e,function(e){e(!1,{node:t,selector:n,parents:o})}))})})),n.selectorChangedData[e]||(n.selectorChangedData[e]=[]),n.selectorChangedData[e].push(t),n},getScrollContainer:function(){for(var e,t=this.dom.getRoot();t&&"BODY"!=t.nodeName;){if(t.scrollHeight>t.clientHeight){e=t;break}t=t.parentNode}return e},scrollIntoView:function(e,t){function n(e){for(var t=0,n=0,r=e;r&&r.nodeType;)t+=r.offsetLeft||0,n+=r.offsetTop||0,r=r.offsetParent;return{x:t,y:n}}var r,i,o=this,s=o.dom,l=s.getRoot(),u,c,d=0;if(a.isElement(e)){if(t===!1&&(d=e.offsetHeight),"BODY"!=l.nodeName){var f=o.getScrollContainer();if(f)return r=n(e).y-n(f).y+d,c=f.clientHeight,u=f.scrollTop,void((r<u||r+25>u+c)&&(f.scrollTop=r<u?r:r-c+25))}i=s.getViewPort(o.editor.getWin()),r=s.getPos(e).y+d,u=i.y,c=i.h,(r<i.y||r+25>u+c)&&o.editor.getWin().scrollTo(0,r<u?r:r-c+25)}},placeCaretAt:function(e,t){this.setRng(i.getCaretRangeFromPoint(e,t,this.editor.getDoc()))},_moveEndPoint:function(t,n,r){var i=n,o=new e(n,i),a=this.dom.schema.getNonEmptyElements();do{if(3==n.nodeType&&0!==f(n.nodeValue).length)return void(r?t.setStart(n,0):t.setEnd(n,n.nodeValue.length));if(a[n.nodeName]&&!/^(TD|TH)$/.test(n.nodeName))return void(r?t.setStartBefore(n):"BR"==n.nodeName?t.setEndBefore(n):t.setEndAfter(n));if(s.ie&&s.ie<11&&this.dom.isBlock(n)&&this.dom.isEmpty(n))return void(r?t.setStart(n,0):t.setEnd(n,0))}while(n=r?o.next():o.prev());"BODY"==i.nodeName&&(r?t.setStart(i,0):t.setEnd(i,i.childNodes.length))},getBoundingClientRect:function(){var e=this.getRng();return e.collapsed?u.fromRangeStart(e).getClientRects()[0]:e.getBoundingClientRect()},destroy:function(){this.win=null,this.controlSelection.destroy()}},c}),r(X,[j,m],function(e,t){function n(t){this.compare=function(n,i){function o(e){var n={};return r(t.getAttribs(e),function(r){var i=r.nodeName.toLowerCase();0!==i.indexOf("_")&&"style"!==i&&0!==i.indexOf("data-")&&(n[i]=t.getAttrib(e,i))}),n}function a(e,t){var n,r;for(r in e)if(e.hasOwnProperty(r)){if(n=t[r],"undefined"==typeof n)return!1;if(e[r]!=n)return!1;delete t[r]}for(r in t)if(t.hasOwnProperty(r))return!1;return!0}return n.nodeName==i.nodeName&&(!!a(o(n),o(i))&&(!!a(t.parseStyle(t.getAttrib(n,"style")),t.parseStyle(t.getAttrib(i,"style")))&&(!e.isBookmarkNode(n)&&!e.isBookmarkNode(i))))}}var r=t.each;return n}),r(K,[w,m,B],function(e,t,n){function r(e,r){function i(e,t){t.classes.length&&u.addClass(e,t.classes.join(" ")),u.setAttribs(e,t.attrs)}function o(e){var t;return c="string"==typeof e?{name:e,classes:[],attrs:{}}:e,t=u.create(c.name),i(t,c),t}function a(e,n){var r="string"!=typeof e?e.nodeName.toLowerCase():e,i=f.getElementRule(r),o=i.parentsRequired;return!(!o||!o.length)&&(n&&t.inArray(o,n)!==-1?n:o[0])}function s(e,n,r){var i,l,c,d=n.length&&n[0],f=d&&d.name;if(c=a(e,f))f==c?(l=n[0],n=n.slice(1)):l=c;else if(d)l=n[0],n=n.slice(1);else if(!r)return e;return l&&(i=o(l),i.appendChild(e)),r&&(i||(i=u.create("div"),i.appendChild(e)),t.each(r,function(t){var n=o(t);i.insertBefore(n,e)})),s(i,n,l&&l.siblings)}var l,c,d,f=r&&r.schema||new n({});return e&&e.length?(c=e[0],l=o(c),d=u.create("div"),d.appendChild(s(l,e.slice(1),c.siblings)),d):""}function i(e,t){return r(a(e),t)}function o(e){var n,r={classes:[],attrs:{}};return e=r.selector=t.trim(e),"*"!==e&&(n=e.replace(/(?:([#\.]|::?)([\w\-]+)|(\[)([^\]]+)\]?)/g,function(e,n,i,o,a){switch(n){case"#":r.attrs.id=i;break;case".":r.classes.push(i);break;case":":t.inArray("checked disabled enabled read-only required".split(" "),i)!==-1&&(r.attrs[i]=i)}if("["==o){var s=a.match(/([\w\-]+)(?:\=\"([^\"]+))?/);s&&(r.attrs[s[1]]=s[2])}return""})),r.name=n||"div",r}function a(e){return e&&"string"==typeof e?(e=e.split(/\s*,\s*/)[0],e=e.replace(/\s*(~\+|~|\+|>)\s*/g,"$1"),t.map(e.split(/(?:>|\s+(?![^\[\]]+\]))/),function(e){var n=t.map(e.split(/(?:~\+|~|\+)/),o),r=n.pop();return n.length&&(r.siblings=n),r}).reverse()):[]}function s(e,t){function n(e){return e.replace(/%(\w+)/g,"")}var i,o,s,c,d="",f,p;if(p=e.settings.preview_styles,p===!1)return"";if("string"!=typeof p&&(p="font-family font-size font-weight font-style text-decoration text-transform color background-color border border-radius outline text-shadow"),"string"==typeof t){if(t=e.formatter.get(t),!t)return;t=t[0]}return"preview"in t&&(p=t.preview,p===!1)?"":(i=t.block||t.inline||"span",c=a(t.selector),c.length?(c[0].name||(c[0].name=i),i=t.selector,o=r(c,e)):o=r([i],e),s=u.select(i,o)[0]||o.firstChild,l(t.styles,function(e,t){e=n(e),e&&u.setStyle(s,t,e)}),l(t.attributes,function(e,t){e=n(e),e&&u.setAttrib(s,t,e)}),l(t.classes,function(e){e=n(e),u.hasClass(s,e)||u.addClass(s,e)}),e.fire("PreviewFormats"),u.setStyles(o,{position:"absolute",left:-65535}),e.getBody().appendChild(o),f=u.getStyle(e.getBody(),"fontSize",!0),f=/px$/.test(f)?parseInt(f,10):0,l(p.split(" "),function(t){var n=u.getStyle(s,t,!0);if(!("background-color"==t&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(n)&&(n=u.getStyle(e.getBody(),t,!0),"#ffffff"==u.toHex(n).toLowerCase())||"color"==t&&"#000000"==u.toHex(n).toLowerCase())){if("font-size"==t&&/em|%$/.test(n)){if(0===f)return;n=parseFloat(n,10)/(/%$/.test(n)?100:1),n=n*f+"px"}"border"==t&&n&&(d+="padding:0 2px;"),d+=t+":"+n+";"}}),e.fire("AfterPreviewFormats"),u.remove(o),d)}var l=t.each,u=e.DOM;return{getCssText:s,parseSelector:a,selectorToHtml:i}}),r(G,[h,_,g],function(e,t,n){function r(e,t){var n=o[e];n||(o[e]=n=[]),o[e].push(t)}function i(e,t){s(o[e],function(e){e(t)})}var o={},a=e.filter,s=e.each;return r("pre",function(r){function i(t){return u(t.previousSibling)&&e.indexOf(c,t.previousSibling)!=-1}function o(e,t){n(t).remove(),n(e).append("<br><br>").append(t.childNodes)}var l=r.selection.getRng(),u,c;u=t.matchNodeNames("pre"),l.collapsed||(c=r.selection.getSelectedBlocks(),s(a(a(c,u),i),function(e){o(e.previousSibling,e)}))}),{postProcess:i}}),r(J,[y,T,j,X,z,m,K,G],function(e,t,n,r,i,o,a,s){return function(l){function u(e){return e.nodeType&&(e=e.nodeName),!!l.schema.getTextBlockElements()[e.toLowerCase()]}function c(e){return/^(TH|TD)$/.test(e.nodeName)}function d(e){return e&&/^(IMG)$/.test(e.nodeName)}function f(e,t){return Q.getParents(e,t,Q.getRoot())}function p(e){return 1===e.nodeType&&"_mce_caret"===e.id}function h(){v({valigntop:[{selector:"td,th",styles:{verticalAlign:"top"}}],valignmiddle:[{selector:"td,th",styles:{verticalAlign:"middle"}}],valignbottom:[{selector:"td,th",styles:{verticalAlign:"bottom"}}],alignleft:[{selector:"figure.image",collapsed:!1,classes:"align-left",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"left"},inherit:!1,preview:!1,defaultBlock:"div"},{selector:"img,table",collapsed:!1,styles:{"float":"left"},preview:"font-family font-size"}],aligncenter:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"center"},inherit:!1,preview:!1,defaultBlock:"div"},{selector:"figure.image",collapsed:!1,classes:"align-center",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"img",collapsed:!1,styles:{display:"block",marginLeft:"auto",marginRight:"auto"},preview:!1},{selector:"table",collapsed:!1,styles:{marginLeft:"auto",marginRight:"auto"},preview:"font-family font-size"}],alignright:[{selector:"figure.image",collapsed:!1,classes:"align-right",ceFalseOverride:!0,preview:"font-family font-size"},{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"right"},inherit:!1,preview:"font-family font-size",defaultBlock:"div"},{selector:"img,table",collapsed:!1,styles:{"float":"right"},preview:"font-family font-size"}],alignjustify:[{selector:"figure,p,h1,h2,h3,h4,h5,h6,td,th,tr,div,ul,ol,li",styles:{textAlign:"justify"},inherit:!1,defaultBlock:"div",preview:"font-family font-size"}],bold:[{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}},{inline:"b",remove:"all"}],italic:[{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}},{inline:"i",remove:"all"}],underline:[{inline:"span",styles:{textDecoration:"underline"},exact:!0},{inline:"u",remove:"all"}],strikethrough:[{inline:"span",styles:{textDecoration:"line-through"},exact:!0},{inline:"strike",remove:"all"}],forecolor:{inline:"span",styles:{color:"%value"},links:!0,remove_similar:!0},hilitecolor:{inline:"span",styles:{backgroundColor:"%value"},links:!0,remove_similar:!0},fontname:{inline:"span",styles:{fontFamily:"%value"}},fontsize:{inline:"span",styles:{fontSize:"%value"}},fontsize_class:{inline:"span",attributes:{"class":"%value"}},blockquote:{block:"blockquote",wrapper:1,remove:"all"},subscript:{inline:"sub"},superscript:{inline:"sup"},code:{inline:"code"},link:{inline:"a",selector:"a",remove:"all",split:!0,deep:!0,onmatch:function(){return!0},onformat:function(e,t,n){me(n,function(t,n){Q.setAttrib(e,n,t)})}},removeformat:[{selector:"b,strong,em,i,font,u,strike,sub,sup,dfn,code,samp,kbd,var,cite,mark,q,del,ins",remove:"all",split:!0,expand:!1,block_expand:!0,deep:!0},{selector:"span",attributes:["style","class"],remove:"empty",split:!0,expand:!1,deep:!0},{selector:"*",attributes:["style","class"],split:!1,expand:!1,deep:!0}]}),me("p h1 h2 h3 h4 h5 h6 div address pre div dt dd samp".split(/\s/),function(e){
+v(e,{block:e,remove:"all"})}),v(l.settings.formats)}function m(){l.addShortcut("meta+b","bold_desc","Bold"),l.addShortcut("meta+i","italic_desc","Italic"),l.addShortcut("meta+u","underline_desc","Underline");for(var e=1;e<=6;e++)l.addShortcut("access+"+e,"",["FormatBlock",!1,"h"+e]);l.addShortcut("access+7","",["FormatBlock",!1,"p"]),l.addShortcut("access+8","",["FormatBlock",!1,"div"]),l.addShortcut("access+9","",["FormatBlock",!1,"address"])}function g(e){return e?J[e]:J}function v(e,t){e&&("string"!=typeof e?me(e,function(e,t){v(t,e)}):(t=t.length?t:[t],me(t,function(e){e.deep===ce&&(e.deep=!e.selector),e.split===ce&&(e.split=!e.selector||e.inline),e.remove===ce&&e.selector&&!e.inline&&(e.remove="none"),e.selector&&e.inline&&(e.mixed=!0,e.block_expand=!0),"string"==typeof e.classes&&(e.classes=e.classes.split(/\s+/))}),J[e]=t))}function y(e){return e&&J[e]&&delete J[e],J}function b(e,t){var n=g(t);if(n)for(var r=0;r<n.length;r++)if(n[r].inherit===!1&&Q.is(e,n[r].selector))return!0;return!1}function C(e){var t;return l.dom.getParent(e,function(e){return t=l.dom.getStyle(e,"text-decoration"),t&&"none"!==t}),t}function x(e){var t;1===e.nodeType&&e.parentNode&&1===e.parentNode.nodeType&&(t=C(e.parentNode),l.dom.getStyle(e,"color")&&t?l.dom.setStyle(e,"text-decoration",t):l.dom.getStyle(e,"text-decoration")===t&&l.dom.setStyle(e,"text-decoration",null))}function w(t,n,r){function i(e,t){if(t=t||f,e){if(t.onformat&&t.onformat(e,t,n,r),me(t.styles,function(t,r){Q.setStyle(e,r,F(t,n))}),t.styles){var i=Q.getAttrib(e,"style");i&&e.setAttribute("data-mce-style",i)}me(t.attributes,function(t,r){Q.setAttrib(e,r,F(t,n))}),me(t.classes,function(t){t=F(t,n),Q.hasClass(e,t)||Q.addClass(e,t)})}}function o(e,t){var n=!1;return!!f.selector&&(me(e,function(e){if(!("collapsed"in e&&e.collapsed!==v))return Q.is(t,e.selector)&&!p(t)?(i(t,e),n=!0,!1):void 0}),n)}function a(){function t(t,n){var i=new e(n);for(r=i.prev2();r;r=i.prev2()){if(3==r.nodeType&&r.data.length>0)return r;if(r.childNodes.length>1||r==t||"BR"==r.tagName)return r}}var n=l.selection.getRng(),i=n.startContainer,o=n.endContainer;if(i!=o&&0===n.endOffset){var a=t(i,o),s=3==a.nodeType?a.data.length:a.childNodes.length;n.setEnd(a,s)}return n}function c(e,r,a){var s=[],l,c,h=!0;l=f.inline||f.block,c=Q.create(l),i(c),ee.walk(e,function(e){function r(e){var g,v,y,b;if(b=h,g=e.nodeName.toLowerCase(),v=e.parentNode.nodeName.toLowerCase(),1===e.nodeType&&de(e)&&(b=h,h="true"===de(e),y=!0),D(g,"br"))return m=0,void(f.block&&Q.remove(e));if(f.wrapper&&_(e,t,n))return void(m=0);if(h&&!y&&f.block&&!f.wrapper&&u(g)&&te(v,l))return e=Q.rename(e,l),i(e),s.push(e),void(m=0);if(f.selector){var C=o(d,e);if(!f.inline||C)return void(m=0)}!h||y||!te(l,g)||!te(v,l)||!a&&3===e.nodeType&&1===e.nodeValue.length&&65279===e.nodeValue.charCodeAt(0)||p(e)||f.inline&&ne(e)?(m=0,me(ge(e.childNodes),r),y&&(h=b),m=0):(m||(m=Q.clone(c,se),e.parentNode.insertBefore(m,e),s.push(m)),m.appendChild(e))}var m;me(e,r)}),f.links===!0&&me(s,function(e){function t(e){"A"===e.nodeName&&i(e,f),me(ge(e.childNodes),t)}t(e)}),me(s,function(e){function r(e){var t=0;return me(e.childNodes,function(e){z(e)||he(e)||t++}),t}function o(e){var t=!1;return me(e.childNodes,function(e){if(M(e))return t=e,!1}),t}function a(e,t){do{if(1!==r(e))break;if(e=o(e),!e)break;if(t(e))return e}while(e);return null}function l(e){var t,n;return t=o(e),t&&!he(t)&&B(t,f)&&(n=Q.clone(t,se),i(n),Q.replace(n,e,le),Q.remove(t,1)),n||e}var u;if(u=r(e),(s.length>1||!ne(e))&&0===u)return void Q.remove(e,1);if(!ne(e)&&!H(e,"fontSize")){var c=a(e,P("fontSize"));c&&w("fontsize",{value:H(c,"fontSize")},e)}(f.inline||f.wrapper)&&(f.exact||1!==u||(e=l(e)),me(d,function(t){me(Q.select(t.inline,e),function(e){he(e)||$(t,n,e,t.exact?e:null)})}),_(e.parentNode,t,n)&&$(f,n,e)&&(e=0),f.merge_with_parents&&Q.getParent(e.parentNode,function(r){if(_(r,t,n))return $(f,n,e)&&(e=0),le}),e&&f.merge_siblings!==!1&&(e=Y(j(e),e),e=Y(e,j(e,le))))})}var d=g(t),f=d[0],h,m,v=!r&&Z.isCollapsed();if("false"!==de(Z.getNode())){if(f){if(r)r.nodeType?o(d,r)||(m=Q.createRng(),m.setStartBefore(r),m.setEndAfter(r),c(W(m,d),null,!0)):c(r,null,!0);else if(v&&f.inline&&!Q.select("td[data-mce-selected],th[data-mce-selected]").length)K("apply",t,n);else{var y=l.selection.getNode();re||!d[0].defaultBlock||Q.getParent(y,Q.isBlock)||w(d[0].defaultBlock),l.selection.setRng(a()),h=Z.getBookmark(),c(W(Z.getRng(le),d),h),f.styles&&((f.styles.color||f.styles.textDecoration)&&(ve(y,x,"childNodes"),x(y)),f.styles.backgroundColor&&L(y,P("fontSize"),O("backgroundColor",F(f.styles.backgroundColor,n)))),Z.moveToBookmark(h),G(Z.getRng(le)),l.nodeChanged()}s.postProcess(t,l)}}else{r=Z.getNode();for(var b=0,C=d.length;b<C;b++)if(d[b].ceFalseOverride&&Q.is(r,d[b].selector))return void i(r,d[b])}}function E(e,t,n,r){function i(e){var n,r,o,a,s;if(1===e.nodeType&&de(e)&&(a=y,y="true"===de(e),s=!0),n=ge(e.childNodes),y&&!s)for(r=0,o=p.length;r<o&&!$(p[r],t,e,e);r++);if(h.deep&&n.length){for(r=0,o=n.length;r<o;r++)i(n[r]);s&&(y=a)}}function o(n){var i;return me(f(n.parentNode).reverse(),function(n){var o;i||"_start"==n.id||"_end"==n.id||(o=_(n,e,t,r),o&&o.split!==!1&&(i=n))}),i}function a(e,n,r,i){var o,a,s,l,u,c;if(e){for(c=e.parentNode,o=n.parentNode;o&&o!=c;o=o.parentNode){for(a=Q.clone(o,se),u=0;u<p.length;u++)if($(p[u],t,a,a)){a=0;break}a&&(s&&a.appendChild(s),l||(l=a),s=a)}!i||h.mixed&&ne(e)||(n=Q.split(e,n)),s&&(r.parentNode.insertBefore(s,r),l.appendChild(r))}return n}function s(e){return a(o(e),e,e,!0)}function u(e){var t=Q.get(e?"_start":"_end"),n=t[e?"firstChild":"lastChild"];return he(n)&&(n=n[e?"firstChild":"lastChild"]),3==n.nodeType&&0===n.data.length&&(n=e?t.previousSibling||t.nextSibling:t.nextSibling||t.previousSibling),Q.remove(t,!0),n}function d(e){var t,n,r=e.commonAncestorContainer;if(e=W(e,p,le),h.split){if(t=X(e,le),n=X(e),t!=n){if(/^(TR|TH|TD)$/.test(t.nodeName)&&t.firstChild&&(t="TR"==t.nodeName?t.firstChild.firstChild||t:t.firstChild||t),r&&/^T(HEAD|BODY|FOOT|R)$/.test(r.nodeName)&&c(n)&&n.firstChild&&(n=n.firstChild||n),Q.isChildOf(t,n)&&!ne(n)&&!c(t)&&!c(n))return t=U(t,"span",{id:"_start","data-mce-type":"bookmark"}),s(t),void(t=u(le));t=U(t,"span",{id:"_start","data-mce-type":"bookmark"}),n=U(n,"span",{id:"_end","data-mce-type":"bookmark"}),s(t),s(n),t=u(le),n=u()}else t=n=s(t);e.startContainer=t.parentNode?t.parentNode:t,e.startOffset=ie(t),e.endContainer=n.parentNode?n.parentNode:n,e.endOffset=ie(n)+1}ee.walk(e,function(e){me(e,function(e){i(e),1===e.nodeType&&"underline"===l.dom.getStyle(e,"text-decoration")&&e.parentNode&&"underline"===C(e.parentNode)&&$({deep:!1,exact:!0,inline:"span",styles:{textDecoration:"underline"}},null,e)})})}var p=g(e),h=p[0],m,v,y=!0;if(n)return void(n.nodeType?(v=Q.createRng(),v.setStartBefore(n),v.setEndAfter(n),d(v)):d(n));if("false"!==de(Z.getNode()))Z.isCollapsed()&&h.inline&&!Q.select("td[data-mce-selected],th[data-mce-selected]").length?K("remove",e,t,r):(m=Z.getBookmark(),d(Z.getRng(le)),Z.moveToBookmark(m),h.inline&&S(e,t,Z.getStart())&&G(Z.getRng(!0)),l.nodeChanged());else{n=Z.getNode();for(var b=0,x=p.length;b<x&&(!p[b].ceFalseOverride||!$(p[b],t,n,n));b++);}}function N(e,t,n){var r=g(e);!S(e,t,n)||"toggle"in r[0]&&!r[0].toggle?w(e,t,n):E(e,t,n)}function _(e,t,n,r){function i(e,t,i){var o,a,s=t[i],l;if(t.onmatch)return t.onmatch(e,t,i);if(s)if(s.length===ce){for(o in s)if(s.hasOwnProperty(o)){if(a="attributes"===i?Q.getAttrib(e,o):H(e,o),r&&!a&&!t.exact)return;if((!r||t.exact)&&!D(a,I(F(s[o],n),o)))return}}else for(l=0;l<s.length;l++)if("attributes"===i?Q.getAttrib(e,s[l]):H(e,s[l]))return t;return t}var o=g(t),a,s,l;if(o&&e)for(s=0;s<o.length;s++)if(a=o[s],B(e,a)&&i(e,a,"attributes")&&i(e,a,"styles")){if(l=a.classes)for(s=0;s<l.length;s++)if(!Q.hasClass(e,l[s]))return;return a}}function S(e,t,n){function r(n){var r=Q.getRoot();return n!==r&&(n=Q.getParent(n,function(n){return!!b(n,e)||(n.parentNode===r||!!_(n,e,t,!0))}),_(n,e,t))}var i;return n?r(n):(n=Z.getNode(),r(n)?le:(i=Z.getStart(),i!=n&&r(i)?le:se))}function k(e,t){var n,r=[],i={};return n=Z.getStart(),Q.getParent(n,function(n){var o,a;for(o=0;o<e.length;o++)a=e[o],!i[a]&&_(n,a,t)&&(i[a]=!0,r.push(a))},Q.getRoot()),r}function T(e){var t=g(e),n,r,i,o,a;if(t)for(n=Z.getStart(),r=f(n),o=t.length-1;o>=0;o--){if(a=t[o].selector,!a||t[o].defaultBlock)return le;for(i=r.length-1;i>=0;i--)if(Q.is(r[i],a))return le}return se}function R(e,t,n){var r;return ue||(ue={},r={},l.on("NodeChange",function(e){var t=f(e.element),n={};t=o.grep(t,function(e){return 1==e.nodeType&&!e.getAttribute("data-mce-bogus")}),me(ue,function(e,i){me(t,function(o){return _(o,i,{},e.similar)?(r[i]||(me(e,function(e){e(!0,{node:o,format:i,parents:t})}),r[i]=e),n[i]=e,!1):!b(o,i)&&void 0})}),me(r,function(i,o){n[o]||(delete r[o],me(i,function(n){n(!1,{node:e.element,format:o,parents:t})}))})})),me(e.split(","),function(e){ue[e]||(ue[e]=[],ue[e].similar=n),ue[e].push(t)}),this}function A(e){return a.getCssText(l,e)}function B(e,t){return D(e,t.inline)?le:D(e,t.block)?le:t.selector?1==e.nodeType&&Q.is(e,t.selector):void 0}function D(e,t){return e=e||"",t=t||"",e=""+(e.nodeName||e),t=""+(t.nodeName||t),e.toLowerCase()==t.toLowerCase()}function L(e,t,n){me(e.childNodes,function(e){M(e)&&(t(e)&&n(e),e.hasChildNodes()&&L(e,t,n))})}function M(e){return 1==e.nodeType&&!he(e)&&!z(e)&&!p(e)}function P(e){return i.curry(function(e,t){return!(!t||!H(t,e))},e)}function O(e,t){return i.curry(function(e,t,n){Q.setStyle(n,e,t)},e,t)}function H(e,t){return I(Q.getStyle(e,t),t)}function I(e,t){return"color"!=t&&"backgroundColor"!=t||(e=Q.toHex(e)),"fontWeight"==t&&700==e&&(e="bold"),"fontFamily"==t&&(e=e.replace(/[\'\"]/g,"").replace(/,\s+/g,",")),""+e}function F(e,t){return"string"!=typeof e?e=e(t):t&&(e=e.replace(/%(\w+)/g,function(e,n){return t[n]||e})),e}function z(e){return e&&3===e.nodeType&&/^([\t \r\n]+|)$/.test(e.nodeValue)}function U(e,t,n){var r=Q.create(t,n);return e.parentNode.insertBefore(r,e),r.appendChild(e),r}function W(t,n,r){function i(e){function t(e){return"BR"==e.nodeName&&e.getAttribute("data-mce-bogus")&&!e.nextSibling}var r,i,o,a,s;if(r=i=e?g:y,a=e?"previousSibling":"nextSibling",s=Q.getRoot(),3==r.nodeType&&!z(r)&&(e?v>0:b<r.nodeValue.length))return r;for(;;){if(!n[0].block_expand&&ne(i))return i;for(o=i[a];o;o=o[a])if(!he(o)&&!z(o)&&!t(o))return i;if(i==s||i.parentNode==s){r=i;break}i=i.parentNode}return r}function o(e,t){for(t===ce&&(t=3===e.nodeType?e.length:e.childNodes.length);e&&e.hasChildNodes();)e=e.childNodes[t],e&&(t=3===e.nodeType?e.length:e.childNodes.length);return{node:e,offset:t}}function a(e){for(var t=e;t;){if(1===t.nodeType&&de(t))return"false"===de(t)?t:e;t=t.parentNode}return e}function s(t,n,i){function o(e,t){var n,o,a=e.nodeValue;return"undefined"==typeof t&&(t=i?a.length:0),i?(n=a.lastIndexOf(" ",t),o=a.lastIndexOf("\xa0",t),n=n>o?n:o,n===-1||r||n++):(n=a.indexOf(" ",t),o=a.indexOf("\xa0",t),n=n!==-1&&(o===-1||n<o)?n:o),n}var a,s,u,c;if(3===t.nodeType){if(u=o(t,n),u!==-1)return{container:t,offset:u};c=t}for(a=new e(t,Q.getParent(t,ne)||l.getBody());s=a[i?"prev":"next"]();)if(3===s.nodeType){if(c=s,u=o(s),u!==-1)return{container:s,offset:u}}else if(ne(s))break;if(c)return n=i?0:c.length,{container:c,offset:n}}function c(e,r){var i,o,a,s;for(3==e.nodeType&&0===e.nodeValue.length&&e[r]&&(e=e[r]),i=f(e),o=0;o<i.length;o++)for(a=0;a<n.length;a++)if(s=n[a],!("collapsed"in s&&s.collapsed!==t.collapsed)&&Q.is(i[o],s.selector))return i[o];return e}function d(e,t){var r,i=Q.getRoot();if(n[0].wrapper||(r=Q.getParent(e,n[0].block,i)),r||(r=Q.getParent(3==e.nodeType?e.parentNode:e,function(e){return e!=i&&u(e)})),r&&n[0].wrapper&&(r=f(r,"ul,ol").reverse()[0]||r),!r)for(r=e;r[t]&&!ne(r[t])&&(r=r[t],!D(r,"br")););return r||e}var p,h,m,g=t.startContainer,v=t.startOffset,y=t.endContainer,b=t.endOffset;if(1==g.nodeType&&g.hasChildNodes()&&(p=g.childNodes.length-1,g=g.childNodes[v>p?p:v],3==g.nodeType&&(v=0)),1==y.nodeType&&y.hasChildNodes()&&(p=y.childNodes.length-1,y=y.childNodes[b>p?p:b-1],3==y.nodeType&&(b=y.nodeValue.length)),g=a(g),y=a(y),(he(g.parentNode)||he(g))&&(g=he(g)?g:g.parentNode,g=g.nextSibling||g,3==g.nodeType&&(v=0)),(he(y.parentNode)||he(y))&&(y=he(y)?y:y.parentNode,y=y.previousSibling||y,3==y.nodeType&&(b=y.length)),n[0].inline&&(t.collapsed&&(m=s(g,v,!0),m&&(g=m.container,v=m.offset),m=s(y,b),m&&(y=m.container,b=m.offset)),h=o(y,b),h.node)){for(;h.node&&0===h.offset&&h.node.previousSibling;)h=o(h.node.previousSibling);h.node&&h.offset>0&&3===h.node.nodeType&&" "===h.node.nodeValue.charAt(h.offset-1)&&h.offset>1&&(y=h.node,y.splitText(h.offset-1))}return(n[0].inline||n[0].block_expand)&&(n[0].inline&&3==g.nodeType&&0!==v||(g=i(!0)),n[0].inline&&3==y.nodeType&&b!==y.nodeValue.length||(y=i())),n[0].selector&&n[0].expand!==se&&!n[0].inline&&(g=c(g,"previousSibling"),y=c(y,"nextSibling")),(n[0].block||n[0].selector)&&(g=d(g,"previousSibling"),y=d(y,"nextSibling"),n[0].block&&(ne(g)||(g=i(!0)),ne(y)||(y=i()))),1==g.nodeType&&(v=ie(g),g=g.parentNode),1==y.nodeType&&(b=ie(y)+1,y=y.parentNode),{startContainer:g,startOffset:v,endContainer:y,endOffset:b}}function V(e,t){return t.links&&"A"==e.tagName}function $(e,t,n,r){var i,o,a;if(!B(n,e)&&!V(n,e))return se;if("all"!=e.remove)for(me(e.styles,function(i,o){i=I(F(i,t),o),"number"==typeof o&&(o=i,r=0),(e.remove_similar||!r||D(H(r,o),i))&&Q.setStyle(n,o,""),a=1}),a&&""===Q.getAttrib(n,"style")&&(n.removeAttribute("style"),n.removeAttribute("data-mce-style")),me(e.attributes,function(e,i){var o;if(e=F(e,t),"number"==typeof i&&(i=e,r=0),!r||D(Q.getAttrib(r,i),e)){if("class"==i&&(e=Q.getAttrib(n,i),e&&(o="",me(e.split(/\s+/),function(e){/mce\-\w+/.test(e)&&(o+=(o?" ":"")+e)}),o)))return void Q.setAttrib(n,i,o);"class"==i&&n.removeAttribute("className"),ae.test(i)&&n.removeAttribute("data-mce-"+i),n.removeAttribute(i)}}),me(e.classes,function(e){e=F(e,t),r&&!Q.hasClass(r,e)||Q.removeClass(n,e)}),o=Q.getAttribs(n),i=0;i<o.length;i++){var s=o[i].nodeName;if(0!==s.indexOf("_")&&0!==s.indexOf("data-"))return se}return"none"!=e.remove?(q(n,e),le):void 0}function q(e,t){function n(e,t,n){return e=j(e,t,n),!e||"BR"==e.nodeName||ne(e)}var r=e.parentNode,i;t.block&&(re?r==Q.getRoot()&&(t.list_block&&D(e,t.list_block)||me(ge(e.childNodes),function(e){te(re,e.nodeName.toLowerCase())?i?i.appendChild(e):(i=U(e,re),Q.setAttribs(i,l.settings.forced_root_block_attrs)):i=0})):ne(e)&&!ne(r)&&(n(e,se)||n(e.firstChild,le,1)||e.insertBefore(Q.create("br"),e.firstChild),n(e,le)||n(e.lastChild,se,1)||e.appendChild(Q.create("br")))),t.selector&&t.inline&&!D(t.inline,e)||Q.remove(e,1)}function j(e,t,n){if(e)for(t=t?"nextSibling":"previousSibling",e=n?e:e[t];e;e=e[t])if(1==e.nodeType||!z(e))return e}function Y(e,t){function n(e,t){for(i=e;i;i=i[t]){if(3==i.nodeType&&0!==i.nodeValue.length)return e;if(1==i.nodeType&&!he(i))return i}return e}var i,o,a=new r(Q);if(e&&t&&(e=n(e,"previousSibling"),t=n(t,"nextSibling"),a.compare(e,t))){for(i=e.nextSibling;i&&i!=t;)o=i,i=i.nextSibling,e.appendChild(o);return Q.remove(t),me(ge(t.childNodes),function(t){e.appendChild(t)}),e}return t}function X(t,n){var r,i,o;return r=t[n?"startContainer":"endContainer"],i=t[n?"startOffset":"endOffset"],1==r.nodeType&&(o=r.childNodes.length-1,!n&&i&&i--,r=r.childNodes[i>o?o:i]),3===r.nodeType&&n&&i>=r.nodeValue.length&&(r=new e(r,l.getBody()).next()||r),3!==r.nodeType||n||0!==i||(r=new e(r,l.getBody()).prev()||r),r}function K(t,n,r,i){function o(e){var t=Q.create("span",{id:m,"data-mce-bogus":!0,style:v?"color:red":""});return e&&t.appendChild(l.getDoc().createTextNode(oe)),t}function a(e,t){for(;e;){if(3===e.nodeType&&e.nodeValue!==oe||e.childNodes.length>1)return!1;t&&1===e.nodeType&&t.push(e),e=e.firstChild}return!0}function s(e){for(;e;){if(e.id===m)return e;e=e.parentNode}}function c(t){var n;if(t)for(n=new e(t,t),t=n.current();t;t=n.next())if(3===t.nodeType)return t}function d(e,t){var n,r;if(e)r=Z.getRng(!0),a(e)?(t!==!1&&(r.setStartBefore(e),r.setEndBefore(e)),Q.remove(e)):(n=c(e),n.nodeValue.charAt(0)===oe&&(n.deleteData(0,1),r.startContainer==n&&r.startOffset>0&&r.setStart(n,r.startOffset-1),r.endContainer==n&&r.endOffset>0&&r.setEnd(n,r.endOffset-1)),Q.remove(e,1)),Z.setRng(r);else if(e=s(Z.getStart()),!e)for(;e=Q.get(m);)d(e,!1)}function f(){var e,t,i,a,l,u,d;e=Z.getRng(!0),a=e.startOffset,u=e.startContainer,d=u.nodeValue,t=s(Z.getStart()),t&&(i=c(t));var f=/[^\s\u00a0\u00ad\u200b\ufeff]/;d&&a>0&&a<d.length&&f.test(d.charAt(a))&&f.test(d.charAt(a-1))?(l=Z.getBookmark(),e.collapse(!0),e=W(e,g(n)),e=ee.split(e),w(n,r,e),Z.moveToBookmark(l)):(t&&i.nodeValue===oe?w(n,r,t):(t=o(!0),i=t.firstChild,e.insertNode(t),a=1,w(n,r,t)),Z.setCursorLocation(i,a))}function p(){var e=Z.getRng(!0),t,a,s,l,c,d,f=[],p,h;for(t=e.startContainer,a=e.startOffset,c=t,3==t.nodeType&&(a!=t.nodeValue.length&&(l=!0),c=c.parentNode);c;){if(_(c,n,r,i)){d=c;break}c.nextSibling&&(l=!0),f.push(c),c=c.parentNode}if(d)if(l)s=Z.getBookmark(),e.collapse(!0),e=W(e,g(n),!0),e=ee.split(e),E(n,r,e),Z.moveToBookmark(s);else{for(h=o(),c=h,p=f.length-1;p>=0;p--)c.appendChild(Q.clone(f[p],!1)),c=c.firstChild;c.appendChild(Q.doc.createTextNode(oe)),c=c.firstChild;var m=Q.getParent(d,u);m&&Q.isEmpty(m)?d.parentNode.replaceChild(h,d):Q.insertAfter(h,d),Z.setCursorLocation(c,1),Q.isEmpty(d)&&Q.remove(d)}}function h(){var e;e=s(Z.getStart()),e&&!Q.isEmpty(e)&&ve(e,function(e){1!=e.nodeType||e.id===m||Q.isEmpty(e)||Q.setAttrib(e,"data-mce-bogus",null)},"childNodes")}var m="_mce_caret",v=l.settings.caret_debug;l._hasCaretEvents||(pe=function(){var e=[],t;if(a(s(Z.getStart()),e))for(t=e.length;t--;)Q.setAttrib(e[t],"data-mce-bogus","1")},fe=function(e){var t=e.keyCode;d(),8==t&&Z.isCollapsed()&&Z.getStart().innerHTML==oe&&d(s(Z.getStart())),37!=t&&39!=t||d(s(Z.getStart())),h()},l.on("SetContent",function(e){e.selection&&h()}),l._hasCaretEvents=!0),"apply"==t?f():p()}function G(t){var n=t.startContainer,r=t.startOffset,i,o,a,s,l;if((t.startContainer!=t.endContainer||!d(t.startContainer.childNodes[t.startOffset]))&&(3==n.nodeType&&r>=n.nodeValue.length&&(r=ie(n),n=n.parentNode,i=!0),1==n.nodeType))for(s=n.childNodes,n=s[Math.min(r,s.length-1)],o=new e(n,Q.getParent(n,Q.isBlock)),(r>s.length-1||i)&&o.next(),a=o.current();a;a=o.next())if(3==a.nodeType&&!z(a))return l=Q.create("a",{"data-mce-bogus":"all"},oe),a.parentNode.insertBefore(l,a),t.setStart(a,0),Z.setRng(t),void Q.remove(l)}var J={},Q=l.dom,Z=l.selection,ee=new t(Q),te=l.schema.isValidChild,ne=Q.isBlock,re=l.settings.forced_root_block,ie=Q.nodeIndex,oe="\ufeff",ae=/^(src|href|style)$/,se=!1,le=!0,ue,ce,de=Q.getContentEditable,fe,pe,he=n.isBookmarkNode,me=o.each,ge=o.grep,ve=o.walk,ye=o.extend;ye(this,{get:g,register:v,unregister:y,apply:w,remove:E,toggle:N,match:S,matchAll:k,matchNode:_,canApply:T,formatChanged:R,getCssText:A}),h(),m(),l.on("BeforeGetContent",function(e){pe&&"raw"!=e.format&&pe()}),l.on("mouseup keydown",function(e){fe&&fe(e)})}}),r(Q,[],function(){var e=0,t=1,n=2,r=function(r,i){var o=r.length+i.length+2,a=new Array(o),s=new Array(o),l=function(e,t,n){return{start:e,end:t,diag:n}},u=function(o,a,s,l,c){var f=d(o,a,s,l);if(null===f||f.start===a&&f.diag===a-l||f.end===o&&f.diag===o-s)for(var p=o,h=s;p<a||h<l;)p<a&&h<l&&r[p]===i[h]?(c.push([e,r[p]]),++p,++h):a-o>l-s?(c.push([n,r[p]]),++p):(c.push([t,i[h]]),++h);else{u(o,f.start,s,f.start-f.diag,c);for(var m=f.start;m<f.end;++m)c.push([e,r[m]]);u(f.end,a,f.end-f.diag,l,c)}},c=function(e,t,n,o){for(var a=e;a-t<o&&a<n&&r[a]===i[a-t];)++a;return l(e,a,t)},d=function(e,t,n,o){var l=t-e,u=o-n;if(0===l||0===u)return null;var d=l-u,f=u+l,p=(f%2===0?f:f+1)/2;a[1+p]=e,s[1+p]=t+1;for(var h=0;h<=p;++h){for(var m=-h;m<=h;m+=2){var g=m+p;m===-h||m!=h&&a[g-1]<a[g+1]?a[g]=a[g+1]:a[g]=a[g-1]+1;for(var v=a[g],y=v-e+n-m;v<t&&y<o&&r[v]===i[y];)a[g]=++v,++y;if(d%2!=0&&d-h<=m&&m<=d+h&&s[g-d]<=a[g])return c(s[g-d],m+e-n,t,o)}for(m=d-h;m<=d+h;m+=2){for(g=m+p-d,m===d-h||m!=d+h&&s[g+1]<=s[g-1]?s[g]=s[g+1]-1:s[g]=s[g-1],v=s[g]-1,y=v-e+n-m;v>=e&&y>=n&&r[v]===i[y];)s[g]=v--,y--;if(d%2===0&&-h<=m&&m<=h&&s[g]<=a[g+d])return c(s[g],m+e-n,t,o)}}},f=[];return u(0,r.length,0,i.length,f),f};return{KEEP:e,DELETE:n,INSERT:t,diff:r}}),r(Z,[h,C,Q],function(e,t,n){var r=function(e){return 1===e.nodeType?e.outerHTML:3===e.nodeType?t.encodeRaw(e.data,!1):8===e.nodeType?"<!--"+e.data+"-->":""},i=function(e){var t,n,r;for(r=document.createElement("div"),t=document.createDocumentFragment(),e&&(r.innerHTML=e);n=r.firstChild;)t.appendChild(n);return t},o=function(e,t,n){var r=i(t);if(e.hasChildNodes()&&n<e.childNodes.length){var o=e.childNodes[n];o.parentNode.insertBefore(r,o)}else e.appendChild(r)},a=function(e,t){if(e.hasChildNodes()&&t<e.childNodes.length){var n=e.childNodes[t];n.parentNode.removeChild(n)}},s=function(t,r){var i=0;e.each(t,function(e){e[0]===n.KEEP?i++:e[0]===n.INSERT?(o(r,e[1],i),i++):e[0]===n.DELETE&&a(r,i)})},l=function(t){return e.map(t.childNodes,r)},u=function(t,i){var o=e.map(i.childNodes,r);return s(n.diff(o,t),i),i};return{read:l,write:u}}),r(ee,[h,Z],function(e,t){var n=function(e){return e.indexOf("</iframe>")!==-1},r=function(e){return{type:"fragmented",fragments:e,content:"",bookmark:null,beforeBookmark:null}},i=function(e){return{type:"complete",fragments:null,content:e,bookmark:null,beforeBookmark:null}},o=function(o){var a,s,l;return a=t.read(o.getBody()),l=e.map(a,function(e){return o.serializer.trimContent(e)}),s=l.join(""),n(s)?r(l):i(s)},a=function(e,n,r){"fragmented"===n.type?t.write(n.fragments,e.getBody()):e.setContent(n.content,{format:"raw"}),e.selection.moveToBookmark(r?n.beforeBookmark:n.bookmark)},s=function(e){return"fragmented"===e.type?e.fragments.join(""):e.content},l=function(e,t){return s(e)===s(t)};return{createFragmentedLevel:r,createCompleteLevel:i,createFromEditor:o,applyToEditor:a,isEq:l}}),r(te,[I,m,ee],function(e,t,n){return function(e){function r(t){e.setDirty(t)}function i(e){a.typing=!1,a.add({},e)}function o(){a.typing&&(a.typing=!1,a.add())}var a=this,s=0,l=[],u,c,d=0;return e.on("init",function(){a.add()}),e.on("BeforeExecCommand",function(e){var t=e.command;"Undo"!==t&&"Redo"!==t&&"mceRepaint"!==t&&(o(),a.beforeChange())}),e.on("ExecCommand",function(e){var t=e.command;"Undo"!==t&&"Redo"!==t&&"mceRepaint"!==t&&i(e)}),e.on("ObjectResizeStart Cut",function(){a.beforeChange()}),e.on("SaveContent ObjectResized blur",i),e.on("DragEnd",i),e.on("KeyUp",function(t){var o=t.keyCode;t.isDefaultPrevented()||((o>=33&&o<=36||o>=37&&o<=40||45===o||t.ctrlKey)&&(i(),e.nodeChanged()),46!==o&&8!==o||e.nodeChanged(),c&&a.typing&&(e.isDirty()||(r(l[0]&&!n.isEq(n.createFromEditor(e),l[0])),e.isDirty()&&e.fire("change",{level:l[0],lastLevel:null})),e.fire("TypingUndo"),c=!1,e.nodeChanged()))}),e.on("KeyDown",function(e){var t=e.keyCode;if(!e.isDefaultPrevented()){if(t>=33&&t<=36||t>=37&&t<=40||45===t)return void(a.typing&&i(e));var n=e.ctrlKey&&!e.altKey||e.metaKey;!(t<16||t>20)||224===t||91===t||a.typing||n||(a.beforeChange(),a.typing=!0,a.add({},e),c=!0)}}),e.on("MouseDown",function(e){a.typing&&i(e)}),e.addShortcut("meta+z","","Undo"),e.addShortcut("meta+y,meta+shift+z","","Redo"),e.on("AddUndo Undo Redo ClearUndos",function(t){t.isDefaultPrevented()||e.nodeChanged()}),a={data:l,typing:!1,beforeChange:function(){d||(u=e.selection.getBookmark(2,!0))},add:function(i,o){var a,c=e.settings,f,p;if(p=n.createFromEditor(e),i=i||{},i=t.extend(i,p),d||e.removed)return null;if(f=l[s],e.fire("BeforeAddUndo",{level:i,lastLevel:f,originalEvent:o}).isDefaultPrevented())return null;if(f&&n.isEq(f,i))return null;if(l[s]&&(l[s].beforeBookmark=u),c.custom_undo_redo_levels&&l.length>c.custom_undo_redo_levels){for(a=0;a<l.length-1;a++)l[a]=l[a+1];l.length--,s=l.length}i.bookmark=e.selection.getBookmark(2,!0),s<l.length-1&&(l.length=s+1),l.push(i),s=l.length-1;var h={level:i,lastLevel:f,originalEvent:o};return e.fire("AddUndo",h),s>0&&(r(!0),e.fire("change",h)),i},undo:function(){var t;return a.typing&&(a.add(),a.typing=!1),s>0&&(t=l[--s],n.applyToEditor(e,t,!0),r(!0),e.fire("undo",{level:t})),t},redo:function(){var t;return s<l.length-1&&(t=l[++s],n.applyToEditor(e,t,!1),r(!0),e.fire("redo",{level:t})),t},clear:function(){l=[],s=0,a.typing=!1,a.data=l,e.fire("ClearUndos")},hasUndo:function(){return s>0||a.typing&&l[0]&&!n.isEq(n.createFromEditor(e),l[0])},hasRedo:function(){return s<l.length-1&&!a.typing},transact:function(e){o(),a.beforeChange();try{d++,e()}finally{d--}return a.add()},extra:function(t,r){var i,o;a.transact(t)&&(o=l[s].bookmark,i=l[s-1],n.applyToEditor(e,i,!0),a.transact(r)&&(l[s-1].beforeBookmark=o))}}}}),r(ne,[y,T,k,d],function(e,t,n,r){var i=r.ie&&r.ie<11;return function(o){function a(a){function h(e){return e&&s.isBlock(e)&&!/^(TD|TH|CAPTION|FORM)$/.test(e.nodeName)&&!/^(fixed|absolute)/i.test(e.style.position)&&"true"!==s.getContentEditable(e)}function m(e){return e&&/^(TD|TH|CAPTION)$/.test(e.nodeName)}function g(e){var t;s.isBlock(e)&&(t=l.getRng(),e.appendChild(s.create("span",null,"\xa0")),l.select(e),e.lastChild.outerHTML="",l.setRng(t))}function v(e){var t=e,n=[],r;if(t){for(;t=t.firstChild;){if(s.isBlock(t))return;1!=t.nodeType||f[t.nodeName.toLowerCase()]||n.push(t)}for(r=n.length;r--;)t=n[r],!t.hasChildNodes()||t.firstChild==t.lastChild&&""===t.firstChild.nodeValue?s.remove(t):"A"==t.nodeName&&" "===(t.innerText||t.textContent)&&s.remove(t)}}function y(t){function n(e){for(;e;){if(1==e.nodeType||3==e.nodeType&&e.data&&/[\r\n\s]/.test(e.data))return e;e=e.nextSibling}}var i,o,a,u=t,c;if(t){if(r.ie&&r.ie<9&&P&&P.firstChild&&P.firstChild==P.lastChild&&"BR"==P.firstChild.tagName&&s.remove(P.firstChild),/^(LI|DT|DD)$/.test(t.nodeName)){var d=n(t.firstChild);d&&/^(UL|OL|DL)$/.test(d.nodeName)&&t.insertBefore(s.doc.createTextNode("\xa0"),t.firstChild)}if(a=s.createRng(),r.ie||t.normalize(),t.hasChildNodes()){for(i=new e(t,t);o=i.current();){if(3==o.nodeType){a.setStart(o,0),a.setEnd(o,0);break}if(p[o.nodeName.toLowerCase()]){a.setStartBefore(o),a.setEndBefore(o);break}u=o,o=i.next()}o||(a.setStart(u,0),a.setEnd(u,0))}else"BR"==t.nodeName?t.nextSibling&&s.isBlock(t.nextSibling)?((!O||O<9)&&(c=s.create("br"),t.parentNode.insertBefore(c,t)),a.setStartBefore(t),a.setEndBefore(t)):(a.setStartAfter(t),a.setEndAfter(t)):(a.setStart(t,0),a.setEnd(t,0));l.setRng(a),s.remove(c),l.scrollIntoView(t)}}function b(e){var t=u.forced_root_block;t&&t.toLowerCase()===e.tagName.toLowerCase()&&s.setAttribs(e,u.forced_root_block_attrs)}function C(e){e.innerHTML=i?"":'<br data-mce-bogus="1">'}function x(e){var t=L,n,r,o,a=d.getTextInlineElements();if(e||"TABLE"==U?(n=s.create(e||V),b(n)):n=P.cloneNode(!1),o=n,u.keep_styles!==!1)do if(a[t.nodeName]){if("_mce_caret"==t.id)continue;r=t.cloneNode(!1),s.setAttrib(r,"id",""),n.hasChildNodes()?(r.appendChild(n.firstChild),n.appendChild(r)):(o=r,n.appendChild(r))}while((t=t.parentNode)&&t!=D);return i||(o.innerHTML='<br data-mce-bogus="1">'),n}function w(t){var n,r,i;if(3==L.nodeType&&(t?M>0:M<L.nodeValue.length))return!1;if(L.parentNode==P&&$&&!t)return!0;if(t&&1==L.nodeType&&L==P.firstChild)return!0;if("TABLE"===L.nodeName||L.previousSibling&&"TABLE"==L.previousSibling.nodeName)return $&&!t||!$&&t;for(n=new e(L,P),3==L.nodeType&&(t&&0===M?n.prev():t||M!=L.nodeValue.length||n.next());r=n.current();){if(1===r.nodeType){if(!r.getAttribute("data-mce-bogus")&&(i=r.nodeName.toLowerCase(),f[i]&&"br"!==i))return!1}else if(3===r.nodeType&&!/^[ \t\r\n]*$/.test(r.nodeValue))return!1;t?n.prev():n.next()}return!0}function E(e,t){var n,r,i,a,l,u,c=V||"P";if(r=s.getParent(e,s.isBlock),!r||!h(r)){if(r=r||D,u=r==o.getBody()||m(r)?r.nodeName.toLowerCase():r.parentNode.nodeName.toLowerCase(),!r.hasChildNodes())return n=s.create(c),b(n),r.appendChild(n),A.setStart(n,0),A.setEnd(n,0),n;for(a=e;a.parentNode!=r;)a=a.parentNode;for(;a&&!s.isBlock(a);)i=a,a=a.previousSibling;if(i&&d.isValidChild(u,c.toLowerCase())){for(n=s.create(c),b(n),i.parentNode.insertBefore(n,i),a=i;a&&!s.isBlock(a);)l=a.nextSibling,n.appendChild(a),a=l;A.setStart(e,t),A.setEnd(e,t)}}return e}function N(){function e(e){for(var t=z[e?"firstChild":"lastChild"];t&&1!=t.nodeType;)t=t[e?"nextSibling":"previousSibling"];return t===P}function t(){var e=z.parentNode;return/^(LI|DT|DD)$/.test(e.nodeName)?e:z}if(z!=o.getBody()){var n=z.parentNode.nodeName;/^(OL|UL|LI)$/.test(n)&&(V="LI"),I=V?x(V):s.create("BR"),e(!0)&&e()?"LI"==n?s.insertAfter(I,t()):s.replace(I,z):e(!0)?"LI"==n?(s.insertAfter(I,t()),I.appendChild(s.doc.createTextNode(" ")),I.appendChild(z)):z.parentNode.insertBefore(I,z):e()?(s.insertAfter(I,t()),g(I)):(z=t(),B=A.cloneRange(),B.setStartAfter(P),B.setEndAfter(z),F=B.extractContents(),"LI"==V&&"LI"==F.firstChild.nodeName?(I=F.firstChild,s.insertAfter(F,z)):(s.insertAfter(F,z),s.insertAfter(I,z))),s.remove(P),y(I),c.add()}}function _(){o.execCommand("InsertLineBreak",!1,a)}function S(e){do 3===e.nodeType&&(e.nodeValue=e.nodeValue.replace(/^[\r\n]+/,"")),e=e.firstChild;while(e)}function k(e){var t=s.getRoot(),n,r;for(n=e;n!==t&&"false"!==s.getContentEditable(n);)"true"===s.getContentEditable(n)&&(r=n),n=n.parentNode;return n!==t?r:t}function T(e){var t;i||(e.normalize(),t=e.lastChild,t&&!/^(left|right)$/gi.test(s.getStyle(t,"float",!0))||s.add(e,"br"))}function R(){I=/^(H[1-6]|PRE|FIGURE)$/.test(U)&&"HGROUP"!=W?x(V):x(),u.end_container_on_empty_block&&h(z)&&s.isEmpty(P)?I=s.split(z,P):s.insertAfter(I,P),y(I)}var A,B,D,L,M,P,O,H,I,F,z,U,W,V,$;if(A=l.getRng(!0),!a.isDefaultPrevented()){if(!A.collapsed)return void o.execCommand("Delete");if(new t(s).normalize(A),L=A.startContainer,M=A.startOffset,V=(u.force_p_newlines?"p":"")||u.forced_root_block,V=V?V.toUpperCase():"",O=s.doc.documentMode,H=a.shiftKey,1==L.nodeType&&L.hasChildNodes()&&($=M>L.childNodes.length-1,L=L.childNodes[Math.min(M,L.childNodes.length-1)]||L,M=$&&3==L.nodeType?L.nodeValue.length:0),D=k(L)){if(c.beforeChange(),!s.isBlock(D)&&D!=s.getRoot())return void(V&&!H||_());if((V&&!H||!V&&H)&&(L=E(L,M)),P=s.getParent(L,s.isBlock),z=P?s.getParent(P.parentNode,s.isBlock):null,U=P?P.nodeName.toUpperCase():"",W=z?z.nodeName.toUpperCase():"","LI"!=W||a.ctrlKey||(P=z,U=W),o.undoManager.typing&&(o.undoManager.typing=!1,o.undoManager.add()),/^(LI|DT|DD)$/.test(U)){if(!V&&H)return void _();if(s.isEmpty(P))return void N()}if("PRE"==U&&u.br_in_pre!==!1){if(!H)return void _()}else if(!V&&!H&&"LI"!=U||V&&H)return void _();V&&P===o.getBody()||(V=V||"P",n.isCaretContainerBlock(P)?(I=n.showCaretContainerBlock(P),s.isEmpty(P)&&C(P),y(I)):w()?R():w(!0)?(I=P.parentNode.insertBefore(x(),P),g(I),y(P)):(B=A.cloneRange(),B.setEndAfter(P),F=B.extractContents(),S(F),I=F.firstChild,s.insertAfter(F,P),v(I),T(P),s.isEmpty(P)&&C(P),I.normalize(),s.isEmpty(I)?(s.remove(I),R()):y(I)),s.setAttrib(I,"id",""),o.fire("NewBlock",{newBlock:I}),c.typing=!1,c.add())}}}var s=o.dom,l=o.selection,u=o.settings,c=o.undoManager,d=o.schema,f=d.getNonEmptyElements(),p=d.getMoveCaretBeforeOnEnterElements();o.on("keydown",function(e){13==e.keyCode&&a(e)!==!1&&e.preventDefault()})}}),r(re,[],function(){return function(e){function t(){var t=i.getStart(),s=e.getBody(),l,u,c,d,f,p,h,m=-16777215,g,v,y,b,C;if(C=n.forced_root_block,t&&1===t.nodeType&&C){for(;t&&t!=s;){if(a[t.nodeName])return;t=t.parentNode}if(l=i.getRng(),l.setStart){u=l.startContainer,c=l.startOffset,d=l.endContainer,f=l.endOffset;try{v=e.getDoc().activeElement===s}catch(x){}}else l.item&&(t=l.item(0),l=e.getDoc().body.createTextRange(),l.moveToElementText(t)),v=l.parentElement().ownerDocument===e.getDoc(),y=l.duplicate(),y.collapse(!0),c=y.move("character",m)*-1,y.collapsed||(y=l.duplicate(),y.collapse(!1),f=y.move("character",m)*-1-c);for(t=s.firstChild,b=s.nodeName.toLowerCase();t;)if((3===t.nodeType||1==t.nodeType&&!a[t.nodeName])&&o.isValidChild(b,C.toLowerCase())){if(3===t.nodeType&&0===t.nodeValue.length){h=t,t=t.nextSibling,r.remove(h);continue}p||(p=r.create(C,e.settings.forced_root_block_attrs),t.parentNode.insertBefore(p,t),g=!0),h=t,t=t.nextSibling,p.appendChild(h)}else p=null,t=t.nextSibling;if(g&&v){if(l.setStart)l.setStart(u,c),
+l.setEnd(d,f),i.setRng(l);else try{l=e.getDoc().body.createTextRange(),l.moveToElementText(s),l.collapse(!0),l.moveStart("character",c),f>0&&l.moveEnd("character",f),l.select()}catch(x){}e.nodeChanged()}}}var n=e.settings,r=e.dom,i=e.selection,o=e.schema,a=o.getBlockElements();n.forced_root_block&&e.on("NodeChange",t)}}),r(ie,[z,y,_,$,k,U],function(e,t,n,r,i,o){function a(e){return e>0}function s(e){return e<0}function l(e,t){for(var n;n=e(t);)if(!N(n))return n;return null}function u(e,n,r,i,o){var u=new t(e,i);if(s(n)){if((x(e)||N(e))&&(e=l(u.prev,!0),r(e)))return e;for(;e=l(u.prev,o);)if(r(e))return e}if(a(n)){if((x(e)||N(e))&&(e=l(u.next,!0),r(e)))return e;for(;e=l(u.next,o);)if(r(e))return e}return null}function c(e,t){for(e=e.parentNode;e&&e!=t;e=e.parentNode)if(C(e))return e;return t}function d(e,t){for(;e&&e!=t;){if(w(e))return e;e=e.parentNode}return null}function f(e,t,n){return d(e.container(),n)==d(t.container(),n)}function p(e,t,n){return c(e.container(),n)==c(t.container(),n)}function h(e,t){var n,r;return t?(n=t.container(),r=t.offset(),S(n)?n.childNodes[r+e]:null):null}function m(e,t){var n=t.ownerDocument.createRange();return e?(n.setStartBefore(t),n.setEndBefore(t)):(n.setStartAfter(t),n.setEndAfter(t)),n}function g(e,t,n){return d(t,e)==d(n,e)}function v(e,t,n){var r,i;for(i=e?"previousSibling":"nextSibling";n&&n!=t;){if(r=n[i],E(r)&&(r=r[i]),x(r)){if(g(t,r,n))return r;break}if(k(r))break;n=n.parentNode}return null}function y(e,t,r){var o,a,s,l,u=_(v,!0,t),c=_(v,!1,t);if(a=r.startContainer,s=r.startOffset,i.isCaretContainerBlock(a)){if(S(a)||(a=a.parentNode),l=a.getAttribute("data-mce-caret"),"before"==l&&(o=a.nextSibling,x(o)))return T(o);if("after"==l&&(o=a.previousSibling,x(o)))return R(o)}if(!r.collapsed)return r;if(n.isText(a)){if(E(a)){if(1===e){if(o=c(a))return T(o);if(o=u(a))return R(o)}if(e===-1){if(o=u(a))return R(o);if(o=c(a))return T(o)}return r}if(i.endsWithCaretContainer(a)&&s>=a.data.length-1)return 1===e&&(o=c(a))?T(o):r;if(i.startsWithCaretContainer(a)&&s<=1)return e===-1&&(o=u(a))?R(o):r;if(s===a.data.length)return o=c(a),o?T(o):r;if(0===s)return o=u(a),o?R(o):r}return r}function b(e,t){return x(h(e,t))}var C=n.isContentEditableTrue,x=n.isContentEditableFalse,w=n.matchStyleValues("display","block table table-cell table-caption"),E=i.isCaretContainer,N=i.isCaretContainerBlock,_=e.curry,S=n.isElement,k=o.isCaretCandidate,T=_(m,!0),R=_(m,!1);return{isForwards:a,isBackwards:s,findNode:u,getEditingHost:c,getParentBlock:d,isInSameBlock:f,isInSameEditingHost:p,isBeforeContentEditableFalse:_(b,0),isAfterContentEditableFalse:_(b,-1),normalizeRange:y}}),r(oe,[_,U,$,ie,h,z],function(e,t,n,r,i,o){function a(e,t){for(var n=[];e&&e!=t;)n.push(e),e=e.parentNode;return n}function s(e,t){return e.hasChildNodes()&&t<e.childNodes.length?e.childNodes[t]:null}function l(e,t){if(m(e)){if(v(t.previousSibling)&&!f(t.previousSibling))return n.before(t);if(f(t))return n(t,0)}if(g(e)){if(v(t.nextSibling)&&!f(t.nextSibling))return n.after(t);if(f(t))return n(t,t.data.length)}return g(e)?h(t)?n.before(t):n.after(t):n.before(t)}function u(t,i){var o;return!!e.isBr(t)&&(o=c(1,n.after(t),i),!!o&&!r.isInSameBlock(n.before(t),n.before(o),i))}function c(e,t,h){var C,x,w,E,N,_,S;if(!p(h)||!t)return null;if(S=t,C=S.container(),x=S.offset(),f(C)){if(g(e)&&x>0)return n(C,--x);if(m(e)&&x<C.length)return n(C,++x);w=C}else{if(g(e)&&x>0&&(E=s(C,x-1),v(E)))return!y(E)&&(N=r.findNode(E,e,b,E))?f(N)?n(N,N.data.length):n.after(N):f(E)?n(E,E.data.length):n.before(E);if(m(e)&&x<C.childNodes.length&&(E=s(C,x),v(E)))return u(E,h)?c(e,n.after(E),h):!y(E)&&(N=r.findNode(E,e,b,E))?f(N)?n(N,0):n.before(N):f(E)?n(E,0):n.after(E);w=S.getNode()}return(m(e)&&S.isAtEnd()||g(e)&&S.isAtStart())&&(w=r.findNode(w,e,o.constant(!0),h,!0),b(w))?l(e,w):(E=r.findNode(w,e,b,h),_=i.last(i.filter(a(C,h),d)),!_||E&&_.contains(E)?E?l(e,E):null:S=m(e)?n.after(_):n.before(_))}var d=e.isContentEditableFalse,f=e.isText,p=e.isElement,h=e.isBr,m=r.isForwards,g=r.isBackwards,v=t.isCaretCandidate,y=t.isAtomic,b=t.isEditableCaretCandidate;return function(e){return{next:function(t){return c(1,t,e)},prev:function(t){return c(-1,t,e)}}}}),r(ae,[m,oe,$],function(e,t,n){var r=function(e){var t=e.firstChild,n=e.lastChild;return t&&"meta"===t.name&&(t=t.next),n&&"mce_marker"===n.attr("id")&&(n=n.prev),!(!t||t!==n)&&("ul"===t.name||"ol"===t.name)},i=function(e){var t=e.firstChild,n=e.lastChild;return t&&"META"===t.nodeName&&t.parentNode.removeChild(t),n&&"mce_marker"===n.id&&n.parentNode.removeChild(n),e},o=function(e,t,n){var r=t.serialize(n),o=e.createFragment(r);return i(o)},a=function(t){return e.grep(t.childNodes,function(e){return"LI"===e.nodeName})},s=function(e){return!e.firstChild},l=function(e){return e.length>0&&s(e[e.length-1])?e.slice(0,-1):e},u=function(e,t){var n=e.getParent(t,e.isBlock);return n&&"LI"===n.nodeName?n:null},c=function(e,t){return!!u(e,t)},d=function(e,t){var n=t.cloneRange(),r=t.cloneRange();return n.setStartBefore(e),r.setEndAfter(e),[n.cloneContents(),r.cloneContents()]},f=function(e,r){var i=n.before(e),o=new t(r),a=o.next(i);return a?a.toRange():null},p=function(e,r){var i=n.after(e),o=new t(r),a=o.prev(i);return a?a.toRange():null},h=function(t,n,r,i){var o=d(t,i),a=t.parentNode;return a.insertBefore(o[0],t),e.each(n,function(e){a.insertBefore(e,t)}),a.insertBefore(o[1],t),a.removeChild(t),p(n[n.length-1],r)},m=function(t,n,r){var i=t.parentNode;return e.each(n,function(e){i.insertBefore(e,t)}),f(t,r)},g=function(e,t,n,r){return r.insertAfter(t.reverse(),e),p(t[0],n)},v=function(e,r,i,s){var c=o(r,e,s),d=u(r,i.startContainer),f=l(a(c.firstChild)),p=1,v=2,y=r.getRoot(),b=function(e){var o=n.fromRangeStart(i),a=new t(r.getRoot()),s=e===p?a.prev(o):a.next(o);return!s||u(r,s.getNode())!==d};return b(p)?m(d,f,y):b(v)?g(d,f,y,r):h(d,f,y,i)};return{isListFragment:r,insertAtCaret:v,isParentBlockLi:c,trimListItems:l,listItems:a}}),r(se,[d,m,P,oe,$,X,_,ae],function(e,t,n,r,i,o,a,s){var l=a.matchNodeNames("td th"),u=function(e,t,n){if("all"===n.getAttribute("data-mce-bogus"))n.parentNode.insertBefore(e.dom.createFragment(t),n);else{var r=n.firstChild,i=n.lastChild;!r||r===i&&"BR"===r.nodeName?e.dom.setHTML(n,t):e.selection.setContent(t)}},c=function(a,c,d){function f(e){function t(e){return r[e]&&3==r[e].nodeType}var n,r,i;return n=L.getRng(!0),r=n.startContainer,i=n.startOffset,3==r.nodeType&&(i>0?e=e.replace(/^&nbsp;/," "):t("previousSibling")||(e=e.replace(/^ /,"&nbsp;")),i<r.length?e=e.replace(/&nbsp;(<br>|)$/," "):t("nextSibling")||(e=e.replace(/(&nbsp;| )(<br>|)$/,"&nbsp;"))),e}function p(){var e,t,n;e=L.getRng(!0),t=e.startContainer,n=e.startOffset,3==t.nodeType&&e.collapsed&&("\xa0"===t.data[n]?(t.deleteData(n,1),/[\u00a0| ]$/.test(c)||(c+=" ")):"\xa0"===t.data[n-1]&&(t.deleteData(n-1,1),/[\u00a0| ]$/.test(c)||(c=" "+c)))}function h(){if(B){var e=a.getBody(),n=new o(M);t.each(M.select("*[data-mce-fragment]"),function(t){for(var r=t.parentNode;r&&r!=e;r=r.parentNode)D[t.nodeName.toLowerCase()]&&n.compare(r,t)&&M.remove(t,!0)})}}function m(e){for(var t=e;t=t.walk();)1===t.type&&t.attr("data-mce-fragment","1")}function g(e){t.each(e.getElementsByTagName("*"),function(e){e.removeAttribute("data-mce-fragment")})}function v(e){return!!e.getAttribute("data-mce-fragment")}function y(e){return e&&!a.schema.getShortEndedElements()[e.nodeName]}function b(t){function n(e){for(var t=a.getBody();e&&e!==t;e=e.parentNode)if("false"===a.dom.getContentEditable(e))return e;return null}function o(e){var t=i.fromRangeStart(e),n=new r(a.getBody());if(t=n.next(t))return t.toRange()}var s,u,c;if(t){if(L.scrollIntoView(t),s=n(t))return M.remove(t),void L.select(s);k=M.createRng(),T=t.previousSibling,T&&3==T.nodeType?(k.setStart(T,T.nodeValue.length),e.ie||(R=t.nextSibling,R&&3==R.nodeType&&(T.appendData(R.data),R.parentNode.removeChild(R)))):(k.setStartBefore(t),k.setEndBefore(t)),u=M.getParent(t,M.isBlock),M.remove(t),u&&M.isEmpty(u)&&(a.$(u).empty(),k.setStart(u,0),k.setEnd(u,0),l(u)||v(u)||!(c=o(k))?M.add(u,M.create("br",{"data-mce-bogus":"1"})):(k=c,M.remove(u))),L.setRng(k)}}var C,x,w,E,N,_,S,k,T,R,A,B,D=a.schema.getTextInlineElements(),L=a.selection,M=a.dom;/^ | $/.test(c)&&(c=f(c)),C=a.parser,B=d.merge,x=new n({validate:a.settings.validate},a.schema),A='<span id="mce_marker" data-mce-type="bookmark">&#xFEFF;&#x200B;</span>',_={content:c,format:"html",selection:!0},a.fire("BeforeSetContent",_),c=_.content,c.indexOf("{$caret}")==-1&&(c+="{$caret}"),c=c.replace(/\{\$caret\}/,A),k=L.getRng();var P=k.startContainer||(k.parentElement?k.parentElement():null),O=a.getBody();P===O&&L.isCollapsed()&&M.isBlock(O.firstChild)&&y(O.firstChild)&&M.isEmpty(O.firstChild)&&(k=M.createRng(),k.setStart(O.firstChild,0),k.setEnd(O.firstChild,0),L.setRng(k)),L.isCollapsed()||(a.selection.setRng(a.selection.getRng()),a.getDoc().execCommand("Delete",!1,null),p()),w=L.getNode();var H={context:w.nodeName.toLowerCase(),data:d.data};if(N=C.parse(c,H),d.paste===!0&&s.isListFragment(N)&&s.isParentBlockLi(M,w))return k=s.insertAtCaret(x,M,a.selection.getRng(!0),N),a.selection.setRng(k),void a.fire("SetContent",_);if(m(N),T=N.lastChild,"mce_marker"==T.attr("id"))for(S=T,T=T.prev;T;T=T.walk(!0))if(3==T.type||!M.isBlock(T.name)){a.schema.isValidChild(T.parent.name,"span")&&T.parent.insert(S,T,"br"===T.name);break}if(a._selectionOverrides.showBlockCaretContainer(w),H.invalid){for(L.setContent(A),w=L.getNode(),E=a.getBody(),9==w.nodeType?w=T=E:T=w;T!==E;)w=T,T=T.parentNode;c=w==E?E.innerHTML:M.getOuterHTML(w),c=x.serialize(C.parse(c.replace(/<span (id="mce_marker"|id=mce_marker).+?<\/span>/i,function(){return x.serialize(N)}))),w==E?M.setHTML(E,c):M.setOuterHTML(w,c)}else c=x.serialize(N),u(a,c,w);h(),b(M.get("mce_marker")),g(a.getBody()),a.fire("SetContent",_),a.addVisual()},d=function(e){var n;return"string"!=typeof e?(n=t.extend({paste:e.paste,data:{paste:e.paste}},e),{content:e.content,details:n}):{content:e,details:{}}},f=function(e,t){var n=d(t);c(e,n.content,n.details)};return{insertAtCaret:f}}),r(le,[d,m,T,y,se,_],function(e,n,r,i,o,a){var s=n.each,l=n.extend,u=n.map,c=n.inArray,d=n.explode,f=e.ie&&e.ie<11,p=!0,h=!1;return function(n){function m(e,t,r,i){var o,a,l=0;if(/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint)$/.test(e)||i&&i.skip_focus||n.focus(),i=n.fire("BeforeExecCommand",{command:e,ui:t,value:r}),i.isDefaultPrevented())return!1;if(a=e.toLowerCase(),o=D.exec[a])return o(a,t,r),n.fire("ExecCommand",{command:e,ui:t,value:r}),!0;if(s(n.plugins,function(i){if(i.execCommand&&i.execCommand(e,t,r))return n.fire("ExecCommand",{command:e,ui:t,value:r}),l=!0,!1}),l)return l;if(n.theme&&n.theme.execCommand&&n.theme.execCommand(e,t,r))return n.fire("ExecCommand",{command:e,ui:t,value:r}),!0;try{l=n.getDoc().execCommand(e,t,r)}catch(u){}return!!l&&(n.fire("ExecCommand",{command:e,ui:t,value:r}),!0)}function g(e){var t;if(!n.quirks.isHidden()){if(e=e.toLowerCase(),t=D.state[e])return t(e);try{return n.getDoc().queryCommandState(e)}catch(r){}return!1}}function v(e){var t;if(!n.quirks.isHidden()){if(e=e.toLowerCase(),t=D.value[e])return t(e);try{return n.getDoc().queryCommandValue(e)}catch(r){}}}function y(e,t){t=t||"exec",s(e,function(e,n){s(n.toLowerCase().split(","),function(n){D[t][n]=e})})}function b(e,t,r){e=e.toLowerCase(),D.exec[e]=function(e,i,o,a){return t.call(r||n,i,o,a)}}function C(e){if(e=e.toLowerCase(),D.exec[e])return!0;try{return n.getDoc().queryCommandSupported(e)}catch(t){}return!1}function x(e,t,r){e=e.toLowerCase(),D.state[e]=function(){return t.call(r||n)}}function w(e,t,r){e=e.toLowerCase(),D.value[e]=function(){return t.call(r||n)}}function E(e){return e=e.toLowerCase(),!!D.exec[e]}function N(e,r,i){return r===t&&(r=h),i===t&&(i=null),n.getDoc().execCommand(e,r,i)}function _(e){return B.match(e)}function S(e,r){B.toggle(e,r?{value:r}:t),n.nodeChanged()}function k(e){M=A.getBookmark(e)}function T(){A.moveToBookmark(M)}var R,A,B,D={state:{},exec:{},value:{}},L=n.settings,M;n.on("PreInit",function(){R=n.dom,A=n.selection,L=n.settings,B=n.formatter}),l(this,{execCommand:m,queryCommandState:g,queryCommandValue:v,queryCommandSupported:C,addCommands:y,addCommand:b,addQueryStateHandler:x,addQueryValueHandler:w,hasCustomCommand:E}),y({"mceResetDesignMode,mceBeginUndoLevel":function(){},"mceEndUndoLevel,mceAddUndoLevel":function(){n.undoManager.add()},"Cut,Copy,Paste":function(t){var r=n.getDoc(),i;try{N(t)}catch(o){i=p}if("paste"!==t||r.queryCommandEnabled(t)||(i=!0),i||!r.queryCommandSupported(t)){var a=n.translate("Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.");e.mac&&(a=a.replace(/Ctrl\+/g,"\u2318+")),n.notificationManager.open({text:a,type:"error"})}},unlink:function(){if(A.isCollapsed()){var e=n.dom.getParent(n.selection.getStart(),"a");return void(e&&n.dom.remove(e,!0))}B.remove("link")},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull,JustifyNone":function(e){var t=e.substring(7);"full"==t&&(t="justify"),s("left,center,right,justify".split(","),function(e){t!=e&&B.remove("align"+e)}),"none"!=t&&S("align"+t)},"InsertUnorderedList,InsertOrderedList":function(e){var t,n;N(e),t=R.getParent(A.getNode(),"ol,ul"),t&&(n=t.parentNode,/^(H[1-6]|P|ADDRESS|PRE)$/.test(n.nodeName)&&(k(),R.split(n,t),T()))},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(e){S(e)},"ForeColor,HiliteColor,FontName":function(e,t,n){S(e,n)},FontSize:function(e,t,n){var r,i;n>=1&&n<=7&&(i=d(L.font_size_style_values),r=d(L.font_size_classes),n=r?r[n-1]||n:i[n-1]||n),S(e,n)},RemoveFormat:function(e){B.remove(e)},mceBlockQuote:function(){S("blockquote")},FormatBlock:function(e,t,n){return S(n||"p")},mceCleanup:function(){var e=A.getBookmark();n.setContent(n.getContent({cleanup:p}),{cleanup:p}),A.moveToBookmark(e)},mceRemoveNode:function(e,t,r){var i=r||A.getNode();i!=n.getBody()&&(k(),n.dom.remove(i,p),T())},mceSelectNodeDepth:function(e,t,r){var i=0;R.getParent(A.getNode(),function(e){if(1==e.nodeType&&i++==r)return A.select(e),h},n.getBody())},mceSelectNode:function(e,t,n){A.select(n)},mceInsertContent:function(e,t,r){o.insertAtCaret(n,r)},mceInsertRawHTML:function(e,t,r){A.setContent("tiny_mce_marker"),n.setContent(n.getContent().replace(/tiny_mce_marker/g,function(){return r}))},mceToggleFormat:function(e,t,n){S(n)},mceSetContent:function(e,t,r){n.setContent(r)},"Indent,Outdent":function(e){var t,r,i;t=L.indentation,r=/[a-z%]+$/i.exec(t),t=parseInt(t,10),g("InsertUnorderedList")||g("InsertOrderedList")?N(e):(L.forced_root_block||R.getParent(A.getNode(),R.isBlock)||B.apply("div"),s(A.getSelectedBlocks(),function(o){if("false"!==R.getContentEditable(o)&&"LI"!==o.nodeName){var a=n.getParam("indent_use_margin",!1)?"margin":"padding";a="TABLE"===o.nodeName?"margin":a,a+="rtl"==R.getStyle(o,"direction",!0)?"Right":"Left","outdent"==e?(i=Math.max(0,parseInt(o.style[a]||0,10)-t),R.setStyle(o,a,i?i+r:"")):(i=parseInt(o.style[a]||0,10)+t+r,R.setStyle(o,a,i))}}))},mceRepaint:function(){},InsertHorizontalRule:function(){n.execCommand("mceInsertContent",!1,"<hr />")},mceToggleVisualAid:function(){n.hasVisual=!n.hasVisual,n.addVisual()},mceReplaceContent:function(e,t,r){n.execCommand("mceInsertContent",!1,r.replace(/\{\$selection\}/g,A.getContent({format:"text"})))},mceInsertLink:function(e,t,n){var r;"string"==typeof n&&(n={href:n}),r=R.getParent(A.getNode(),"a"),n.href=n.href.replace(" ","%20"),r&&n.href||B.remove("link"),n.href&&B.apply("link",n,r)},selectAll:function(){var e=R.getRoot(),t;if(A.getRng().setStart){var n=R.getParent(A.getStart(),a.isContentEditableTrue);n&&(t=R.createRng(),t.selectNodeContents(n),A.setRng(t))}else t=A.getRng(),t.item||(t.moveToElementText(e),t.select())},"delete":function(){N("Delete");var e=n.getBody();R.isEmpty(e)&&(n.setContent(""),e.firstChild&&R.isBlock(e.firstChild)?n.selection.setCursorLocation(e.firstChild,0):n.selection.setCursorLocation(e,0))},mceNewDocument:function(){n.setContent("")},InsertLineBreak:function(e,t,o){function a(){for(var e=new i(m,v),t,r=n.schema.getNonEmptyElements();t=e.next();)if(r[t.nodeName.toLowerCase()]||t.length>0)return!0}var s=o,l,u,c,d=A.getRng(!0);new r(R).normalize(d);var h=d.startOffset,m=d.startContainer;if(1==m.nodeType&&m.hasChildNodes()){var g=h>m.childNodes.length-1;m=m.childNodes[Math.min(h,m.childNodes.length-1)]||m,h=g&&3==m.nodeType?m.nodeValue.length:0}var v=R.getParent(m,R.isBlock),y=v?v.nodeName.toUpperCase():"",b=v?R.getParent(v.parentNode,R.isBlock):null,C=b?b.nodeName.toUpperCase():"",x=s&&s.ctrlKey;"LI"!=C||x||(v=b,y=C),m&&3==m.nodeType&&h>=m.nodeValue.length&&(f||a()||(l=R.create("br"),d.insertNode(l),d.setStartAfter(l),d.setEndAfter(l),u=!0)),l=R.create("br"),d.insertNode(l);var w=R.doc.documentMode;return f&&"PRE"==y&&(!w||w<8)&&l.parentNode.insertBefore(R.doc.createTextNode("\r"),l),c=R.create("span",{},"&nbsp;"),l.parentNode.insertBefore(c,l),A.scrollIntoView(c),R.remove(c),u?(d.setStartBefore(l),d.setEndBefore(l)):(d.setStartAfter(l),d.setEndAfter(l)),A.setRng(d),n.undoManager.add(),p}}),y({"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(e){var t="align"+e.substring(7),n=A.isCollapsed()?[R.getParent(A.getNode(),R.isBlock)]:A.getSelectedBlocks(),r=u(n,function(e){return!!B.matchNode(e,t)});return c(r,p)!==-1},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(e){return _(e)},mceBlockQuote:function(){return _("blockquote")},Outdent:function(){var e;if(L.inline_styles){if((e=R.getParent(A.getStart(),R.isBlock))&&parseInt(e.style.paddingLeft,10)>0)return p;if((e=R.getParent(A.getEnd(),R.isBlock))&&parseInt(e.style.paddingLeft,10)>0)return p}return g("InsertUnorderedList")||g("InsertOrderedList")||!L.inline_styles&&!!R.getParent(A.getNode(),"BLOCKQUOTE")},"InsertUnorderedList,InsertOrderedList":function(e){var t=R.getParent(A.getNode(),"ul,ol");return t&&("insertunorderedlist"===e&&"UL"===t.tagName||"insertorderedlist"===e&&"OL"===t.tagName)}},"state"),y({"FontSize,FontName":function(e){var t=0,n;return(n=R.getParent(A.getNode(),"span"))&&(t="fontsize"==e?n.style.fontSize:n.style.fontFamily.replace(/, /g,",").replace(/[\'\"]/g,"").toLowerCase()),t}},"value"),y({Undo:function(){n.undoManager.undo()},Redo:function(){n.undoManager.redo()}})}}),r(ue,[m],function(e){function t(e,o){var a=this,s,l;if(e=r(e),o=a.settings=o||{},s=o.base_uri,/^([\w\-]+):([^\/]{2})/i.test(e)||/^\s*#/.test(e))return void(a.source=e);var u=0===e.indexOf("//");0!==e.indexOf("/")||u||(e=(s?s.protocol||"http":"http")+"://mce_host"+e),/^[\w\-]*:?\/\//.test(e)||(l=o.base_uri?o.base_uri.path:new t(location.href).directory,""===o.base_uri.protocol?e="//mce_host"+a.toAbsPath(l,e):(e=/([^#?]*)([#?]?.*)/.exec(e),e=(s&&s.protocol||"http")+"://mce_host"+a.toAbsPath(l,e[1])+e[2])),e=e.replace(/@@/g,"(mce_at)"),e=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(e),n(i,function(t,n){var r=e[n];r&&(r=r.replace(/\(mce_at\)/g,"@@")),a[t]=r}),s&&(a.protocol||(a.protocol=s.protocol),a.userInfo||(a.userInfo=s.userInfo),a.port||"mce_host"!==a.host||(a.port=s.port),a.host&&"mce_host"!==a.host||(a.host=s.host),a.source=""),u&&(a.protocol="")}var n=e.each,r=e.trim,i="source protocol authority userInfo user password host port relative path directory file query anchor".split(" "),o={ftp:21,http:80,https:443,mailto:25};return t.prototype={setPath:function(e){var t=this;e=/^(.*?)\/?(\w+)?$/.exec(e),t.path=e[0],t.directory=e[1],t.file=e[2],t.source="",t.getURI()},toRelative:function(e){var n=this,r;if("./"===e)return e;if(e=new t(e,{base_uri:n}),"mce_host"!=e.host&&n.host!=e.host&&e.host||n.port!=e.port||n.protocol!=e.protocol&&""!==e.protocol)return e.getURI();var i=n.getURI(),o=e.getURI();return i==o||"/"==i.charAt(i.length-1)&&i.substr(0,i.length-1)==o?i:(r=n.toRelPath(n.path,e.path),e.query&&(r+="?"+e.query),e.anchor&&(r+="#"+e.anchor),r)},toAbsolute:function(e,n){return e=new t(e,{base_uri:this}),e.getURI(n&&this.isSameOrigin(e))},isSameOrigin:function(e){if(this.host==e.host&&this.protocol==e.protocol){if(this.port==e.port)return!0;var t=o[this.protocol];if(t&&(this.port||t)==(e.port||t))return!0}return!1},toRelPath:function(e,t){var n,r=0,i="",o,a;if(e=e.substring(0,e.lastIndexOf("/")),e=e.split("/"),n=t.split("/"),e.length>=n.length)for(o=0,a=e.length;o<a;o++)if(o>=n.length||e[o]!=n[o]){r=o+1;break}if(e.length<n.length)for(o=0,a=n.length;o<a;o++)if(o>=e.length||e[o]!=n[o]){r=o+1;break}if(1===r)return t;for(o=0,a=e.length-(r-1);o<a;o++)i+="../";for(o=r-1,a=n.length;o<a;o++)i+=o!=r-1?"/"+n[o]:n[o];return i},toAbsPath:function(e,t){var r,i=0,o=[],a,s;for(a=/\/$/.test(t)?"/":"",e=e.split("/"),t=t.split("/"),n(e,function(e){e&&o.push(e)}),e=o,r=t.length-1,o=[];r>=0;r--)0!==t[r].length&&"."!==t[r]&&(".."!==t[r]?i>0?i--:o.push(t[r]):i++);return r=e.length-i,s=r<=0?o.reverse().join("/"):e.slice(0,r).join("/")+"/"+o.reverse().join("/"),0!==s.indexOf("/")&&(s="/"+s),a&&s.lastIndexOf("/")!==s.length-1&&(s+=a),s},getURI:function(e){var t,n=this;return n.source&&!e||(t="",e||(t+=n.protocol?n.protocol+"://":"//",n.userInfo&&(t+=n.userInfo+"@"),n.host&&(t+=n.host),n.port&&(t+=":"+n.port)),n.path&&(t+=n.path),n.query&&(t+="?"+n.query),n.anchor&&(t+="#"+n.anchor),n.source=t),n.source}},t.parseDataUri=function(e){var t,n;return e=decodeURIComponent(e).split(","),n=/data:([^;]+)/.exec(e[0]),n&&(t=n[1]),{type:t,data:e[1]}},t.getDocumentBaseUrl=function(e){var t;return t=0!==e.protocol.indexOf("http")&&"file:"!==e.protocol?e.href:e.protocol+"//"+e.host+e.pathname,/^[^:]+:\/\/\/?[^\/]+\//.test(t)&&(t=t.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(t)||(t+="/")),t},t}),r(ce,[m],function(e){function t(){}var n=e.each,r=e.extend,i,o;return t.extend=i=function(e){function t(){var e,t,n,r=this;if(!o&&(r.init&&r.init.apply(r,arguments),t=r.Mixins))for(e=t.length;e--;)n=t[e],n.init&&n.init.apply(r,arguments)}function a(){return this}function s(e,t){return function(){var n=this,r=n._super,i;return n._super=u[e],i=t.apply(n,arguments),n._super=r,i}}var l=this,u=l.prototype,c,d,f;o=!0,c=new l,o=!1,e.Mixins&&(n(e.Mixins,function(t){for(var n in t)"init"!==n&&(e[n]=t[n])}),u.Mixins&&(e.Mixins=u.Mixins.concat(e.Mixins))),e.Methods&&n(e.Methods.split(","),function(t){e[t]=a}),e.Properties&&n(e.Properties.split(","),function(t){var n="_"+t;e[t]=function(e){var t=this,r;return e!==r?(t[n]=e,t):t[n]}}),e.Statics&&n(e.Statics,function(e,n){t[n]=e}),e.Defaults&&u.Defaults&&(e.Defaults=r({},u.Defaults,e.Defaults));for(d in e)f=e[d],"function"==typeof f&&u[d]?c[d]=s(d,f):c[d]=f;return t.prototype=c,t.constructor=t,t.extend=i,t},t}),r(de,[m],function(e){function t(t){function n(){return!1}function r(){return!0}function i(e,i){var o,s,l,u;if(e=e.toLowerCase(),i=i||{},i.type=e,i.target||(i.target=c),i.preventDefault||(i.preventDefault=function(){i.isDefaultPrevented=r},i.stopPropagation=function(){i.isPropagationStopped=r},i.stopImmediatePropagation=function(){i.isImmediatePropagationStopped=r},i.isDefaultPrevented=n,i.isPropagationStopped=n,i.isImmediatePropagationStopped=n),t.beforeFire&&t.beforeFire(i),o=d[e])for(s=0,l=o.length;s<l;s++){if(u=o[s],u.once&&a(e,u.func),i.isImmediatePropagationStopped())return i.stopPropagation(),i;if(u.func.call(c,i)===!1)return i.preventDefault(),i}return i}function o(t,r,i,o){var a,s,l;if(r===!1&&(r=n),r)for(r={func:r},o&&e.extend(r,o),s=t.toLowerCase().split(" "),l=s.length;l--;)t=s[l],a=d[t],a||(a=d[t]=[],f(t,!0)),i?a.unshift(r):a.push(r);return u}function a(e,t){var n,r,i,o,a;if(e)for(o=e.toLowerCase().split(" "),n=o.length;n--;){if(e=o[n],r=d[e],!e){for(i in d)f(i,!1),delete d[i];return u}if(r){if(t)for(a=r.length;a--;)r[a].func===t&&(r=r.slice(0,a).concat(r.slice(a+1)),d[e]=r);else r.length=0;r.length||(f(e,!1),delete d[e])}}else{for(e in d)f(e,!1);d={}}return u}function s(e,t,n){return o(e,t,n,{once:!0})}function l(e){return e=e.toLowerCase(),!(!d[e]||0===d[e].length)}var u=this,c,d={},f;t=t||{},c=t.scope||u,f=t.toggleEvent||n,u.fire=i,u.on=o,u.off=a,u.once=s,u.has=l}var n=e.makeMap("focus blur focusin focusout click dblclick mousedown mouseup mousemove mouseover beforepaste paste cut copy selectionchange mouseout mouseenter mouseleave wheel keydown keypress keyup input contextmenu dragstart dragend dragover draggesture dragdrop drop drag submit compositionstart compositionend compositionupdate touchstart touchmove touchend"," ");return t.isNative=function(e){return!!n[e.toLowerCase()]},t}),r(fe,[],function(){function e(e){this.create=e.create}return e.create=function(t,n){return new e({create:function(e,r){function i(t){e.set(r,t.value)}function o(e){t.set(n,e.value)}var a;return e.on("change:"+r,o),t.on("change:"+n,i),a=e._bindings,a||(a=e._bindings=[],e.on("destroy",function(){for(var e=a.length;e--;)a[e]()})),a.push(function(){t.off("change:"+n,i)}),t.get(n)}})},e}),r(pe,[de],function(e){function t(t){return t._eventDispatcher||(t._eventDispatcher=new e({scope:t,toggleEvent:function(n,r){e.isNative(n)&&t.toggleNativeEvent&&t.toggleNativeEvent(n,r)}})),t._eventDispatcher}return{fire:function(e,n,r){var i=this;if(i.removed&&"remove"!==e)return n;if(n=t(i).fire(e,n,r),r!==!1&&i.parent)for(var o=i.parent();o&&!n.isPropagationStopped();)o.fire(e,n,!1),o=o.parent();return n},on:function(e,n,r){return t(this).on(e,n,r)},off:function(e,n){return t(this).off(e,n)},once:function(e,n){return t(this).once(e,n)},hasEventListeners:function(e){return t(this).has(e)}}}),r(he,[fe,pe,ce,m],function(e,t,n,r){function i(e){return e.nodeType>0}function o(e,t){var n,a;if(e===t)return!0;if(null===e||null===t)return e===t;if("object"!=typeof e||"object"!=typeof t)return e===t;if(r.isArray(t)){if(e.length!==t.length)return!1;for(n=e.length;n--;)if(!o(e[n],t[n]))return!1}if(i(e)||i(t))return e===t;a={};for(n in t){if(!o(e[n],t[n]))return!1;a[n]=!0}for(n in e)if(!a[n]&&!o(e[n],t[n]))return!1;return!0}return n.extend({Mixins:[t],init:function(t){var n,r;t=t||{};for(n in t)r=t[n],r instanceof e&&(t[n]=r.create(this,n));this.data=t},set:function(t,n){var r,i,a=this.data[t];if(n instanceof e&&(n=n.create(this,t)),"object"==typeof t){for(r in t)this.set(r,t[r]);return this}return o(a,n)||(this.data[t]=n,i={target:this,name:t,value:n,oldValue:a},this.fire("change:"+t,i),this.fire("change",i)),this},get:function(e){return this.data[e]},has:function(e){return e in this.data},bind:function(t){return e.create(this,t)},destroy:function(){this.fire("destroy")}})}),r(me,[ce],function(e){function t(e){for(var t=[],n=e.length,r;n--;)r=e[n],r.__checked||(t.push(r),r.__checked=1);for(n=t.length;n--;)delete t[n].__checked;return t}var n=/^([\w\\*]+)?(?:#([\w\-\\]+))?(?:\.([\w\\\.]+))?(?:\[\@?([\w\\]+)([\^\$\*!~]?=)([\w\\]+)\])?(?:\:(.+))?/i,r=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,i=/^\s*|\s*$/g,o,a=e.extend({init:function(e){function t(e){if(e)return e=e.toLowerCase(),function(t){return"*"===e||t.type===e}}function o(e){if(e)return function(t){return t._name===e}}function a(e){if(e)return e=e.split("."),function(t){for(var n=e.length;n--;)if(!t.classes.contains(e[n]))return!1;return!0}}function s(e,t,n){if(e)return function(r){var i=r[e]?r[e]():"";return t?"="===t?i===n:"*="===t?i.indexOf(n)>=0:"~="===t?(" "+i+" ").indexOf(" "+n+" ")>=0:"!="===t?i!=n:"^="===t?0===i.indexOf(n):"$="===t&&i.substr(i.length-n.length)===n:!!n}}function l(e){var t;if(e)return e=/(?:not\((.+)\))|(.+)/i.exec(e),e[1]?(t=c(e[1],[]),function(e){return!d(e,t)}):(e=e[2],function(t,n,r){return"first"===e?0===n:"last"===e?n===r-1:"even"===e?n%2===0:"odd"===e?n%2===1:!!t[e]&&t[e]()})}function u(e,r,u){function c(e){e&&r.push(e)}var d;return d=n.exec(e.replace(i,"")),c(t(d[1])),c(o(d[2])),c(a(d[3])),c(s(d[4],d[5],d[6])),c(l(d[7])),r.pseudo=!!d[7],r.direct=u,r}function c(e,t){var n=[],i,o,a;do if(r.exec(""),o=r.exec(e),o&&(e=o[3],n.push(o[1]),o[2])){i=o[3];break}while(o);for(i&&c(i,t),e=[],a=0;a<n.length;a++)">"!=n[a]&&e.push(u(n[a],[],">"===n[a-1]));return t.push(e),t}var d=this.match;this._selectors=c(e,[])},match:function(e,t){var n,r,i,o,a,s,l,u,c,d,f,p,h;for(t=t||this._selectors,n=0,r=t.length;n<r;n++){for(a=t[n],o=a.length,h=e,p=0,i=o-1;i>=0;i--)for(u=a[i];h;){if(u.pseudo)for(f=h.parent().items(),c=d=f.length;c--&&f[c]!==h;);for(s=0,l=u.length;s<l;s++)if(!u[s](h,c,d)){s=l+1;break}if(s===l){p++;break}if(i===o-1)break;h=h.parent()}if(p===o)return!0}return!1},find:function(e){function n(e,t,i){var o,a,s,l,u,c=t[i];for(o=0,a=e.length;o<a;o++){for(u=e[o],s=0,l=c.length;s<l;s++)if(!c[s](u,o,a)){s=l+1;break}if(s===l)i==t.length-1?r.push(u):u.items&&n(u.items(),t,i+1);else if(c.direct)return;u.items&&n(u.items(),t,i)}}var r=[],i,s,l=this._selectors;if(e.items){for(i=0,s=l.length;i<s;i++)n(e.items(),l[i],0);s>1&&(r=t(r))}return o||(o=a.Collection),new o(r)}});return a}),r(ge,[m,me,ce],function(e,t,n){var r,i,o=Array.prototype.push,a=Array.prototype.slice;return i={length:0,init:function(e){e&&this.add(e)},add:function(t){var n=this;return e.isArray(t)?o.apply(n,t):t instanceof r?n.add(t.toArray()):o.call(n,t),n},set:function(e){var t=this,n=t.length,r;for(t.length=0,t.add(e),r=t.length;r<n;r++)delete t[r];return t},filter:function(e){var n=this,i,o,a=[],s,l;for("string"==typeof e?(e=new t(e),l=function(t){return e.match(t)}):l=e,i=0,o=n.length;i<o;i++)s=n[i],l(s)&&a.push(s);return new r(a)},slice:function(){return new r(a.apply(this,arguments))},eq:function(e){return e===-1?this.slice(e):this.slice(e,+e+1)},each:function(t){return e.each(this,t),this},toArray:function(){return e.toArray(this)},indexOf:function(e){for(var t=this,n=t.length;n--&&t[n]!==e;);return n},reverse:function(){return new r(e.toArray(this).reverse())},hasClass:function(e){return!!this[0]&&this[0].classes.contains(e)},prop:function(e,t){var n=this,r,i;return t!==r?(n.each(function(n){n[e]&&n[e](t)}),n):(i=n[0],i&&i[e]?i[e]():void 0)},exec:function(t){var n=this,r=e.toArray(arguments).slice(1);return n.each(function(e){e[t]&&e[t].apply(e,r)}),n},remove:function(){for(var e=this.length;e--;)this[e].remove();return this},addClass:function(e){return this.each(function(t){t.classes.add(e)})},removeClass:function(e){return this.each(function(t){t.classes.remove(e)})}},e.each("fire on off show hide append prepend before after reflow".split(" "),function(t){i[t]=function(){var n=e.toArray(arguments);return this.each(function(e){t in e&&e[t].apply(e,n)}),this}}),e.each("text name disabled active selected checked visible parent value data".split(" "),function(e){i[e]=function(t){return this.prop(e,t)}}),r=n.extend(i),t.Collection=r,r}),r(ve,[d,m,w],function(e,t,n){var r=0,i={id:function(){return"mceu_"+r++},create:function(e,r,i){var o=document.createElement(e);return n.DOM.setAttribs(o,r),"string"==typeof i?o.innerHTML=i:t.each(i,function(e){e.nodeType&&o.appendChild(e)}),o},createFragment:function(e){return n.DOM.createFragment(e)},getWindowSize:function(){return n.DOM.getViewPort()},getSize:function(e){var t,n;if(e.getBoundingClientRect){var r=e.getBoundingClientRect();t=Math.max(r.width||r.right-r.left,e.offsetWidth),n=Math.max(r.height||r.bottom-r.bottom,e.offsetHeight)}else t=e.offsetWidth,n=e.offsetHeight;return{width:t,height:n}},getPos:function(e,t){return n.DOM.getPos(e,t||i.getContainer())},getContainer:function(){return e.container?e.container:document.body},getViewPort:function(e){return n.DOM.getViewPort(e)},get:function(e){return document.getElementById(e)},addClass:function(e,t){return n.DOM.addClass(e,t)},removeClass:function(e,t){return n.DOM.removeClass(e,t)},hasClass:function(e,t){return n.DOM.hasClass(e,t)},toggleClass:function(e,t,r){return n.DOM.toggleClass(e,t,r)},css:function(e,t,r){return n.DOM.setStyle(e,t,r)},getRuntimeStyle:function(e,t){return n.DOM.getStyle(e,t,!0)},on:function(e,t,r,i){return n.DOM.bind(e,t,r,i)},off:function(e,t,r){return n.DOM.unbind(e,t,r)},fire:function(e,t,r){return n.DOM.fire(e,t,r)},innerHtml:function(e,t){
+n.DOM.setHTML(e,t)}};return i}),r(ye,[],function(){return{parseBox:function(e){var t,n=10;if(e)return"number"==typeof e?(e=e||0,{top:e,left:e,bottom:e,right:e}):(e=e.split(" "),t=e.length,1===t?e[1]=e[2]=e[3]=e[0]:2===t?(e[2]=e[0],e[3]=e[1]):3===t&&(e[3]=e[1]),{top:parseInt(e[0],n)||0,right:parseInt(e[1],n)||0,bottom:parseInt(e[2],n)||0,left:parseInt(e[3],n)||0})},measureBox:function(e,t){function n(t){var n=document.defaultView;return n?(t=t.replace(/[A-Z]/g,function(e){return"-"+e}),n.getComputedStyle(e,null).getPropertyValue(t)):e.currentStyle[t]}function r(e){var t=parseFloat(n(e),10);return isNaN(t)?0:t}return{top:r(t+"TopWidth"),right:r(t+"RightWidth"),bottom:r(t+"BottomWidth"),left:r(t+"LeftWidth")}}}}),r(be,[m],function(e){function t(){}function n(e){this.cls=[],this.cls._map={},this.onchange=e||t,this.prefix=""}return e.extend(n.prototype,{add:function(e){return e&&!this.contains(e)&&(this.cls._map[e]=!0,this.cls.push(e),this._change()),this},remove:function(e){if(this.contains(e)){for(var t=0;t<this.cls.length&&this.cls[t]!==e;t++);this.cls.splice(t,1),delete this.cls._map[e],this._change()}return this},toggle:function(e,t){var n=this.contains(e);return n!==t&&(n?this.remove(e):this.add(e),this._change()),this},contains:function(e){return!!this.cls._map[e]},_change:function(){delete this.clsValue,this.onchange.call(this)}}),n.prototype.toString=function(){var e;if(this.clsValue)return this.clsValue;e="";for(var t=0;t<this.cls.length;t++)t>0&&(e+=" "),e+=this.prefix+this.cls[t];return e},n}),r(Ce,[c],function(e){var t={},n;return{add:function(r){var i=r.parent();if(i){if(!i._layout||i._layout.isNative())return;t[i._id]||(t[i._id]=i),n||(n=!0,e.requestAnimationFrame(function(){var e,r;n=!1;for(e in t)r=t[e],r.state.get("rendered")&&r.reflow();t={}},document.body))}},remove:function(e){t[e._id]&&delete t[e._id]}}}),r(xe,[ce,m,de,he,ge,ve,g,ye,be,Ce],function(e,t,n,r,i,o,a,s,l,u){function c(e){return e._eventDispatcher||(e._eventDispatcher=new n({scope:e,toggleEvent:function(t,r){r&&n.isNative(t)&&(e._nativeEvents||(e._nativeEvents={}),e._nativeEvents[t]=!0,e.state.get("rendered")&&d(e))}})),e._eventDispatcher}function d(e){function t(t){var n=e.getParentCtrl(t.target);n&&n.fire(t.type,t)}function n(){var e=u._lastHoverCtrl;e&&(e.fire("mouseleave",{target:e.getEl()}),e.parents().each(function(e){e.fire("mouseleave",{target:e.getEl()})}),u._lastHoverCtrl=null)}function r(t){var n=e.getParentCtrl(t.target),r=u._lastHoverCtrl,i=0,o,a,s;if(n!==r){if(u._lastHoverCtrl=n,a=n.parents().toArray().reverse(),a.push(n),r){for(s=r.parents().toArray().reverse(),s.push(r),i=0;i<s.length&&a[i]===s[i];i++);for(o=s.length-1;o>=i;o--)r=s[o],r.fire("mouseleave",{target:r.getEl()})}for(o=i;o<a.length;o++)n=a[o],n.fire("mouseenter",{target:n.getEl()})}}function i(t){t.preventDefault(),"mousewheel"==t.type?(t.deltaY=-.025*t.wheelDelta,t.wheelDeltaX&&(t.deltaX=-.025*t.wheelDeltaX)):(t.deltaX=0,t.deltaY=t.detail),t=e.fire("wheel",t)}var o,s,l,u,c,d;if(c=e._nativeEvents){for(l=e.parents().toArray(),l.unshift(e),o=0,s=l.length;!u&&o<s;o++)u=l[o]._eventsRoot;for(u||(u=l[l.length-1]||e),e._eventsRoot=u,s=o,o=0;o<s;o++)l[o]._eventsRoot=u;var h=u._delegates;h||(h=u._delegates={});for(d in c){if(!c)return!1;"wheel"!==d||p?("mouseenter"===d||"mouseleave"===d?u._hasMouseEnter||(a(u.getEl()).on("mouseleave",n).on("mouseover",r),u._hasMouseEnter=1):h[d]||(a(u.getEl()).on(d,t),h[d]=!0),c[d]=!1):f?a(e.getEl()).on("mousewheel",i):a(e.getEl()).on("DOMMouseScroll",i)}}}var f="onmousewheel"in document,p=!1,h="mce-",m,g=0,v={Statics:{classPrefix:h},isRtl:function(){return m.rtl},classPrefix:h,init:function(e){function n(e){var t;for(e=e.split(" "),t=0;t<e.length;t++)i.classes.add(e[t])}var i=this,o,u;i.settings=e=t.extend({},i.Defaults,e),i._id=e.id||"mceu_"+g++,i._aria={role:e.role},i._elmCache={},i.$=a,i.state=new r({visible:!0,active:!1,disabled:!1,value:""}),i.data=new r(e.data),i.classes=new l(function(){i.state.get("rendered")&&(i.getEl().className=this.toString())}),i.classes.prefix=i.classPrefix,o=e.classes,o&&(i.Defaults&&(u=i.Defaults.classes,u&&o!=u&&n(u)),n(o)),t.each("title text name visible disabled active value".split(" "),function(t){t in e&&i[t](e[t])}),i.on("click",function(){if(i.disabled())return!1}),i.settings=e,i.borderBox=s.parseBox(e.border),i.paddingBox=s.parseBox(e.padding),i.marginBox=s.parseBox(e.margin),e.hidden&&i.hide()},Properties:"parent,name",getContainerElm:function(){return o.getContainer()},getParentCtrl:function(e){for(var t,n=this.getRoot().controlIdLookup;e&&n&&!(t=n[e.id]);)e=e.parentNode;return t},initLayoutRect:function(){var e=this,t=e.settings,n,r,i=e.getEl(),a,l,u,c,d,f,p,h;n=e.borderBox=e.borderBox||s.measureBox(i,"border"),e.paddingBox=e.paddingBox||s.measureBox(i,"padding"),e.marginBox=e.marginBox||s.measureBox(i,"margin"),h=o.getSize(i),f=t.minWidth,p=t.minHeight,u=f||h.width,c=p||h.height,a=t.width,l=t.height,d=t.autoResize,d="undefined"!=typeof d?d:!a&&!l,a=a||u,l=l||c;var m=n.left+n.right,g=n.top+n.bottom,v=t.maxWidth||65535,y=t.maxHeight||65535;return e._layoutRect=r={x:t.x||0,y:t.y||0,w:a,h:l,deltaW:m,deltaH:g,contentW:a-m,contentH:l-g,innerW:a-m,innerH:l-g,startMinWidth:f||0,startMinHeight:p||0,minW:Math.min(u,v),minH:Math.min(c,y),maxW:v,maxH:y,autoResize:d,scrollW:0},e._lastLayoutRect={},r},layoutRect:function(e){var t=this,n=t._layoutRect,r,i,o,a,s,l;return n||(n=t.initLayoutRect()),e?(o=n.deltaW,a=n.deltaH,e.x!==s&&(n.x=e.x),e.y!==s&&(n.y=e.y),e.minW!==s&&(n.minW=e.minW),e.minH!==s&&(n.minH=e.minH),i=e.w,i!==s&&(i=i<n.minW?n.minW:i,i=i>n.maxW?n.maxW:i,n.w=i,n.innerW=i-o),i=e.h,i!==s&&(i=i<n.minH?n.minH:i,i=i>n.maxH?n.maxH:i,n.h=i,n.innerH=i-a),i=e.innerW,i!==s&&(i=i<n.minW-o?n.minW-o:i,i=i>n.maxW-o?n.maxW-o:i,n.innerW=i,n.w=i+o),i=e.innerH,i!==s&&(i=i<n.minH-a?n.minH-a:i,i=i>n.maxH-a?n.maxH-a:i,n.innerH=i,n.h=i+a),e.contentW!==s&&(n.contentW=e.contentW),e.contentH!==s&&(n.contentH=e.contentH),r=t._lastLayoutRect,r.x===n.x&&r.y===n.y&&r.w===n.w&&r.h===n.h||(l=m.repaintControls,l&&l.map&&!l.map[t._id]&&(l.push(t),l.map[t._id]=!0),r.x=n.x,r.y=n.y,r.w=n.w,r.h=n.h),t):n},repaint:function(){var e=this,t,n,r,i,o,a,s,l,u,c;u=document.createRange?function(e){return e}:Math.round,t=e.getEl().style,i=e._layoutRect,l=e._lastRepaintRect||{},o=e.borderBox,a=o.left+o.right,s=o.top+o.bottom,i.x!==l.x&&(t.left=u(i.x)+"px",l.x=i.x),i.y!==l.y&&(t.top=u(i.y)+"px",l.y=i.y),i.w!==l.w&&(c=u(i.w-a),t.width=(c>=0?c:0)+"px",l.w=i.w),i.h!==l.h&&(c=u(i.h-s),t.height=(c>=0?c:0)+"px",l.h=i.h),e._hasBody&&i.innerW!==l.innerW&&(c=u(i.innerW),r=e.getEl("body"),r&&(n=r.style,n.width=(c>=0?c:0)+"px"),l.innerW=i.innerW),e._hasBody&&i.innerH!==l.innerH&&(c=u(i.innerH),r=r||e.getEl("body"),r&&(n=n||r.style,n.height=(c>=0?c:0)+"px"),l.innerH=i.innerH),e._lastRepaintRect=l,e.fire("repaint",{},!1)},updateLayoutRect:function(){var e=this;e.parent()._lastRect=null,o.css(e.getEl(),{width:"",height:""}),e._layoutRect=e._lastRepaintRect=e._lastLayoutRect=null,e.initLayoutRect()},on:function(e,t){function n(e){var t,n;return"string"!=typeof e?e:function(i){return t||r.parentsAndSelf().each(function(r){var i=r.settings.callbacks;if(i&&(t=i[e]))return n=r,!1}),t?t.call(n,i):(i.action=e,void this.fire("execute",i))}}var r=this;return c(r).on(e,n(t)),r},off:function(e,t){return c(this).off(e,t),this},fire:function(e,t,n){var r=this;if(t=t||{},t.control||(t.control=r),t=c(r).fire(e,t),n!==!1&&r.parent)for(var i=r.parent();i&&!t.isPropagationStopped();)i.fire(e,t,!1),i=i.parent();return t},hasEventListeners:function(e){return c(this).has(e)},parents:function(e){var t=this,n,r=new i;for(n=t.parent();n;n=n.parent())r.add(n);return e&&(r=r.filter(e)),r},parentsAndSelf:function(e){return new i(this).add(this.parents(e))},next:function(){var e=this.parent().items();return e[e.indexOf(this)+1]},prev:function(){var e=this.parent().items();return e[e.indexOf(this)-1]},innerHtml:function(e){return this.$el.html(e),this},getEl:function(e){var t=e?this._id+"-"+e:this._id;return this._elmCache[t]||(this._elmCache[t]=a("#"+t)[0]),this._elmCache[t]},show:function(){return this.visible(!0)},hide:function(){return this.visible(!1)},focus:function(){try{this.getEl().focus()}catch(e){}return this},blur:function(){return this.getEl().blur(),this},aria:function(e,t){var n=this,r=n.getEl(n.ariaTarget);return"undefined"==typeof t?n._aria[e]:(n._aria[e]=t,n.state.get("rendered")&&r.setAttribute("role"==e?e:"aria-"+e,t),n)},encode:function(e,t){return t!==!1&&(e=this.translate(e)),(e||"").replace(/[&<>"]/g,function(e){return"&#"+e.charCodeAt(0)+";"})},translate:function(e){return m.translate?m.translate(e):e},before:function(e){var t=this,n=t.parent();return n&&n.insert(e,n.items().indexOf(t),!0),t},after:function(e){var t=this,n=t.parent();return n&&n.insert(e,n.items().indexOf(t)),t},remove:function(){var e=this,t=e.getEl(),n=e.parent(),r,i;if(e.items){var o=e.items().toArray();for(i=o.length;i--;)o[i].remove()}n&&n.items&&(r=[],n.items().each(function(t){t!==e&&r.push(t)}),n.items().set(r),n._lastRect=null),e._eventsRoot&&e._eventsRoot==e&&a(t).off();var s=e.getRoot().controlIdLookup;return s&&delete s[e._id],t&&t.parentNode&&t.parentNode.removeChild(t),e.state.set("rendered",!1),e.state.destroy(),e.fire("remove"),e},renderBefore:function(e){return a(e).before(this.renderHtml()),this.postRender(),this},renderTo:function(e){return a(e||this.getContainerElm()).append(this.renderHtml()),this.postRender(),this},preRender:function(){},render:function(){},renderHtml:function(){return'<div id="'+this._id+'" class="'+this.classes+'"></div>'},postRender:function(){var e=this,t=e.settings,n,r,i,o,s;e.$el=a(e.getEl()),e.state.set("rendered",!0);for(o in t)0===o.indexOf("on")&&e.on(o.substr(2),t[o]);if(e._eventsRoot){for(i=e.parent();!s&&i;i=i.parent())s=i._eventsRoot;if(s)for(o in s._nativeEvents)e._nativeEvents[o]=!0}d(e),t.style&&(n=e.getEl(),n&&(n.setAttribute("style",t.style),n.style.cssText=t.style)),e.settings.border&&(r=e.borderBox,e.$el.css({"border-top-width":r.top,"border-right-width":r.right,"border-bottom-width":r.bottom,"border-left-width":r.left}));var l=e.getRoot();l.controlIdLookup||(l.controlIdLookup={}),l.controlIdLookup[e._id]=e;for(var c in e._aria)e.aria(c,e._aria[c]);e.state.get("visible")===!1&&(e.getEl().style.display="none"),e.bindStates(),e.state.on("change:visible",function(t){var n=t.value,r;e.state.get("rendered")&&(e.getEl().style.display=n===!1?"none":"",e.getEl().getBoundingClientRect()),r=e.parent(),r&&(r._lastRect=null),e.fire(n?"show":"hide"),u.add(e)}),e.fire("postrender",{},!1)},bindStates:function(){},scrollIntoView:function(e){function t(e,t){var n,r,i=e;for(n=r=0;i&&i!=t&&i.nodeType;)n+=i.offsetLeft||0,r+=i.offsetTop||0,i=i.offsetParent;return{x:n,y:r}}var n=this.getEl(),r=n.parentNode,i,o,a,s,l,u,c=t(n,r);return i=c.x,o=c.y,a=n.offsetWidth,s=n.offsetHeight,l=r.clientWidth,u=r.clientHeight,"end"==e?(i-=l-a,o-=u-s):"center"==e&&(i-=l/2-a/2,o-=u/2-s/2),r.scrollLeft=i,r.scrollTop=o,this},getRoot:function(){for(var e=this,t,n=[];e;){if(e.rootControl){t=e.rootControl;break}n.push(e),t=e,e=e.parent()}t||(t=this);for(var r=n.length;r--;)n[r].rootControl=t;return t},reflow:function(){u.remove(this);var e=this.parent();return e._layout&&!e._layout.isNative()&&e.reflow(),this}};return t.each("text title visible disabled active value".split(" "),function(e){v[e]=function(t){return 0===arguments.length?this.state.get(e):("undefined"!=typeof t&&this.state.set(e,t),this)}}),m=e.extend(v)}),r(we,[],function(){var e={},t;return{add:function(t,n){e[t.toLowerCase()]=n},has:function(t){return!!e[t.toLowerCase()]},create:function(n,r){var i,o,a;if(!t){a=tinymce.ui;for(o in a)e[o.toLowerCase()]=a[o];t=!0}if("string"==typeof n?(r=r||{},r.type=n):(r=n,n=r.type),n=n.toLowerCase(),i=e[n],!i)throw new Error("Could not find control by type: "+n);return i=new i(r),i.type=n,i}}}),r(Ee,[],function(){return function(e){function t(e){return e&&1===e.nodeType}function n(e){return e=e||C,t(e)?e.getAttribute("role"):null}function r(e){for(var t,r=e||C;r=r.parentNode;)if(t=n(r))return t}function i(e){var n=C;if(t(n))return n.getAttribute("aria-"+e)}function o(e){var t=e.tagName.toUpperCase();return"INPUT"==t||"TEXTAREA"==t||"SELECT"==t}function a(e){return!(!o(e)||e.hidden)||!!/^(button|menuitem|checkbox|tab|menuitemcheckbox|option|gridcell|slider)$/.test(n(e))}function s(e){function t(e){if(1==e.nodeType&&"none"!=e.style.display&&!e.disabled){a(e)&&n.push(e);for(var r=0;r<e.childNodes.length;r++)t(e.childNodes[r])}}var n=[];return t(e||b.getEl()),n}function l(e){var t,n;e=e||x,n=e.parents().toArray(),n.unshift(e);for(var r=0;r<n.length&&(t=n[r],!t.settings.ariaRoot);r++);return t}function u(e){var t=l(e),n=s(t.getEl());t.settings.ariaRemember&&"lastAriaIndex"in t?c(t.lastAriaIndex,n):c(0,n)}function c(e,t){return e<0?e=t.length-1:e>=t.length&&(e=0),t[e]&&t[e].focus(),e}function d(e,t){var n=-1,r=l();t=t||s(r.getEl());for(var i=0;i<t.length;i++)t[i]===C&&(n=i);n+=e,r.lastAriaIndex=c(n,t)}function f(){var e=r();"tablist"==e?d(-1,s(C.parentNode)):x.parent().submenu?v():d(-1)}function p(){var e=n(),t=r();"tablist"==t?d(1,s(C.parentNode)):"menuitem"==e&&"menu"==t&&i("haspopup")?y():d(1)}function h(){d(-1)}function m(){var e=n(),t=r();"menuitem"==e&&"menubar"==t?y():"button"==e&&i("haspopup")?y({key:"down"}):d(1)}function g(e){var t=r();if("tablist"==t){var n=s(x.getEl("body"))[0];n&&n.focus()}else d(e.shiftKey?-1:1)}function v(){x.fire("cancel")}function y(e){e=e||{},x.fire("click",{target:C,aria:e})}var b=e.root,C,x;try{C=document.activeElement}catch(w){C=document.body}return x=b.getParentCtrl(C),b.on("keydown",function(e){function t(e,t){o(C)||"slider"!==n(C)&&t(e)!==!1&&e.preventDefault()}if(!e.isDefaultPrevented())switch(e.keyCode){case 37:t(e,f);break;case 39:t(e,p);break;case 38:t(e,h);break;case 40:t(e,m);break;case 27:v();break;case 14:case 13:case 32:t(e,y);break;case 9:g(e)!==!1&&e.preventDefault()}}),b.on("focusin",function(e){C=e.target,x=e.control}),{focusFirst:u}}}),r(Ne,[xe,ge,me,we,Ee,m,g,be,Ce],function(e,t,n,r,i,o,a,s,l){var u={};return e.extend({init:function(e){var n=this;n._super(e),e=n.settings,e.fixed&&n.state.set("fixed",!0),n._items=new t,n.isRtl()&&n.classes.add("rtl"),n.bodyClasses=new s(function(){n.state.get("rendered")&&(n.getEl("body").className=this.toString())}),n.bodyClasses.prefix=n.classPrefix,n.classes.add("container"),n.bodyClasses.add("container-body"),e.containerCls&&n.classes.add(e.containerCls),n._layout=r.create((e.layout||"")+"layout"),n.settings.items?n.add(n.settings.items):n.add(n.render()),n._hasBody=!0},items:function(){return this._items},find:function(e){return e=u[e]=u[e]||new n(e),e.find(this)},add:function(e){var t=this;return t.items().add(t.create(e)).parent(t),t},focus:function(e){var t=this,n,r,i;return e&&(r=t.keyboardNav||t.parents().eq(-1)[0].keyboardNav)?void r.focusFirst(t):(i=t.find("*"),t.statusbar&&i.add(t.statusbar.items()),i.each(function(e){return e.settings.autofocus?(n=null,!1):void(e.canFocus&&(n=n||e))}),n&&n.focus(),t)},replace:function(e,t){for(var n,r=this.items(),i=r.length;i--;)if(r[i]===e){r[i]=t;break}i>=0&&(n=t.getEl(),n&&n.parentNode.removeChild(n),n=e.getEl(),n&&n.parentNode.removeChild(n)),t.parent(this)},create:function(t){var n=this,i,a=[];return o.isArray(t)||(t=[t]),o.each(t,function(t){t&&(t instanceof e||("string"==typeof t&&(t={type:t}),i=o.extend({},n.settings.defaults,t),t.type=i.type=i.type||t.type||n.settings.defaultType||(i.defaults?i.defaults.type:null),t=r.create(i)),a.push(t))}),a},renderNew:function(){var e=this;return e.items().each(function(t,n){var r;t.parent(e),t.state.get("rendered")||(r=e.getEl("body"),r.hasChildNodes()&&n<=r.childNodes.length-1?a(r.childNodes[n]).before(t.renderHtml()):a(r).append(t.renderHtml()),t.postRender(),l.add(t))}),e._layout.applyClasses(e.items().filter(":visible")),e._lastRect=null,e},append:function(e){return this.add(e).renderNew()},prepend:function(e){var t=this;return t.items().set(t.create(e).concat(t.items().toArray())),t.renderNew()},insert:function(e,t,n){var r=this,i,o,a;return e=r.create(e),i=r.items(),!n&&t<i.length-1&&(t+=1),t>=0&&t<i.length&&(o=i.slice(0,t).toArray(),a=i.slice(t).toArray(),i.set(o.concat(e,a))),r.renderNew()},fromJSON:function(e){var t=this;for(var n in e)t.find("#"+n).value(e[n]);return t},toJSON:function(){var e=this,t={};return e.find("*").each(function(e){var n=e.name(),r=e.value();n&&"undefined"!=typeof r&&(t[n]=r)}),t},renderHtml:function(){var e=this,t=e._layout,n=this.settings.role;return e.preRender(),t.preRender(e),'<div id="'+e._id+'" class="'+e.classes+'"'+(n?' role="'+this.settings.role+'"':"")+'><div id="'+e._id+'-body" class="'+e.bodyClasses+'">'+(e.settings.html||"")+t.renderHtml(e)+"</div></div>"},postRender:function(){var e=this,t;return e.items().exec("postRender"),e._super(),e._layout.postRender(e),e.state.set("rendered",!0),e.settings.style&&e.$el.css(e.settings.style),e.settings.border&&(t=e.borderBox,e.$el.css({"border-top-width":t.top,"border-right-width":t.right,"border-bottom-width":t.bottom,"border-left-width":t.left})),e.parent()||(e.keyboardNav=new i({root:e})),e},initLayoutRect:function(){var e=this,t=e._super();return e._layout.recalc(e),t},recalc:function(){var e=this,t=e._layoutRect,n=e._lastRect;if(!n||n.w!=t.w||n.h!=t.h)return e._layout.recalc(e),t=e.layoutRect(),e._lastRect={x:t.x,y:t.y,w:t.w,h:t.h},!0},reflow:function(){var t;if(l.remove(this),this.visible()){for(e.repaintControls=[],e.repaintControls.map={},this.recalc(),t=e.repaintControls.length;t--;)e.repaintControls[t].repaint();"flow"!==this.settings.layout&&"stack"!==this.settings.layout&&this.repaint(),e.repaintControls=[]}return this}})}),r(_e,[g],function(e){function t(e){var t,n,r,i,o,a,s,l,u=Math.max;return t=e.documentElement,n=e.body,r=u(t.scrollWidth,n.scrollWidth),i=u(t.clientWidth,n.clientWidth),o=u(t.offsetWidth,n.offsetWidth),a=u(t.scrollHeight,n.scrollHeight),s=u(t.clientHeight,n.clientHeight),l=u(t.offsetHeight,n.offsetHeight),{width:r<o?i:r,height:a<l?s:a}}function n(e){var t,n;if(e.changedTouches)for(t="screenX screenY pageX pageY clientX clientY".split(" "),n=0;n<t.length;n++)e[t[n]]=e.changedTouches[0][t[n]]}return function(r,i){function o(){return s.getElementById(i.handle||r)}var a,s=i.document||document,l,u,c,d,f,p;i=i||{},u=function(r){var u=t(s),h,m;n(r),r.preventDefault(),l=r.button,h=o(),f=r.screenX,p=r.screenY,m=window.getComputedStyle?window.getComputedStyle(h,null).getPropertyValue("cursor"):h.runtimeStyle.cursor,a=e("<div></div>").css({position:"absolute",top:0,left:0,width:u.width,height:u.height,zIndex:2147483647,opacity:1e-4,cursor:m}).appendTo(s.body),e(s).on("mousemove touchmove",d).on("mouseup touchend",c),i.start(r)},d=function(e){return n(e),e.button!==l?c(e):(e.deltaX=e.screenX-f,e.deltaY=e.screenY-p,e.preventDefault(),void i.drag(e))},c=function(t){n(t),e(s).off("mousemove touchmove",d).off("mouseup touchend",c),a.remove(),i.stop&&i.stop(t)},this.destroy=function(){e(o()).off()},e(o()).on("mousedown touchstart",u)}}),r(Se,[g,_e],function(e,t){return{init:function(){var e=this;e.on("repaint",e.renderScroll)},renderScroll:function(){function n(){function t(t,a,s,l,u,c){var d,f,p,h,m,g,v,y,b;if(f=i.getEl("scroll"+t)){if(y=a.toLowerCase(),b=s.toLowerCase(),e(i.getEl("absend")).css(y,i.layoutRect()[l]-1),!u)return void e(f).css("display","none");e(f).css("display","block"),d=i.getEl("body"),p=i.getEl("scroll"+t+"t"),h=d["client"+s]-2*o,h-=n&&r?f["client"+c]:0,m=d["scroll"+s],g=h/m,v={},v[y]=d["offset"+a]+o,v[b]=h,e(f).css(v),v={},v[y]=d["scroll"+a]*g,v[b]=h*g,e(p).css(v)}}var n,r,a;a=i.getEl("body"),n=a.scrollWidth>a.clientWidth,r=a.scrollHeight>a.clientHeight,t("h","Left","Width","contentW",n,"Height"),t("v","Top","Height","contentH",r,"Width")}function r(){function n(n,r,a,s,l){var u,c=i._id+"-scroll"+n,d=i.classPrefix;e(i.getEl()).append('<div id="'+c+'" class="'+d+"scrollbar "+d+"scrollbar-"+n+'"><div id="'+c+'t" class="'+d+'scrollbar-thumb"></div></div>'),i.draghelper=new t(c+"t",{start:function(){u=i.getEl("body")["scroll"+r],e("#"+c).addClass(d+"active")},drag:function(e){var t,c,d,f,p=i.layoutRect();c=p.contentW>p.innerW,d=p.contentH>p.innerH,f=i.getEl("body")["client"+a]-2*o,f-=c&&d?i.getEl("scroll"+n)["client"+l]:0,t=f/i.getEl("body")["scroll"+a],i.getEl("body")["scroll"+r]=u+e["delta"+s]/t},stop:function(){e("#"+c).removeClass(d+"active")}})}i.classes.add("scroll"),n("v","Top","Height","Y","Width"),n("h","Left","Width","X","Height")}var i=this,o=2;i.settings.autoScroll&&(i._hasScroll||(i._hasScroll=!0,r(),i.on("wheel",function(e){var t=i.getEl("body");t.scrollLeft+=10*(e.deltaX||0),t.scrollTop+=10*e.deltaY,n()}),e(i.getEl("body")).on("scroll",n)),n())}}}),r(ke,[Ne,Se],function(e,t){return e.extend({Defaults:{layout:"fit",containerCls:"panel"},Mixins:[t],renderHtml:function(){var e=this,t=e._layout,n=e.settings.html;return e.preRender(),t.preRender(e),"undefined"==typeof n?n='<div id="'+e._id+'-body" class="'+e.bodyClasses+'">'+t.renderHtml(e)+"</div>":("function"==typeof n&&(n=n.call(e)),e._hasBody=!1),'<div id="'+e._id+'" class="'+e.classes+'" hidefocus="1" tabindex="-1" role="group">'+(e._preBodyHtml||"")+n+"</div>"}})}),r(Te,[ve],function(e){function t(t,n,r){var i,o,a,s,l,u,c,d,f,p;return f=e.getViewPort(),o=e.getPos(n),a=o.x,s=o.y,t.state.get("fixed")&&"static"==e.getRuntimeStyle(document.body,"position")&&(a-=f.x,s-=f.y),i=t.getEl(),p=e.getSize(i),l=p.width,u=p.height,p=e.getSize(n),c=p.width,d=p.height,r=(r||"").split(""),"b"===r[0]&&(s+=d),"r"===r[1]&&(a+=c),"c"===r[0]&&(s+=Math.round(d/2)),"c"===r[1]&&(a+=Math.round(c/2)),"b"===r[3]&&(s-=u),"r"===r[4]&&(a-=l),"c"===r[3]&&(s-=Math.round(u/2)),"c"===r[4]&&(a-=Math.round(l/2)),{x:a,y:s,w:l,h:u}}return{testMoveRel:function(n,r){for(var i=e.getViewPort(),o=0;o<r.length;o++){var a=t(this,n,r[o]);if(this.state.get("fixed")){if(a.x>0&&a.x+a.w<i.w&&a.y>0&&a.y+a.h<i.h)return r[o]}else if(a.x>i.x&&a.x+a.w<i.w+i.x&&a.y>i.y&&a.y+a.h<i.h+i.y)return r[o]}return r[0]},moveRel:function(e,n){"string"!=typeof n&&(n=this.testMoveRel(e,n));var r=t(this,e,n);return this.moveTo(r.x,r.y)},moveBy:function(e,t){var n=this,r=n.layoutRect();return n.moveTo(r.x+e,r.y+t),n},moveTo:function(t,n){function r(e,t,n){return e<0?0:e+n>t?(e=t-n,e<0?0:e):e}var i=this;if(i.settings.constrainToViewport){var o=e.getViewPort(window),a=i.layoutRect();t=r(t,o.w+o.x,a.w),n=r(n,o.h+o.y,a.h)}return i.state.get("rendered")?i.layoutRect({x:t,y:n}).repaint():(i.settings.x=t,i.settings.y=n),i.fire("move",{x:t,y:n}),i}}}),r(Re,[ve],function(e){return{resizeToContent:function(){this._layoutRect.autoResize=!0,this._lastRect=null,this.reflow()},resizeTo:function(t,n){if(t<=1||n<=1){var r=e.getWindowSize();t=t<=1?t*r.w:t,n=n<=1?n*r.h:n}return this._layoutRect.autoResize=!1,this.layoutRect({minW:t,minH:n,w:t,h:n}).reflow()},resizeBy:function(e,t){var n=this,r=n.layoutRect();return n.resizeTo(r.w+e,r.h+t)}}}),r(Ae,[ke,Te,Re,ve,g,c],function(e,t,n,r,i,o){function a(e,t){for(;e;){if(e==t)return!0;e=e.parent()}}function s(e){for(var t=v.length;t--;){var n=v[t],r=n.getParentCtrl(e.target);if(n.settings.autohide){if(r&&(a(r,n)||n.parent()===r))continue;e=n.fire("autohide",{target:e.target}),e.isDefaultPrevented()||n.hide()}}}function l(){h||(h=function(e){2!=e.button&&s(e)},i(document).on("click touchstart",h))}function u(){m||(m=function(){var e;for(e=v.length;e--;)d(v[e])},i(window).on("scroll",m))}function c(){if(!g){var e=document.documentElement,t=e.clientWidth,n=e.clientHeight;g=function(){document.all&&t==e.clientWidth&&n==e.clientHeight||(t=e.clientWidth,n=e.clientHeight,C.hideAll())},i(window).on("resize",g)}}function d(e){function t(t,n){for(var r,i=0;i<v.length;i++)if(v[i]!=e)for(r=v[i].parent();r&&(r=r.parent());)r==e&&v[i].fixed(t).moveBy(0,n).repaint()}var n=r.getViewPort().y;e.settings.autofix&&(e.state.get("fixed")?e._autoFixY>n&&(e.fixed(!1).layoutRect({y:e._autoFixY}).repaint(),t(!1,e._autoFixY-n)):(e._autoFixY=e.layoutRect().y,e._autoFixY<n&&(e.fixed(!0).layoutRect({y:0}).repaint(),t(!0,n-e._autoFixY))))}function f(e,t){var n,r=C.zIndex||65535,o;if(e)y.push(t);else for(n=y.length;n--;)y[n]===t&&y.splice(n,1);if(y.length)for(n=0;n<y.length;n++)y[n].modal&&(r++,o=y[n]),y[n].getEl().style.zIndex=r,y[n].zIndex=r,r++;var a=i("#"+t.classPrefix+"modal-block",t.getContainerElm())[0];o?i(a).css("z-index",o.zIndex-1):a&&(a.parentNode.removeChild(a),b=!1),C.currentZIndex=r}function p(e){var t;for(t=v.length;t--;)v[t]===e&&v.splice(t,1);for(t=y.length;t--;)y[t]===e&&y.splice(t,1)}var h,m,g,v=[],y=[],b,C=e.extend({Mixins:[t,n],init:function(e){var t=this;t._super(e),t._eventsRoot=t,t.classes.add("floatpanel"),e.autohide&&(l(),c(),v.push(t)),e.autofix&&(u(),t.on("move",function(){d(this)})),t.on("postrender show",function(e){if(e.control==t){var n,r=t.classPrefix;t.modal&&!b&&(n=i("#"+r+"modal-block",t.getContainerElm()),n[0]||(n=i('<div id="'+r+'modal-block" class="'+r+"reset "+r+'fade"></div>').appendTo(t.getContainerElm())),o.setTimeout(function(){n.addClass(r+"in"),i(t.getEl()).addClass(r+"in")}),b=!0),f(!0,t)}}),t.on("show",function(){t.parents().each(function(e){if(e.state.get("fixed"))return t.fixed(!0),!1})}),e.popover&&(t._preBodyHtml='<div class="'+t.classPrefix+'arrow"></div>',t.classes.add("popover").add("bottom").add(t.isRtl()?"end":"start")),t.aria("label",e.ariaLabel),t.aria("labelledby",t._id),t.aria("describedby",t.describedBy||t._id+"-none")},fixed:function(e){var t=this;if(t.state.get("fixed")!=e){if(t.state.get("rendered")){var n=r.getViewPort();e?t.layoutRect().y-=n.y:t.layoutRect().y+=n.y}t.classes.toggle("fixed",e),t.state.set("fixed",e)}return t},show:function(){var e=this,t,n=e._super();for(t=v.length;t--&&v[t]!==e;);return t===-1&&v.push(e),n},hide:function(){return p(this),f(!1,this),this._super()},hideAll:function(){C.hideAll()},close:function(){var e=this;return e.fire("close").isDefaultPrevented()||(e.remove(),f(!1,e)),e},remove:function(){p(this),this._super()},postRender:function(){var e=this;return e.settings.bodyRole&&this.getEl("body").setAttribute("role",e.settings.bodyRole),e._super()}});return C.hideAll=function(){for(var e=v.length;e--;){var t=v[e];t&&t.settings.autohide&&(t.hide(),v.splice(e,1))}},C}),r(Be,[Ae,ke,ve,g,_e,ye,d,c],function(e,t,n,r,i,o,a,s){function l(e){var t="width=device-width,initial-scale=1.0,user-scalable=0,minimum-scale=1.0,maximum-scale=1.0",n=r("meta[name=viewport]")[0],i;a.overrideViewPort!==!1&&(n||(n=document.createElement("meta"),n.setAttribute("name","viewport"),document.getElementsByTagName("head")[0].appendChild(n)),i=n.getAttribute("content"),i&&"undefined"!=typeof p&&(p=i),n.setAttribute("content",e?t:p))}function u(e,t){c()&&t===!1&&r([document.documentElement,document.body]).removeClass(e+"fullscreen")}function c(){for(var e=0;e<f.length;e++)if(f[e]._fullscreen)return!0;return!1}function d(){function e(){var e,t=n.getWindowSize(),r;for(e=0;e<f.length;e++)r=f[e].layoutRect(),f[e].moveTo(f[e].settings.x||Math.max(0,t.w/2-r.w/2),f[e].settings.y||Math.max(0,t.h/2-r.h/2))}if(!a.desktop){var t={w:window.innerWidth,h:window.innerHeight};s.setInterval(function(){var e=window.innerWidth,n=window.innerHeight;t.w==e&&t.h==n||(t={w:e,h:n},r(window).trigger("resize"))},100)}r(window).on("resize",e)}var f=[],p="",h=e.extend({modal:!0,Defaults:{border:1,layout:"flex",containerCls:"panel",role:"dialog",callbacks:{submit:function(){this.fire("submit",{data:this.toJSON()})},close:function(){this.close()}}},init:function(e){var r=this;r._super(e),r.isRtl()&&r.classes.add("rtl"),r.classes.add("window"),r.bodyClasses.add("window-body"),r.state.set("fixed",!0),e.buttons&&(r.statusbar=new t({layout:"flex",border:"1 0 0 0",spacing:3,padding:10,align:"center",pack:r.isRtl()?"start":"end",defaults:{type:"button"},items:e.buttons}),r.statusbar.classes.add("foot"),r.statusbar.parent(r)),r.on("click",function(e){var t=r.classPrefix+"close";(n.hasClass(e.target,t)||n.hasClass(e.target.parentNode,t))&&r.close()}),r.on("cancel",function(){r.close()}),r.aria("describedby",r.describedBy||r._id+"-none"),r.aria("label",e.title),r._fullscreen=!1},recalc:function(){var e=this,t=e.statusbar,r,i,o,a;e._fullscreen&&(e.layoutRect(n.getWindowSize()),e.layoutRect().contentH=e.layoutRect().innerH),e._super(),r=e.layoutRect(),e.settings.title&&!e._fullscreen&&(i=r.headerW,i>r.w&&(o=r.x-Math.max(0,i/2),e.layoutRect({w:i,x:o}),a=!0)),t&&(t.layoutRect({w:e.layoutRect().innerW}).recalc(),i=t.layoutRect().minW+r.deltaW,i>r.w&&(o=r.x-Math.max(0,i-r.w),e.layoutRect({w:i,x:o}),a=!0)),a&&e.recalc()},initLayoutRect:function(){var e=this,t=e._super(),r=0,i;if(e.settings.title&&!e._fullscreen){i=e.getEl("head");var o=n.getSize(i);t.headerW=o.width,t.headerH=o.height,r+=t.headerH}e.statusbar&&(r+=e.statusbar.layoutRect().h),t.deltaH+=r,t.minH+=r,t.h+=r;var a=n.getWindowSize();return t.x=e.settings.x||Math.max(0,a.w/2-t.w/2),t.y=e.settings.y||Math.max(0,a.h/2-t.h/2),t},renderHtml:function(){var e=this,t=e._layout,n=e._id,r=e.classPrefix,i=e.settings,o="",a="",s=i.html;return e.preRender(),t.preRender(e),i.title&&(o='<div id="'+n+'-head" class="'+r+'window-head"><div id="'+n+'-title" class="'+r+'title">'+e.encode(i.title)+'</div><div id="'+n+'-dragh" class="'+r+'dragh"></div><button type="button" class="'+r+'close" aria-hidden="true"><i class="mce-ico mce-i-remove"></i></button></div>'),i.url&&(s='<iframe src="'+i.url+'" tabindex="-1"></iframe>'),"undefined"==typeof s&&(s=t.renderHtml(e)),e.statusbar&&(a=e.statusbar.renderHtml()),'<div id="'+n+'" class="'+e.classes+'" hidefocus="1"><div class="'+e.classPrefix+'reset" role="application">'+o+'<div id="'+n+'-body" class="'+e.bodyClasses+'">'+s+"</div>"+a+"</div></div>"},fullscreen:function(e){var t=this,i=document.documentElement,a,l=t.classPrefix,u;if(e!=t._fullscreen)if(r(window).on("resize",function(){var e;if(t._fullscreen)if(a)t._timer||(t._timer=s.setTimeout(function(){var e=n.getWindowSize();t.moveTo(0,0).resizeTo(e.w,e.h),t._timer=0},50));else{e=(new Date).getTime();var r=n.getWindowSize();t.moveTo(0,0).resizeTo(r.w,r.h),(new Date).getTime()-e>50&&(a=!0)}}),u=t.layoutRect(),t._fullscreen=e,e){t._initial={x:u.x,y:u.y,w:u.w,h:u.h},t.borderBox=o.parseBox("0"),t.getEl("head").style.display="none",u.deltaH-=u.headerH+2,r([i,document.body]).addClass(l+"fullscreen"),t.classes.add("fullscreen");var c=n.getWindowSize();t.moveTo(0,0).resizeTo(c.w,c.h)}else t.borderBox=o.parseBox(t.settings.border),t.getEl("head").style.display="",u.deltaH+=u.headerH,r([i,document.body]).removeClass(l+"fullscreen"),t.classes.remove("fullscreen"),t.moveTo(t._initial.x,t._initial.y).resizeTo(t._initial.w,t._initial.h);return t.reflow()},postRender:function(){var e=this,t;setTimeout(function(){e.classes.add("in"),e.fire("open")},0),e._super(),e.statusbar&&e.statusbar.postRender(),e.focus(),this.dragHelper=new i(e._id+"-dragh",{start:function(){t={x:e.layoutRect().x,y:e.layoutRect().y}},drag:function(n){e.moveTo(t.x+n.deltaX,t.y+n.deltaY)}}),e.on("submit",function(t){t.isDefaultPrevented()||e.close()}),f.push(e),l(!0)},submit:function(){return this.fire("submit",{data:this.toJSON()})},remove:function(){var e=this,t;for(e.dragHelper.destroy(),e._super(),e.statusbar&&this.statusbar.remove(),u(e.classPrefix,!1),t=f.length;t--;)f[t]===e&&f.splice(t,1);l(f.length>0)},getContentWindow:function(){var e=this.getEl().getElementsByTagName("iframe")[0];return e?e.contentWindow:null}});return d(),h}),r(De,[Be],function(e){var t=e.extend({init:function(e){e={border:1,padding:20,layout:"flex",pack:"center",align:"center",containerCls:"panel",autoScroll:!0,buttons:{type:"button",text:"Ok",action:"ok"},items:{type:"label",multiline:!0,maxWidth:500,maxHeight:200}},this._super(e)},Statics:{OK:1,OK_CANCEL:2,YES_NO:3,YES_NO_CANCEL:4,msgBox:function(n){function r(e,t,n){return{type:"button",text:e,subtype:n?"primary":"",onClick:function(e){e.control.parents()[1].close(),o(t)}}}var i,o=n.callback||function(){};switch(n.buttons){case t.OK_CANCEL:i=[r("Ok",!0,!0),r("Cancel",!1)];break;case t.YES_NO:case t.YES_NO_CANCEL:i=[r("Yes",1,!0),r("No",0)],
+n.buttons==t.YES_NO_CANCEL&&i.push(r("Cancel",-1));break;default:i=[r("Ok",!0,!0)]}return new e({padding:20,x:n.x,y:n.y,minWidth:300,minHeight:100,layout:"flex",pack:"center",align:"center",buttons:i,title:n.title,role:"alertdialog",items:{type:"label",multiline:!0,maxWidth:500,maxHeight:200,text:n.text},onPostRender:function(){this.aria("describedby",this.items()[0]._id)},onClose:n.onClose,onCancel:function(){o(!1)}}).renderTo(document.body).reflow()},alert:function(e,n){return"string"==typeof e&&(e={text:e}),e.callback=n,t.msgBox(e)},confirm:function(e,n){return"string"==typeof e&&(e={text:e}),e.callback=n,e.buttons=t.OK_CANCEL,t.msgBox(e)}}});return t}),r(Le,[Be,De],function(e,t){return function(n){function r(){if(s.length)return s[s.length-1]}function i(e){n.fire("OpenWindow",{win:e})}function o(e){n.fire("CloseWindow",{win:e})}var a=this,s=[];a.windows=s,n.on("remove",function(){for(var e=s.length;e--;)s[e].close()}),a.open=function(t,r){var a;return n.editorManager.setActive(n),t.title=t.title||" ",t.url=t.url||t.file,t.url&&(t.width=parseInt(t.width||320,10),t.height=parseInt(t.height||240,10)),t.body&&(t.items={defaults:t.defaults,type:t.bodyType||"form",items:t.body,data:t.data,callbacks:t.commands}),t.url||t.buttons||(t.buttons=[{text:"Ok",subtype:"primary",onclick:function(){a.find("form")[0].submit()}},{text:"Cancel",onclick:function(){a.close()}}]),a=new e(t),s.push(a),a.on("close",function(){for(var e=s.length;e--;)s[e]===a&&s.splice(e,1);s.length||n.focus(),o(a)}),t.data&&a.on("postRender",function(){this.find("*").each(function(e){var n=e.name();n in t.data&&e.value(t.data[n])})}),a.features=t||{},a.params=r||{},1===s.length&&n.nodeChanged(),a=a.renderTo().reflow(),i(a),a},a.alert=function(e,r,a){var s;s=t.alert(e,function(){r?r.call(a||this):n.focus()}),s.on("close",function(){o(s)}),i(s)},a.confirm=function(e,n,r){var a;a=t.confirm(e,function(e){n.call(r||this,e)}),a.on("close",function(){o(a)}),i(a)},a.close=function(){r()&&r().close()},a.getParams=function(){return r()?r().params:null},a.setParams=function(e){r()&&(r().params=e)},a.getWindows=function(){return s}}}),r(Me,[xe,Te],function(e,t){return e.extend({Mixins:[t],Defaults:{classes:"widget tooltip tooltip-n"},renderHtml:function(){var e=this,t=e.classPrefix;return'<div id="'+e._id+'" class="'+e.classes+'" role="presentation"><div class="'+t+'tooltip-arrow"></div><div class="'+t+'tooltip-inner">'+e.encode(e.state.get("text"))+"</div></div>"},bindStates:function(){var e=this;return e.state.on("change:text",function(t){e.getEl().lastChild.innerHTML=e.encode(t.value)}),e._super()},repaint:function(){var e=this,t,n;t=e.getEl().style,n=e._layoutRect,t.left=n.x+"px",t.top=n.y+"px",t.zIndex=131070}})}),r(Pe,[xe,Me],function(e,t){var n,r=e.extend({init:function(e){var t=this;t._super(e),e=t.settings,t.canFocus=!0,e.tooltip&&r.tooltips!==!1&&(t.on("mouseenter",function(n){var r=t.tooltip().moveTo(-65535);if(n.control==t){var i=r.text(e.tooltip).show().testMoveRel(t.getEl(),["bc-tc","bc-tl","bc-tr"]);r.classes.toggle("tooltip-n","bc-tc"==i),r.classes.toggle("tooltip-nw","bc-tl"==i),r.classes.toggle("tooltip-ne","bc-tr"==i),r.moveRel(t.getEl(),i)}else r.hide()}),t.on("mouseleave mousedown click",function(){t.tooltip().hide()})),t.aria("label",e.ariaLabel||e.tooltip)},tooltip:function(){return n||(n=new t({type:"tooltip"}),n.renderTo()),n},postRender:function(){var e=this,t=e.settings;e._super(),e.parent()||!t.width&&!t.height||(e.initLayoutRect(),e.repaint()),t.autofocus&&e.focus()},bindStates:function(){function e(e){n.aria("disabled",e),n.classes.toggle("disabled",e)}function t(e){n.aria("pressed",e),n.classes.toggle("active",e)}var n=this;return n.state.on("change:disabled",function(t){e(t.value)}),n.state.on("change:active",function(e){t(e.value)}),n.state.get("disabled")&&e(!0),n.state.get("active")&&t(!0),n._super()},remove:function(){this._super(),n&&(n.remove(),n=null)}});return r}),r(Oe,[Pe],function(e){return e.extend({Defaults:{value:0},init:function(e){var t=this;t._super(e),t.classes.add("progress"),t.settings.filter||(t.settings.filter=function(e){return Math.round(e)})},renderHtml:function(){var e=this,t=e._id,n=this.classPrefix;return'<div id="'+t+'" class="'+e.classes+'"><div class="'+n+'bar-container"><div class="'+n+'bar"></div></div><div class="'+n+'text">0%</div></div>'},postRender:function(){var e=this;return e._super(),e.value(e.settings.value),e},bindStates:function(){function e(e){e=t.settings.filter(e),t.getEl().lastChild.innerHTML=e+"%",t.getEl().firstChild.firstChild.style.width=e+"%"}var t=this;return t.state.on("change:value",function(t){e(t.value)}),e(t.state.get("value")),t._super()}})}),r(He,[xe,Te,Oe,c],function(e,t,n,r){return e.extend({Mixins:[t],Defaults:{classes:"widget notification"},init:function(e){var t=this;t._super(e),e.text&&t.text(e.text),e.icon&&(t.icon=e.icon),e.color&&(t.color=e.color),e.type&&t.classes.add("notification-"+e.type),e.timeout&&(e.timeout<0||e.timeout>0)&&!e.closeButton?t.closeButton=!1:(t.classes.add("has-close"),t.closeButton=!0),e.progressBar&&(t.progressBar=new n),t.on("click",function(e){e.target.className.indexOf(t.classPrefix+"close")!=-1&&t.close()})},renderHtml:function(){var e=this,t=e.classPrefix,n="",r="",i="",o="";return e.icon&&(n='<i class="'+t+"ico "+t+"i-"+e.icon+'"></i>'),e.color&&(o=' style="background-color: '+e.color+'"'),e.closeButton&&(r='<button type="button" class="'+t+'close" aria-hidden="true">\xd7</button>'),e.progressBar&&(i=e.progressBar.renderHtml()),'<div id="'+e._id+'" class="'+e.classes+'"'+o+' role="presentation">'+n+'<div class="'+t+'notification-inner">'+e.state.get("text")+"</div>"+i+r+"</div>"},postRender:function(){var e=this;return r.setTimeout(function(){e.$el.addClass(e.classPrefix+"in")}),e._super()},bindStates:function(){var e=this;return e.state.on("change:text",function(t){e.getEl().childNodes[1].innerHTML=t.value}),e.progressBar&&e.progressBar.bindStates(),e._super()},close:function(){var e=this;return e.fire("close").isDefaultPrevented()||e.remove(),e},repaint:function(){var e=this,t,n;t=e.getEl().style,n=e._layoutRect,t.left=n.x+"px",t.top=n.y+"px",t.zIndex=65534}})}),r(Ie,[He,c,m],function(e,t,n){return function(r){function i(){if(f.length)return f[f.length-1]}function o(){t.requestAnimationFrame(function(){a(),s()})}function a(){for(var e=0;e<f.length;e++)f[e].moveTo(0,0)}function s(){if(f.length>0){var e=f.slice(0,1)[0],t=r.inline?r.getElement():r.getContentAreaContainer();if(e.moveRel(t,"tc-tc"),f.length>1)for(var n=1;n<f.length;n++)f[n].moveRel(f[n-1].getEl(),"bc-tc")}}function l(e,t){if(!c(t))return null;var r=n.grep(e,function(e){return u(t,e)});return 0===r.length?null:r[0]}function u(e,t){return e.type===t.settings.type&&e.text===t.settings.text}function c(e){return!e.progressBar&&!e.timeout}var d=this,f=[];d.notifications=f,r.on("remove",function(){for(var e=f.length;e--;)f[e].close()}),r.on("ResizeEditor",s),r.on("ResizeWindow",o),d.open=function(t){if(!r.removed){var n;r.editorManager.setActive(r);var i=l(f,t);return null===i?(n=new e(t),f.push(n),t.timeout>0&&(n.timer=setTimeout(function(){n.close()},t.timeout)),n.on("close",function(){var e=f.length;for(n.timer&&r.getWin().clearTimeout(n.timer);e--;)f[e]===n&&f.splice(e,1);s()}),n.renderTo(),s()):n=i,n}},d.close=function(){i()&&i().close()},d.getNotifications=function(){return f},r.on("SkinLoaded",function(){var e=r.settings.service_message;e&&r.notificationManager.open({text:e,type:"warning",timeout:0,icon:""})})}}),r(Fe,[w],function(e){function t(t,n,r){for(var i=[];n&&n!=t;n=n.parentNode)i.push(e.nodeIndex(n,r));return i}function n(e,t){var n,r,i;for(r=e,n=t.length-1;n>=0;n--){if(i=r.childNodes,t[n]>i.length-1)return null;r=i[t[n]]}return r}return{create:t,resolve:n}}),r(ze,[I,T,y,Fe,A,C,d,m,c,k,$,oe],function(e,t,n,r,i,o,a,s,l,u,c,d){return function(f){function p(e,t){try{f.getDoc().execCommand(e,!1,t)}catch(n){}}function h(){var e=f.getDoc().documentMode;return e?e:6}function m(e){return e.isDefaultPrevented()}function g(e){var t,n;e.dataTransfer&&(f.selection.isCollapsed()&&"IMG"==e.target.tagName&&re.select(e.target),t=f.selection.getContent(),t.length>0&&(n=ce+escape(f.id)+","+escape(t),e.dataTransfer.setData(de,n)))}function v(e){var t;return e.dataTransfer&&(t=e.dataTransfer.getData(de),t&&t.indexOf(ce)>=0)?(t=t.substr(ce.length).split(","),{id:unescape(t[0]),html:unescape(t[1])}):null}function y(e){f.queryCommandSupported("mceInsertClipboardContent")?f.execCommand("mceInsertClipboardContent",!1,{content:e}):f.execCommand("mceInsertContent",!1,e)}function b(){function i(e){var t=x.schema.getBlockElements(),n=f.getBody();if("BR"!=e.nodeName)return!1;for(;e!=n&&!t[e.nodeName];e=e.parentNode)if(e.nextSibling)return!1;return!0}function o(e,t){var n;for(n=e.nextSibling;n&&n!=t;n=n.nextSibling)if((3!=n.nodeType||0!==Z.trim(n.data).length)&&n!==t)return!1;return n===t}function a(e,t,r){var o,a,s;if(x.isChildOf(e,f.getBody()))for(s=x.schema.getNonEmptyElements(),o=new n(r||e,e);a=o[t?"next":"prev"]();){if(s[a.nodeName]&&!i(a))return a;if(3==a.nodeType&&a.data.length>0)return a}}function u(e){var n,r,i,o,s;if(!e.collapsed&&(n=x.getParent(t.getNode(e.startContainer,e.startOffset),x.isBlock),r=x.getParent(t.getNode(e.endContainer,e.endOffset),x.isBlock),s=f.schema.getTextBlockElements(),n!=r&&s[n.nodeName]&&s[r.nodeName]&&"false"!==x.getContentEditable(n)&&"false"!==x.getContentEditable(r)))return e.deleteContents(),i=a(n,!1),o=a(r,!0),x.isEmpty(r)||Z(n).append(r.childNodes),Z(r).remove(),i?1==i.nodeType?"BR"==i.nodeName?(e.setStartBefore(i),e.setEndBefore(i)):(e.setStartAfter(i),e.setEndAfter(i)):(e.setStart(i,i.data.length),e.setEnd(i,i.data.length)):o&&(1==o.nodeType?(e.setStartBefore(o),e.setEndBefore(o)):(e.setStart(o,0),e.setEnd(o,0))),w.setRng(e),!0}function c(e,n){var r,i,s,l,u,c;if(!e.collapsed)return e;if(u=e.startContainer,c=e.startOffset,3==u.nodeType)if(n){if(c<u.data.length)return e}else if(c>0)return e;r=t.getNode(u,c),s=x.getParent(r,x.isBlock),i=a(f.getBody(),n,r),l=x.getParent(i,x.isBlock);var d=1===u.nodeType&&c>u.childNodes.length-1;if(!r||!i)return e;if(l&&s!=l)if(n){if(!o(s,l))return e;1==r.nodeType?"BR"==r.nodeName?e.setStartBefore(r):e.setStartAfter(r):e.setStart(r,r.data.length),1==i.nodeType?e.setEnd(i,0):e.setEndBefore(i)}else{if(!o(l,s))return e;1==i.nodeType?"BR"==i.nodeName?e.setStartBefore(i):e.setStartAfter(i):e.setStart(i,i.data.length),1==r.nodeType&&d?e.setEndAfter(r):e.setEndBefore(r)}return e}function d(e){var t=w.getRng();if(t=c(t,e),u(t))return!0}function p(e,t){function n(e,n){return m=Z(n).parents().filter(function(e,t){return!!f.schema.getTextInlineElements()[t.nodeName]}),l=e.cloneNode(!1),m=s.map(m,function(e){return e=e.cloneNode(!1),l.hasChildNodes()?(e.appendChild(l.firstChild),l.appendChild(e)):l.appendChild(e),l.appendChild(e),e}),m.length?(h=x.create("br"),m[0].appendChild(h),x.replace(l,e),t.setStartBefore(h),t.setEndBefore(h),f.selection.setRng(t),h):null}function i(e){return e&&f.schema.getTextBlockElements()[e.tagName]}var o,a,l,u,c,d,p,h,m;if(t.collapsed&&(d=t.startContainer,p=t.startOffset,a=x.getParent(d,x.isBlock),i(a)))if(1==d.nodeType){if(d=d.childNodes[p],d&&"BR"!=d.tagName)return;if(c=e?a.nextSibling:a.previousSibling,x.isEmpty(a)&&i(c)&&x.isEmpty(c)&&n(a,d))return x.remove(c),!0}else if(3==d.nodeType){if(o=r.create(a,d),u=a.cloneNode(!0),d=r.resolve(u,o),e){if(p>=d.data.length)return;d.deleteData(p,1)}else{if(p<=0)return;d.deleteData(p-1,1)}if(x.isEmpty(u))return n(a,d)}}function h(e){var t,n,r;d(e)||(s.each(f.getBody().getElementsByTagName("*"),function(e){"SPAN"==e.tagName&&e.setAttribute("mce-data-marked",1),!e.hasAttribute("data-mce-style")&&e.hasAttribute("style")&&f.dom.setAttrib(e,"style",f.dom.getAttrib(e,"style"))}),t=new E(function(){}),t.observe(f.getDoc(),{childList:!0,attributes:!0,subtree:!0,attributeFilter:["style"]}),f.getDoc().execCommand(e?"ForwardDelete":"Delete",!1,null),n=f.selection.getRng(),r=n.startContainer.parentNode,s.each(t.takeRecords(),function(e){if(x.isChildOf(e.target,f.getBody())){if("style"==e.attributeName){var t=e.target.getAttribute("data-mce-style");t?e.target.setAttribute("style",t):e.target.removeAttribute("style")}s.each(e.addedNodes,function(e){if("SPAN"==e.nodeName&&!e.getAttribute("mce-data-marked")){var t,i;e==r&&(t=n.startOffset,i=e.firstChild),x.remove(e,!0),i&&(n.setStart(i,t),n.setEnd(i,t),f.selection.setRng(n))}})}}),t.disconnect(),s.each(f.dom.select("span[mce-data-marked]"),function(e){e.removeAttribute("mce-data-marked")}))}function b(e){f.undoManager.transact(function(){h(e)})}var C=f.getDoc(),x=f.dom,w=f.selection,E=window.MutationObserver,N,_;E||(N=!0,E=function(){function e(e){var t=e.relatedNode||e.target;n.push({target:t,addedNodes:[t]})}function t(e){var t=e.relatedNode||e.target;n.push({target:t,attributeName:e.attrName})}var n=[],r;this.observe=function(n){r=n,r.addEventListener("DOMSubtreeModified",e,!1),r.addEventListener("DOMNodeInsertedIntoDocument",e,!1),r.addEventListener("DOMNodeInserted",e,!1),r.addEventListener("DOMAttrModified",t,!1)},this.disconnect=function(){r.removeEventListener("DOMSubtreeModified",e,!1),r.removeEventListener("DOMNodeInsertedIntoDocument",e,!1),r.removeEventListener("DOMNodeInserted",e,!1),r.removeEventListener("DOMAttrModified",t,!1)},this.takeRecords=function(){return n}}),f.on("keydown",function(e){var t=e.keyCode==te,n=e.ctrlKey||e.metaKey;if(!m(e)&&(t||e.keyCode==ee)){var r=f.selection.getRng(),i=r.startContainer,o=r.startOffset;if(t&&e.shiftKey)return;if(p(t,r))return void e.preventDefault();if(!n&&r.collapsed&&3==i.nodeType&&(t?o<i.data.length:o>0))return;e.preventDefault(),n&&f.selection.getSel().modify("extend",t?"forward":"backward",e.metaKey?"lineboundary":"word"),h(t)}}),f.on("keypress",function(t){if(!m(t)&&!w.isCollapsed()&&t.charCode>31&&!e.metaKeyPressed(t)){var n,r,i,o,a,s;n=f.selection.getRng(),s=String.fromCharCode(t.charCode),t.preventDefault(),r=Z(n.startContainer).parents().filter(function(e,t){return!!f.schema.getTextInlineElements()[t.nodeName]}),h(!0),r=r.filter(function(e,t){return!Z.contains(f.getBody(),t)}),r.length?(i=x.createFragment(),r.each(function(e,t){t=t.cloneNode(!1),i.hasChildNodes()?(t.appendChild(i.firstChild),i.appendChild(t)):(a=t,i.appendChild(t)),i.appendChild(t)}),a.appendChild(f.getDoc().createTextNode(s)),o=x.getParent(n.startContainer,x.isBlock),x.isEmpty(o)?Z(o).empty().append(i):n.insertNode(i),n.setStart(a.firstChild,1),n.setEnd(a.firstChild,1),f.selection.setRng(n)):f.selection.setContent(s)}}),f.addCommand("Delete",function(){h()}),f.addCommand("ForwardDelete",function(){h(!0)}),N||(f.on("dragstart",function(e){_=w.getRng(),g(e)}),f.on("drop",function(e){if(!m(e)){var n=v(e);n&&(e.preventDefault(),l.setEditorTimeout(f,function(){var r=t.getCaretRangeFromPoint(e.x,e.y,C);_&&(w.setRng(_),_=null,b()),w.setRng(r),y(n.html)}))}}),f.on("cut",function(e){m(e)||!e.clipboardData||f.selection.isCollapsed()||(e.preventDefault(),e.clipboardData.clearData(),e.clipboardData.setData("text/html",f.selection.getContent()),e.clipboardData.setData("text/plain",f.selection.getContent({format:"text"})),l.setEditorTimeout(f,function(){b(!0)}))}))}function C(){function e(e){var t=ne.create("body"),n=e.cloneContents();return t.appendChild(n),re.serializer.serialize(t,{format:"html"})}function n(n){if(!n.setStart){if(n.item)return!1;var r=n.duplicate();return r.moveToElementText(f.getBody()),t.compareRanges(n,r)}var i=e(n),o=ne.createRng();o.selectNode(f.getBody());var a=e(o);return i===a}f.on("keydown",function(e){var t=e.keyCode,r,i;if(!m(e)&&(t==te||t==ee)){if(r=f.selection.isCollapsed(),i=f.getBody(),r&&!ne.isEmpty(i))return;if(!r&&!n(f.selection.getRng()))return;e.preventDefault(),f.setContent(""),i.firstChild&&ne.isBlock(i.firstChild)?f.selection.setCursorLocation(i.firstChild,0):f.selection.setCursorLocation(i,0),f.nodeChanged()}})}function x(){f.shortcuts.add("meta+a",null,"SelectAll")}function w(){f.settings.content_editable||ne.bind(f.getDoc(),"mousedown mouseup",function(e){var t;if(e.target==f.getDoc().documentElement)if(t=re.getRng(),f.getBody().focus(),"mousedown"==e.type){if(u.isCaretContainer(t.startContainer))return;re.placeCaretAt(e.clientX,e.clientY)}else re.setRng(t)})}function E(){f.on("keydown",function(e){if(!m(e)&&e.keyCode===ee){if(!f.getBody().getElementsByTagName("hr").length)return;if(re.isCollapsed()&&0===re.getRng(!0).startOffset){var t=re.getNode(),n=t.previousSibling;if("HR"==t.nodeName)return ne.remove(t),void e.preventDefault();n&&n.nodeName&&"hr"===n.nodeName.toLowerCase()&&(ne.remove(n),e.preventDefault())}}})}function N(){window.Range.prototype.getClientRects||f.on("mousedown",function(e){if(!m(e)&&"HTML"===e.target.nodeName){var t=f.getBody();t.blur(),l.setEditorTimeout(f,function(){t.focus()})}})}function _(){f.on("click",function(e){var t=e.target;/^(IMG|HR)$/.test(t.nodeName)&&"false"!==ne.getContentEditableParent(t)&&(e.preventDefault(),re.getSel().setBaseAndExtent(t,0,t,1),f.nodeChanged()),"A"==t.nodeName&&ne.hasClass(t,"mce-item-anchor")&&(e.preventDefault(),re.select(t))})}function S(){function e(){var e=ne.getAttribs(re.getStart().cloneNode(!1));return function(){var t=re.getStart();t!==f.getBody()&&(ne.setAttrib(t,"style",null),Q(e,function(e){t.setAttributeNode(e.cloneNode(!0))}))}}function t(){return!re.isCollapsed()&&ne.getParent(re.getStart(),ne.isBlock)!=ne.getParent(re.getEnd(),ne.isBlock)}f.on("keypress",function(n){var r;if(!m(n)&&(8==n.keyCode||46==n.keyCode)&&t())return r=e(),f.getDoc().execCommand("delete",!1,null),r(),n.preventDefault(),!1}),ne.bind(f.getDoc(),"cut",function(n){var r;!m(n)&&t()&&(r=e(),l.setEditorTimeout(f,function(){r()}))})}function k(){document.body.setAttribute("role","application")}function T(){f.on("keydown",function(e){if(!m(e)&&e.keyCode===ee&&re.isCollapsed()&&0===re.getRng(!0).startOffset){var t=re.getNode().previousSibling;if(t&&t.nodeName&&"table"===t.nodeName.toLowerCase())return e.preventDefault(),!1}})}function R(){h()>7||(p("RespectVisibilityInDesign",!0),f.contentStyles.push(".mceHideBrInPre pre br {display: none}"),ne.addClass(f.getBody(),"mceHideBrInPre"),oe.addNodeFilter("pre",function(e){for(var t=e.length,n,r,o,a;t--;)for(n=e[t].getAll("br"),r=n.length;r--;)o=n[r],a=o.prev,a&&3===a.type&&"\n"!=a.value.charAt(a.value-1)?a.value+="\n":o.parent.insert(new i("#text",3),o,!0).value="\n"}),ae.addNodeFilter("pre",function(e){for(var t=e.length,n,r,i,o;t--;)for(n=e[t].getAll("br"),r=n.length;r--;)i=n[r],o=i.prev,o&&3==o.type&&(o.value=o.value.replace(/\r?\n$/,""))}))}function A(){ne.bind(f.getBody(),"mouseup",function(){var e,t=re.getNode();"IMG"==t.nodeName&&((e=ne.getStyle(t,"width"))&&(ne.setAttrib(t,"width",e.replace(/[^0-9%]+/g,"")),ne.setStyle(t,"width","")),(e=ne.getStyle(t,"height"))&&(ne.setAttrib(t,"height",e.replace(/[^0-9%]+/g,"")),ne.setStyle(t,"height","")))})}function B(){f.on("keydown",function(t){var n,r,i,o,a;if(!m(t)&&t.keyCode==e.BACKSPACE&&(n=re.getRng(),r=n.startContainer,i=n.startOffset,o=ne.getRoot(),a=r,n.collapsed&&0===i)){for(;a&&a.parentNode&&a.parentNode.firstChild==a&&a.parentNode!=o;)a=a.parentNode;"BLOCKQUOTE"===a.tagName&&(f.formatter.toggle("blockquote",null,a),n=ne.createRng(),n.setStart(r,0),n.setEnd(r,0),re.setRng(n))}})}function D(){function e(){K(),p("StyleWithCSS",!1),p("enableInlineTableEditing",!1),ie.object_resizing||p("enableObjectResizing",!1)}ie.readonly||f.on("BeforeExecCommand MouseDown",e)}function L(){function e(){Q(ne.select("a"),function(e){var t=e.parentNode,n=ne.getRoot();if(t.lastChild===e){for(;t&&!ne.isBlock(t);){if(t.parentNode.lastChild!==t||t===n)return;t=t.parentNode}ne.add(t,"br",{"data-mce-bogus":1})}})}f.on("SetContent ExecCommand",function(t){"setcontent"!=t.type&&"mceInsertLink"!==t.command||e()})}function M(){ie.forced_root_block&&f.on("init",function(){p("DefaultParagraphSeparator",ie.forced_root_block)})}function P(){f.on("keydown",function(e){var t;m(e)||e.keyCode!=ee||(t=f.getDoc().selection.createRange(),t&&t.item&&(e.preventDefault(),f.undoManager.beforeChange(),ne.remove(t.item(0)),f.undoManager.add()))})}function O(){var e;h()>=10&&(e="",Q("p div h1 h2 h3 h4 h5 h6".split(" "),function(t,n){e+=(n>0?",":"")+t+":empty"}),f.contentStyles.push(e+"{padding-right: 1px !important}"))}function H(){h()<9&&(oe.addNodeFilter("noscript",function(e){for(var t=e.length,n,r;t--;)n=e[t],r=n.firstChild,r&&n.attr("data-mce-innertext",r.value)}),ae.addNodeFilter("noscript",function(e){for(var t=e.length,n,r,a;t--;)n=e[t],r=e[t].firstChild,r?r.value=o.decode(r.value):(a=n.attributes.map["data-mce-innertext"],a&&(n.attr("data-mce-innertext",null),r=new i("#text",3),r.value=a,r.raw=!0,n.append(r)))}))}function I(){function e(e,t){var n=i.createTextRange();try{n.moveToPoint(e,t)}catch(r){n=null}return n}function t(t){var r;t.button?(r=e(t.x,t.y),r&&(r.compareEndPoints("StartToStart",a)>0?r.setEndPoint("StartToStart",a):r.setEndPoint("EndToEnd",a),r.select())):n()}function n(){var e=r.selection.createRange();a&&!e.item&&0===e.compareEndPoints("StartToEnd",e)&&a.select(),ne.unbind(r,"mouseup",n),ne.unbind(r,"mousemove",t),a=o=0}var r=ne.doc,i=r.body,o,a,s;r.documentElement.unselectable=!0,ne.bind(r,"mousedown contextmenu",function(i){if("HTML"===i.target.nodeName){if(o&&n(),s=r.documentElement,s.scrollHeight>s.clientHeight)return;o=1,a=e(i.x,i.y),a&&(ne.bind(r,"mouseup",n),ne.bind(r,"mousemove",t),ne.getRoot().focus(),a.select())}})}function F(){f.on("keyup focusin mouseup",function(t){65==t.keyCode&&e.metaKeyPressed(t)||re.normalize()},!0)}function z(){f.contentStyles.push("img:-moz-broken {-moz-force-broken-image-icon:1;min-width:24px;min-height:24px}")}function U(){f.inline||f.on("keydown",function(){document.activeElement==document.body&&f.getWin().focus()})}function W(){f.inline||(f.contentStyles.push("body {min-height: 150px}"),f.on("click",function(e){var t;if("HTML"==e.target.nodeName){if(a.ie>11)return void f.getBody().focus();t=f.selection.getRng(),f.getBody().focus(),f.selection.setRng(t),f.selection.normalize(),f.nodeChanged()}}))}function V(){a.mac&&f.on("keydown",function(t){!e.metaKeyPressed(t)||t.shiftKey||37!=t.keyCode&&39!=t.keyCode||(t.preventDefault(),f.selection.getSel().modify("move",37==t.keyCode?"backward":"forward","lineboundary"))})}function $(){p("AutoUrlDetect",!1)}function q(){f.on("click",function(e){var t=e.target;do if("A"===t.tagName)return void e.preventDefault();while(t=t.parentNode)}),f.contentStyles.push(".mce-content-body {-webkit-touch-callout: none}")}function j(){f.on("init",function(){f.dom.bind(f.getBody(),"submit",function(e){e.preventDefault()})})}function Y(){oe.addNodeFilter("br",function(e){for(var t=e.length;t--;)"Apple-interchange-newline"==e[t].attr("class")&&e[t].remove()})}function X(){f.on("dragstart",function(e){g(e)}),f.on("drop",function(e){if(!m(e)){var n=v(e);if(n&&n.id!=f.id){e.preventDefault();var r=t.getCaretRangeFromPoint(e.x,e.y,f.getDoc());re.setRng(r),y(n.html)}}})}function K(){}function G(){var e;return se?(e=f.selection.getSel(),!e||!e.rangeCount||0===e.rangeCount):0}function J(){function t(e){var t=new d(e.getBody()),r=e.selection.getRng(),i=c.fromRangeStart(r),o=c.fromRangeEnd(r),a=t.prev(i),s=t.next(o);return!e.selection.isCollapsed()&&(!a||a.isAtStart()&&n(i,a)===!1)&&(!s||s.isAtEnd()&&n(i,s)===!1)}var n=function(e,t){return e.getNode()===t.getNode()||e.isEqual(t)};f.on("keypress",function(n){!m(n)&&!re.isCollapsed()&&n.charCode>31&&!e.metaKeyPressed(n)&&t(f)&&(n.preventDefault(),f.setContent(String.fromCharCode(n.charCode)),f.selection.select(f.getBody(),!0),f.selection.collapse(!1),f.nodeChanged())}),f.on("keydown",function(e){var n=e.keyCode;m(e)||n!=te&&n!=ee||t(f)&&(e.preventDefault(),f.setContent(""),f.nodeChanged())})}var Q=s.each,Z=f.$,ee=e.BACKSPACE,te=e.DELETE,ne=f.dom,re=f.selection,ie=f.settings,oe=f.parser,ae=f.serializer,se=a.gecko,le=a.ie,ue=a.webkit,ce="data:text/mce-internal,",de=le?"Text":"URL";return B(),C(),a.windowsPhone||F(),ue&&(J(),b(),w(),_(),M(),j(),T(),Y(),a.iOS?(U(),W(),q()):x()),le&&a.ie<11&&(E(),k(),R(),A(),P(),O(),H(),I()),a.ie>=11&&(W(),T()),a.ie&&(x(),$(),X()),se&&(J(),E(),N(),S(),D(),L(),z(),V(),T()),{refreshContentEditable:K,isHidden:G}}}),r(Ue,[pe,w,m],function(e,t,n){function r(e,t){return"selectionchange"==t?e.getDoc():!e.inline&&/^mouse|touch|click|contextmenu|drop|dragover|dragend/.test(t)?e.getDoc().documentElement:e.settings.event_root?(e.eventRoot||(e.eventRoot=o.select(e.settings.event_root)[0]),e.eventRoot):e.getBody()}function i(e,t){function n(e){return!e.hidden&&!e.readonly}var i=r(e,t),s;if(e.delegates||(e.delegates={}),!e.delegates[t])if(e.settings.event_root){if(a||(a={},e.editorManager.on("removeEditor",function(){var t;if(!e.editorManager.activeEditor&&a){for(t in a)e.dom.unbind(r(e,t));a=null}})),a[t])return;s=function(r){for(var i=r.target,a=e.editorManager.editors,s=a.length;s--;){var l=a[s].getBody();(l===i||o.isChildOf(i,l))&&n(a[s])&&a[s].fire(t,r)}},a[t]=s,o.bind(i,t,s)}else s=function(r){n(e)&&e.fire(t,r)},o.bind(i,t,s),e.delegates[t]=s}var o=t.DOM,a,s={bindPendingEventDelegates:function(){var e=this;n.each(e._pendingNativeEvents,function(t){i(e,t)})},toggleNativeEvent:function(e,t){var n=this;"focus"!=e&&"blur"!=e&&(t?n.initialized?i(n,e):n._pendingNativeEvents?n._pendingNativeEvents.push(e):n._pendingNativeEvents=[e]:n.initialized&&(n.dom.unbind(r(n,e),e,n.delegates[e]),delete n.delegates[e]))},unbindAllNativeEvents:function(){var e=this,t;if(e.delegates){for(t in e.delegates)e.dom.unbind(r(e,t),t,e.delegates[t]);delete e.delegates}e.inline||(e.getBody().onload=null,e.dom.unbind(e.getWin()),e.dom.unbind(e.getDoc())),e.dom.unbind(e.getBody()),e.dom.unbind(e.getContainer())}};return s=n.extend({},e,s)}),r(We,[],function(){function e(e,t,n){try{e.getDoc().execCommand(t,!1,n)}catch(r){}}function t(e){var t,n;return t=e.getBody(),n=function(t){e.dom.getParents(t.target,"a").length>0&&t.preventDefault()},e.dom.bind(t,"click",n),{unbind:function(){e.dom.unbind(t,"click",n)}}}function n(n,r){n._clickBlocker&&(n._clickBlocker.unbind(),n._clickBlocker=null),r?(n._clickBlocker=t(n),n.selection.controlSelection.hideResizeRect(),n.readonly=!0,n.getBody().contentEditable=!1):(n.readonly=!1,n.getBody().contentEditable=!0,e(n,"StyleWithCSS",!1),e(n,"enableInlineTableEditing",!1),e(n,"enableObjectResizing",!1),n.focus(),n.nodeChanged())}function r(e,t){var r=e.readonly?"readonly":"design";t!=r&&(e.initialized?n(e,"readonly"==t):e.on("init",function(){n(e,"readonly"==t)}),e.fire("SwitchMode",{mode:t}))}return{setMode:r}}),r(Ve,[m,d],function(e,t){var n=e.each,r=e.explode,i={f9:120,f10:121,f11:122},o=e.makeMap("alt,ctrl,shift,meta,access");return function(a){function s(e){var a,s,l={};n(r(e,"+"),function(e){e in o?l[e]=!0:/^[0-9]{2,}$/.test(e)?l.keyCode=parseInt(e,10):(l.charCode=e.charCodeAt(0),l.keyCode=i[e]||e.toUpperCase().charCodeAt(0))}),a=[l.keyCode];for(s in o)l[s]?a.push(s):l[s]=!1;return l.id=a.join(","),l.access&&(l.alt=!0,t.mac?l.ctrl=!0:l.shift=!0),l.meta&&(t.mac?l.meta=!0:(l.ctrl=!0,l.meta=!1)),l}function l(t,n,i,o){var l;return l=e.map(r(t,">"),s),l[l.length-1]=e.extend(l[l.length-1],{func:i,scope:o||a}),e.extend(l[0],{desc:a.translate(n),subpatterns:l.slice(1)})}function u(e){return e.altKey||e.ctrlKey||e.metaKey}function c(e){return"keydown"===e.type&&e.keyCode>=112&&e.keyCode<=123}function d(e,t){return!!t&&(t.ctrl==e.ctrlKey&&t.meta==e.metaKey&&(t.alt==e.altKey&&t.shift==e.shiftKey&&(!!(e.keyCode==t.keyCode||e.charCode&&e.charCode==t.charCode)&&(e.preventDefault(),!0))))}function f(e){return e.func?e.func.call(e.scope):null}var p=this,h={},m=[];a.on("keyup keypress keydown",function(e){!u(e)&&!c(e)||e.isDefaultPrevented()||(n(h,function(t){if(d(e,t))return m=t.subpatterns.slice(0),"keydown"==e.type&&f(t),!0}),d(e,m[0])&&(1===m.length&&"keydown"==e.type&&f(m[0]),m.shift()))}),p.add=function(t,i,o,s){var u;return u=o,"string"==typeof o?o=function(){a.execCommand(u,!1,null)}:e.isArray(u)&&(o=function(){a.execCommand(u[0],u[1],u[2])}),n(r(e.trim(t.toLowerCase())),function(e){var t=l(e,i,o,s);h[t.id]=t}),!0},p.remove=function(e){var t=l(e);return!!h[t.id]&&(delete h[t.id],!0)}}}),r($e,[u,m,z],function(e,t,n){return function(r,i){function o(e){var t,n;return n={"image/jpeg":"jpg","image/jpg":"jpg","image/gif":"gif","image/png":"png"},t=n[e.blob().type.toLowerCase()]||"dat",e.filename()+"."+t}function a(e,t){return e?e.replace(/\/$/,"")+"/"+t.replace(/^\//,""):t}function s(e){return{id:e.id,blob:e.blob,base64:e.base64,filename:n.constant(o(e))}}function l(e,t,n,r){var o,s;o=new XMLHttpRequest,o.open("POST",i.url),o.withCredentials=i.credentials,o.upload.onprogress=function(e){r(e.loaded/e.total*100)},o.onerror=function(){n("Image upload failed due to a XHR Transport error. Code: "+o.status)},o.onload=function(){var e;return 200!=o.status?void n("HTTP Error: "+o.status):(e=JSON.parse(o.responseText),e&&"string"==typeof e.location?void t(a(i.basePath,e.location)):void n("Invalid JSON: "+o.responseText))},s=new FormData,s.append("file",e.blob(),e.filename()),o.send(s)}function u(){return new e(function(e){e([])})}function c(e,t){return{url:t,blobInfo:e,status:!0}}function d(e,t){return{url:"",blobInfo:e,status:!1,error:t}}function f(e,n){t.each(y[e],function(e){e(n)}),delete y[e]}function p(t,n,i){return r.markPending(t.blobUri()),new e(function(e){var o,a,l=function(){};try{var u=function(){o&&(o.close(),a=l)},p=function(n){u(),r.markUploaded(t.blobUri(),n),f(t.blobUri(),c(t,n)),e(c(t,n))},h=function(n){u(),r.removeFailed(t.blobUri()),f(t.blobUri(),d(t,n)),e(d(t,n))};a=function(e){e<0||e>100||(o||(o=i()),o.progressBar.value(e))},n(s(t),p,h,a)}catch(m){e(d(t,m.message))}})}function h(e){return e===l}function m(t){var n=t.blobUri();return new e(function(e){y[n]=y[n]||[],y[n].push(e)})}function g(n,o){return n=t.grep(n,function(e){return!r.isUploaded(e.blobUri())}),e.all(t.map(n,function(e){return r.isPending(e.blobUri())?m(e):p(e,i.handler,o)}))}function v(e,t){return!i.url&&h(i.handler)?u():g(e,t)}var y={};return i=t.extend({credentials:!1,handler:l},i),{upload:v}}}),r(qe,[u],function(e){function t(t){return new e(function(e){var n=new XMLHttpRequest;n.open("GET",t,!0),n.responseType="blob",n.onload=function(){200==this.status&&e(this.response)},n.send()})}function n(e){var t,n;return e=decodeURIComponent(e).split(","),n=/data:([^;]+)/.exec(e[0]),n&&(t=n[1]),{type:t,data:e[1]}}function r(t){return new e(function(e){var r,i,o;t=n(t);try{r=atob(t.data)}catch(a){return void e(new Blob([]))}for(i=new Uint8Array(r.length),o=0;o<i.length;o++)i[o]=r.charCodeAt(o);e(new Blob([i],{type:t.type}))})}function i(e){return 0===e.indexOf("blob:")?t(e):0===e.indexOf("data:")?r(e):null}function o(t){return new e(function(e){var n=new FileReader;n.onloadend=function(){e(n.result)},n.readAsDataURL(t)})}return{uriToBlob:i,blobToDataUri:o,parseDataUri:n}}),r(je,[u,h,z,qe,d],function(e,t,n,r,i){var o=0,a=function(e){return(e||"blobid")+o++};return function(o,s){function l(l,c){function d(e,t){var n,i;return 0===e.src.indexOf("blob:")?(i=s.getByUri(e.src),void(i?t({image:e,blobInfo:i}):r.uriToBlob(e.src).then(function(o){r.blobToDataUri(o).then(function(l){n=r.parseDataUri(l).data,i=s.create(a(),o,n),s.add(i),t({image:e,blobInfo:i})})}))):(n=r.parseDataUri(e.src).data,i=s.findFirst(function(e){return e.base64()===n}),void(i?t({image:e,blobInfo:i}):r.uriToBlob(e.src).then(function(r){i=s.create(a(),r,n),s.add(i),t({image:e,blobInfo:i})})))}var f,p;return c||(c=n.constant(!0)),f=t.filter(l.getElementsByTagName("img"),function(e){var t=e.src;return!!i.fileApi&&(!e.hasAttribute("data-mce-bogus")&&(!e.hasAttribute("data-mce-placeholder")&&(!(!t||t==i.transparentSrc)&&(0===t.indexOf("blob:")?!o.isUploaded(t):0===t.indexOf("data:")&&c(e)))))}),p=t.map(f,function(t){var n;return u[t.src]?new e(function(e){u[t.src].then(function(n){e({image:t,blobInfo:n.blobInfo})})}):(n=new e(function(e){d(t,e)}).then(function(e){return delete u[e.image.src],e})["catch"](function(e){return delete u[t.src],e}),u[t.src]=n,n)}),e.all(p)}var u={};return{
+findAll:l}}}),r(Ye,[h,z],function(e,t){return function(){function n(e,t,n,r){return{id:c(e),filename:c(r||e),blob:c(t),base64:c(n),blobUri:c(URL.createObjectURL(t))}}function r(e){i(e.id())||u.push(e)}function i(e){return o(function(t){return t.id()===e})}function o(t){return e.filter(u,t)[0]}function a(e){return o(function(t){return t.blobUri()==e})}function s(t){u=e.filter(u,function(e){return e.blobUri()!==t||(URL.revokeObjectURL(e.blobUri()),!1)})}function l(){e.each(u,function(e){URL.revokeObjectURL(e.blobUri())}),u=[]}var u=[],c=t.constant;return{create:n,add:r,get:i,getByUri:a,findFirst:o,removeByUri:s,destroy:l}}}),r(Xe,[],function(){return function(){function e(e,t){return{status:e,resultUri:t}}function t(e){return e in d}function n(e){var t=d[e];return t?t.resultUri:null}function r(e){return!!t(e)&&d[e].status===u}function i(e){return!!t(e)&&d[e].status===c}function o(t){d[t]=e(u,null)}function a(t,n){d[t]=e(c,n)}function s(e){delete d[e]}function l(){d={}}var u=1,c=2,d={};return{hasBlobUri:t,getResultUri:n,isPending:r,isUploaded:i,markPending:o,markUploaded:a,removeFailed:s,destroy:l}}}),r(Ke,[N],function(e){var t=e.PluginManager,n=function(e,n){for(var r in t.urls){var i=t.urls[r]+"/plugin"+n+".js";if(i===e)return r}return null},r=function(e,t){var r=n(t,e.suffix);return r?"Failed to load plugin: "+r+" from url "+t:"Failed to load plugin url: "+t},i=function(e,t){e.notificationManager.open({type:"error",text:t})},o=function(e,t){e._skinLoaded?i(e,t):e.on("SkinLoaded",function(){i(e,t)})},a=function(e,t){o(e,"Failed to upload image: "+t)},s=function(e,t){o(e,r(e,t))};return{pluginLoadError:s,uploadError:a}}),r(Ge,[h,$e,je,Ye,Xe,Ke],function(e,t,n,r,i,o){return function(a){function s(e){return function(t){return a.selection?e(t):[]}}function l(){return"?"+(new Date).getTime()}function u(e,t,n){var r=0;do r=e.indexOf(t,r),r!==-1&&(e=e.substring(0,r)+n+e.substr(r+t.length),r+=n.length-t.length+1);while(r!==-1);return e}function c(e,t,n){return e=u(e,'src="'+t+'"','src="'+n+'"'),e=u(e,'data-mce-src="'+t+'"','data-mce-src="'+n+'"')}function d(t,n){e.each(a.undoManager.data,function(r){"fragmented"===r.type?r.fragments=e.map(r.fragments,function(e){return c(e,t,n)}):r.content=c(r.content,t,n)})}function f(){return a.notificationManager.open({text:a.translate("Image uploading..."),type:"info",timeout:-1,progressBar:!0})}function p(e,t){C.removeByUri(e.src),d(e.src,t),a.$(e).attr({src:E.images_reuse_filename?t+l():t,"data-mce-src":a.convertURL(t,"src")})}function h(n){return x||(x=new t(N,{url:E.images_upload_url,basePath:E.images_upload_base_path,credentials:E.images_upload_credentials,handler:E.images_upload_handler})),v().then(s(function(t){var r;return r=e.map(t,function(e){return e.blobInfo}),x.upload(r,f).then(s(function(r){return r=e.map(r,function(e,n){var r=t[n].image;return e.status&&a.settings.images_replace_blob_uris!==!1?p(r,e.url):e.error&&o.uploadError(a,e.error),{element:r,status:e.status}}),n&&n(r),r}))}))}function m(e){if(E.automatic_uploads!==!1)return h(e)}function g(e){return!E.images_dataimg_filter||E.images_dataimg_filter(e)}function v(){return w||(w=new n(N,C)),w.findAll(a.getBody(),g).then(s(function(t){return e.each(t,function(e){d(e.image.src,e.blobInfo.blobUri()),e.image.src=e.blobInfo.blobUri(),e.image.removeAttribute("data-mce-src")}),t}))}function y(){C.destroy(),N.destroy(),w=x=null}function b(t){return t.replace(/src="(blob:[^"]+)"/g,function(t,n){var r=N.getResultUri(n);if(r)return'src="'+r+'"';var i=C.getByUri(n);return i||(i=e.reduce(a.editorManager.editors,function(e,t){return e||t.editorUpload.blobCache.getByUri(n)},null)),i?'src="data:'+i.blob().type+";base64,"+i.base64()+'"':t})}var C=new r,x,w,E=a.settings,N=new i;return a.on("setContent",function(){a.settings.automatic_uploads!==!1?m():v()}),a.on("RawSaveContent",function(e){e.content=b(e.content)}),a.on("getContent",function(e){e.source_view||"raw"==e.format||(e.content=b(e.content))}),a.on("PostRender",function(){a.parser.addNodeFilter("img",function(t){e.each(t,function(e){var t=e.attr("src");if(!C.getByUri(t)){var n=N.getResultUri(t);n&&e.attr("src",n)}})})}),{blobCache:C,uploadImages:h,uploadImagesAuto:m,scanForImages:v,destroy:y}}}),r(Je,[k,$,_,T,g,W,c],function(e,t,n,r,i,o,a){var s=n.isContentEditableFalse;return function(t,n){function r(e,n){var r=o.collapse(e.getBoundingClientRect(),n),i,a,s,l,u;return"BODY"==t.tagName?(i=t.ownerDocument.documentElement,a=t.scrollLeft||i.scrollLeft,s=t.scrollTop||i.scrollTop):(u=t.getBoundingClientRect(),a=t.scrollLeft-u.left,s=t.scrollTop-u.top),r.left+=a,r.right+=a,r.top+=s,r.bottom+=s,r.width=1,l=e.offsetWidth-e.clientWidth,l>0&&(n&&(l*=-1),r.left+=l,r.right+=l),r}function l(){var n,r,o,a,s;for(n=i("*[contentEditable=false]",t),a=0;a<n.length;a++)r=n[a],o=r.previousSibling,e.endsWithCaretContainer(o)&&(s=o.data,1==s.length?o.parentNode.removeChild(o):o.deleteData(s.length-1,1)),o=r.nextSibling,e.startsWithCaretContainer(o)&&(s=o.data,1==s.length?o.parentNode.removeChild(o):o.deleteData(0,1));return null}function u(o,a){var l,u;return c(),n(a)?(g=e.insertBlock("p",a,o),l=r(a,o),i(g).css("top",l.top),m=i('<div class="mce-visual-caret" data-mce-bogus="all"></div>').css(l).appendTo(t),o&&m.addClass("mce-visual-caret-before"),d(),u=a.ownerDocument.createRange(),u.setStart(g,0),u.setEnd(g,0),u):(g=e.insertInline(a,o),u=a.ownerDocument.createRange(),s(g.nextSibling)?(u.setStart(g,0),u.setEnd(g,0)):(u.setStart(g,1),u.setEnd(g,1)),u)}function c(){l(),g&&(e.remove(g),g=null),m&&(m.remove(),m=null),clearInterval(h)}function d(){h=a.setInterval(function(){i("div.mce-visual-caret",t).toggleClass("mce-visual-caret-hidden")},500)}function f(){a.clearInterval(h)}function p(){return".mce-visual-caret {position: absolute;background-color: black;background-color: currentcolor;}.mce-visual-caret-hidden {display: none;}*[data-mce-caret] {position: absolute;left: -1000px;right: auto;top: 0;margin: 0;padding: 0;}"}var h,m,g;return{show:u,hide:c,getCss:p,destroy:f}}}),r(Qe,[h,_,W],function(e,t,n){function r(i){function o(t){return e.map(t,function(e){return e=n.clone(e),e.node=i,e})}if(e.isArray(i))return e.reduce(i,function(e,t){return e.concat(r(t))},[]);if(t.isElement(i))return o(i.getClientRects());if(t.isText(i)){var a=i.ownerDocument.createRange();return a.setStart(i,0),a.setEnd(i,i.data.length),o(a.getClientRects())}}return{getClientRects:r}}),r(Ze,[z,h,Qe,U,ie,oe,$,W],function(e,t,n,r,i,o,a,s){function l(e,t,n,o){for(;o=i.findNode(o,e,r.isEditableCaretCandidate,t);)if(n(o))return}function u(e,r,i,o,a,s){function u(o){var s,l,u;for(u=n.getClientRects(o),e==-1&&(u=u.reverse()),s=0;s<u.length;s++)if(l=u[s],!i(l,p)){if(f.length>0&&r(l,t.last(f))&&c++,l.line=c,a(l))return!0;f.push(l)}}var c=0,d,f=[],p;return(p=t.last(s.getClientRects()))?(d=s.getNode(),u(d),l(e,o,u,d),f):f}function c(e,t){return t.line>e}function d(e,t){return t.line===e}function f(e,n,r,i){function l(n){return 1==e?t.last(n.getClientRects()):t.last(n.getClientRects())}var u=new o(n),c,d,f,p,h=[],m=0,g,v;1==e?(c=u.next,d=s.isBelow,f=s.isAbove,p=a.after(i)):(c=u.prev,d=s.isAbove,f=s.isBelow,p=a.before(i)),v=l(p);do if(p.isVisible()&&(g=l(p),!f(g,v))){if(h.length>0&&d(g,t.last(h))&&m++,g=s.clone(g),g.position=p,g.line=m,r(g))return h;h.push(g)}while(p=c(p));return h}var p=e.curry,h=p(u,-1,s.isAbove,s.isBelow),m=p(u,1,s.isBelow,s.isAbove);return{upUntil:h,downUntil:m,positionsUntil:f,isAboveLine:p(c),isLine:p(d)}}),r(et,[z,h,_,Qe,W,ie,U],function(e,t,n,r,i,o,a){function s(e,t){return Math.abs(e.left-t)}function l(e,t){return Math.abs(e.right-t)}function u(e,n){function r(e,t){return e>=t.left&&e<=t.right}return t.reduce(e,function(e,t){var i,o;return i=Math.min(s(e,n),l(e,n)),o=Math.min(s(t,n),l(t,n)),r(n,t)?t:r(n,e)?e:o==i&&m(t.node)?t:o<i?t:e})}function c(e,t,n,r){for(;r=g(r,e,a.isEditableCaretCandidate,t);)if(n(r))return}function d(e,n){function o(e,i){var o;return o=t.filter(r.getClientRects(i),function(t){return!e(t,n)}),a=a.concat(o),0===o.length}var a=[];return a.push(n),c(-1,e,v(o,i.isAbove),n.node),c(1,e,v(o,i.isBelow),n.node),a}function f(e){return t.filter(t.toArray(e.getElementsByTagName("*")),m)}function p(e,t){return{node:e.node,before:s(e,t)<l(e,t)}}function h(e,n,i){var o,a;return o=r.getClientRects(f(e)),o=t.filter(o,function(e){return i>=e.top&&i<=e.bottom}),a=u(o,n),a&&(a=u(d(e,a),n),a&&m(a.node))?p(a,n):null}var m=n.isContentEditableFalse,g=o.findNode,v=e.curry;return{findClosestClientRect:u,findLineNodeRects:d,closestCaret:h}}),r(tt,[],function(){var e=function(e){var t,n,r,i;return i=e.getBoundingClientRect(),t=e.ownerDocument,n=t.documentElement,r=t.defaultView,{top:i.top+r.pageYOffset-n.clientTop,left:i.left+r.pageXOffset-n.clientLeft}},t=function(t){return t.inline?e(t.getBody()):{left:0,top:0}},n=function(e){var t=e.getBody();return e.inline?{left:t.scrollLeft,top:t.scrollTop}:{left:0,top:0}},r=function(e){var t=e.getBody(),n=e.getDoc().documentElement,r={left:t.scrollLeft,top:t.scrollTop},i={left:t.scrollLeft||n.scrollLeft,top:t.scrollTop||n.scrollTop};return e.inline?r:i},i=function(t,n){if(n.target.ownerDocument!==t.getDoc()){var i=e(t.getContentAreaContainer()),o=r(t);return{left:n.pageX-i.left+o.left,top:n.pageY-i.top+o.top}}return{left:n.pageX,top:n.pageY}},o=function(e,t,n){return{pageX:n.left-e.left+t.left,pageY:n.top-e.top+t.top}},a=function(e,r){return o(t(e),n(e),i(e,r))};return{calc:a}}),r(nt,[_,h,z,c,w,tt],function(e,t,n,r,i,o){var a=e.isContentEditableFalse,s=e.isContentEditableTrue,l=function(e,t){return a(t)&&t!==e},u=function(e,t,n){return t!==n&&!e.dom.isChildOf(t,n)&&!a(t)},c=function(e){var t=e.cloneNode(!0);return t.removeAttribute("data-mce-selected"),t},d=function(e,t,n,r){var i=t.cloneNode(!0);e.dom.setStyles(i,{width:n,height:r}),e.dom.setAttrib(i,"data-mce-selected",null);var o=e.dom.create("div",{"class":"mce-drag-container","data-mce-bogus":"all",unselectable:"on",contenteditable:"false"});return e.dom.setStyles(o,{position:"absolute",opacity:.5,overflow:"hidden",border:0,padding:0,margin:0,width:n,height:r}),e.dom.setStyles(i,{margin:0,boxSizing:"border-box"}),o.appendChild(i),o},f=function(e,t){e.parentNode!==t&&t.appendChild(e)},p=function(e,t,n,r,i,o){var a=0,s=0;e.style.left=t.pageX+"px",e.style.top=t.pageY+"px",t.pageX+n>i&&(a=t.pageX+n-i),t.pageY+r>o&&(s=t.pageY+r-o),e.style.width=n-a+"px",e.style.height=r-s+"px"},h=function(e){e&&e.parentNode&&e.parentNode.removeChild(e)},m=function(e){return 0===e.button},g=function(e){return e.element},v=function(e,t){return{pageX:t.pageX-e.relX,pageY:t.pageY+5}},y=function(e,r){return function(i){if(m(i)){var o=t.find(r.dom.getParents(i.target),n.or(a,s));if(l(r.getBody(),o)){var u=r.dom.getPos(o),c=r.getBody(),f=r.getDoc().documentElement;e.element=o,e.screenX=i.screenX,e.screenY=i.screenY,e.maxX=(r.inline?c.scrollWidth:f.offsetWidth)-2,e.maxY=(r.inline?c.scrollHeight:f.offsetHeight)-2,e.relX=i.pageX-u.x,e.relY=i.pageY-u.y,e.width=o.offsetWidth,e.height=o.offsetHeight,e.ghost=d(r,o,e.width,e.height)}}}},b=function(e,t){var n=r.throttle(function(e,n){t._selectionOverrides.hideFakeCaret(),t.selection.placeCaretAt(e,n)},0);return function(r){var i=Math.max(Math.abs(r.screenX-e.screenX),Math.abs(r.screenY-e.screenY));if(g(e)&&!e.dragging&&i>10){var a=t.fire("dragstart",{target:e.element});if(a.isDefaultPrevented())return;e.dragging=!0,t.focus()}if(e.dragging){var s=v(e,o.calc(t,r));f(e.ghost,t.getBody()),p(e.ghost,s,e.width,e.height,e.maxX,e.maxY),n(r.clientX,r.clientY)}}},C=function(e){var t=e.getSel().getRangeAt(0),n=t.startContainer;return 3===n.nodeType?n.parentNode:n},x=function(e,t){return function(n){if(e.dragging&&u(t,C(t.selection),e.element)){var r=c(e.element),i=t.fire("drop",{targetClone:r,clientX:n.clientX,clientY:n.clientY});i.isDefaultPrevented()||(r=i.targetClone,t.undoManager.transact(function(){h(e.element),t.insertContent(t.dom.getOuterHTML(r)),t._selectionOverrides.hideFakeCaret()}))}E(e)}},w=function(e,t){return function(){E(e),e.dragging&&t.fire("dragend")}},E=function(e){e.dragging=!1,e.element=null,h(e.ghost)},N=function(e){var t={},n,r,o,a,s,l;n=i.DOM,l=document,r=y(t,e),o=b(t,e),a=x(t,e),s=w(t,e),e.on("mousedown",r),e.on("mousemove",o),e.on("mouseup",a),n.bind(l,"mousemove",o),n.bind(l,"mouseup",s),e.on("remove",function(){n.unbind(l,"mousemove",o),n.unbind(l,"mouseup",s)})},_=function(e){e.on("drop",function(t){var n="undefined"!=typeof t.clientX?e.getDoc().elementFromPoint(t.clientX,t.clientY):null;(a(n)||a(e.dom.getContentEditableParent(n)))&&t.preventDefault()})},S=function(e){N(e),_(e)};return{init:S}}),r(rt,[d,oe,$,k,ie,Je,Ze,et,_,T,W,I,z,h,c,nt],function(e,t,n,r,i,o,a,s,l,u,c,d,f,p,h,m){function g(e,t){for(;t=e(t);)if(t.isVisible())return t;return t}function v(u){function v(e){return u.dom.hasClass(e,"mce-offscreen-selection")}function _(){var e=u.dom.get(le);return e?e.getElementsByTagName("*")[0]:e}function S(e){return u.dom.isBlock(e)}function k(e){e&&u.selection.setRng(e)}function T(){return u.selection.getRng()}function R(e,t){u.selection.scrollIntoView(e,t)}function A(e,t,n){var r;return r=u.fire("ShowCaret",{target:t,direction:e,before:n}),r.isDefaultPrevented()?null:(R(t,e===-1),se.show(n,t))}function B(e){var t;return t=u.fire("BeforeObjectSelected",{target:e}),t.isDefaultPrevented()?null:D(e)}function D(e){var t=e.ownerDocument.createRange();return t.selectNode(e),t}function L(e,t){var n=i.isInSameBlock(e,t);return!(n||!l.isBr(e.getNode()))||n}function M(e,t){return t=i.normalizeRange(e,re,t),e==-1?n.fromRangeStart(t):n.fromRangeEnd(t)}function P(e){return r.isCaretContainerBlock(e.startContainer)}function O(e,t,n,r){var i,o,a,s;return!r.collapsed&&(i=N(r),C(i))?A(e,i,e==-1):(s=P(r),o=M(e,r),n(o)?B(o.getNode(e==-1)):(o=t(o))?n(o)?A(e,o.getNode(e==-1),1==e):(a=t(o),n(a)&&L(o,a)?A(e,a.getNode(e==-1),1==e):s?$(o.toRange()):null):s?r:null)}function H(e,t,n){var r,i,o,l,u,c,d,f,h;if(h=N(n),r=M(e,n),i=t(re,a.isAboveLine(1),r),o=p.filter(i,a.isLine(1)),u=p.last(r.getClientRects()),E(r)&&(h=r.getNode()),w(r)&&(h=r.getNode(!0)),!u)return null;if(c=u.left,l=s.findClosestClientRect(o,c),l&&C(l.node))return d=Math.abs(c-l.left),f=Math.abs(c-l.right),A(e,l.node,d<f);if(h){var m=a.positionsUntil(e,re,a.isAboveLine(1),h);if(l=s.findClosestClientRect(p.filter(m,a.isLine(1)),c))return $(l.position.toRange());if(l=p.last(p.filter(m,a.isLine(0))))return $(l.position.toRange())}}function I(t,r){function i(){var t=u.dom.create(u.settings.forced_root_block);return(!e.ie||e.ie>=11)&&(t.innerHTML='<br data-mce-bogus="1">'),t}var o,a,s;if(r.collapsed&&u.settings.forced_root_block){if(o=u.dom.getParent(r.startContainer,"PRE"),!o)return;a=1==t?oe(n.fromRangeStart(r)):ae(n.fromRangeStart(r)),a||(s=i(),1==t?u.$(o).after(s):u.$(o).before(s),u.selection.select(s,!0),u.selection.collapse())}}function F(e,t,n,r){var i;return(i=O(e,t,n,r))?i:(i=I(e,r),i?i:null)}function z(e,t,n){var r;return(r=H(e,t,n))?r:(r=I(e,n),r?r:null)}function U(){return ce("*[data-mce-caret]")[0]}function W(e){e.hasAttribute("data-mce-caret")&&(r.showCaretContainerBlock(e),k(T()),R(e[0]))}function V(e){var t,r;return e=i.normalizeRange(1,re,e),t=n.fromRangeStart(e),C(t.getNode())?A(1,t.getNode(),!t.isAtEnd()):C(t.getNode(!0))?A(1,t.getNode(!0),!1):(r=u.dom.getParent(t.getNode(),f.or(C,b)),C(r)?A(1,r,!1):null)}function $(e){var t;return e&&e.collapsed?(t=V(e),t?t:e):e}function q(e){var t,i,o,a;return C(e)?(C(e.previousSibling)&&(o=e.previousSibling),i=ae(n.before(e)),i||(t=oe(n.after(e))),t&&x(t.getNode())&&(a=t.getNode()),r.remove(e.previousSibling),r.remove(e.nextSibling),u.dom.remove(e),u.dom.isEmpty(u.getBody())?(u.setContent(""),void u.focus()):o?n.after(o).toRange():a?n.before(a).toRange():i?i.toRange():t?t.toRange():null):null}function j(e){var t=u.schema.getTextBlockElements();return e.nodeName in t}function Y(e){return u.dom.isEmpty(e)}function X(e,t,r){var i=u.dom,o,a,s,l;if(o=i.getParent(t.getNode(),i.isBlock),a=i.getParent(r.getNode(),i.isBlock),e===-1){if(l=r.getNode(!0),w(r)&&S(l))return j(o)?(Y(o)&&i.remove(o),n.after(l).toRange()):q(r.getNode(!0))}else if(l=t.getNode(),E(t)&&S(l))return j(a)?(Y(a)&&i.remove(a),n.before(l).toRange()):q(t.getNode());if(o===a||!j(o)||!j(a))return null;for(;s=o.firstChild;)a.appendChild(s);return u.dom.remove(o),r.toRange()}function K(e,t,n,i){var o,a,s,l;return!i.collapsed&&(o=N(i),C(o))?$(q(o)):(a=M(e,i),n(a)&&r.isCaretContainerBlock(i.startContainer)?(l=e==-1?ie.prev(a):ie.next(a),l?$(l.toRange()):i):t(a)?$(q(a.getNode(e==-1))):(s=e==-1?ie.prev(a):ie.next(a),t(s)?e===-1?X(e,a,s):X(e,s,a):void 0))}function G(){function i(e,t){var n=t(T());n&&!e.isDefaultPrevented()&&(e.preventDefault(),k(n))}function o(e){for(var t=u.getBody();e&&e!=t;){if(b(e)||C(e))return e;e=e.parentNode}return null}function l(e,t,n){return!n.collapsed&&p.reduce(n.getClientRects(),function(n,r){return n||c.containsXY(r,e,t)},!1)}function f(e){var t=!1;e.on("touchstart",function(){t=!1}),e.on("touchmove",function(){t=!0}),e.on("touchend",function(e){var n=o(e.target);C(n)&&(t||(e.preventDefault(),Z(B(n))))})}function g(){var e,t=o(u.selection.getNode());b(t)&&S(t)&&u.dom.isEmpty(t)&&(e=u.dom.create("br",{"data-mce-bogus":"1"}),u.$(t).empty().append(e),u.selection.setRng(n.before(e).toRange()))}function x(e){var t=U();if(t)return"compositionstart"==e.type?(e.preventDefault(),e.stopPropagation(),void W(t)):void(r.hasContent(t)&&W(t))}function N(e){var t;switch(e.keyCode){case d.DELETE:t=g();break;case d.BACKSPACE:t=g()}t&&e.preventDefault()}var R=y(F,1,oe,E),D=y(F,-1,ae,w),L=y(K,1,E,w),M=y(K,-1,w,E),P=y(z,-1,a.upUntil),O=y(z,1,a.downUntil);u.on("mouseup",function(){var e=T();e.collapsed&&k(V(e))}),u.on("click",function(e){var t;t=o(e.target),t&&(C(t)&&(e.preventDefault(),u.focus()),b(t)&&u.dom.isChildOf(t,u.selection.getNode())&&ee())}),u.on("blur NewBlock",function(){ee(),ne()});var H=function(e){var r=new t(e);if(!e.firstChild)return!1;var i=n.before(e.firstChild),o=r.next(i);return o&&!E(o)&&!w(o)},I=function(e,t){var n=u.dom.getParent(e,u.dom.isBlock),r=u.dom.getParent(t,u.dom.isBlock);return n===r},j=function(e){return!(e.keyCode>=112&&e.keyCode<=123)},Y=function(e,t){var n=u.dom.getParent(e,u.dom.isBlock),r=u.dom.getParent(t,u.dom.isBlock);return n&&!I(n,r)&&H(n)};f(u),u.on("mousedown",function(e){var t;if(t=o(e.target))C(t)?(e.preventDefault(),Z(B(t))):l(e.clientX,e.clientY,u.selection.getRng())||u.selection.placeCaretAt(e.clientX,e.clientY);else{ee(),ne();var n=s.closestCaret(re,e.clientX,e.clientY);n&&(Y(e.target,n.node)||(e.preventDefault(),u.getBody().focus(),k(A(1,n.node,n.before))))}}),u.on("keydown",function(e){if(!d.modifierPressed(e))switch(e.keyCode){case d.RIGHT:i(e,R);break;case d.DOWN:i(e,O);break;case d.LEFT:i(e,D);break;case d.UP:i(e,P);break;case d.DELETE:i(e,L);break;case d.BACKSPACE:i(e,M);break;default:C(u.selection.getNode())&&j(e)&&e.preventDefault()}}),u.on("keyup compositionstart",function(e){x(e),N(e)},!0),u.on("cut",function(){var e=u.selection.getNode();C(e)&&h.setEditorTimeout(u,function(){k($(q(e)))})}),u.on("getSelectionRange",function(e){var t=e.range;if(ue){if(!ue.parentNode)return void(ue=null);t=t.cloneRange(),t.selectNode(ue),e.range=t}}),u.on("setSelectionRange",function(e){var t;t=Z(e.range),t&&(e.range=t)}),u.on("AfterSetSelectionRange",function(e){var t=e.range;Q(t)||ne(),v(t.startContainer.parentNode)||ee()}),u.on("focus",function(){h.setEditorTimeout(u,function(){u.selection.setRng($(u.selection.getRng()))},0)}),u.on("copy",function(t){var n=t.clipboardData;if(!t.isDefaultPrevented()&&t.clipboardData&&!e.ie){var r=_();r&&(t.preventDefault(),n.clearData(),n.setData("text/html",r.outerHTML),n.setData("text/plain",r.outerText))}}),m.init(u)}function J(){var e=u.contentStyles,t=".mce-content-body";e.push(se.getCss()),e.push(t+" .mce-offscreen-selection {position: absolute;left: -9999999999px;max-width: 1000000px;}"+t+" *[contentEditable=false] {cursor: default;}"+t+" *[contentEditable=true] {cursor: text;}")}function Q(e){return r.isCaretContainer(e.startContainer)||r.isCaretContainer(e.endContainer)}function Z(t){var n,r=u.$,i=u.dom,o,a,s,l,c,d,f,p,h;if(!t)return null;if(t.collapsed){if(!Q(t)){if(f=M(1,t),C(f.getNode()))return A(1,f.getNode(),!f.isAtEnd());if(C(f.getNode(!0)))return A(1,f.getNode(!0),!1)}return null}return s=t.startContainer,l=t.startOffset,c=t.endOffset,3==s.nodeType&&0==l&&C(s.parentNode)&&(s=s.parentNode,l=i.nodeIndex(s),s=s.parentNode),1!=s.nodeType?null:(c==l+1&&(n=s.childNodes[l]),C(n)?(p=h=n.cloneNode(!0),d=u.fire("ObjectSelected",{target:n,targetClone:p}),d.isDefaultPrevented()?null:(p=d.targetClone,o=r("#"+le),0===o.length&&(o=r('<div data-mce-bogus="all" class="mce-offscreen-selection"></div>').attr("id",le),o.appendTo(u.getBody())),t=u.dom.createRng(),p===h&&e.ie?(o.empty().append('<p style="font-size: 0" data-mce-bogus="all">\xa0</p>').append(p),t.setStartAfter(o[0].firstChild.firstChild),t.setEndAfter(p)):(o.empty().append("\xa0").append(p).append("\xa0"),t.setStart(o[0].firstChild,1),t.setEnd(o[0].lastChild,0)),o.css({top:i.getPos(n,u.getBody()).y}),o[0].focus(),a=u.selection.getSel(),a.removeAllRanges(),a.addRange(t),u.$("*[data-mce-selected]").removeAttr("data-mce-selected"),n.setAttribute("data-mce-selected",1),ue=n,ne(),t)):null)}function ee(){ue&&(ue.removeAttribute("data-mce-selected"),u.$("#"+le).remove(),ue=null)}function te(){se.destroy(),ue=null}function ne(){se.hide()}var re=u.getBody(),ie=new t(re),oe=y(g,ie.next),ae=y(g,ie.prev),se=new o(u.getBody(),S),le="sel-"+u.dom.uniqueId(),ue,ce=u.$;return e.ceFalse&&(G(),J()),{showBlockCaretContainer:W,hideFakeCaret:ne,destroy:te}}var y=f.curry,b=l.isContentEditableTrue,C=l.isContentEditableFalse,x=l.isElement,w=i.isAfterContentEditableFalse,E=i.isBeforeContentEditableFalse,N=u.getSelectedNode;return v}),r(it,[],function(){var e=0,t=function(){var e=function(){return Math.round(4294967295*Math.random()).toString(36)},t=(new Date).getTime();return"s"+t.toString(36)+e()+e()+e()},n=function(n){return n+e++ +t()};return{uuid:n}}),r(ot,[],function(){var e=function(e,t,n){var r=e.sidebars?e.sidebars:[];r.push({name:t,settings:n}),e.sidebars=r};return{add:e}}),r(at,[w,g,N,R,A,O,P,Y,J,te,ne,re,le,ue,E,f,Le,Ie,B,L,ze,d,m,c,Ue,We,Ve,Ge,rt,it,ot,Ke],function(e,n,r,i,o,a,s,l,u,c,d,f,p,h,m,g,v,y,b,C,x,w,E,N,_,S,k,T,R,A,B,D){function L(e,t,i){var o=this,a,s,l;a=o.documentBaseUrl=i.documentBaseURL,s=i.baseURI,l=i.defaultSettings,t=H({id:e,theme:"modern",delta_width:0,delta_height:0,popup_css:"",plugins:"",document_base_url:a,add_form_submit_trigger:!0,submit_patch:!0,add_unload_trigger:!0,convert_urls:!0,relative_urls:!0,remove_script_host:!0,object_resizing:!0,doctype:"<!DOCTYPE html>",visual:!0,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",forced_root_block:"p",hidden_input:!0,padd_empty_editor:!0,render_ui:!0,indentation:"30px",inline_styles:!0,convert_fonts_to_spans:!0,indent:"simple",indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,th,ul,ol,li,dl,dt,dd,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,figcaption,option,optgroup,datalist",validate:!0,entity_encoding:"named",url_converter:o.convertURL,url_converter_scope:o,ie7_compat:!0},l,t),l&&l.external_plugins&&t.external_plugins&&(t.external_plugins=H({},l.external_plugins,t.external_plugins)),o.settings=t,r.language=t.language||"en",r.languageLoad=t.language_load,r.baseURL=i.baseURL,o.id=t.id=e,o.setDirty(!1),o.plugins={},o.documentBaseURI=new h(t.document_base_url||a,{base_uri:s}),o.baseURI=s,o.contentCSS=[],o.contentStyles=[],o.shortcuts=new k(o),o.loadedCSS={},o.editorCommands=new p(o),o.suffix=i.suffix,o.editorManager=i,o.inline=t.inline,o.settings.content_editable=o.inline,t.cache_suffix&&(w.cacheSuffix=t.cache_suffix.replace(/^[\?\&]+/,"")),t.override_viewport===!1&&(w.overrideViewPort=!1),i.fire("SetupEditor",o),o.execCallback("setup",o),o.$=n.overrideDefaults(function(){return{context:o.inline?o.getBody():o.getDoc(),element:o.getBody()}})}var M=e.DOM,P=r.ThemeManager,O=r.PluginManager,H=E.extend,I=E.each,F=E.explode,z=E.inArray,U=E.trim,W=E.resolve,V=g.Event,$=w.gecko,q=w.ie;return L.prototype={render:function(){function e(){M.unbind(window,"ready",e),n.render()}function t(){var e=m.ScriptLoader;if(r.language&&"en"!=r.language&&!r.language_url&&(r.language_url=n.editorManager.baseURL+"/langs/"+r.language+".js"),r.language_url&&e.add(r.language_url),r.theme&&"function"!=typeof r.theme&&"-"!=r.theme.charAt(0)&&!P.urls[r.theme]){var t=r.theme_url;t=t?n.documentBaseURI.toAbsolute(t):"themes/"+r.theme+"/theme"+o+".js",P.load(r.theme,t)}E.isArray(r.plugins)&&(r.plugins=r.plugins.join(" ")),I(r.external_plugins,function(e,t){O.load(t,e),r.plugins+=" "+t}),I(r.plugins.split(/[ ,]/),function(e){if(e=U(e),e&&!O.urls[e])if("-"==e.charAt(0)){e=e.substr(1,e.length);var t=O.dependencies(e);I(t,function(e){var t={prefix:"plugins/",resource:e,suffix:"/plugin"+o+".js"};e=O.createUrl(t,e),O.load(e.resource,e)})}else O.load(e,{prefix:"plugins/",resource:e,suffix:"/plugin"+o+".js"})}),e.loadQueue(function(){n.removed||n.init()},n,function(e){D.pluginLoadError(n,e[0]),n.removed||n.init()})}var n=this,r=n.settings,i=n.id,o=n.suffix;if(!V.domLoaded)return void M.bind(window,"ready",e);if(n.getElement()&&w.contentEditable){r.inline?n.inline=!0:(n.orgVisibility=n.getElement().style.visibility,n.getElement().style.visibility="hidden");var a=n.getElement().form||M.getParent(i,"form");a&&(n.formElement=a,r.hidden_input&&!/TEXTAREA|INPUT/i.test(n.getElement().nodeName)&&(M.insertAfter(M.create("input",{type:"hidden",name:i}),i),n.hasHiddenInput=!0),n.formEventDelegate=function(e){n.fire(e.type,e)},M.bind(a,"submit reset",n.formEventDelegate),n.on("reset",function(){n.setContent(n.startContent,{format:"raw"})}),!r.submit_patch||a.submit.nodeType||a.submit.length||a._mceOldSubmit||(a._mceOldSubmit=a.submit,a.submit=function(){return n.editorManager.triggerSave(),n.setDirty(!1),a._mceOldSubmit(a)})),n.windowManager=new v(n),n.notificationManager=new y(n),"xml"==r.encoding&&n.on("GetContent",function(e){e.save&&(e.content=M.encode(e.content))}),r.add_form_submit_trigger&&n.on("submit",function(){n.initialized&&n.save()}),r.add_unload_trigger&&(n._beforeUnload=function(){!n.initialized||n.destroyed||n.isHidden()||n.save({format:"raw",no_events:!0,set_dirty:!1})},n.editorManager.on("BeforeUnload",n._beforeUnload)),n.editorManager.add(n),t()}},init:function(){function e(n){var r=O.get(n),i,o;if(i=O.urls[n]||t.documentBaseUrl.replace(/\/$/,""),n=U(n),r&&z(m,n)===-1){if(I(O.dependencies(n),function(t){e(t)}),t.plugins[n])return;o=new r(t,i,t.$),t.plugins[n]=o,o.init&&(o.init(t,i),m.push(n))}}var t=this,n=t.settings,r=t.getElement(),i,o,a,s,l,u,c,d,f,p,h,m=[];if(t.rtl=n.rtl_ui||t.editorManager.i18n.rtl,t.editorManager.i18n.setCode(n.language),n.aria_label=n.aria_label||M.getAttrib(r,"aria-label",t.getLang("aria.rich_text_area")),t.fire("ScriptsLoaded"),n.theme&&("function"!=typeof n.theme?(n.theme=n.theme.replace(/-/,""),u=P.get(n.theme),t.theme=new u(t,P.urls[n.theme]),t.theme.init&&t.theme.init(t,P.urls[n.theme]||t.documentBaseUrl.replace(/\/$/,""),t.$)):t.theme=n.theme),I(n.plugins.replace(/\-/g,"").split(/[ ,]/),e),n.render_ui&&t.theme&&(t.orgDisplay=r.style.display,"function"!=typeof n.theme?(i=n.width||r.style.width||r.offsetWidth,o=n.height||r.style.height||r.offsetHeight,a=n.min_height||100,p=/^[0-9\.]+(|px)$/i,p.test(""+i)&&(i=Math.max(parseInt(i,10),100)),p.test(""+o)&&(o=Math.max(parseInt(o,10),a)),l=t.theme.renderUI({targetNode:r,width:i,height:o,deltaWidth:n.delta_width,deltaHeight:n.delta_height}),n.content_editable||(o=(l.iframeHeight||o)+("number"==typeof o?l.deltaHeight||0:""),o<a&&(o=a))):(l=n.theme(t,r),l.editorContainer.nodeType&&(l.editorContainer.id=l.editorContainer.id||t.id+"_parent"),l.iframeContainer.nodeType&&(l.iframeContainer.id=l.iframeContainer.id||t.id+"_iframecontainer"),o=l.iframeHeight||r.offsetHeight),t.editorContainer=l.editorContainer),n.content_css&&I(F(n.content_css),function(e){t.contentCSS.push(t.documentBaseURI.toAbsolute(e))}),n.content_style&&t.contentStyles.push(n.content_style),n.content_editable)return r=s=l=null,t.initContentBody();if(t.iframeHTML=n.doctype+"<html><head>",n.document_base_url!=t.documentBaseUrl&&(t.iframeHTML+='<base href="'+t.documentBaseURI.getURI()+'" />'),!w.caretAfter&&n.ie7_compat&&(t.iframeHTML+='<meta http-equiv="X-UA-Compatible" content="IE=7" />'),t.iframeHTML+='<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />',!/#$/.test(document.location.href))for(h=0;h<t.contentCSS.length;h++){var g=t.contentCSS[h];t.iframeHTML+='<link type="text/css" rel="stylesheet" href="'+E._addCacheSuffix(g)+'" />',t.loadedCSS[g]=!0}d=n.body_id||"tinymce",d.indexOf("=")!=-1&&(d=t.getParam("body_id","","hash"),d=d[t.id]||d),f=n.body_class||"",f.indexOf("=")!=-1&&(f=t.getParam("body_class","","hash"),f=f[t.id]||""),n.content_security_policy&&(t.iframeHTML+='<meta http-equiv="Content-Security-Policy" content="'+n.content_security_policy+'" />'),t.iframeHTML+='</head><body id="'+d+'" class="mce-content-body '+f+'" data-id="'+t.id+'"><br></body></html>';var v='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinymce.get("'+t.id+'");document.write(ed.iframeHTML);document.close();ed.initContentBody(true);})()';document.domain!=location.hostname&&w.ie&&w.ie<12&&(c=v);var y=M.create("iframe",{id:t.id+"_ifr",frameBorder:"0",allowTransparency:"true",title:t.editorManager.translate("Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help"),style:{width:"100%",height:o,display:"block"}});if(y.onload=function(){y.onload=null,t.fire("load")},M.setAttrib(y,"src",c||'javascript:""'),t.contentAreaContainer=l.iframeContainer,t.iframeElement=y,s=M.add(l.iframeContainer,y),q)try{t.getDoc()}catch(b){s.src=c=v}l.editorContainer&&(M.get(l.editorContainer).style.display=t.orgDisplay,t.hidden=M.isHidden(l.editorContainer)),t.getElement().style.display="none",M.setAttrib(t.id,"aria-hidden",!0),c||t.initContentBody(),r=s=l=null},initContentBody:function(t){var n=this,r=n.settings,s=n.getElement(),p=n.getDoc(),h,m;r.inline||(n.getElement().style.visibility=n.orgVisibility),t||r.content_editable||(p.open(),p.write(n.iframeHTML),p.close()),r.content_editable&&(n.on("remove",function(){var e=this.getBody();M.removeClass(e,"mce-content-body"),M.removeClass(e,"mce-edit-focus"),M.setAttrib(e,"contentEditable",null)}),M.addClass(s,"mce-content-body"),n.contentDocument=p=r.content_document||document,n.contentWindow=r.content_window||window,n.bodyElement=s,r.content_document=r.content_window=null,r.root_name=s.nodeName.toLowerCase()),h=n.getBody(),h.disabled=!0,n.readonly=r.readonly,n.readonly||(n.inline&&"static"==M.getStyle(h,"position",!0)&&(h.style.position="relative"),h.contentEditable=n.getParam("content_editable_state",!0)),h.disabled=!1,n.editorUpload=new T(n),n.schema=new b(r),n.dom=new e(p,{keep_values:!0,url_converter:n.convertURL,url_converter_scope:n,hex_colors:r.force_hex_style_colors,class_filter:r.class_filter,update_styles:!0,root_element:n.inline?n.getBody():null,collect:r.content_editable,schema:n.schema,onSetAttrib:function(e){n.fire("SetAttrib",e)}}),n.parser=new C(r,n.schema),n.parser.addAttributeFilter("src,href,style,tabindex",function(e,t){for(var r=e.length,i,o=n.dom,a,s;r--;)if(i=e[r],a=i.attr(t),s="data-mce-"+t,!i.attributes.map[s]){if(0===a.indexOf("data:")||0===a.indexOf("blob:"))continue;"style"===t?(a=o.serializeStyle(o.parseStyle(a),i.name),a.length||(a=null),i.attr(s,a),i.attr(t,a)):"tabindex"===t?(i.attr(s,a),i.attr(t,null)):i.attr(s,n.convertURL(a,t,i.name))}}),n.parser.addNodeFilter("script",function(e){for(var t=e.length,n,r;t--;)n=e[t],r=n.attr("type")||"no/type",0!==r.indexOf("mce-")&&n.attr("type","mce-"+r);
+}),n.parser.addNodeFilter("#cdata",function(e){for(var t=e.length,n;t--;)n=e[t],n.type=8,n.name="#comment",n.value="[CDATA["+n.value+"]]"}),n.parser.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(e){for(var t=e.length,r,i=n.schema.getNonEmptyElements();t--;)r=e[t],r.isEmpty(i)&&0===r.getAll("br").length&&(r.append(new o("br",1)).shortEnded=!0)}),n.serializer=new a(r,n),n.selection=new l(n.dom,n.getWin(),n.serializer,n),n.formatter=new u(n),n.undoManager=new c(n),n.forceBlocks=new f(n),n.enterKey=new d(n),n._nodeChangeDispatcher=new i(n),n._selectionOverrides=new R(n),n.fire("PreInit"),r.browser_spellcheck||r.gecko_spellcheck||(p.body.spellcheck=!1,M.setAttrib(h,"spellcheck","false")),n.quirks=new x(n),n.fire("PostRender"),r.directionality&&(h.dir=r.directionality),r.nowrap&&(h.style.whiteSpace="nowrap"),r.protect&&n.on("BeforeSetContent",function(e){I(r.protect,function(t){e.content=e.content.replace(t,function(e){return"<!--mce:protected "+escape(e)+"-->"})})}),n.on("SetContent",function(){n.addVisual(n.getBody())}),r.padd_empty_editor&&n.on("PostProcess",function(e){e.content=e.content.replace(/^(<p[^>]*>(&nbsp;|&#160;|\s|\u00a0|<br \/>|)<\/p>[\r\n]*|<br \/>[\r\n]*)$/,"")}),n.load({initial:!0,format:"html"}),n.startContent=n.getContent({format:"raw"}),n.initialized=!0,n.bindPendingEventDelegates(),n.fire("init"),n.focus(!0),n.nodeChanged({initial:!0}),n.execCallback("init_instance_callback",n),n.on("compositionstart compositionend",function(e){n.composing="compositionstart"===e.type}),n.contentStyles.length>0&&(m="",I(n.contentStyles,function(e){m+=e+"\r\n"}),n.dom.addStyle(m)),I(n.contentCSS,function(e){n.loadedCSS[e]||(n.dom.loadCSS(e),n.loadedCSS[e]=!0)}),r.auto_focus&&N.setEditorTimeout(n,function(){var e;e=r.auto_focus===!0?n:n.editorManager.get(r.auto_focus),e.destroyed||e.focus()},100),s=p=h=null},focus:function(e){function t(e){return n.dom.getParent(e,function(e){return"true"===n.dom.getContentEditable(e)})}var n=this,r=n.selection,i=n.settings.content_editable,o,a,s=n.getDoc(),l=n.getBody(),u;if(!e){if(o=r.getRng(),o.item&&(a=o.item(0)),n.quirks.refreshContentEditable(),u=t(r.getNode()),n.$.contains(l,u))return u.focus(),r.normalize(),void n.editorManager.setActive(n);if(i||(w.opera||n.getBody().focus(),n.getWin().focus()),$||i){if(l.setActive)try{l.setActive()}catch(c){l.focus()}else l.focus();i&&r.normalize()}a&&a.ownerDocument==s&&(o=s.body.createControlRange(),o.addElement(a),o.select())}n.editorManager.setActive(n)},execCallback:function(e){var t=this,n=t.settings[e],r;if(n)return t.callbackLookup&&(r=t.callbackLookup[e])&&(n=r.func,r=r.scope),"string"==typeof n&&(r=n.replace(/\.\w+$/,""),r=r?W(r):0,n=W(n),t.callbackLookup=t.callbackLookup||{},t.callbackLookup[e]={func:n,scope:r}),n.apply(r||t,Array.prototype.slice.call(arguments,1))},translate:function(e){var t=this.settings.language||"en",n=this.editorManager.i18n;return e?(e=n.data[t+"."+e]||e.replace(/\{\#([^\}]+)\}/g,function(e,r){return n.data[t+"."+r]||"{#"+r+"}"}),this.editorManager.translate(e)):""},getLang:function(e,n){return this.editorManager.i18n.data[(this.settings.language||"en")+"."+e]||(n!==t?n:"{#"+e+"}")},getParam:function(e,t,n){var r=e in this.settings?this.settings[e]:t,i;return"hash"===n?(i={},"string"==typeof r?I(r.indexOf("=")>0?r.split(/[;,](?![^=;,]*(?:[;,]|$))/):r.split(","),function(e){e=e.split("="),e.length>1?i[U(e[0])]=U(e[1]):i[U(e[0])]=U(e)}):i=r,i):r},nodeChanged:function(e){this._nodeChangeDispatcher.nodeChanged(e)},addButton:function(e,t){var n=this;t.cmd&&(t.onclick=function(){n.execCommand(t.cmd)}),t.text||t.icon||(t.icon=e),n.buttons=n.buttons||{},t.tooltip=t.tooltip||t.title,n.buttons[e]=t},addSidebar:function(e,t){return B.add(this,e,t)},addMenuItem:function(e,t){var n=this;t.cmd&&(t.onclick=function(){n.execCommand(t.cmd)}),n.menuItems=n.menuItems||{},n.menuItems[e]=t},addContextToolbar:function(e,t){var n=this,r;n.contextToolbars=n.contextToolbars||[],"string"==typeof e&&(r=e,e=function(e){return n.dom.is(e,r)}),n.contextToolbars.push({id:A.uuid("mcet"),predicate:e,items:t})},addCommand:function(e,t,n){this.editorCommands.addCommand(e,t,n)},addQueryStateHandler:function(e,t,n){this.editorCommands.addQueryStateHandler(e,t,n)},addQueryValueHandler:function(e,t,n){this.editorCommands.addQueryValueHandler(e,t,n)},addShortcut:function(e,t,n,r){this.shortcuts.add(e,t,n,r)},execCommand:function(e,t,n,r){return this.editorCommands.execCommand(e,t,n,r)},queryCommandState:function(e){return this.editorCommands.queryCommandState(e)},queryCommandValue:function(e){return this.editorCommands.queryCommandValue(e)},queryCommandSupported:function(e){return this.editorCommands.queryCommandSupported(e)},show:function(){var e=this;e.hidden&&(e.hidden=!1,e.inline?e.getBody().contentEditable=!0:(M.show(e.getContainer()),M.hide(e.id)),e.load(),e.fire("show"))},hide:function(){var e=this,t=e.getDoc();e.hidden||(q&&t&&!e.inline&&t.execCommand("SelectAll"),e.save(),e.inline?(e.getBody().contentEditable=!1,e==e.editorManager.focusedEditor&&(e.editorManager.focusedEditor=null)):(M.hide(e.getContainer()),M.setStyle(e.id,"display",e.orgDisplay)),e.hidden=!0,e.fire("hide"))},isHidden:function(){return!!this.hidden},setProgressState:function(e,t){this.fire("ProgressState",{state:e,time:t})},load:function(e){var n=this,r=n.getElement(),i;if(r)return e=e||{},e.load=!0,i=n.setContent(r.value!==t?r.value:r.innerHTML,e),e.element=r,e.no_events||n.fire("LoadContent",e),e.element=r=null,i},save:function(e){var t=this,n=t.getElement(),r,i;if(n&&t.initialized)return e=e||{},e.save=!0,e.element=n,r=e.content=t.getContent(e),e.no_events||t.fire("SaveContent",e),"raw"==e.format&&t.fire("RawSaveContent",e),r=e.content,/TEXTAREA|INPUT/i.test(n.nodeName)?n.value=r:(t.inline||(n.innerHTML=r),(i=M.getParent(t.id,"form"))&&I(i.elements,function(e){if(e.name==t.id)return e.value=r,!1})),e.element=n=null,e.set_dirty!==!1&&t.setDirty(!1),r},setContent:function(e,t){var n=this,r=n.getBody(),i,o;return t=t||{},t.format=t.format||"html",t.set=!0,t.content=e,t.no_events||n.fire("BeforeSetContent",t),e=t.content,0===e.length||/^\s+$/.test(e)?(o=q&&q<11?"":'<br data-mce-bogus="1">',"TABLE"==r.nodeName?e="<tr><td>"+o+"</td></tr>":/^(UL|OL)$/.test(r.nodeName)&&(e="<li>"+o+"</li>"),i=n.settings.forced_root_block,i&&n.schema.isValidChild(r.nodeName.toLowerCase(),i.toLowerCase())?(e=o,e=n.dom.createHTML(i,n.settings.forced_root_block_attrs,e)):q||e||(e='<br data-mce-bogus="1">'),n.dom.setHTML(r,e),n.fire("SetContent",t)):("raw"!==t.format&&(e=new s({validate:n.validate},n.schema).serialize(n.parser.parse(e,{isRootContent:!0}))),t.content=U(e),n.dom.setHTML(r,t.content),t.no_events||n.fire("SetContent",t)),t.content},getContent:function(e){var t=this,n,r=t.getBody();return e=e||{},e.format=e.format||"html",e.get=!0,e.getInner=!0,e.no_events||t.fire("BeforeGetContent",e),n="raw"==e.format?E.trim(t.serializer.getTrimmedContent()):"text"==e.format?r.innerText||r.textContent:t.serializer.serialize(r,e),"text"!=e.format?e.content=U(n):e.content=n,e.no_events||t.fire("GetContent",e),e.content},insertContent:function(e,t){t&&(e=H({content:e},t)),this.execCommand("mceInsertContent",!1,e)},isDirty:function(){return!this.isNotDirty},setDirty:function(e){var t=!this.isNotDirty;this.isNotDirty=!e,e&&e!=t&&this.fire("dirty")},setMode:function(e){S.setMode(this,e)},getContainer:function(){var e=this;return e.container||(e.container=M.get(e.editorContainer||e.id+"_parent")),e.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return this.targetElm||(this.targetElm=M.get(this.id)),this.targetElm},getWin:function(){var e=this,t;return e.contentWindow||(t=e.iframeElement,t&&(e.contentWindow=t.contentWindow)),e.contentWindow},getDoc:function(){var e=this,t;return e.contentDocument||(t=e.getWin(),t&&(e.contentDocument=t.document)),e.contentDocument},getBody:function(){var e=this.getDoc();return this.bodyElement||(e?e.body:null)},convertURL:function(e,t,n){var r=this,i=r.settings;return i.urlconverter_callback?r.execCallback("urlconverter_callback",e,n,!0,t):!i.convert_urls||n&&"LINK"==n.nodeName||0===e.indexOf("file:")||0===e.length?e:i.relative_urls?r.documentBaseURI.toRelative(e):e=r.documentBaseURI.toAbsolute(e,i.remove_script_host)},addVisual:function(e){var n=this,r=n.settings,i=n.dom,o;e=e||n.getBody(),n.hasVisual===t&&(n.hasVisual=r.visual),I(i.select("table,a",e),function(e){var t;switch(e.nodeName){case"TABLE":return o=r.visual_table_class||"mce-item-table",t=i.getAttrib(e,"border"),void(t&&"0"!=t||!n.hasVisual?i.removeClass(e,o):i.addClass(e,o));case"A":return void(i.getAttrib(e,"href",!1)||(t=i.getAttrib(e,"name")||e.id,o=r.visual_anchor_class||"mce-item-anchor",t&&n.hasVisual?i.addClass(e,o):i.removeClass(e,o)))}}),n.fire("VisualAid",{element:e,hasVisual:n.hasVisual})},remove:function(){var e=this;e.removed||(e.save(),e.removed=1,e.unbindAllNativeEvents(),e.hasHiddenInput&&M.remove(e.getElement().nextSibling),e.inline||(q&&q<10&&e.getDoc().execCommand("SelectAll",!1,null),M.setStyle(e.id,"display",e.orgDisplay),e.getBody().onload=null),e.fire("remove"),e.editorManager.remove(e),M.remove(e.getContainer()),e._selectionOverrides.destroy(),e.editorUpload.destroy(),e.destroy())},destroy:function(e){var t=this,n;if(!t.destroyed){if(!e&&!t.removed)return void t.remove();e||(t.editorManager.off("beforeunload",t._beforeUnload),t.theme&&t.theme.destroy&&t.theme.destroy(),t.selection.destroy(),t.dom.destroy()),n=t.formElement,n&&(n._mceOldSubmit&&(n.submit=n._mceOldSubmit,n._mceOldSubmit=null),M.unbind(n,"submit reset",t.formEventDelegate)),t.contentAreaContainer=t.formElement=t.container=t.editorContainer=null,t.bodyElement=t.contentDocument=t.contentWindow=null,t.iframeElement=t.targetElm=null,t.selection&&(t.selection=t.selection.win=t.selection.dom=t.selection.dom.doc=null),t.destroyed=1}},uploadImages:function(e){return this.editorUpload.uploadImages(e)},_scanForImages:function(){return this.editorUpload.scanForImages()}},H(L.prototype,_),L}),r(st,[m],function(e){var t={},n="en";return{setCode:function(e){e&&(n=e,this.rtl=!!this.data[e]&&"rtl"===this.data[e]._dir)},getCode:function(){return n},rtl:!1,add:function(e,n){var r=t[e];r||(t[e]=r={});for(var i in n)r[i]=n[i];this.setCode(e)},translate:function(r){function i(t){return e.is(t,"function")?Object.prototype.toString.call(t):o(t)?"":""+t}function o(t){return""===t||null===t||e.is(t,"undefined")}function a(t){return t=i(t),e.hasOwn(s,t)?i(s[t]):t}var s=t[n]||{};if(o(r))return"";if(e.is(r,"object")&&e.hasOwn(r,"raw"))return i(r.raw);if(e.is(r,"array")){var l=r.slice(1);r=a(r[0]).replace(/\{([0-9]+)\}/g,function(t,n){return e.hasOwn(l,n)?i(l[n]):t})}return a(r).replace(/{context:\w+}$/,"")},data:t}}),r(lt,[w,c,d],function(e,t,n){function r(e){function r(){try{return document.activeElement}catch(e){return document.body}}function u(e,t){if(t&&t.startContainer){if(!e.isChildOf(t.startContainer,e.getRoot())||!e.isChildOf(t.endContainer,e.getRoot()))return;return{startContainer:t.startContainer,startOffset:t.startOffset,endContainer:t.endContainer,endOffset:t.endOffset}}return t}function c(e,t){var n;return t.startContainer?(n=e.getDoc().createRange(),n.setStart(t.startContainer,t.startOffset),n.setEnd(t.endContainer,t.endOffset)):n=t,n}function d(d){var f=d.editor;f.on("init",function(){(f.inline||n.ie)&&("onbeforedeactivate"in document&&n.ie<9?f.dom.bind(f.getBody(),"beforedeactivate",function(e){if(e.target==f.getBody())try{f.lastRng=f.selection.getRng()}catch(t){}}):f.on("nodechange mouseup keyup",function(e){var t=r();"nodechange"==e.type&&e.selectionChange||(t&&t.id==f.id+"_ifr"&&(t=f.getBody()),f.dom.isChildOf(t,f.getBody())&&(f.lastRng=f.selection.getRng()))}),n.webkit&&!i&&(i=function(){var t=e.activeEditor;if(t&&t.selection){var n=t.selection.getRng();n&&!n.collapsed&&(f.lastRng=n)}},s.bind(document,"selectionchange",i)))}),f.on("setcontent",function(){f.lastRng=null}),f.on("mousedown",function(){f.selection.lastFocusBookmark=null}),f.on("focusin",function(){var t=e.focusedEditor,n;f.selection.lastFocusBookmark&&(n=c(f,f.selection.lastFocusBookmark),f.selection.lastFocusBookmark=null,f.selection.setRng(n)),t!=f&&(t&&t.fire("blur",{focusedEditor:f}),e.setActive(f),e.focusedEditor=f,f.fire("focus",{blurredEditor:t}),f.focus(!0)),f.lastRng=null}),f.on("focusout",function(){t.setEditorTimeout(f,function(){var t=e.focusedEditor;l(f,r())||t!=f||(f.fire("blur",{focusedEditor:null}),e.focusedEditor=null,f.selection&&(f.selection.lastFocusBookmark=null))})}),o||(o=function(t){var n=e.activeEditor,r;r=t.target,n&&r.ownerDocument==document&&(n.selection&&r!=n.getBody()&&(n.selection.lastFocusBookmark=u(n.dom,n.lastRng)),r==document.body||l(n,r)||e.focusedEditor!=n||(n.fire("blur",{focusedEditor:null}),e.focusedEditor=null))},s.bind(document,"focusin",o)),f.inline&&!a&&(a=function(t){var n=e.activeEditor,r=n.dom;if(n.inline&&r&&!r.isChildOf(t.target,n.getBody())){var i=n.selection.getRng();i.collapsed||(n.lastRng=i)}},s.bind(document,"mouseup",a))}function f(t){e.focusedEditor==t.editor&&(e.focusedEditor=null),e.activeEditor||(s.unbind(document,"selectionchange",i),s.unbind(document,"focusin",o),s.unbind(document,"mouseup",a),i=o=a=null)}e.on("AddEditor",d),e.on("RemoveEditor",f)}var i,o,a,s=e.DOM,l=function(e,t){var n=e?e.settings.custom_ui_selector:"",i=s.getParent(t,function(t){return r.isEditorUIElement(t)||!!n&&e.dom.is(t,n)});return null!==i};return r.isEditorUIElement=function(e){return e.className.toString().indexOf("mce-")!==-1},r._isUIElement=l,r}),r(ut,[at,g,w,ue,d,m,u,pe,st,lt,N],function(e,t,n,r,i,o,a,s,l,u,c){function d(e){v(x.editors,function(t){"scroll"===e.type?t.fire("ScrollWindow",e):t.fire("ResizeWindow",e)})}function f(e,n){n!==w&&(n?t(window).on("resize scroll",d):t(window).off("resize scroll",d),w=n)}function p(e){var t=x.editors,n;delete t[e.id];for(var r=0;r<t.length;r++)if(t[r]==e){t.splice(r,1),n=!0;break}return x.activeEditor==e&&(x.activeEditor=t[0]),x.focusedEditor==e&&(x.focusedEditor=null),n}function h(e){return e&&e.initialized&&!(e.getContainer()||e.getBody()).parentNode&&(p(e),e.unbindAllNativeEvents(),e.destroy(!0),e.removed=!0,e=null),e}var m=n.DOM,g=o.explode,v=o.each,y=o.extend,b=0,C,x,w=!1;return x={$:t,majorVersion:"4",minorVersion:"5.3",releaseDate:"2017-02-01",editors:[],i18n:l,activeEditor:null,setup:function(){var e=this,t,n,i="",o,a;if(n=r.getDocumentBaseUrl(document.location),/^[^:]+:\/\/\/?[^\/]+\//.test(n)&&(n=n.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,""),/[\/\\]$/.test(n)||(n+="/")),o=window.tinymce||window.tinyMCEPreInit)t=o.base||o.baseURL,i=o.suffix;else{for(var s=document.getElementsByTagName("script"),l=0;l<s.length;l++){a=s[l].src;var c=a.substring(a.lastIndexOf("/"));if(/tinymce(\.full|\.jquery|)(\.min|\.dev|)\.js/.test(a)){c.indexOf(".min")!=-1&&(i=".min"),t=a.substring(0,a.lastIndexOf("/"));break}}!t&&document.currentScript&&(a=document.currentScript.src,a.indexOf(".min")!=-1&&(i=".min"),t=a.substring(0,a.lastIndexOf("/")))}e.baseURL=new r(n).toAbsolute(t),e.documentBaseURL=n,e.baseURI=new r(e.baseURL),e.suffix=i,e.focusManager=new u(e)},overrideDefaults:function(e){var t,n;t=e.base_url,t&&(this.baseURL=new r(this.documentBaseURL).toAbsolute(t.replace(/\/+$/,"")),this.baseURI=new r(this.baseURL)),n=e.suffix,e.suffix&&(this.suffix=n),this.defaultSettings=e;var i=e.plugin_base_urls;for(var o in i)c.PluginManager.urls[o]=i[o]},init:function(n){function r(e,t){return e.inline&&t.tagName.toLowerCase()in C}function i(e,t){window.console&&!window.test&&window.console.log(e,t)}function s(e){var t=e.id;return t||(t=e.name,t=t&&!m.get(t)?e.name:m.uniqueId(),e.setAttribute("id",t)),t}function l(e){var t=n[e];if(t)return t.apply(f,Array.prototype.slice.call(arguments,2))}function u(e,t){return t.constructor===RegExp?t.test(e.className):m.hasClass(e,t)}function c(e){var t,n=[];if(e.types)return v(e.types,function(e){n=n.concat(m.select(e.selector))}),n;if(e.selector)return m.select(e.selector);if(e.target)return[e.target];switch(e.mode){case"exact":t=e.elements||"",t.length>0&&v(g(t),function(e){var t;(t=m.get(e))?n.push(t):v(document.forms,function(t){v(t.elements,function(t){t.name===e&&(e="mce_editor_"+b++,m.setAttrib(t,"id",e),n.push(t))})})});break;case"textareas":case"specific_textareas":v(m.select("textarea"),function(t){e.editor_deselector&&u(t,e.editor_deselector)||e.editor_selector&&!u(t,e.editor_selector)||n.push(t)})}return n}function d(){function a(t,n,r){var i=new e(t,n,f);p.push(i),i.on("init",function(){++u===g.length&&x(p)}),i.targetElm=i.targetElm||r,i.render()}var u=0,p=[],g;return m.unbind(window,"ready",d),l("onpageload"),g=t.unique(c(n)),n.types?void v(n.types,function(e){o.each(g,function(t){return!m.is(t,e.selector)||(a(s(t),y({},n,e),t),!1)})}):(o.each(g,function(e){h(f.get(e.id))}),g=o.grep(g,function(e){return!f.get(e.id)}),void v(g,function(e){r(n,e)?i("Could not initialize inline editor on invalid inline target element",e):a(s(e),n,e)}))}var f=this,p,C;C=o.makeMap("area base basefont br col frame hr img input isindex link meta param embed source wbr track colgroup option tbody tfoot thead tr script noscript style textarea video audio iframe object menu"," ");var x=function(e){p=e};return f.settings=n,m.bind(window,"ready",d),new a(function(e){p?e(p):x=function(t){e(t)}})},get:function(e){return arguments.length?e in this.editors?this.editors[e]:null:this.editors},add:function(e){var t=this,n=t.editors;return n[e.id]=e,n.push(e),f(n,!0),t.activeEditor=e,t.fire("AddEditor",{editor:e}),C||(C=function(){t.fire("BeforeUnload")},m.bind(window,"beforeunload",C)),e},createEditor:function(t,n){return this.add(new e(t,n,this))},remove:function(e){var t=this,n,r=t.editors,i;{if(e)return"string"==typeof e?(e=e.selector||e,void v(m.select(e),function(e){i=r[e.id],i&&t.remove(i)})):(i=e,r[i.id]?(p(i)&&t.fire("RemoveEditor",{editor:i}),r.length||m.unbind(window,"beforeunload",C),i.remove(),f(r,r.length>0),i):null);for(n=r.length-1;n>=0;n--)t.remove(r[n])}},execCommand:function(t,n,r){var i=this,o=i.get(r);switch(t){case"mceAddEditor":return i.get(r)||new e(r,i.settings,i).render(),!0;case"mceRemoveEditor":return o&&o.remove(),!0;case"mceToggleEditor":return o?(o.isHidden()?o.show():o.hide(),!0):(i.execCommand("mceAddEditor",0,r),!0)}return!!i.activeEditor&&i.activeEditor.execCommand(t,n,r)},triggerSave:function(){v(this.editors,function(e){e.save()})},addI18n:function(e,t){l.add(e,t)},translate:function(e){return l.translate(e)},setActive:function(e){var t=this.activeEditor;this.activeEditor!=e&&(t&&t.fire("deactivate",{relatedTarget:e}),e.fire("activate",{relatedTarget:t})),this.activeEditor=e}},y(x,s),x.setup(),window.tinymce=window.tinyMCE=x,x}),r(ct,[ut,m],function(e,t){var n=t.each,r=t.explode;e.on("AddEditor",function(e){var t=e.editor;t.on("preInit",function(){function e(e,t){n(t,function(t,n){t&&s.setStyle(e,n,t)}),s.rename(e,"span")}function i(e){s=t.dom,l.convert_fonts_to_spans&&n(s.select("font,u,strike",e.node),function(e){o[e.nodeName.toLowerCase()](s,e)})}var o,a,s,l=t.settings;l.inline_styles&&(a=r(l.font_size_legacy_values),o={font:function(t,n){e(n,{backgroundColor:n.style.backgroundColor,color:n.color,fontFamily:n.face,fontSize:a[parseInt(n.size,10)-1]})},u:function(n,r){"html4"===t.settings.schema&&e(r,{textDecoration:"underline"})},strike:function(t,n){e(n,{textDecoration:"line-through"})}},t.on("PreProcess SetContent",i))})})}),r(dt,[pe,m],function(e,t){var n={send:function(e){function r(){!e.async||4==i.readyState||o++>1e4?(e.success&&o<1e4&&200==i.status?e.success.call(e.success_scope,""+i.responseText,i,e):e.error&&e.error.call(e.error_scope,o>1e4?"TIMED_OUT":"GENERAL",i,e),i=null):setTimeout(r,10)}var i,o=0;if(e.scope=e.scope||this,e.success_scope=e.success_scope||e.scope,e.error_scope=e.error_scope||e.scope,e.async=e.async!==!1,e.data=e.data||"",n.fire("beforeInitialize",{settings:e}),i=new XMLHttpRequest){if(i.overrideMimeType&&i.overrideMimeType(e.content_type),i.open(e.type||(e.data?"POST":"GET"),e.url,e.async),e.crossDomain&&(i.withCredentials=!0),e.content_type&&i.setRequestHeader("Content-Type",e.content_type),e.requestheaders&&t.each(e.requestheaders,function(e){i.setRequestHeader(e.key,e.value)}),i.setRequestHeader("X-Requested-With","XMLHttpRequest"),i=n.fire("beforeSend",{xhr:i,settings:e}).xhr,i.send(e.data),!e.async)return r();setTimeout(r,10)}}};return t.extend(n,e),n}),r(ft,[],function(){function e(t,n){var r,i,o,a;if(n=n||'"',null===t)return"null";if(o=typeof t,"string"==o)return i="\bb\tt\nn\ff\rr\"\"''\\\\",n+t.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(e,t){return'"'===n&&"'"===e?e:(r=i.indexOf(t),r+1?"\\"+i.charAt(r+1):(e=t.charCodeAt().toString(16),"\\u"+"0000".substring(e.length)+e))})+n;if("object"==o){if(t.hasOwnProperty&&"[object Array]"===Object.prototype.toString.call(t)){for(r=0,i="[";r<t.length;r++)i+=(r>0?",":"")+e(t[r],n);return i+"]"}i="{";for(a in t)t.hasOwnProperty(a)&&(i+="function"!=typeof t[a]?(i.length>1?","+n:n)+a+n+":"+e(t[a],n):"");return i+"}"}return""+t}return{serialize:e,parse:function(e){try{return window[String.fromCharCode(101)+"val"]("("+e+")")}catch(t){}}}}),r(pt,[ft,dt,m],function(e,t,n){function r(e){this.settings=i({},e),this.count=0}var i=n.extend;return r.sendRPC=function(e){return(new r).send(e)},r.prototype={send:function(n){var r=n.error,o=n.success;n=i(this.settings,n),n.success=function(t,i){t=e.parse(t),"undefined"==typeof t&&(t={error:"JSON Parse error."}),t.error?r.call(n.error_scope||n.scope,t.error,i):o.call(n.success_scope||n.scope,t.result)},n.error=function(e,t){r&&r.call(n.error_scope||n.scope,e,t)},n.data=e.serialize({id:n.id||"c"+this.count++,method:n.method,params:n.params}),n.content_type="application/json",t.send(n)}},r}),r(ht,[w],function(e){return{callbacks:{},count:0,send:function(n){var r=this,i=e.DOM,o=n.count!==t?n.count:r.count,a="tinymce_jsonp_"+o;r.callbacks[o]=function(e){i.remove(a),delete r.callbacks[o],n.callback(e)},i.add(i.doc.body,"script",{id:a,src:n.url,type:"text/javascript"}),r.count++}}}),r(mt,[],function(){function e(){s=[];for(var e in a)s.push(e);i.length=s.length}function n(){function n(e){var n,r;return r=e!==t?c+e:i.indexOf(",",c),r===-1||r>i.length?null:(n=i.substring(c,r),c=r+1,n)}var r,i,s,c=0;if(a={},u){o.load(l),i=o.getAttribute(l)||"";do{var d=n();if(null===d)break;if(r=n(parseInt(d,32)||0),null!==r){if(d=n(),null===d)break;s=n(parseInt(d,32)||0),r&&(a[r]=s)}}while(null!==r);e()}}function r(){var t,n="";if(u){for(var r in a)t=a[r],n+=(n?",":"")+r.length.toString(32)+","+r+","+t.length.toString(32)+","+t;o.setAttribute(l,n);try{o.save(l)}catch(i){}e()}}var i,o,a,s,l,u;try{if(window.localStorage)return localStorage}catch(c){}return l="tinymce",o=document.documentElement,u=!!o.addBehavior,u&&o.addBehavior("#default#userData"),i={key:function(e){return s[e]},getItem:function(e){return e in a?a[e]:null},setItem:function(e,t){a[e]=""+t,r()},removeItem:function(e){delete a[e],r()},clear:function(){a={},r()}},n(),i}),r(gt,[w,f,E,N,m,d],function(e,t,n,r,i,o){var a=window.tinymce;return a.DOM=e.DOM,a.ScriptLoader=n.ScriptLoader,a.PluginManager=r.PluginManager,a.ThemeManager=r.ThemeManager,a.dom=a.dom||{},a.dom.Event=t.Event,i.each("trim isArray is toArray makeMap each map grep inArray extend create walk createNS resolve explode _addCacheSuffix".split(" "),function(e){a[e]=i[e]}),i.each("isOpera isWebKit isIE isGecko isMac".split(" "),function(e){a[e]=o[e.substr(2).toLowerCase()]}),{}}),r(vt,[ce,m],function(e,t){return e.extend({Defaults:{firstControlClass:"first",lastControlClass:"last"},init:function(e){this.settings=t.extend({},this.Defaults,e)},preRender:function(e){e.bodyClasses.add(this.settings.containerClass)},applyClasses:function(e){var t=this,n=t.settings,r,i,o,a;r=n.firstControlClass,i=n.lastControlClass,e.each(function(e){e.classes.remove(r).remove(i).add(n.controlClass),e.visible()&&(o||(o=e),a=e)}),o&&o.classes.add(r),a&&a.classes.add(i)},renderHtml:function(e){var t=this,n="";return t.applyClasses(e.items()),e.items().each(function(e){n+=e.renderHtml()}),n},recalc:function(){},postRender:function(){},isNative:function(){return!1}})}),r(yt,[vt],function(e){return e.extend({Defaults:{containerClass:"abs-layout",controlClass:"abs-layout-item"},recalc:function(e){e.items().filter(":visible").each(function(e){var t=e.settings;e.layoutRect({x:t.x,y:t.y,w:t.w,h:t.h}),e.recalc&&e.recalc()})},renderHtml:function(e){return'<div id="'+e._id+'-absend" class="'+e.classPrefix+'abs-end"></div>'+this._super(e)}})}),r(bt,[Pe],function(e){return e.extend({Defaults:{classes:"widget btn",role:"button"},init:function(e){var t=this,n;t._super(e),e=t.settings,n=t.settings.size,t.on("click mousedown",function(e){e.preventDefault()}),t.on("touchstart",function(e){t.fire("click",e),e.preventDefault()}),e.subtype&&t.classes.add(e.subtype),n&&t.classes.add("btn-"+n),e.icon&&t.icon(e.icon)},icon:function(e){return arguments.length?(this.state.set("icon",e),this):this.state.get("icon")},repaint:function(){var e=this.getEl().firstChild,t;e&&(t=e.style,t.width=t.height="100%"),this._super()},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix,r=e.state.get("icon"),i,o=e.state.get("text"),a="";return i=e.settings.image,i?(r="none","string"!=typeof i&&(i=window.getSelection?i[0]:i[1]),i=" style=\"background-image: url('"+i+"')\""):i="",o&&(e.classes.add("btn-has-text"),a='<span class="'+n+'txt">'+e.encode(o)+"</span>"),r=r?n+"ico "+n+"i-"+r:"",'<div id="'+t+'" class="'+e.classes+'" tabindex="-1" aria-labelledby="'+t+'"><button role="presentation" type="button" tabindex="-1">'+(r?'<i class="'+r+'"'+i+"></i>":"")+a+"</button></div>"},bindStates:function(){function e(e){var i=n("span."+r,t.getEl());e?(i[0]||(n("button:first",t.getEl()).append('<span class="'+r+'"></span>'),i=n("span."+r,t.getEl())),i.html(t.encode(e))):i.remove(),t.classes.toggle("btn-has-text",!!e)}var t=this,n=t.$,r=t.classPrefix+"txt";return t.state.on("change:text",function(t){e(t.value)}),t.state.on("change:icon",function(n){var r=n.value,i=t.classPrefix;t.settings.icon=r,r=r?i+"ico "+i+"i-"+t.settings.icon:"";var o=t.getEl().firstChild,a=o.getElementsByTagName("i")[0];r?(a&&a==o.firstChild||(a=document.createElement("i"),o.insertBefore(a,o.firstChild)),a.className=r):a&&o.removeChild(a),e(t.state.get("text"))}),t._super()}})}),r(Ct,[Ne],function(e){return e.extend({Defaults:{defaultType:"button",role:"group"},renderHtml:function(){var e=this,t=e._layout;return e.classes.add("btn-group"),e.preRender(),t.preRender(e),'<div id="'+e._id+'" class="'+e.classes+'"><div id="'+e._id+'-body">'+(e.settings.html||"")+t.renderHtml(e)+"</div></div>"}})}),r(xt,[Pe],function(e){return e.extend({Defaults:{classes:"checkbox",role:"checkbox",checked:!1},init:function(e){var t=this;t._super(e),t.on("click mousedown",function(e){e.preventDefault()}),t.on("click",function(e){e.preventDefault(),t.disabled()||t.checked(!t.checked())}),t.checked(t.settings.checked)},checked:function(e){return arguments.length?(this.state.set("checked",e),this):this.state.get("checked")},value:function(e){return arguments.length?this.checked(e):this.checked()},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix;return'<div id="'+t+'" class="'+e.classes+'" unselectable="on" aria-labelledby="'+t+'-al" tabindex="-1"><i class="'+n+"ico "+n+'i-checkbox"></i><span id="'+t+'-al" class="'+n+'label">'+e.encode(e.state.get("text"))+"</span></div>"},bindStates:function(){function e(e){t.classes.toggle("checked",e),t.aria("checked",e)}var t=this;return t.state.on("change:text",function(e){t.getEl("al").firstChild.data=t.translate(e.value)}),t.state.on("change:checked change:value",function(n){t.fire("change"),e(n.value)}),t.state.on("change:icon",function(e){var n=e.value,r=t.classPrefix;if("undefined"==typeof n)return t.settings.icon;t.settings.icon=n,n=n?r+"ico "+r+"i-"+t.settings.icon:"";var i=t.getEl().firstChild,o=i.getElementsByTagName("i")[0];n?(o&&o==i.firstChild||(o=document.createElement("i"),i.insertBefore(o,i.firstChild)),o.className=n):o&&i.removeChild(o)}),t.state.get("checked")&&e(!0),t._super()}})}),r(wt,[Pe,we,ve,g,I,m],function(e,t,n,r,i,o){return e.extend({init:function(e){var t=this;t._super(e),e=t.settings,t.classes.add("combobox"),t.subinput=!0,t.ariaTarget="inp",e.menu=e.menu||e.values,e.menu&&(e.icon="caret"),t.on("click",function(n){var i=n.target,o=t.getEl();if(r.contains(o,i)||i==o)for(;i&&i!=o;)i.id&&i.id.indexOf("-open")!=-1&&(t.fire("action"),e.menu&&(t.showMenu(),n.aria&&t.menu.items()[0].focus())),i=i.parentNode}),t.on("keydown",function(e){var n;13==e.keyCode&&"INPUT"===e.target.nodeName&&(e.preventDefault(),t.parents().reverse().each(function(e){if(e.toJSON)return n=e,!1}),t.fire("submit",{data:n.toJSON()}))}),t.on("keyup",function(e){if("INPUT"==e.target.nodeName){var n=t.state.get("value"),r=e.target.value;r!==n&&(t.state.set("value",r),t.fire("autocomplete",e))}}),t.on("mouseover",function(e){var n=t.tooltip().moveTo(-65535);if(t.statusLevel()&&e.target.className.indexOf(t.classPrefix+"status")!==-1){var r=t.statusMessage()||"Ok",i=n.text(r).show().testMoveRel(e.target,["bc-tc","bc-tl","bc-tr"]);n.classes.toggle("tooltip-n","bc-tc"==i),n.classes.toggle("tooltip-nw","bc-tl"==i),n.classes.toggle("tooltip-ne","bc-tr"==i),n.moveRel(e.target,i)}})},statusLevel:function(e){return arguments.length>0&&this.state.set("statusLevel",e),this.state.get("statusLevel")},statusMessage:function(e){return arguments.length>0&&this.state.set("statusMessage",e),this.state.get("statusMessage")},showMenu:function(){var e=this,n=e.settings,r;e.menu||(r=n.menu||[],r.length?r={type:"menu",items:r}:r.type=r.type||"menu",e.menu=t.create(r).parent(e).renderTo(e.getContainerElm()),e.fire("createmenu"),e.menu.reflow(),e.menu.on("cancel",function(t){t.control===e.menu&&e.focus()}),e.menu.on("show hide",function(t){t.control.items().each(function(t){t.active(t.value()==e.value())})}).fire("show"),e.menu.on("select",function(t){e.value(t.control.value())}),e.on("focusin",function(t){"INPUT"==t.target.tagName.toUpperCase()&&e.menu.hide()}),e.aria("expanded",!0)),e.menu.show(),e.menu.layoutRect({w:e.layoutRect().w}),e.menu.moveRel(e.getEl(),e.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"])},focus:function(){this.getEl("inp").focus()},repaint:function(){var e=this,t=e.getEl(),i=e.getEl("open"),o=e.layoutRect(),a,s,l=0,u=t.firstChild;e.statusLevel()&&"none"!==e.statusLevel()&&(l=parseInt(n.getRuntimeStyle(u,"padding-right"),10)-parseInt(n.getRuntimeStyle(u,"padding-left"),10)),a=i?o.w-n.getSize(i).width-10:o.w-10;var c=document;return c.all&&(!c.documentMode||c.documentMode<=8)&&(s=e.layoutRect().h-2+"px"),r(u).css({width:a-l,lineHeight:s}),e._super(),e},postRender:function(){var e=this;return r(this.getEl("inp")).on("change",function(t){e.state.set("value",t.target.value),e.fire("change",t)}),e._super()},renderHtml:function(){var e=this,t=e._id,n=e.settings,r=e.classPrefix,i=e.state.get("value")||"",o,a,s="",l="",u="";return"spellcheck"in n&&(l+=' spellcheck="'+n.spellcheck+'"'),n.maxLength&&(l+=' maxlength="'+n.maxLength+'"'),n.size&&(l+=' size="'+n.size+'"'),n.subtype&&(l+=' type="'+n.subtype+'"'),u='<i id="'+t+'-status" class="mce-status mce-ico" style="display: none"></i>',e.disabled()&&(l+=' disabled="disabled"'),o=n.icon,o&&"caret"!=o&&(o=r+"ico "+r+"i-"+n.icon),a=e.state.get("text"),(o||a)&&(s='<div id="'+t+'-open" class="'+r+"btn "+r+'open" tabIndex="-1" role="button"><button id="'+t+'-action" type="button" hidefocus="1" tabindex="-1">'+("caret"!=o?'<i class="'+o+'"></i>':'<i class="'+r+'caret"></i>')+(a?(o?" ":"")+a:"")+"</button></div>",e.classes.add("has-open")),'<div id="'+t+'" class="'+e.classes+'"><input id="'+t+'-inp" class="'+r+'textbox" value="'+e.encode(i,!1)+'" hidefocus="1"'+l+' placeholder="'+e.encode(n.placeholder)+'" />'+u+s+"</div>"},value:function(e){return arguments.length?(this.state.set("value",e),this):(this.state.get("rendered")&&this.state.set("value",this.getEl("inp").value),this.state.get("value"))},showAutoComplete:function(e,n){
+var r=this;if(0===e.length)return void r.hideMenu();var i=function(e,t){return function(){r.fire("selectitem",{title:t,value:e})}};r.menu?r.menu.items().remove():r.menu=t.create({type:"menu",classes:"combobox-menu",layout:"flow"}).parent(r).renderTo(),o.each(e,function(e){r.menu.add({text:e.title,url:e.previewUrl,match:n,classes:"menu-item-ellipsis",onclick:i(e.value,e.title)})}),r.menu.renderNew(),r.hideMenu(),r.menu.on("cancel",function(e){e.control.parent()===r.menu&&(e.stopPropagation(),r.focus(),r.hideMenu())}),r.menu.on("select",function(){r.focus()});var a=r.layoutRect().w;r.menu.layoutRect({w:a,minW:0,maxW:a}),r.menu.reflow(),r.menu.show(),r.menu.moveRel(r.getEl(),r.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"])},hideMenu:function(){this.menu&&this.menu.hide()},bindStates:function(){var e=this;e.state.on("change:value",function(t){e.getEl("inp").value!=t.value&&(e.getEl("inp").value=t.value)}),e.state.on("change:disabled",function(t){e.getEl("inp").disabled=t.value}),e.state.on("change:statusLevel",function(t){var r=e.getEl("status"),i=e.classPrefix,o=t.value;n.css(r,"display","none"===o?"none":""),n.toggleClass(r,i+"i-checkmark","ok"===o),n.toggleClass(r,i+"i-warning","warn"===o),n.toggleClass(r,i+"i-error","error"===o),e.classes.toggle("has-status","none"!==o),e.repaint()}),n.on(e.getEl("status"),"mouseleave",function(){e.tooltip().hide()}),e.on("cancel",function(t){e.menu&&e.menu.visible()&&(t.stopPropagation(),e.hideMenu())});var t=function(e,t){t&&t.items().length>0&&t.items().eq(e)[0].focus()};return e.on("keydown",function(n){var r=n.keyCode;"INPUT"===n.target.nodeName&&(r===i.DOWN?(n.preventDefault(),e.fire("autocomplete"),t(0,e.menu)):r===i.UP&&(n.preventDefault(),t(-1,e.menu)))}),e._super()},remove:function(){r(this.getEl("inp")).off(),this.menu&&this.menu.remove(),this._super()}})}),r(Et,[wt],function(e){return e.extend({init:function(e){var t=this;e.spellcheck=!1,e.onaction&&(e.icon="none"),t._super(e),t.classes.add("colorbox"),t.on("change keyup postrender",function(){t.repaintColor(t.value())})},repaintColor:function(e){var t=this.getEl("open"),n=t?t.getElementsByTagName("i")[0]:null;if(n)try{n.style.background=e}catch(r){}},bindStates:function(){var e=this;return e.state.on("change:value",function(t){e.state.get("rendered")&&e.repaintColor(t.value)}),e._super()}})}),r(Nt,[bt,Ae],function(e,t){return e.extend({showPanel:function(){var e=this,n=e.settings;if(e.active(!0),e.panel)e.panel.show();else{var r=n.panel;r.type&&(r={layout:"grid",items:r}),r.role=r.role||"dialog",r.popover=!0,r.autohide=!0,r.ariaRoot=!0,e.panel=new t(r).on("hide",function(){e.active(!1)}).on("cancel",function(t){t.stopPropagation(),e.focus(),e.hidePanel()}).parent(e).renderTo(e.getContainerElm()),e.panel.fire("show"),e.panel.reflow()}e.panel.moveRel(e.getEl(),n.popoverAlign||(e.isRtl()?["bc-tr","bc-tc"]:["bc-tl","bc-tc"]))},hidePanel:function(){var e=this;e.panel&&e.panel.hide()},postRender:function(){var e=this;return e.aria("haspopup",!0),e.on("click",function(t){t.control===e&&(e.panel&&e.panel.visible()?e.hidePanel():(e.showPanel(),e.panel.focus(!!t.aria)))}),e._super()},remove:function(){return this.panel&&(this.panel.remove(),this.panel=null),this._super()}})}),r(_t,[Nt,w],function(e,t){var n=t.DOM;return e.extend({init:function(e){this._super(e),this.classes.add("colorbutton")},color:function(e){return e?(this._color=e,this.getEl("preview").style.backgroundColor=e,this):this._color},resetColor:function(){return this._color=null,this.getEl("preview").style.backgroundColor=null,this},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix,r=e.state.get("text"),i=e.settings.icon?n+"ico "+n+"i-"+e.settings.icon:"",o=e.settings.image?" style=\"background-image: url('"+e.settings.image+"')\"":"",a="";return r&&(e.classes.add("btn-has-text"),a='<span class="'+n+'txt">'+e.encode(r)+"</span>"),'<div id="'+t+'" class="'+e.classes+'" role="button" tabindex="-1" aria-haspopup="true"><button role="presentation" hidefocus="1" type="button" tabindex="-1">'+(i?'<i class="'+i+'"'+o+"></i>":"")+'<span id="'+t+'-preview" class="'+n+'preview"></span>'+a+'</button><button type="button" class="'+n+'open" hidefocus="1" tabindex="-1"> <i class="'+n+'caret"></i></button></div>'},postRender:function(){var e=this,t=e.settings.onclick;return e.on("click",function(r){r.aria&&"down"==r.aria.key||r.control!=e||n.getParent(r.target,"."+e.classPrefix+"open")||(r.stopImmediatePropagation(),t.call(e,r))}),delete e.settings.onclick,e._super()}})}),r(St,[],function(){function e(e){function i(e,i,o){var a,s,l,u,c,d;return a=0,s=0,l=0,e/=255,i/=255,o/=255,c=t(e,t(i,o)),d=n(e,n(i,o)),c==d?(l=c,{h:0,s:0,v:100*l}):(u=e==c?i-o:o==c?e-i:o-e,a=e==c?3:o==c?1:5,a=60*(a-u/(d-c)),s=(d-c)/d,l=d,{h:r(a),s:r(100*s),v:r(100*l)})}function o(e,i,o){var a,s,l,u;if(e=(parseInt(e,10)||0)%360,i=parseInt(i,10)/100,o=parseInt(o,10)/100,i=n(0,t(i,1)),o=n(0,t(o,1)),0===i)return void(d=f=p=r(255*o));switch(a=e/60,s=o*i,l=s*(1-Math.abs(a%2-1)),u=o-s,Math.floor(a)){case 0:d=s,f=l,p=0;break;case 1:d=l,f=s,p=0;break;case 2:d=0,f=s,p=l;break;case 3:d=0,f=l,p=s;break;case 4:d=l,f=0,p=s;break;case 5:d=s,f=0,p=l;break;default:d=f=p=0}d=r(255*(d+u)),f=r(255*(f+u)),p=r(255*(p+u))}function a(){function e(e){return e=parseInt(e,10).toString(16),e.length>1?e:"0"+e}return"#"+e(d)+e(f)+e(p)}function s(){return{r:d,g:f,b:p}}function l(){return i(d,f,p)}function u(e){var t;return"object"==typeof e?"r"in e?(d=e.r,f=e.g,p=e.b):"v"in e&&o(e.h,e.s,e.v):(t=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)[^\)]*\)/gi.exec(e))?(d=parseInt(t[1],10),f=parseInt(t[2],10),p=parseInt(t[3],10)):(t=/#([0-F]{2})([0-F]{2})([0-F]{2})/gi.exec(e))?(d=parseInt(t[1],16),f=parseInt(t[2],16),p=parseInt(t[3],16)):(t=/#([0-F])([0-F])([0-F])/gi.exec(e))&&(d=parseInt(t[1]+t[1],16),f=parseInt(t[2]+t[2],16),p=parseInt(t[3]+t[3],16)),d=d<0?0:d>255?255:d,f=f<0?0:f>255?255:f,p=p<0?0:p>255?255:p,c}var c=this,d=0,f=0,p=0;e&&u(e),c.toRgb=s,c.toHsv=l,c.toHex=a,c.parse=u}var t=Math.min,n=Math.max,r=Math.round;return e}),r(kt,[Pe,_e,ve,St],function(e,t,n,r){return e.extend({Defaults:{classes:"widget colorpicker"},init:function(e){this._super(e)},postRender:function(){function e(e,t){var r=n.getPos(e),i,o;return i=t.pageX-r.x,o=t.pageY-r.y,i=Math.max(0,Math.min(i/e.clientWidth,1)),o=Math.max(0,Math.min(o/e.clientHeight,1)),{x:i,y:o}}function i(e,t){var i=(360-e.h)/360;n.css(d,{top:100*i+"%"}),t||n.css(p,{left:e.s+"%",top:100-e.v+"%"}),f.style.background=new r({s:100,v:100,h:e.h}).toHex(),s.color().parse({s:e.s,v:e.v,h:e.h})}function o(t){var n;n=e(f,t),u.s=100*n.x,u.v=100*(1-n.y),i(u),s.fire("change")}function a(t){var n;n=e(c,t),u=l.toHsv(),u.h=360*(1-n.y),i(u,!0),s.fire("change")}var s=this,l=s.color(),u,c,d,f,p;c=s.getEl("h"),d=s.getEl("hp"),f=s.getEl("sv"),p=s.getEl("svp"),s._repaint=function(){u=l.toHsv(),i(u)},s._super(),s._svdraghelper=new t(s._id+"-sv",{start:o,drag:o}),s._hdraghelper=new t(s._id+"-h",{start:a,drag:a}),s._repaint()},rgb:function(){return this.color().toRgb()},value:function(e){var t=this;return arguments.length?(t.color().parse(e),void(t._rendered&&t._repaint())):t.color().toHex()},color:function(){return this._color||(this._color=new r),this._color},renderHtml:function(){function e(){var e,t,n="",i,a;for(i="filter:progid:DXImageTransform.Microsoft.gradient(GradientType=0,startColorstr=",a=o.split(","),e=0,t=a.length-1;e<t;e++)n+='<div class="'+r+'colorpicker-h-chunk" style="height:'+100/t+"%;"+i+a[e]+",endColorstr="+a[e+1]+");-ms-"+i+a[e]+",endColorstr="+a[e+1]+')"></div>';return n}var t=this,n=t._id,r=t.classPrefix,i,o="#ff0000,#ff0080,#ff00ff,#8000ff,#0000ff,#0080ff,#00ffff,#00ff80,#00ff00,#80ff00,#ffff00,#ff8000,#ff0000",a="background: -ms-linear-gradient(top,"+o+");background: linear-gradient(to bottom,"+o+");";return i='<div id="'+n+'-h" class="'+r+'colorpicker-h" style="'+a+'">'+e()+'<div id="'+n+'-hp" class="'+r+'colorpicker-h-marker"></div></div>','<div id="'+n+'" class="'+t.classes+'"><div id="'+n+'-sv" class="'+r+'colorpicker-sv"><div class="'+r+'colorpicker-overlay1"><div class="'+r+'colorpicker-overlay2"><div id="'+n+'-svp" class="'+r+'colorpicker-selector1"><div class="'+r+'colorpicker-selector2"></div></div></div></div></div>'+i+"</div>"}})}),r(Tt,[Pe],function(e){return e.extend({init:function(e){var t=this;e.delimiter||(e.delimiter="\xbb"),t._super(e),t.classes.add("path"),t.canFocus=!0,t.on("click",function(e){var n,r=e.target;(n=r.getAttribute("data-index"))&&t.fire("select",{value:t.row()[n],index:n})}),t.row(t.settings.row)},focus:function(){var e=this;return e.getEl().firstChild.focus(),e},row:function(e){return arguments.length?(this.state.set("row",e),this):this.state.get("row")},renderHtml:function(){var e=this;return'<div id="'+e._id+'" class="'+e.classes+'">'+e._getDataPathHtml(e.state.get("row"))+"</div>"},bindStates:function(){var e=this;return e.state.on("change:row",function(t){e.innerHtml(e._getDataPathHtml(t.value))}),e._super()},_getDataPathHtml:function(e){var t=this,n=e||[],r,i,o="",a=t.classPrefix;for(r=0,i=n.length;r<i;r++)o+=(r>0?'<div class="'+a+'divider" aria-hidden="true"> '+t.settings.delimiter+" </div>":"")+'<div role="button" class="'+a+"path-item"+(r==i-1?" "+a+"last":"")+'" data-index="'+r+'" tabindex="-1" id="'+t._id+"-"+r+'" aria-level="'+(r+1)+'">'+n[r].name+"</div>";return o||(o='<div class="'+a+'path-item">\xa0</div>'),o}})}),r(Rt,[Tt],function(e){return e.extend({postRender:function(){function e(e){if(1===e.nodeType){if("BR"==e.nodeName||e.getAttribute("data-mce-bogus"))return!0;if("bookmark"===e.getAttribute("data-mce-type"))return!0}return!1}var t=this,n=t.settings.editor;return n.settings.elementpath!==!1&&(t.on("select",function(e){n.focus(),n.selection.select(this.row()[e.index].element),n.nodeChanged()}),n.on("nodeChange",function(r){for(var i=[],o=r.parents,a=o.length;a--;)if(1==o[a].nodeType&&!e(o[a])){var s=n.fire("ResolveName",{name:o[a].nodeName.toLowerCase(),target:o[a]});if(s.isDefaultPrevented()||i.push({name:s.name,element:o[a]}),s.isPropagationStopped())break}t.row(i)})),t._super()}})}),r(At,[Ne],function(e){return e.extend({Defaults:{layout:"flex",align:"center",defaults:{flex:1}},renderHtml:function(){var e=this,t=e._layout,n=e.classPrefix;return e.classes.add("formitem"),t.preRender(e),'<div id="'+e._id+'" class="'+e.classes+'" hidefocus="1" tabindex="-1">'+(e.settings.title?'<div id="'+e._id+'-title" class="'+n+'title">'+e.settings.title+"</div>":"")+'<div id="'+e._id+'-body" class="'+e.bodyClasses+'">'+(e.settings.html||"")+t.renderHtml(e)+"</div></div>"}})}),r(Bt,[Ne,At,m],function(e,t,n){return e.extend({Defaults:{containerCls:"form",layout:"flex",direction:"column",align:"stretch",flex:1,padding:20,labelGap:30,spacing:10,callbacks:{submit:function(){this.submit()}}},preRender:function(){var e=this,r=e.items();e.settings.formItemDefaults||(e.settings.formItemDefaults={layout:"flex",autoResize:"overflow",defaults:{flex:1}}),r.each(function(r){var i,o=r.settings.label;o&&(i=new t(n.extend({items:{type:"label",id:r._id+"-l",text:o,flex:0,forId:r._id,disabled:r.disabled()}},e.settings.formItemDefaults)),i.type="formitem",r.aria("labelledby",r._id+"-l"),"undefined"==typeof r.settings.flex&&(r.settings.flex=1),e.replace(r,i),i.add(r))})},submit:function(){return this.fire("submit",{data:this.toJSON()})},postRender:function(){var e=this;e._super(),e.fromJSON(e.settings.data)},bindStates:function(){function e(){var e=0,n=[],r,i,o;if(t.settings.labelGapCalc!==!1)for(o="children"==t.settings.labelGapCalc?t.find("formitem"):t.items(),o.filter("formitem").each(function(t){var r=t.items()[0],i=r.getEl().clientWidth;e=i>e?i:e,n.push(r)}),i=t.settings.labelGap||0,r=n.length;r--;)n[r].settings.minWidth=e+i}var t=this;t._super(),t.on("show",e),e()}})}),r(Dt,[Bt],function(e){return e.extend({Defaults:{containerCls:"fieldset",layout:"flex",direction:"column",align:"stretch",flex:1,padding:"25 15 5 15",labelGap:30,spacing:10,border:1},renderHtml:function(){var e=this,t=e._layout,n=e.classPrefix;return e.preRender(),t.preRender(e),'<fieldset id="'+e._id+'" class="'+e.classes+'" hidefocus="1" tabindex="-1">'+(e.settings.title?'<legend id="'+e._id+'-title" class="'+n+'fieldset-title">'+e.settings.title+"</legend>":"")+'<div id="'+e._id+'-body" class="'+e.bodyClasses+'">'+(e.settings.html||"")+t.renderHtml(e)+"</div></fieldset>"}})}),r(Lt,[w,z,h,it,m,_],function(e,t,n,r,i,o){var a=i.trim,s=function(e,t,n,r,i){return{type:e,title:t,url:n,level:r,attach:i}},l=function(e){for(;e=e.parentNode;){var t=e.contentEditable;if(t&&"inherit"!==t)return o.isContentEditableTrue(e)}return!1},u=function(t,n){return e.DOM.select(t,n)},c=function(e){return e.innerText||e.textContent},d=function(e){return e.id?e.id:r.uuid("h")},f=function(e){return e&&"A"===e.nodeName&&(e.id||e.name)},p=function(e){return f(e)&&m(e)},h=function(e){return e&&/^(H[1-6])$/.test(e.nodeName)},m=function(e){return l(e)&&!o.isContentEditableFalse(e)},g=function(e){return h(e)&&m(e)},v=function(e){return h(e)?parseInt(e.nodeName.substr(1),10):0},y=function(e){var t=d(e),n=function(){e.id=t};return s("header",c(e),"#"+t,v(e),n)},b=function(e){var n=e.id||e.name,r=c(e);return s("anchor",r?r:"#"+n,"#"+n,0,t.noop)},C=function(e){return n.map(n.filter(e,g),y)},x=function(e){return n.map(n.filter(e,p),b)},w=function(e){var t=u("h1,h2,h3,h4,h5,h6,a:not([href])",e);return t},E=function(e){return a(e.title).length>0},N=function(e){var t=w(e);return n.filter(C(t).concat(x(t)),E)};return{find:N}}),r(Mt,[wt,m,h,z,I,Lt],function(e,t,n,r,i,o){var a={},s=5,l=function(e){return{title:e.title,value:{title:{raw:e.title},url:e.url,attach:e.attach}}},u=function(e){return t.map(e,l)},c=function(e,t){return{title:e,value:{title:e,url:t,attach:r.noop}}},d=function(e,t){var r=n.find(t,function(t){return t.url===e});return!r},f=function(e,t,n){var r=t in e?e[t]:n;return r===!1?null:r},p=function(e,i,o,s){var l={title:"-"},p=function(e){var a=n.filter(e[o],function(e){return d(e,i)});return t.map(a,function(e){return{title:e,value:{title:e,url:e,attach:r.noop}}})},h=function(e){var t=n.filter(i,function(t){return t.type==e});return u(t)},g=function(){var e=h("anchor"),t=f(s,"anchor_top","#top"),n=f(s,"anchor_bottom","#bottom");return null!==t&&e.unshift(c("<top>",t)),null!==n&&e.push(c("<bottom>",n)),e},v=function(e){return n.reduce(e,function(e,t){var n=0===e.length||0===t.length;return n?e.concat(t):e.concat(l,t)},[])};return s.typeahead_urls===!1?[]:"file"===o?v([m(e,p(a)),m(e,h("header")),m(e,g())]):m(e,p(a))},h=function(e,t){var r=a[t];/^https?/.test(e)&&(r?n.indexOf(r,e)===-1&&(a[t]=r.slice(0,s).concat(e)):a[t]=[e])},m=function(e,n){var r=e.toLowerCase(),i=t.grep(n,function(e){return e.title.toLowerCase().indexOf(r)!==-1});return 1===i.length&&i[0].title===e?[]:i},g=function(e){var t=e.title;return t.raw?t.raw:t},v=function(e,t,n,r){var i=function(i){var a=o.find(n),s=p(i,a,r,t);e.showAutoComplete(s,i)};e.on("autocomplete",function(){i(e.value())}),e.on("selectitem",function(t){var n=t.value;e.value(n.url);var i=g(n);"image"===r?e.fire("change",{meta:{alt:i,attach:n.attach}}):e.fire("change",{meta:{text:i,attach:n.attach}}),e.focus()}),e.on("click",function(t){0===e.value().length&&"INPUT"===t.target.nodeName&&i("")}),e.on("PostRender",function(){e.getRoot().on("submit",function(t){t.isDefaultPrevented()||h(e.value(),r)})})},y=function(e){var t=e.status,n=e.message;return"valid"===t?{status:"ok",message:n}:"unknown"===t?{status:"warn",message:n}:"invalid"===t?{status:"warn",message:n}:{status:"none",message:""}},b=function(e,t,n){var r=t.filepicker_validator_handler;if(r){var i=function(t){return 0===t.length?void e.statusLevel("none"):void r({url:t,type:n},function(t){var n=y(t);e.statusMessage(n.message),e.statusLevel(n.status)})};e.state.on("change:value",function(e){i(e.value)})}};return e.extend({init:function(e){var n=this,r=tinymce.activeEditor,i=r.settings,o,a,s,l=e.filetype;e.spellcheck=!1,s=i.file_picker_types||i.file_browser_callback_types,s&&(s=t.makeMap(s,/[, ]/)),s&&!s[l]||(a=i.file_picker_callback,!a||s&&!s[l]?(a=i.file_browser_callback,!a||s&&!s[l]||(o=function(){a(n.getEl("inp").id,n.value(),l,window)})):o=function(){var e=n.fire("beforecall").meta;e=t.extend({filetype:l},e),a.call(r,function(e,t){n.value(e).fire("change",{meta:t})},n.value(),e)}),o&&(e.icon="browse",e.onaction=o),n._super(e),v(n,i,r.getBody(),l),b(n,i,l)}})}),r(Pt,[yt],function(e){return e.extend({recalc:function(e){var t=e.layoutRect(),n=e.paddingBox;e.items().filter(":visible").each(function(e){e.layoutRect({x:n.left,y:n.top,w:t.innerW-n.right-n.left,h:t.innerH-n.top-n.bottom}),e.recalc&&e.recalc()})}})}),r(Ot,[yt],function(e){return e.extend({recalc:function(e){var t,n,r,i,o,a,s,l,u,c,d,f,p,h,m,g,v=[],y,b,C,x,w,E,N,_,S,k,T,R,A,B,D,L,M,P,O,H,I,F,z=Math.max,U=Math.min;for(r=e.items().filter(":visible"),i=e.layoutRect(),o=e.paddingBox,a=e.settings,f=e.isRtl()?a.direction||"row-reversed":a.direction,s=a.align,l=e.isRtl()?a.pack||"end":a.pack,u=a.spacing||0,"row-reversed"!=f&&"column-reverse"!=f||(r=r.set(r.toArray().reverse()),f=f.split("-")[0]),"column"==f?(S="y",N="h",_="minH",k="maxH",R="innerH",T="top",A="deltaH",B="contentH",O="left",M="w",D="x",L="innerW",P="minW",H="right",I="deltaW",F="contentW"):(S="x",N="w",_="minW",k="maxW",R="innerW",T="left",A="deltaW",B="contentW",O="top",M="h",D="y",L="innerH",P="minH",H="bottom",I="deltaH",F="contentH"),d=i[R]-o[T]-o[T],E=c=0,t=0,n=r.length;t<n;t++)p=r[t],h=p.layoutRect(),m=p.settings,g=m.flex,d-=t<n-1?u:0,g>0&&(c+=g,h[k]&&v.push(p),h.flex=g),d-=h[_],y=o[O]+h[P]+o[H],y>E&&(E=y);if(x={},d<0?x[_]=i[_]-d+i[A]:x[_]=i[R]-d+i[A],x[P]=E+i[I],x[B]=i[R]-d,x[F]=E,x.minW=U(x.minW,i.maxW),x.minH=U(x.minH,i.maxH),x.minW=z(x.minW,i.startMinWidth),x.minH=z(x.minH,i.startMinHeight),!i.autoResize||x.minW==i.minW&&x.minH==i.minH){for(C=d/c,t=0,n=v.length;t<n;t++)p=v[t],h=p.layoutRect(),b=h[k],y=h[_]+h.flex*C,y>b?(d-=h[k]-h[_],c-=h.flex,h.flex=0,h.maxFlexSize=b):h.maxFlexSize=0;for(C=d/c,w=o[T],x={},0===c&&("end"==l?w=d+o[T]:"center"==l?(w=Math.round(i[R]/2-(i[R]-d)/2)+o[T],w<0&&(w=o[T])):"justify"==l&&(w=o[T],u=Math.floor(d/(r.length-1)))),x[D]=o[O],t=0,n=r.length;t<n;t++)p=r[t],h=p.layoutRect(),y=h.maxFlexSize||h[_],"center"===s?x[D]=Math.round(i[L]/2-h[M]/2):"stretch"===s?(x[M]=z(h[P]||0,i[L]-o[O]-o[H]),x[D]=o[O]):"end"===s&&(x[D]=i[L]-h[M]-o.top),h.flex>0&&(y+=h.flex*C),x[N]=y,x[S]=w,p.layoutRect(x),p.recalc&&p.recalc(),w+=y+u}else if(x.w=x.minW,x.h=x.minH,e.layoutRect(x),this.recalc(e),null===e._lastRect){var W=e.parent();W&&(W._lastRect=null,W.recalc())}}})}),r(Ht,[vt],function(e){return e.extend({Defaults:{containerClass:"flow-layout",controlClass:"flow-layout-item",endClass:"break"},recalc:function(e){e.items().filter(":visible").each(function(e){e.recalc&&e.recalc()})},isNative:function(){return!0}})}),r(It,[w],function(e){var n=function(e,t,n){for(;n!==t;){if(n.style[e])return n.style[e];n=n.parentNode}return""},r=function(e){return/[0-9.]+px$/.test(e)?Math.round(72*parseInt(e,10)/96)+"pt":e},i=function(e){return e.replace(/[\'\"]/g,"").replace(/,\s+/g,",")},o=function(t,n){return e.DOM.getStyle(n,t,!0)},a=function(e,t){var r=n("fontSize",e,t);return""!==r?r:o("fontSize",t)},s=function(e,r){var a=n("fontFamily",e,r),s=""!==a?a:o("fontFamily",r);return s!==t?i(s):""};return{getFontSize:a,getFontFamily:s,toPt:r}}),r(Ft,[xe,Pe,Ae,m,h,w,ut,d,It],function(e,t,n,r,i,o,a,s,l){function u(e){e.settings.ui_container&&(s.container=o.DOM.select(e.settings.ui_container)[0])}function c(t){t.on("ScriptsLoaded",function(){t.rtl&&(e.rtl=!0)})}function d(e){function t(t,n){return function(){var r=this;e.on("nodeChange",function(i){var o=e.formatter,a=null;f(i.parents,function(e){if(f(t,function(t){if(n?o.matchNode(e,n,{value:t.value})&&(a=t.value):o.matchNode(e,t.value)&&(a=t.value),a)return!1}),a)return!1}),r.value(a)})}}function i(t){return function(){var n=this,r=function(e){return e?e.split(",")[0]:""};e.on("nodeChange",function(i){var o,a=null;o=l.getFontFamily(e.getBody(),i.element),f(t,function(e){e.value.toLowerCase()===o.toLowerCase()&&(a=e.value)}),f(t,function(e){a||r(e.value).toLowerCase()!==r(o).toLowerCase()||(a=e.value)}),n.value(a),!a&&o&&n.text(r(o))})}}function o(t){return function(){var n=this;e.on("nodeChange",function(r){var i,o,a=null;i=l.getFontSize(e.getBody(),r.element),o=l.toPt(i),f(t,function(e){e.value===i?a=i:e.value===o&&(a=o)}),n.value(a),a||n.text(o)})}}function a(e){e=e.replace(/;$/,"").split(";");for(var t=e.length;t--;)e[t]=e[t].split("=");return e}function s(){function t(e){var n=[];if(e)return f(e,function(e){var o={text:e.title,icon:e.icon};if(e.items)o.menu=t(e.items);else{var a=e.format||"custom"+r++;e.format||(e.name=a,i.push(e)),o.format=a,o.cmd=e.cmd}n.push(o)}),n}function n(){var n;return n=t(e.settings.style_formats_merge?e.settings.style_formats?o.concat(e.settings.style_formats):o:e.settings.style_formats||o)}var r=0,i=[],o=[{title:"Headings",items:[{title:"Heading 1",format:"h1"},{title:"Heading 2",format:"h2"},{title:"Heading 3",format:"h3"},{title:"Heading 4",format:"h4"},{title:"Heading 5",format:"h5"},{title:"Heading 6",format:"h6"}]},{title:"Inline",items:[{title:"Bold",icon:"bold",format:"bold"},{title:"Italic",icon:"italic",format:"italic"},{title:"Underline",icon:"underline",format:"underline"},{title:"Strikethrough",icon:"strikethrough",format:"strikethrough"},{title:"Superscript",icon:"superscript",format:"superscript"},{title:"Subscript",icon:"subscript",format:"subscript"},{title:"Code",icon:"code",format:"code"}]},{title:"Blocks",items:[{title:"Paragraph",format:"p"},{title:"Blockquote",format:"blockquote"},{title:"Div",format:"div"},{title:"Pre",format:"pre"}]},{title:"Alignment",items:[{title:"Left",icon:"alignleft",format:"alignleft"},{title:"Center",icon:"aligncenter",format:"aligncenter"},{title:"Right",icon:"alignright",format:"alignright"},{title:"Justify",icon:"alignjustify",format:"alignjustify"}]}];return e.on("init",function(){f(i,function(t){e.formatter.register(t.name,t)})}),{type:"menu",items:n(),onPostRender:function(t){e.fire("renderFormatsMenu",{control:t.control})},itemDefaults:{preview:!0,textStyle:function(){if(this.settings.format)return e.formatter.getCssText(this.settings.format)},onPostRender:function(){var t=this;t.parent().on("show",function(){var n,r;n=t.settings.format,n&&(t.disabled(!e.formatter.canApply(n)),t.active(e.formatter.match(n))),r=t.settings.cmd,r&&t.active(e.queryCommandState(r))})},onclick:function(){this.settings.format&&h(this.settings.format),this.settings.cmd&&e.execCommand(this.settings.cmd)}}}}function u(t){return function(){var n=this;e.formatter?e.formatter.formatChanged(t,function(e){n.active(e)}):e.on("init",function(){e.formatter.formatChanged(t,function(e){n.active(e)})})}}function c(t){return function(){function n(){var n="redo"==t?"hasRedo":"hasUndo";return!!e.undoManager&&e.undoManager[n]()}var r=this;r.disabled(!n()),e.on("Undo Redo AddUndo TypingUndo ClearUndos SwitchMode",function(){r.disabled(e.readonly||!n())})}}function d(){var t=this;e.on("VisualAid",function(e){t.active(e.hasVisual)}),t.active(e.hasVisual)}function h(t){t.control&&(t=t.control.value()),t&&e.execCommand("mceToggleFormat",!1,t)}function m(t){var n=t.length;return r.each(t,function(t){t.menu&&(t.hidden=0===m(t.menu));var r=t.format;r&&(t.hidden=!e.formatter.canApply(r)),t.hidden&&n--}),n}function g(t){var n=t.items().length;return t.items().each(function(t){t.menu&&t.visible(g(t.menu)>0),!t.menu&&t.settings.menu&&t.visible(m(t.settings.menu)>0);var r=t.settings.format;r&&t.visible(e.formatter.canApply(r)),t.visible()||n--}),n}var v;v=s(),f({bold:"Bold",italic:"Italic",underline:"Underline",strikethrough:"Strikethrough",subscript:"Subscript",superscript:"Superscript"},function(t,n){e.addButton(n,{tooltip:t,onPostRender:u(n),onclick:function(){h(n)}})}),f({outdent:["Decrease indent","Outdent"],indent:["Increase indent","Indent"],cut:["Cut","Cut"],copy:["Copy","Copy"],paste:["Paste","Paste"],help:["Help","mceHelp"],selectall:["Select all","SelectAll"],removeformat:["Clear formatting","RemoveFormat"],visualaid:["Visual aids","mceToggleVisualAid"],newdocument:["New document","mceNewDocument"]},function(t,n){e.addButton(n,{tooltip:t[0],cmd:t[1]})}),f({blockquote:["Blockquote","mceBlockQuote"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],alignleft:["Align left","JustifyLeft"],aligncenter:["Align center","JustifyCenter"],alignright:["Align right","JustifyRight"],alignjustify:["Justify","JustifyFull"],alignnone:["No alignment","JustifyNone"]},function(t,n){e.addButton(n,{tooltip:t[0],cmd:t[1],onPostRender:u(n)})});var y=function(e){var t=e;return t.length>0&&"-"===t[0].text&&(t=t.slice(1)),t.length>0&&"-"===t[t.length-1].text&&(t=t.slice(0,t.length-1)),t},b=function(t){var n,i;if("string"==typeof t)i=t.split(" ");else if(r.isArray(t))return p(r.map(t,b));return n=r.grep(i,function(t){return"|"===t||t in e.menuItems}),r.map(n,function(t){return"|"===t?{text:"-"}:e.menuItems[t]})},C=function(t){var n=[{text:"-"}],i=r.grep(e.menuItems,function(e){return e.context===t});return r.each(i,function(e){"before"==e.separator&&n.push({text:"|"}),e.prependToContext?n.unshift(e):n.push(e),"after"==e.separator&&n.push({text:"|"})}),n},x=function(e){return y(e.insert_button_items?b(e.insert_button_items):C("insert"))};e.addButton("undo",{tooltip:"Undo",onPostRender:c("undo"),cmd:"undo"}),e.addButton("redo",{tooltip:"Redo",onPostRender:c("redo"),cmd:"redo"}),e.addMenuItem("newdocument",{text:"New document",icon:"newdocument",cmd:"mceNewDocument"}),e.addMenuItem("undo",{text:"Undo",icon:"undo",shortcut:"Meta+Z",onPostRender:c("undo"),cmd:"undo"}),e.addMenuItem("redo",{text:"Redo",icon:"redo",shortcut:"Meta+Y",onPostRender:c("redo"),cmd:"redo"}),e.addMenuItem("visualaid",{text:"Visual aids",selectable:!0,onPostRender:d,cmd:"mceToggleVisualAid"}),e.addButton("remove",{tooltip:"Remove",icon:"remove",cmd:"Delete"}),e.addButton("insert",{type:"menubutton",icon:"insert",menu:[],oncreatemenu:function(){this.menu.add(x(e.settings)),this.menu.renderNew()}}),f({cut:["Cut","Cut","Meta+X"],copy:["Copy","Copy","Meta+C"],paste:["Paste","Paste","Meta+V"],selectall:["Select all","SelectAll","Meta+A"],bold:["Bold","Bold","Meta+B"],italic:["Italic","Italic","Meta+I"],underline:["Underline","Underline","Meta+U"],strikethrough:["Strikethrough","Strikethrough"],subscript:["Subscript","Subscript"],superscript:["Superscript","Superscript"],removeformat:["Clear formatting","RemoveFormat"]},function(t,n){e.addMenuItem(n,{text:t[0],icon:n,shortcut:t[2],cmd:t[1]})}),e.on("mousedown",function(){n.hideAll()}),e.addButton("styleselect",{type:"menubutton",text:"Formats",menu:v,onShowMenu:function(){e.settings.style_formats_autohide&&g(this.menu)}}),e.addButton("formatselect",function(){var n=[],r=a(e.settings.block_formats||"Paragraph=p;Heading 1=h1;Heading 2=h2;Heading 3=h3;Heading 4=h4;Heading 5=h5;Heading 6=h6;Preformatted=pre");return f(r,function(t){n.push({text:t[0],value:t[1],textStyle:function(){return e.formatter.getCssText(t[1])}})}),{type:"listbox",text:r[0][0],values:n,fixedWidth:!0,onselect:h,onPostRender:t(n)}}),e.addButton("fontselect",function(){var t="Andale Mono=andale mono,monospace;Arial=arial,helvetica,sans-serif;Arial Black=arial black,sans-serif;Book Antiqua=book antiqua,palatino,serif;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,palatino,serif;Helvetica=helvetica,arial,sans-serif;Impact=impact,sans-serif;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco,monospace;Times New Roman=times new roman,times,serif;Trebuchet MS=trebuchet ms,geneva,sans-serif;Verdana=verdana,geneva,sans-serif;Webdings=webdings;Wingdings=wingdings,zapf dingbats",n=[],r=a(e.settings.font_formats||t);return f(r,function(e){n.push({text:{raw:e[0]},value:e[1],textStyle:e[1].indexOf("dings")==-1?"font-family:"+e[1]:""})}),{type:"listbox",text:"Font Family",tooltip:"Font Family",values:n,fixedWidth:!0,onPostRender:i(n),onselect:function(t){t.control.settings.value&&e.execCommand("FontName",!1,t.control.settings.value)}}}),e.addButton("fontsizeselect",function(){var t=[],n="8pt 10pt 12pt 14pt 18pt 24pt 36pt",r=e.settings.fontsize_formats||n;return f(r.split(" "),function(e){var n=e,r=e,i=e.split("=");i.length>1&&(n=i[0],r=i[1]),t.push({text:n,value:r})}),{type:"listbox",text:"Font Sizes",tooltip:"Font Sizes",values:t,fixedWidth:!0,onPostRender:o(t),onclick:function(t){t.control.settings.value&&e.execCommand("FontSize",!1,t.control.settings.value)}}}),e.addMenuItem("formats",{text:"Formats",menu:v})}var f=r.each,p=function(e){return i.reduce(e,function(e,t){return e.concat(t)},[])};a.on("AddEditor",function(e){var t=e.editor;c(t),d(t),u(t)}),e.translate=function(e){return a.translate(e)},t.tooltips=!s.iOS}),r(zt,[yt],function(e){return e.extend({recalc:function(e){var t,n,r,i,o,a,s,l,u,c,d,f,p,h,m,g,v,y,b,C,x,w,E,N=[],_=[],S,k,T,R,A,B;t=e.settings,i=e.items().filter(":visible"),o=e.layoutRect(),r=t.columns||Math.ceil(Math.sqrt(i.length)),n=Math.ceil(i.length/r),y=t.spacingH||t.spacing||0,b=t.spacingV||t.spacing||0,C=t.alignH||t.align,x=t.alignV||t.align,g=e.paddingBox,A="reverseRows"in t?t.reverseRows:e.isRtl(),C&&"string"==typeof C&&(C=[C]),x&&"string"==typeof x&&(x=[x]);for(d=0;d<r;d++)N.push(0);for(f=0;f<n;f++)_.push(0);for(f=0;f<n;f++)for(d=0;d<r&&(c=i[f*r+d],c);d++)u=c.layoutRect(),S=u.minW,k=u.minH,N[d]=S>N[d]?S:N[d],_[f]=k>_[f]?k:_[f];for(T=o.innerW-g.left-g.right,w=0,d=0;d<r;d++)w+=N[d]+(d>0?y:0),T-=(d>0?y:0)+N[d];for(R=o.innerH-g.top-g.bottom,E=0,f=0;f<n;f++)E+=_[f]+(f>0?b:0),R-=(f>0?b:0)+_[f];if(w+=g.left+g.right,E+=g.top+g.bottom,l={},l.minW=w+(o.w-o.innerW),l.minH=E+(o.h-o.innerH),l.contentW=l.minW-o.deltaW,l.contentH=l.minH-o.deltaH,l.minW=Math.min(l.minW,o.maxW),l.minH=Math.min(l.minH,o.maxH),l.minW=Math.max(l.minW,o.startMinWidth),l.minH=Math.max(l.minH,o.startMinHeight),!o.autoResize||l.minW==o.minW&&l.minH==o.minH){o.autoResize&&(l=e.layoutRect(l),l.contentW=l.minW-o.deltaW,l.contentH=l.minH-o.deltaH);var D;D="start"==t.packV?0:R>0?Math.floor(R/n):0;var L=0,M=t.flexWidths;if(M)for(d=0;d<M.length;d++)L+=M[d];else L=r;var P=T/L;for(d=0;d<r;d++)N[d]+=M?M[d]*P:P;for(h=g.top,f=0;f<n;f++){for(p=g.left,s=_[f]+D,d=0;d<r&&(B=A?f*r+r-1-d:f*r+d,c=i[B],c);d++)m=c.settings,u=c.layoutRect(),a=Math.max(N[d],u.startMinWidth),u.x=p,u.y=h,v=m.alignH||(C?C[d]||C[0]:null),"center"==v?u.x=p+a/2-u.w/2:"right"==v?u.x=p+a-u.w:"stretch"==v&&(u.w=a),v=m.alignV||(x?x[d]||x[0]:null),"center"==v?u.y=h+s/2-u.h/2:"bottom"==v?u.y=h+s-u.h:"stretch"==v&&(u.h=s),c.layoutRect(u),p+=a+y,c.recalc&&c.recalc();h+=s+b}}else if(l.w=l.minW,l.h=l.minH,e.layoutRect(l),this.recalc(e),null===e._lastRect){var O=e.parent();O&&(O._lastRect=null,O.recalc())}}})}),r(Ut,[Pe,c],function(e,t){return e.extend({renderHtml:function(){var e=this;return e.classes.add("iframe"),e.canFocus=!1,'<iframe id="'+e._id+'" class="'+e.classes+'" tabindex="-1" src="'+(e.settings.url||"javascript:''")+'" frameborder="0"></iframe>'},src:function(e){this.getEl().src=e},html:function(e,n){var r=this,i=this.getEl().contentWindow.document.body;return i?(i.innerHTML=e,n&&n()):t.setTimeout(function(){r.html(e)}),this}})}),r(Wt,[Pe],function(e){return e.extend({init:function(e){var t=this;t._super(e),t.classes.add("widget").add("infobox"),t.canFocus=!1},severity:function(e){this.classes.remove("error"),this.classes.remove("warning"),this.classes.remove("success"),this.classes.add(e)},help:function(e){this.state.set("help",e)},renderHtml:function(){var e=this,t=e.classPrefix;return'<div id="'+e._id+'" class="'+e.classes+'"><div id="'+e._id+'-body">'+e.encode(e.state.get("text"))+'<button role="button" tabindex="-1"><i class="'+t+"ico "+t+'i-help"></i></button></div></div>'},bindStates:function(){var e=this;return e.state.on("change:text",function(t){e.getEl("body").firstChild.data=e.encode(t.value),e.state.get("rendered")&&e.updateLayoutRect()}),e.state.on("change:help",function(t){e.classes.toggle("has-help",t.value),
+e.state.get("rendered")&&e.updateLayoutRect()}),e._super()}})}),r(Vt,[Pe,ve],function(e,t){return e.extend({init:function(e){var t=this;t._super(e),t.classes.add("widget").add("label"),t.canFocus=!1,e.multiline&&t.classes.add("autoscroll"),e.strong&&t.classes.add("strong")},initLayoutRect:function(){var e=this,n=e._super();if(e.settings.multiline){var r=t.getSize(e.getEl());r.width>n.maxW&&(n.minW=n.maxW,e.classes.add("multiline")),e.getEl().style.width=n.minW+"px",n.startMinH=n.h=n.minH=Math.min(n.maxH,t.getSize(e.getEl()).height)}return n},repaint:function(){var e=this;return e.settings.multiline||(e.getEl().style.lineHeight=e.layoutRect().h+"px"),e._super()},severity:function(e){this.classes.remove("error"),this.classes.remove("warning"),this.classes.remove("success"),this.classes.add(e)},renderHtml:function(){var e=this,t,n,r=e.settings.forId;return!r&&(n=e.settings.forName)&&(t=e.getRoot().find("#"+n)[0],t&&(r=t._id)),r?'<label id="'+e._id+'" class="'+e.classes+'"'+(r?' for="'+r+'"':"")+">"+e.encode(e.state.get("text"))+"</label>":'<span id="'+e._id+'" class="'+e.classes+'">'+e.encode(e.state.get("text"))+"</span>"},bindStates:function(){var e=this;return e.state.on("change:text",function(t){e.innerHtml(e.encode(t.value)),e.state.get("rendered")&&e.updateLayoutRect()}),e._super()}})}),r($t,[Ne],function(e){return e.extend({Defaults:{role:"toolbar",layout:"flow"},init:function(e){var t=this;t._super(e),t.classes.add("toolbar")},postRender:function(){var e=this;return e.items().each(function(e){e.classes.add("toolbar-item")}),e._super()}})}),r(qt,[$t],function(e){return e.extend({Defaults:{role:"menubar",containerCls:"menubar",ariaRoot:!0,defaults:{type:"menubutton"}}})}),r(jt,[bt,we,qt],function(e,t,n){function r(e,t){for(;e;){if(t===e)return!0;e=e.parentNode}return!1}var i=e.extend({init:function(e){var t=this;t._renderOpen=!0,t._super(e),e=t.settings,t.classes.add("menubtn"),e.fixedWidth&&t.classes.add("fixed-width"),t.aria("haspopup",!0),t.state.set("menu",e.menu||t.render())},showMenu:function(e){var n=this,r;return n.menu&&n.menu.visible()&&e!==!1?n.hideMenu():(n.menu||(r=n.state.get("menu")||[],r.length?r={type:"menu",items:r}:r.type=r.type||"menu",r.renderTo?n.menu=r.parent(n).show().renderTo():n.menu=t.create(r).parent(n).renderTo(),n.fire("createmenu"),n.menu.reflow(),n.menu.on("cancel",function(e){e.control.parent()===n.menu&&(e.stopPropagation(),n.focus(),n.hideMenu())}),n.menu.on("select",function(){n.focus()}),n.menu.on("show hide",function(e){e.control==n.menu&&n.activeMenu("show"==e.type),n.aria("expanded","show"==e.type)}).fire("show")),n.menu.show(),n.menu.layoutRect({w:n.layoutRect().w}),n.menu.moveRel(n.getEl(),n.isRtl()?["br-tr","tr-br"]:["bl-tl","tl-bl"]),void n.fire("showmenu"))},hideMenu:function(){var e=this;e.menu&&(e.menu.items().each(function(e){e.hideMenu&&e.hideMenu()}),e.menu.hide())},activeMenu:function(e){this.classes.toggle("active",e)},renderHtml:function(){var e=this,t=e._id,r=e.classPrefix,i=e.settings.icon,o,a=e.state.get("text"),s="";return o=e.settings.image,o?(i="none","string"!=typeof o&&(o=window.getSelection?o[0]:o[1]),o=" style=\"background-image: url('"+o+"')\""):o="",a&&(e.classes.add("btn-has-text"),s='<span class="'+r+'txt">'+e.encode(a)+"</span>"),i=e.settings.icon?r+"ico "+r+"i-"+i:"",e.aria("role",e.parent()instanceof n?"menuitem":"button"),'<div id="'+t+'" class="'+e.classes+'" tabindex="-1" aria-labelledby="'+t+'"><button id="'+t+'-open" role="presentation" type="button" tabindex="-1">'+(i?'<i class="'+i+'"'+o+"></i>":"")+s+' <i class="'+r+'caret"></i></button></div>'},postRender:function(){var e=this;return e.on("click",function(t){t.control===e&&r(t.target,e.getEl())&&(e.focus(),e.showMenu(!t.aria),t.aria&&e.menu.items().filter(":visible")[0].focus())}),e.on("mouseenter",function(t){var n=t.control,r=e.parent(),o;n&&r&&n instanceof i&&n.parent()==r&&(r.items().filter("MenuButton").each(function(e){e.hideMenu&&e!=n&&(e.menu&&e.menu.visible()&&(o=!0),e.hideMenu())}),o&&(n.focus(),n.showMenu()))}),e._super()},bindStates:function(){var e=this;return e.state.on("change:menu",function(){e.menu&&e.menu.remove(),e.menu=null}),e._super()},remove:function(){this._super(),this.menu&&this.menu.remove()}});return i}),r(Yt,[Pe,we,d,c],function(e,t,n,r){return e.extend({Defaults:{border:0,role:"menuitem"},init:function(e){var t=this,n;t._super(e),e=t.settings,t.classes.add("menu-item"),e.menu&&t.classes.add("menu-item-expand"),e.preview&&t.classes.add("menu-item-preview"),n=t.state.get("text"),"-"!==n&&"|"!==n||(t.classes.add("menu-item-sep"),t.aria("role","separator"),t.state.set("text","-")),e.selectable&&(t.aria("role","menuitemcheckbox"),t.classes.add("menu-item-checkbox"),e.icon="selected"),e.preview||e.selectable||t.classes.add("menu-item-normal"),t.on("mousedown",function(e){e.preventDefault()}),e.menu&&!e.ariaHideMenu&&t.aria("haspopup",!0)},hasMenus:function(){return!!this.settings.menu},showMenu:function(){var e=this,n=e.settings,r,i=e.parent();if(i.items().each(function(t){t!==e&&t.hideMenu()}),n.menu){r=e.menu,r?r.show():(r=n.menu,r.length?r={type:"menu",items:r}:r.type=r.type||"menu",i.settings.itemDefaults&&(r.itemDefaults=i.settings.itemDefaults),r=e.menu=t.create(r).parent(e).renderTo(),r.reflow(),r.on("cancel",function(t){t.stopPropagation(),e.focus(),r.hide()}),r.on("show hide",function(e){e.control.items&&e.control.items().each(function(e){e.active(e.settings.selected)})}).fire("show"),r.on("hide",function(t){t.control===r&&e.classes.remove("selected")}),r.submenu=!0),r._parentMenu=i,r.classes.add("menu-sub");var o=r.testMoveRel(e.getEl(),e.isRtl()?["tl-tr","bl-br","tr-tl","br-bl"]:["tr-tl","br-bl","tl-tr","bl-br"]);r.moveRel(e.getEl(),o),r.rel=o,o="menu-sub-"+o,r.classes.remove(r._lastRel).add(o),r._lastRel=o,e.classes.add("selected"),e.aria("expanded",!0)}},hideMenu:function(){var e=this;return e.menu&&(e.menu.items().each(function(e){e.hideMenu&&e.hideMenu()}),e.menu.hide(),e.aria("expanded",!1)),e},renderHtml:function(){function e(e){var t,r,i={};for(i=n.mac?{alt:"&#x2325;",ctrl:"&#x2318;",shift:"&#x21E7;",meta:"&#x2318;"}:{meta:"Ctrl"},e=e.split("+"),t=0;t<e.length;t++)r=i[e[t].toLowerCase()],r&&(e[t]=r);return e.join("+")}function t(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function r(e){var n=s.match||"";return n?e.replace(new RegExp(t(n),"gi"),function(e){return"!mce~match["+e+"]mce~match!"}):e}function i(e){return e.replace(new RegExp(t("!mce~match["),"g"),"<b>").replace(new RegExp(t("]mce~match!"),"g"),"</b>")}var o=this,a=o._id,s=o.settings,l=o.classPrefix,u=o.state.get("text"),c=o.settings.icon,d="",f=s.shortcut,p=o.encode(s.url),h="";return c&&o.parent().classes.add("menu-has-icons"),s.image&&(d=" style=\"background-image: url('"+s.image+"')\""),f&&(f=e(f)),c=l+"ico "+l+"i-"+(o.settings.icon||"none"),h="-"!==u?'<i class="'+c+'"'+d+"></i>\xa0":"",u=i(o.encode(r(u))),p=i(o.encode(r(p))),'<div id="'+a+'" class="'+o.classes+'" tabindex="-1">'+h+("-"!==u?'<span id="'+a+'-text" class="'+l+'text">'+u+"</span>":"")+(f?'<div id="'+a+'-shortcut" class="'+l+'menu-shortcut">'+f+"</div>":"")+(s.menu?'<div class="'+l+'caret"></div>':"")+(p?'<div class="'+l+'menu-item-link">'+p+"</div>":"")+"</div>"},postRender:function(){var e=this,t=e.settings,n=t.textStyle;if("function"==typeof n&&(n=n.call(this)),n){var i=e.getEl("text");i&&i.setAttribute("style",n)}return e.on("mouseenter click",function(n){n.control===e&&(t.menu||"click"!==n.type?(e.showMenu(),n.aria&&e.menu.focus(!0)):(e.fire("select"),r.requestAnimationFrame(function(){e.parent().hideAll()})))}),e._super(),e},hover:function(){var e=this;return e.parent().items().each(function(e){e.classes.remove("selected")}),e.classes.toggle("selected",!0),e},active:function(e){return"undefined"!=typeof e&&this.aria("checked",e),this._super(e)},remove:function(){this._super(),this.menu&&this.menu.remove()}})}),r(Xt,[g,xe,c],function(e,t,n){return function(r,i){var o=this,a,s=t.classPrefix,l;o.show=function(t,u){function c(){a&&(e(r).append('<div class="'+s+"throbber"+(i?" "+s+"throbber-inline":"")+'"></div>'),u&&u())}return o.hide(),a=!0,t?l=n.setTimeout(c,t):c(),o},o.hide=function(){var e=r.lastChild;return n.clearTimeout(l),e&&e.className.indexOf("throbber")!=-1&&e.parentNode.removeChild(e),a=!1,o}}}),r(Kt,[Ae,Yt,Xt,m],function(e,t,n,r){return e.extend({Defaults:{defaultType:"menuitem",border:1,layout:"stack",role:"application",bodyRole:"menu",ariaRoot:!0},init:function(e){var t=this;if(e.autohide=!0,e.constrainToViewport=!0,"function"==typeof e.items&&(e.itemsFactory=e.items,e.items=[]),e.itemDefaults)for(var n=e.items,i=n.length;i--;)n[i]=r.extend({},e.itemDefaults,n[i]);t._super(e),t.classes.add("menu")},repaint:function(){return this.classes.toggle("menu-align",!0),this._super(),this.getEl().style.height="",this.getEl("body").style.height="",this},cancel:function(){var e=this;e.hideAll(),e.fire("select")},load:function(){function e(){t.throbber&&(t.throbber.hide(),t.throbber=null)}var t=this,r,i;i=t.settings.itemsFactory,i&&(t.throbber||(t.throbber=new n(t.getEl("body"),!0),0===t.items().length?(t.throbber.show(),t.fire("loading")):t.throbber.show(100,function(){t.items().remove(),t.fire("loading")}),t.on("hide close",e)),t.requestTime=r=(new Date).getTime(),t.settings.itemsFactory(function(n){return 0===n.length?void t.hide():void(t.requestTime===r&&(t.getEl().style.width="",t.getEl("body").style.width="",e(),t.items().remove(),t.getEl("body").innerHTML="",t.add(n),t.renderNew(),t.fire("loaded")))}))},hideAll:function(){var e=this;return this.find("menuitem").exec("hideMenu"),e._super()},preRender:function(){var e=this;return e.items().each(function(t){var n=t.settings;if(n.icon||n.image||n.selectable)return e._hasIcons=!0,!1}),e.settings.itemsFactory&&e.on("postrender",function(){e.settings.itemsFactory&&e.load()}),e._super()}})}),r(Gt,[jt,Kt],function(e,t){return e.extend({init:function(e){function t(r){for(var a=0;a<r.length;a++){if(i=r[a].selected||e.value===r[a].value)return o=o||r[a].text,n.state.set("value",r[a].value),!0;if(r[a].menu&&t(r[a].menu))return!0}}var n=this,r,i,o,a;n._super(e),e=n.settings,n._values=r=e.values,r&&("undefined"!=typeof e.value&&t(r),!i&&r.length>0&&(o=r[0].text,n.state.set("value",r[0].value)),n.state.set("menu",r)),n.state.set("text",e.text||o),n.classes.add("listbox"),n.on("select",function(t){var r=t.control;a&&(t.lastControl=a),e.multiple?r.active(!r.active()):n.value(t.control.value()),a=r})},bindStates:function(){function e(e,n){e instanceof t&&e.items().each(function(e){e.hasMenus()||e.active(e.value()===n)})}function n(e,t){var r;if(e)for(var i=0;i<e.length;i++){if(e[i].value===t)return e[i];if(e[i].menu&&(r=n(e[i].menu,t)))return r}}var r=this;return r.on("show",function(t){e(t.control,r.value())}),r.state.on("change:value",function(e){var t=n(r.state.get("menu"),e.value);t?r.text(t.text):r.text(r.settings.text)}),r._super()}})}),r(Jt,[xt],function(e){return e.extend({Defaults:{classes:"radio",role:"radio"}})}),r(Qt,[Pe,_e],function(e,t){return e.extend({renderHtml:function(){var e=this,t=e.classPrefix;return e.classes.add("resizehandle"),"both"==e.settings.direction&&e.classes.add("resizehandle-both"),e.canFocus=!1,'<div id="'+e._id+'" class="'+e.classes+'"><i class="'+t+"ico "+t+'i-resize"></i></div>'},postRender:function(){var e=this;e._super(),e.resizeDragHelper=new t(this._id,{start:function(){e.fire("ResizeStart")},drag:function(t){"both"!=e.settings.direction&&(t.deltaX=0),e.fire("Resize",t)},stop:function(){e.fire("ResizeEnd")}})},remove:function(){return this.resizeDragHelper&&this.resizeDragHelper.destroy(),this._super()}})}),r(Zt,[Pe],function(e){function t(e){var t="";if(e)for(var n=0;n<e.length;n++)t+='<option value="'+e[n]+'">'+e[n]+"</option>";return t}return e.extend({Defaults:{classes:"selectbox",role:"selectbox",options:[]},init:function(e){var t=this;t._super(e),t.settings.size&&(t.size=t.settings.size),t.settings.options&&(t._options=t.settings.options),t.on("keydown",function(e){var n;13==e.keyCode&&(e.preventDefault(),t.parents().reverse().each(function(e){if(e.toJSON)return n=e,!1}),t.fire("submit",{data:n.toJSON()}))})},options:function(e){return arguments.length?(this.state.set("options",e),this):this.state.get("options")},renderHtml:function(){var e=this,n,r="";return n=t(e._options),e.size&&(r=' size = "'+e.size+'"'),'<select id="'+e._id+'" class="'+e.classes+'"'+r+">"+n+"</select>"},bindStates:function(){var e=this;return e.state.on("change:options",function(n){e.getEl().innerHTML=t(n.value)}),e._super()}})}),r(en,[Pe,_e,ve],function(e,t,n){function r(e,t,n){return e<t&&(e=t),e>n&&(e=n),e}function i(e,t,n){e.setAttribute("aria-"+t,n)}function o(e,t){var r,o,a,s,l,u;"v"==e.settings.orientation?(s="top",a="height",o="h"):(s="left",a="width",o="w"),u=e.getEl("handle"),r=(e.layoutRect()[o]||100)-n.getSize(u)[a],l=r*((t-e._minValue)/(e._maxValue-e._minValue))+"px",u.style[s]=l,u.style.height=e.layoutRect().h+"px",i(u,"valuenow",t),i(u,"valuetext",""+e.settings.previewFilter(t)),i(u,"valuemin",e._minValue),i(u,"valuemax",e._maxValue)}return e.extend({init:function(e){var t=this;e.previewFilter||(e.previewFilter=function(e){return Math.round(100*e)/100}),t._super(e),t.classes.add("slider"),"v"==e.orientation&&t.classes.add("vertical"),t._minValue=e.minValue||0,t._maxValue=e.maxValue||100,t._initValue=t.state.get("value")},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix;return'<div id="'+t+'" class="'+e.classes+'"><div id="'+t+'-handle" class="'+n+'slider-handle" role="slider" tabindex="-1"></div></div>'},reset:function(){this.value(this._initValue).repaint()},postRender:function(){function e(e,t,n){return(n+e)/(t-e)}function i(e,t,n){return n*(t-e)-e}function o(t,n){function o(o){var a;a=s.value(),a=i(t,n,e(t,n,a)+.05*o),a=r(a,t,n),s.value(a),s.fire("dragstart",{value:a}),s.fire("drag",{value:a}),s.fire("dragend",{value:a})}s.on("keydown",function(e){switch(e.keyCode){case 37:case 38:o(-1);break;case 39:case 40:o(1)}})}function a(e,i,o){var a,l,u,h,m;s._dragHelper=new t(s._id,{handle:s._id+"-handle",start:function(e){a=e[c],l=parseInt(s.getEl("handle").style[d],10),u=(s.layoutRect()[p]||100)-n.getSize(o)[f],s.fire("dragstart",{value:m})},drag:function(t){var n=t[c]-a;h=r(l+n,0,u),o.style[d]=h+"px",m=e+h/u*(i-e),s.value(m),s.tooltip().text(""+s.settings.previewFilter(m)).show().moveRel(o,"bc tc"),s.fire("drag",{value:m})},stop:function(){s.tooltip().hide(),s.fire("dragend",{value:m})}})}var s=this,l,u,c,d,f,p;l=s._minValue,u=s._maxValue,"v"==s.settings.orientation?(c="screenY",d="top",f="height",p="h"):(c="screenX",d="left",f="width",p="w"),s._super(),o(l,u,s.getEl("handle")),a(l,u,s.getEl("handle"))},repaint:function(){this._super(),o(this,this.value())},bindStates:function(){var e=this;return e.state.on("change:value",function(t){o(e,t.value)}),e._super()}})}),r(tn,[Pe],function(e){return e.extend({renderHtml:function(){var e=this;return e.classes.add("spacer"),e.canFocus=!1,'<div id="'+e._id+'" class="'+e.classes+'"></div>'}})}),r(nn,[jt,ve,g],function(e,t,n){return e.extend({Defaults:{classes:"widget btn splitbtn",role:"button"},repaint:function(){var e=this,r=e.getEl(),i=e.layoutRect(),o,a;return e._super(),o=r.firstChild,a=r.lastChild,n(o).css({width:i.w-t.getSize(a).width,height:i.h-2}),n(a).css({height:i.h-2}),e},activeMenu:function(e){var t=this;n(t.getEl().lastChild).toggleClass(t.classPrefix+"active",e)},renderHtml:function(){var e=this,t=e._id,n=e.classPrefix,r,i=e.state.get("icon"),o=e.state.get("text"),a="";return r=e.settings.image,r?(i="none","string"!=typeof r&&(r=window.getSelection?r[0]:r[1]),r=" style=\"background-image: url('"+r+"')\""):r="",i=e.settings.icon?n+"ico "+n+"i-"+i:"",o&&(e.classes.add("btn-has-text"),a='<span class="'+n+'txt">'+e.encode(o)+"</span>"),'<div id="'+t+'" class="'+e.classes+'" role="button" tabindex="-1"><button type="button" hidefocus="1" tabindex="-1">'+(i?'<i class="'+i+'"'+r+"></i>":"")+a+'</button><button type="button" class="'+n+'open" hidefocus="1" tabindex="-1">'+(e._menuBtnText?(i?"\xa0":"")+e._menuBtnText:"")+' <i class="'+n+'caret"></i></button></div>'},postRender:function(){var e=this,t=e.settings.onclick;return e.on("click",function(e){var n=e.target;if(e.control==this)for(;n;){if(e.aria&&"down"!=e.aria.key||"BUTTON"==n.nodeName&&n.className.indexOf("open")==-1)return e.stopImmediatePropagation(),void(t&&t.call(this,e));n=n.parentNode}}),delete e.settings.onclick,e._super()}})}),r(rn,[Ht],function(e){return e.extend({Defaults:{containerClass:"stack-layout",controlClass:"stack-layout-item",endClass:"break"},isNative:function(){return!0}})}),r(on,[ke,g,ve],function(e,t,n){return e.extend({Defaults:{layout:"absolute",defaults:{type:"panel"}},activateTab:function(e){var n;this.activeTabId&&(n=this.getEl(this.activeTabId),t(n).removeClass(this.classPrefix+"active"),n.setAttribute("aria-selected","false")),this.activeTabId="t"+e,n=this.getEl("t"+e),n.setAttribute("aria-selected","true"),t(n).addClass(this.classPrefix+"active"),this.items()[e].show().fire("showtab"),this.reflow(),this.items().each(function(t,n){e!=n&&t.hide()})},renderHtml:function(){var e=this,t=e._layout,n="",r=e.classPrefix;return e.preRender(),t.preRender(e),e.items().each(function(t,i){var o=e._id+"-t"+i;t.aria("role","tabpanel"),t.aria("labelledby",o),n+='<div id="'+o+'" class="'+r+'tab" unselectable="on" role="tab" aria-controls="'+t._id+'" aria-selected="false" tabIndex="-1">'+e.encode(t.settings.title)+"</div>"}),'<div id="'+e._id+'" class="'+e.classes+'" hidefocus="1" tabindex="-1"><div id="'+e._id+'-head" class="'+r+'tabs" role="tablist">'+n+'</div><div id="'+e._id+'-body" class="'+e.bodyClasses+'">'+t.renderHtml(e)+"</div></div>"},postRender:function(){var e=this;e._super(),e.settings.activeTab=e.settings.activeTab||0,e.activateTab(e.settings.activeTab),this.on("click",function(t){var n=t.target.parentNode;if(n&&n.id==e._id+"-head")for(var r=n.childNodes.length;r--;)n.childNodes[r]==t.target&&e.activateTab(r)})},initLayoutRect:function(){var e=this,t,r,i;r=n.getSize(e.getEl("head")).width,r=r<0?0:r,i=0,e.items().each(function(e){r=Math.max(r,e.layoutRect().minW),i=Math.max(i,e.layoutRect().minH)}),e.items().each(function(e){e.settings.x=0,e.settings.y=0,e.settings.w=r,e.settings.h=i,e.layoutRect({x:0,y:0,w:r,h:i})});var o=n.getSize(e.getEl("head")).height;return e.settings.minWidth=r,e.settings.minHeight=i+o,t=e._super(),t.deltaH+=o,t.innerH=t.h-t.deltaH,t}})}),r(an,[Pe,m,ve],function(e,t,n){return e.extend({init:function(e){var t=this;t._super(e),t.classes.add("textbox"),e.multiline?t.classes.add("multiline"):(t.on("keydown",function(e){var n;13==e.keyCode&&(e.preventDefault(),t.parents().reverse().each(function(e){if(e.toJSON)return n=e,!1}),t.fire("submit",{data:n.toJSON()}))}),t.on("keyup",function(e){t.state.set("value",e.target.value)}))},repaint:function(){var e=this,t,n,r,i,o=0,a;t=e.getEl().style,n=e._layoutRect,a=e._lastRepaintRect||{};var s=document;return!e.settings.multiline&&s.all&&(!s.documentMode||s.documentMode<=8)&&(t.lineHeight=n.h-o+"px"),r=e.borderBox,i=r.left+r.right+8,o=r.top+r.bottom+(e.settings.multiline?8:0),n.x!==a.x&&(t.left=n.x+"px",a.x=n.x),n.y!==a.y&&(t.top=n.y+"px",a.y=n.y),n.w!==a.w&&(t.width=n.w-i+"px",a.w=n.w),n.h!==a.h&&(t.height=n.h-o+"px",a.h=n.h),e._lastRepaintRect=a,e.fire("repaint",{},!1),e},renderHtml:function(){var e=this,r=e.settings,i,o;return i={id:e._id,hidefocus:"1"},t.each(["rows","spellcheck","maxLength","size","readonly","min","max","step","list","pattern","placeholder","required","multiple"],function(e){i[e]=r[e]}),e.disabled()&&(i.disabled="disabled"),r.subtype&&(i.type=r.subtype),o=n.create(r.multiline?"textarea":"input",i),o.value=e.state.get("value"),o.className=e.classes,o.outerHTML},value:function(e){return arguments.length?(this.state.set("value",e),this):(this.state.get("rendered")&&this.state.set("value",this.getEl().value),this.state.get("value"))},postRender:function(){var e=this;e.getEl().value=e.state.get("value"),e._super(),e.$el.on("change",function(t){e.state.set("value",t.target.value),e.fire("change",t)})},bindStates:function(){var e=this;return e.state.on("change:value",function(t){e.getEl().value!=t.value&&(e.getEl().value=t.value)}),e.state.on("change:disabled",function(t){e.getEl().disabled=t.value}),e._super()},remove:function(){this.$el.off(),this._super()}})}),r(sn,[],function(){var e=this||window,t=function(){return e.tinymce};return"function"==typeof e.define&&(e.define.amd||e.define("ephox/tinymce",[],t)),"object"==typeof module&&(module.exports=window.tinymce),{}}),a([l,u,c,d,f,p,m,g,v,y,C,w,E,N,T,A,B,D,L,M,P,O,I,F,j,Y,J,te,le,ue,ce,de,pe,me,ge,Ce,xe,we,Ee,Ne,_e,Se,ke,Te,Re,Ae,Be,De,Le,Me,Pe,Oe,He,Ie,Ue,Ve,at,st,lt,ut,dt,ft,pt,ht,mt,gt,vt,yt,bt,Ct,xt,wt,Et,Nt,_t,St,kt,Tt,Rt,At,Bt,Dt,Mt,Pt,Ot,Ht,Ft,zt,Ut,Wt,Vt,$t,qt,jt,Yt,Xt,Kt,Gt,Jt,Qt,Zt,en,tn,nn,rn,on,an])}(window);

file:b/toplists.php (new)
--- /dev/null
+++ b/toplists.php
@@ -1,1 +1,62 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+$current = "tens";
+
+include ("header.php");
+
+if(file_exists("$skindir/browse.tpl")) $tpl = new TemplatePower( "$skindir/browse.tpl" );
+else $tpl = new TemplatePower("default_tpls/browse.tpl");
+if(file_exists("$skindir/listings.tpl")) $tpl->assignInclude("listings", "./$skindir/listings.tpl");
+else $tpl->assignInclude( "listings", "./default_tpls/listings.tpl" );
+$tpl->assignInclude( "header", "./$skindir/header.tpl" );
+$tpl->assignInclude( "footer", "./$skindir/footer.tpl" );
+
+$list = isset($_GET['list']) ? $_GET['list'] : false;
+include("includes/pagesetup.php");
+	if(!$list) {
+		$output = "<div id='pagetitle'>".$pagelinks['tens']['text']."</div>";
+		$lists = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_type = 'L' AND panel_hidden != '1' AND panel_level = '0' ORDER BY panel_order");
+		if(dbnumrows($lists)) $output .= "<div class='tblborder' id='top10list' style='margin: 0 25%;'>";
+		while($l = dbassoc($lists)) {
+			$output .= "<a href='toplists.php?list=".$l['panel_name']."'>".$l['panel_title']."</a><br />";
+		}
+		
+		if(dbnumrows($lists)) $output .= "</div>";
+	}
+	else {
+		$panelquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_name = '".escapestring($list)."' AND panel_type = 'L' LIMIT 1");
+		if(dbnumrows($panelquery)) {
+			$panel = dbassoc($panelquery);
+			$output .= "<div id='pagetitle'>".$panel['panel_title']."</div>";
+			$numrows = 0;
+			if($panel['panel_url'] && file_exists(_BASEDIR.$panel['panel_url'])) include($panel['panel_url']);
+			else if(file_exists("toplists/{$type}.php")) include("toplists/{$type}.php");
+			else $output .= write_error(_ERROR);
+		}
+		else $output .= write_error(_ERROR);		
+	}
+
+$tpl->assign("output", $output);
+$tpl->printToScreen( );
+?>
+

--- /dev/null
+++ b/toplists/default.php
@@ -1,1 +1,119 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+if(!defined("_CHARSET")) exit( );
 
+		$output = "<div id=\"pagetitle\">".$panel['panel_title']."</div>";
+		$where = false;
+	switch($list) {
+		case "popskins":
+			$result = dbquery("SELECT userskin, COUNT(userskin) as count FROM ".TABLEPREFIX."fanfiction_authorprefs GROUP BY userskin ORDER BY count DESC");
+			$count = 1;
+			while($popskin = dbassoc($result)) {
+				$output .= "$count. ".$popskin['userskin']."<br />";
+				$count++;
+			}
+			break;
+		case "favauthors":
+			$result = dbquery("SELECT count( fav.item ) AS count, "._UIDFIELD." as uid, "._PENNAMEFIELD." as penname FROM ".TABLEPREFIX."fanfiction_favorites AS fav, "._AUTHORTABLE." WHERE fav.item = "._UIDFIELD." AND fav.type = 'AU' GROUP  BY fav.item ORDER  BY count DESC LIMIT 10");
+			if(dbnumrows($result) == 0) $output .= write_message(_NORESULTS);
+			$count = 1;
+			while($author = dbassoc($result)) {
+				$output .= "$count. <a href=\"viewuser.php?uid=".$author['uid']."\">".$author['penname']."</a> [".$author['count']."]<br /> ";
+				$count++;
+			}
+			break;
+		case "favstories":
+			$result = dbquery("SELECT count( fav.item ) AS count, stories.*, "._PENNAMEFIELD." as penname, stories.date as date, stories.updated as updated FROM ".TABLEPREFIX."fanfiction_favorites AS fav, "._AUTHORTABLE.", ".TABLEPREFIX."fanfiction_stories as stories WHERE stories.uid = "._UIDFIELD." AND stories.validated > 0 AND fav.item = stories.sid AND fav.type = 'ST' GROUP  BY stories.sid ORDER  BY count DESC LIMIT 10");
+			if(dbnumrows($result) == 0) $output .= write_message(_NORESULTS);
+			$tpl->newBlock("listings");
+			while($stories = dbassoc($result)) { 
+				$tpl->newblock("storyblock");
+				include("includes/storyblock.php"); 
+			}
+			break;
+		case "favseries" :
+			$result = dbquery("SELECT count(fav.item) AS count, series.*,  "._PENNAMEFIELD." as penname FROM (".TABLEPREFIX."fanfiction_series AS series, ".TABLEPREFIX."fanfiction_favorites as fav, "._AUTHORTABLE.") WHERE series.uid = "._UIDFIELD." AND fav.item = series.seriesid AND fav.type = 'SE' GROUP BY series.seriesid ORDER BY count DESC LIMIT 10");
+			if(dbnumrows($result) == 0) $output .= write_message(_NORESULTS);
+			$tpl->newBlock("listings");
+			while($stories = dbassoc($result)) { include("includes/seriesblock.php"); }
+			break;
+		case "largeseries":
+			$result = dbquery("SELECT count(inorder.seriesid) AS count, sub.*,  "._PENNAMEFIELD." as penname FROM ".TABLEPREFIX."fanfiction_series AS sub, ".TABLEPREFIX."fanfiction_inseries as inorder, "._AUTHORTABLE." WHERE sub.uid = "._UIDFIELD." AND inorder.seriesid = sub.seriesid GROUP BY sub.seriesid ORDER BY count DESC LIMIT 10");
+			if(dbnumrows($result) == 0) $output .= write_message(_NORESULTS);
+			$tpl->newBlock("listings");
+			while($stories = dbassoc($result)) { include("includes/seriesblock.php"); }
+			break;
+		case "smallseries":
+			$result = dbquery("SELECT count(inorder.seriesid) AS count, sub.*,  "._PENNAMEFIELD." as penname FROM ".TABLEPREFIX."fanfiction_series AS sub, ".TABLEPREFIX."fanfiction_inseries as inorder, "._AUTHORTABLE." WHERE sub.uid = "._UIDFIELD." AND inorder.seriesid = sub.seriesid GROUP BY sub.seriesid ORDER BY count LIMIT 10");
+			if(dbnumrows($result) == 0) $output .= write_message(_NORESULTS);
+			$tpl->newBlock("listings");
+			while($stories = dbassoc($result)) { include("includes/seriesblock.php"); }
+			break;
+		case "reviewedseries":
+			$result = dbquery("SELECT series.*,  "._PENNAMEFIELD." as penname FROM ".TABLEPREFIX."fanfiction_series AS series, "._AUTHORTABLE." WHERE series.uid = "._UIDFIELD." ORDER BY series.reviews DESC LIMIT 10");
+			if(dbnumrows($result) == 0) $output .= write_message(_NORESULTS);
+			$tpl->newBlock("listings");
+			while($stories = dbassoc($result)) { include("includes/seriesblock.php"); }
+			break;
+		case "prolificauthors":
+			$result = dbquery("SELECT ap.stories AS count, "._PENNAMEFIELD." as penname , "._UIDFIELD." as uid FROM ".TABLEPREFIX."fanfiction_authorprefs as ap LEFT JOIN "._AUTHORTABLE." ON ap.uid = "._UIDFIELD." ORDER BY count DESC LIMIT 10");
+			if(dbnumrows($result) == 0) $output .= write_message(_NORESULTS);
+			$count = 1;
+			while($author = dbassoc($result)) {
+				$output .= "$count. <a href=\"viewuser.php?uid=".$author['uid']."\">".$author['penname']."</a> [".$author['count']."]<br /> ";
+				$count++;
+			}
+			break;	
+		case "prolificreviewers":
+			$result = dbquery("SELECT count(reviews.uid) AS count, "._PENNAMEFIELD." as penname , "._UIDFIELD." as uid FROM ".TABLEPREFIX."fanfiction_reviews as reviews, "._AUTHORTABLE." WHERE reviews.uid = "._UIDFIELD." AND reviews.review != 'No Review' GROUP BY reviews.uid ORDER BY count DESC LIMIT 10");
+			if(dbnumrows($result) == 0) $output .= write_message(_NORESULTS);
+			$count = 1;
+			while($author = dbassoc($result)) {
+				$output .= "$count. <a href=\"viewuser.php?uid=".$author['uid']."\">".$author['penname']."</a> [".$author['count']."]<br /> ";
+				$count++;
+			}
+			break;
+		case "shortstories":
+			$where = "ORDER BY stories.wordcount ASC";
+			break;
+		case "longstories":
+			$where = "ORDER BY stories.wordcount DESC";
+			break;
+		case "reviewedstories":
+			$where = "AND stories.reviews > 0 ORDER BY stories.reviews DESC";
+			break;
+		case "readstories":
+			$where = "ORDER BY stories.count DESC";
+			break;
+	}
+	if($where) {
+		$result2 = dbquery(_STORYQUERY." $where LIMIT 10");
+		if(dbnumrows($result2) == 0) $output .= "</div>".write_message(_NORESULTS);
+		$tpl->newBlock("listings");
+
+		while($stories = dbassoc($result2)) { 
+			$tpl->newBlock("storyblock");
+			include("includes/storyblock.php"); 
+		}
+	}
+	$tpl->gotoBlock( "_ROOT" );
+?>

--- /dev/null
+++ b/toplists/index.php

file:b/update.php (new)
--- /dev/null
+++ b/update.php
@@ -1,1 +1,344 @@
-
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+$current = "update";
+
+include("header.php");
+
+$blocks['news']['status'] = 0;
+$blocks['info']['status'] = 0;
+
+//make a new TemplatePower object
+if (file_exists("$skindir/default.tpl")) $tpl = new TemplatePower("$skindir/default.tpl");
+else $tpl = new TemplatePower("default_tpls/default.tpl");
+include("includes/pagesetup.php");
+if (file_exists("languages/" . $language . "_admin.php")) include_once("languages/" . $language . "_admin.php");
+else include_once("languages/en_admin.php");
+// end basic page setup
+
+if (!isADMIN)
+{
+	$output .= "<script language=\"javascript\" type=\"text/javascript\">
+location = \"maintenance.php\";
+</script>";
+	$tpl->assign("output", $output);
+	$tpl->printToScreen();
+	dbclose();
+	exit();
+}
+$oldVersion = explode(".", $settings['version']);
+
+if ($oldVersion[0] <= 3 && $oldVersion[1] <= 5 && $oldVersion[2] < 5)
+{
+	header("Location: update355.php");
+	exit();
+}
+
+$fanfiction_poll_exists = 0;  /* poll tables maybe be not installed */
+$fanfiction_poll_table = TABLEPREFIX . "fanfiction_poll";
+$fanfiction_poll_exists =  dbassoc(dbquery("
+			SELECT *
+			FROM information_schema.tables
+			WHERE table_schema = '{$dbname}'
+				AND table_name = '{$fanfiction_poll_table}'
+			;"));
+
+$set_355 = do_version_check_355();
+if($set_355) {
+	dbquery("UPDATE " . $settingsprefix . "fanfiction_settings SET version = '3.5.5' WHERE sitekey = '" . SITEKEY . "'");
+	$settings['version'] = '3.5.5';
+}
+$oldVersion = explode(".", $settings['version']);
+
+$confirm = isset($_GET['confirm']) ? $_GET['confirm'] : false;
+$oldconfirm = isset($_GET['oldconfirm']) ? $_GET['oldconfirm'] : false;
+
+if ($oldVersion[0] == 3 && ($oldVersion[1] < 5 || $oldVersion[2] < 3))
+{
+	write_message("This version is working only for 3.5.5 database. If you have only database, there is way how to do it.");
+	exit;
+}
+
+
+
+if ($oldVersion[0] == 3 && ($oldVersion[1] < 5 || $oldVersion[2] < 6))  //3.5.5
+{
+	if ($confirm == "yes")
+	{
+		if ($oldVersion[0] == 3 &&  $oldVersion[1] == 5 && $oldVersion[2] < 6)
+		{
+			/****************************************************************************************************************/
+			$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_authors LIKE 'date'"));
+			if ($tmp['Type'] == "datetime")
+			{ 
+				$updated = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_authors LIKE 'date_tmp'"));
+				if (!$updated)
+				{
+					dbquery("ALTER TABLE 	`" . TABLEPREFIX . "fanfiction_authors` ADD `date_tmp` int(10) unsigned NOT NULL default '0' ");
+				}
+
+				dbquery("UPDATE 		`" . TABLEPREFIX . "fanfiction_authors` SET `date_tmp` = UNIX_TIMESTAMP( `date` )");
+				dbquery("ALTER TABLE `" . TABLEPREFIX . "fanfiction_authors` CHANGE `date` `date` INT NOT NULL");
+				dbquery("UPDATE `" . TABLEPREFIX . "fanfiction_authors` set date = date_tmp");
+				dbquery("ALTER TABLE `" . TABLEPREFIX . "fanfiction_authors` DROP `date_tmp`");
+			}
+			/****************************************************************************************************************/
+			$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_log LIKE 'log_timestamp'"));
+
+			if ($tmp['Type'] == "timestamp")
+			{ 
+				$updated = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_log LIKE 'log_timestamp_tmp'"));
+				if (!$updated)
+				{
+					dbquery("ALTER TABLE 	`" . TABLEPREFIX . "fanfiction_log` ADD `log_timestamp_tmp` int(10) unsigned NOT NULL default '0' ");
+				}
+
+				dbquery("UPDATE 		`" . TABLEPREFIX . "fanfiction_log` SET `log_timestamp_tmp` = UNIX_TIMESTAMP( `log_timestamp` )");
+				dbquery("ALTER TABLE `" . TABLEPREFIX . "fanfiction_log` CHANGE `log_timestamp` `log_timestamp` INT NOT NULL");
+				dbquery("UPDATE `" . TABLEPREFIX . "fanfiction_log` set log_timestamp = log_timestamp_tmp");
+				dbquery("ALTER TABLE `" . TABLEPREFIX . "fanfiction_log` DROP `log_timestamp_tmp`");
+			}
+			/****************************************************************************************************************/
+			/* fanfiction_comments   `time` datetime NOT NULL default '0000-00-00 00:00:00'  */
+			$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_comments LIKE 'time'"));
+			if ($tmp['Type'] == "datetime")
+			{
+				$updated = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_comments LIKE 'time_tmp'"));
+				if (!$updated)
+				{
+					dbquery("ALTER TABLE 	`" . TABLEPREFIX . "fanfiction_comments` ADD `time_tmp` int(10) unsigned NOT NULL default '0' ");
+				}
+
+				dbquery("UPDATE 		`" . TABLEPREFIX . "fanfiction_comments` SET `time_tmp` = UNIX_TIMESTAMP( `time` )");
+				dbquery("ALTER TABLE `" . TABLEPREFIX . "fanfiction_comments` CHANGE `time` `time` INT NOT NULL");
+				dbquery("UPDATE `" . TABLEPREFIX . "fanfiction_comments` set time = time_tmp");
+				dbquery("ALTER TABLE `" . TABLEPREFIX . "fanfiction_comments` DROP `time_tmp`");
+			}
+			/****************************************************************************************************************/
+			/* fanfiction_reviews   `date` datetime NOT NULL default '0000-00-00 00:00:00', */
+			$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_reviews LIKE 'date'"));
+			if ($tmp['Type'] == "datetime")
+			{
+				$updated = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_reviews LIKE 'date_tmp'"));
+				if (!$updated)
+				{
+					dbquery("ALTER TABLE 	`" . TABLEPREFIX . "fanfiction_reviews` ADD `date_tmp` int(10) unsigned NOT NULL default '0' ");
+				}
+
+				dbquery("UPDATE 		`" . TABLEPREFIX . "fanfiction_reviews` SET `date_tmp` = UNIX_TIMESTAMP( `date` )");
+				dbquery("ALTER TABLE `" . TABLEPREFIX . "fanfiction_reviews` CHANGE `date` `date` INT NOT NULL");
+				dbquery("UPDATE `" . TABLEPREFIX . "fanfiction_reviews` set date = date_tmp");
+				dbquery("ALTER TABLE `" . TABLEPREFIX . "fanfiction_reviews` DROP `date_tmp`");
+			}
+			/****************************************************************************************************************/
+			/* fanfiction_stories `date` datetime NOT NULL default '0000-00-00 00:00:00',   */
+			$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_stories LIKE 'date'"));
+			if($tmp['Type'] == "datetime") {
+				$updated = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_stories LIKE 'date_tmp'"));
+				if (!$updated)
+				{
+					dbquery("ALTER TABLE 	`" . TABLEPREFIX . "fanfiction_stories` ADD `date_tmp` int(10) unsigned NOT NULL default '0' ");
+				}
+
+				dbquery("UPDATE 		`" . TABLEPREFIX . "fanfiction_stories` SET `date_tmp` = UNIX_TIMESTAMP( `date` )");
+				dbquery("ALTER TABLE `" . TABLEPREFIX . "fanfiction_stories` CHANGE `date` `date` INT NOT NULL");
+				dbquery("UPDATE `" . TABLEPREFIX . "fanfiction_stories` set date = date_tmp");
+				dbquery("ALTER TABLE `" . TABLEPREFIX . "fanfiction_stories` DROP `date_tmp`");
+			}
+
+			/****************************************************************************************************************/
+			/* fanfiction_stories `updated` datetime NOT NULL default '0000-00-00 00:00:00', */
+			$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_stories LIKE 'updated'"));
+			if ($tmp['Type'] == "datetime")
+			{				
+				$updated = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_stories LIKE 'updated_tmp'"));
+				if (!$updated)
+				{
+					dbquery("ALTER TABLE 	`" . TABLEPREFIX . "fanfiction_stories` ADD `updated_tmp` int(10) unsigned NOT NULL default '0' ");
+				}
+
+				dbquery("UPDATE 		`" . TABLEPREFIX . "fanfiction_stories` SET `updated_tmp` = UNIX_TIMESTAMP( `updated` )");
+				dbquery("ALTER TABLE `" . TABLEPREFIX . "fanfiction_stories` CHANGE `updated` `updated` INT NOT NULL");
+				dbquery("UPDATE `" . TABLEPREFIX . "fanfiction_stories` set updated = updated_tmp");
+				dbquery("ALTER TABLE `" . TABLEPREFIX . "fanfiction_stories` DROP `updated_tmp`");
+			}
+
+			/****************************************************************************************************************/
+			/* fanfiction_news `time` datetime default NULL,  */
+			$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_news LIKE 'time'"));
+			
+			if ($tmp['Type'] == "datetime")
+			{		
+				$updated = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_news LIKE 'time_tmp'"));
+				if (!$updated)
+				{
+					dbquery("ALTER TABLE 	`" . TABLEPREFIX . "fanfiction_news` ADD `time_tmp` int(10) unsigned NOT NULL default '0' ");
+				}
+
+				dbquery("UPDATE 		`" . TABLEPREFIX . "fanfiction_news` SET `time_tmp` = UNIX_TIMESTAMP( `time` )");
+				dbquery("ALTER TABLE `" . TABLEPREFIX . "fanfiction_news` CHANGE `time` `time` INT NOT NULL");
+				dbquery("UPDATE `" . TABLEPREFIX . "fanfiction_news` set time = time_tmp");
+				dbquery("ALTER TABLE `" . TABLEPREFIX . "fanfiction_news` DROP `time_tmp`");
+			}
+
+			/****************************************************************************************************************/
+			if ($fanfiction_poll_exists)
+			{
+				$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_poll LIKE 'poll_start'"));
+
+				if ($tmp['Type'] == "datetime")
+				{
+					$updated = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_poll LIKE 'poll_start_tmp'"));
+					if (!$updated)
+					{
+						dbquery("ALTER TABLE 	`" . TABLEPREFIX . "fanfiction_poll` ADD `poll_start_tmp` int(10) unsigned NOT NULL default '0' ");
+					}
+
+					dbquery("UPDATE 		`" . TABLEPREFIX . "fanfiction_poll` SET `poll_start_tmp` = UNIX_TIMESTAMP( `poll_start` )");
+					dbquery("ALTER TABLE `" . TABLEPREFIX . "fanfiction_poll` CHANGE `poll_start` `poll_start` INT NOT NULL");
+					dbquery("UPDATE `" . TABLEPREFIX . "fanfiction_poll` set poll_start = poll_start_tmp");
+					dbquery("ALTER TABLE `" . TABLEPREFIX . "fanfiction_poll` DROP `poll_start_tmp`");
+				}
+
+				$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_poll LIKE 'poll_end'"));
+
+				if ($tmp['Type'] == "datetime")
+				{
+					$updated = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_poll LIKE 'poll_end_tmp'"));
+					if (!$updated)
+					{
+						dbquery("ALTER TABLE 	`" . TABLEPREFIX . "fanfiction_poll` ADD `poll_end_tmp` int(10) unsigned NOT NULL default '0' ");
+					}
+
+					dbquery("UPDATE 		`" . TABLEPREFIX . "fanfiction_poll` SET `poll_end_tmp` = UNIX_TIMESTAMP( `poll_end` )");
+					dbquery("ALTER TABLE `" . TABLEPREFIX . "fanfiction_poll` CHANGE `poll_end` `poll_end` INT NOT NULL");
+					dbquery("UPDATE `" . TABLEPREFIX . "fanfiction_poll` set poll_end = poll_end_tmp");
+					dbquery("ALTER TABLE `" . TABLEPREFIX . "fanfiction_poll` DROP `poll_end_tmp`");
+				}
+
+			}	
+
+		}
+	
+		$update = dbquery("UPDATE " . $settingsprefix . "fanfiction_settings SET version = '" . $version . "' WHERE sitekey = '" . SITEKEY . "'");
+		if ($update) $output .= write_message(_ACTIONSUCCESSFUL);
+		else $output .= write_error(_ERROR);
+	}
+	else if ($confirm == "no")
+	{
+		$output .= write_message(_ACTIONCANCELLED);
+	}
+	else
+	{
+		if ($oldVersion[0] == 3 && ($oldVersion[1] < 4 || $oldVersion[1] == 4 && (!isset($oldVersion[2]) || $oldVersion[2] < 6)))
+			$output .= write_message(_CONFIRMUPDATE . "<br /> <a href='update.php?confirm=yes'>" . _YES . "</a> " . _OR . " <a href='update.php?confirm=no'>" . _NO . "</a>");
+		else $output .= write_message("Are you ready to update? <a href='update.php?confirm=yes'>" . _YES . "</a> " . _OR . " <a href='update.php?confirm=no'>" . _NO . "</a>");
+	}
+}
+else $output .= write_message(_ALREADYUPDATED);
+
+/* until database is fully fixed, not update efiction version */
+function do_version_check_355() {
+	global $fanfiction_poll_exists;
+
+	$check_355 = false;
+ 
+	/* do double check or return version back if it is needed */
+	$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_authors LIKE 'date'"));
+	if ($tmp['Type'] == "datetime")
+	{
+		$check_355 = true;
+		return $check_355;
+	}
+	$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_log LIKE 'log_timestamp'"));
+
+	if ($tmp['Type'] == "timestamp")
+	{
+		$check_355 = true;
+		return $check_355;
+	}
+
+	$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_comments LIKE 'time'"));
+	if ($tmp['Type'] == "datetime")
+	{
+		$check_355 = true;
+		return $check_355;
+	}
+
+	$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_reviews LIKE 'date'"));
+	if ($tmp['Type'] == "datetime")
+	{
+		$check_355 = true;
+		return $check_355;
+	}
+
+	$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_stories LIKE 'date'"));
+	if ($tmp['Type'] == "datetime")
+	{
+		$check_355 = true;
+		return $check_355;
+	}
+
+	$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_stories LIKE 'updated'"));
+	if ($tmp['Type'] == "datetime")
+	{
+		$check_355 = true;
+		return $check_355;
+	}
+
+	$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_news LIKE 'time'"));
+
+	if ($tmp['Type'] == "datetime")
+	{
+			$check_355 = true;
+			return $check_355;
+	}
+
+	if ($fanfiction_poll_exists)
+	{
+		$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_poll LIKE 'poll_start'"));
+
+		if ($tmp['Type'] == "datetime")
+		{
+			$update = dbquery("UPDATE " . $settingsprefix . "fanfiction_settings SET version = '3.5.5' WHERE sitekey = '" . SITEKEY . "'");
+		}
+
+
+		$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_poll LIKE 'poll_end'"));
+
+		if ($tmp['Type'] == "datetime")
+		{
+			$update = dbquery("UPDATE " . $settingsprefix . "fanfiction_settings SET version = '3.5.5' WHERE sitekey = '" . SITEKEY . "'");
+		}
+	}
+	
+
+	return $check_355;
+}
+ 
+
+
+$tpl->assign("output", $output);
+$tpl->printToScreen();
+dbclose();
+

file:b/update355.php (new)
--- /dev/null
+++ b/update355.php
@@ -1,1 +1,343 @@
-
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+$current = "update";
+
+include("header.php");
+ 
+$blocks['news']['status'] = 0;
+$blocks['info']['status'] = 0;
+
+//make a new TemplatePower object
+if(file_exists("$skindir/default.tpl")) $tpl = new TemplatePower( "$skindir/default.tpl" );
+else $tpl = new TemplatePower("default_tpls/default.tpl");
+include("includes/pagesetup.php");
+if(file_exists("languages/".$language."_admin.php")) include_once("languages/".$language."_admin.php");
+else include_once("languages/en_admin.php");
+// end basic page setup
+ 
+if(!isADMIN) {
+$output .= "<script language=\"javascript\" type=\"text/javascript\">
+location = \"maintenance.php\";
+</script>";
+$tpl->assign( "output", $output );
+$tpl->printToScreen();
+dbclose( );
+exit( );
+}
+$oldVersion = explode(".", $settings['version']);
+$confirm = isset($_GET['confirm']) ? $_GET['confirm'] : false;
+if($oldVersion[0] == 3 && ($oldVersion[1] < 5 || $oldVersion[2] < 3)) {
+if($confirm == "yes") {
+	// For the slow-pokes who haven't updated to 3.1
+	if($oldVersion[1] == 0 ) {
+		list($field) = dbrow(dbquery("SELECT field_id FROM ".TABLEPREFIX."fanfiction_authorfields WHERE field_name = 'betareader'"));
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorinfo SET info = '"._YES."' WHERE field = '$field' AND info = '1'");
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorinfo SET info = '"._NO."' WHERE field = '$field' AND info != '"._YES."'");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_authorinfo add primary key(uid,field);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_blocks drop index block_name;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_blocks add unique index block_name (block_name);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_categories drop index category;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_categories drop index parentcatid;");
+		dbquery("create index byparent on ".TABLEPREFIX."fanfiction_categories (parentcatid,displayorder);");
+		dbquery("create index forstoryblock on ".TABLEPREFIX."fanfiction_chapters (sid,validated);");
+		dbquery("create index byname on ".TABLEPREFIX."fanfiction_classes (class_type,class_name,class_id);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_classtypes drop index classtype_title;");
+		dbquery("create unique index classtype_name on ".TABLEPREFIX."fanfiction_classtypes(classtype_name);");
+		dbquery("create index code_type on ".TABLEPREFIX."fanfiction_codeblocks(code_type);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_comments drop index nid;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_comments add index commentlist (nid,time);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_favorites drop index uid;");
+		dbquery("create unique index byitem on ".TABLEPREFIX."fanfiction_favorites (item,type,uid);");
+		dbquery("create unique index byuid on ".TABLEPREFIX."fanfiction_favorites (uid,type,item);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_inseries drop index seriesid;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_inseries drop index inorder;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_inseries add index (seriesid,inorder);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_inseries drop index sid;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_inseries add primary key (sid,seriesid);");
+		dbquery("create index message_name on ".TABLEPREFIX."fanfiction_messages (message_name);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_pagelinks drop index link_text;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_panels drop index panel_hidden;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_panels drop index panel_type;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_panels add index panel_type (panel_type,panel_name);");
+		dbquery("create index avgrating on ".TABLEPREFIX."fanfiction_reviews(type,item,rating);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_reviews drop index sid;");
+		dbquery("create index bychapter on ".TABLEPREFIX."fanfiction_reviews (chapid,rating);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_reviews add index byuid (uid,item,type);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_series drop index owner;");
+		dbquery("create index owner on ".TABLEPREFIX."fanfiction_series (uid,title);");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_stories drop index validated;");
+		dbquery("create index validateduid on ".TABLEPREFIX."fanfiction_stories (validated,uid);");
+		dbquery("create index recent on ".TABLEPREFIX."fanfiction_stories (updated,validated);");
+		$alltables = dbquery("SHOW TABLES");
+	}
+	// Still a little behind.
+	if($oldVersion[1] < 2) { 
+		dbquery("
+CREATE TABLE `".TABLEPREFIX."fanfiction_stats` (
+  `sitekey` varchar(50) NOT NULL default '0',
+  `stories` int(11) NOT NULL default '0',
+  `chapters` int(11) NOT NULL default '0',
+  `series` int(11) NOT NULL default '0',
+  `reviews` int(11) NOT NULL default '0',
+  `wordcount` int(11) NOT NULL default '0',
+  `authors` int(11) NOT NULL default '0',
+  `members` int(11) NOT NULL default '0',
+  `reviewers` int(11) NOT NULL default '0',
+  `newestmember` int(11) NOT NULL default '0'
+) ENGINE=MyISAM");
+		dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_stats(`sitekey`) VALUES('SITEKEY')");
+		dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_inseries` DROP `updated`");
+		dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_news` ADD `comments` INT NOT NULL DEFAULT '0'");
+		dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_series` ADD `numstories` INT NOT NULL DEFAULT '0'");
+		dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_pagelinks` ADD `link_key` CHAR( 1 ) NULL AFTER `link_text`");
+		if(!isset($allowseries)) dbquery("ALTER TABLE `".$settingsprefix."fanfiction_settings` ADD `allowseries` TINYINT NOT NULL DEFAULT '2' AFTER `roundrobins`");
+		dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_log` CHANGE `log_ip` `log_ip` INT( 11 ) UNSIGNED NULL DEFAULT NULL");
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_inseries SET confirmed = 1");
+		$serieslist = dbquery("SELECT seriesid FROM ".TABLEPREFIX."fanfiction_series");
+		$totalseries = dbnumrows($serieslist);
+		while($s = dbassoc($serieslist)) {
+			$numstories = count(storiesInSeries($s['seriesid']));
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_series SET numstories = '$numstories' WHERE seriesid = ".$s['seriesid']." LIMIT 1");
+		}
+
+		$newslist = dbquery("SELECT count(cid) as count, nid FROM ".TABLEPREFIX."fanfiction_comments GROUP BY nid");
+		while($n = dbassoc($newslist)) {
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_news SET comments = '".$n['count']."' WHERE nid = ".$n['nid']);
+		}
+	
+		$storiesquery =dbquery("SELECT COUNT(sid) as totals, COUNT(DISTINCT uid) as totala, SUM(wordcount) as totalwords FROM ".TABLEPREFIX."fanfiction_stories WHERE validated > 0 ");
+		list($stories, $authors, $words) = dbrow($storiesquery);
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET stories = '$stories', authors = '$authors', wordcount = '$words' WHERE sitekey = 'SITEKEY'"); 
+
+		$chapterquery = dbquery("SELECT COUNT(chapid) as chapters FROM ".TABLEPREFIX."fanfiction_chapters where validated > 0");
+		list($chapters) = dbrow($chapterquery);
+
+		$authorquery = dbquery("SELECT COUNT("._UIDFIELD.") as totalm FROM "._AUTHORTABLE);
+		list($members) = dbrow($authorquery);
+
+		list($newest) = dbrow(dbquery("SELECT "._UIDFIELD." as uid FROM "._AUTHORTABLE." ORDER BY "._UIDFIELD." DESC LIMIT 1"));
+		$reviewquery = dbquery("SELECT COUNT(reviewid) as totalr FROM ".TABLEPREFIX."fanfiction_reviews WHERE review != 'No Review'");
+		list($reviews) = dbrow($reviewquery);
+		$reviewquery = dbquery("SELECT COUNT(DISTINCT uid) FROM ".TABLEPREFIX."fanfiction_reviews WHERE review != 'No Review' AND uid > 0");
+		list($reviewers) = dbrow($reviewquery);
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET series = '$totalseries', chapters = '$chapters', members = '$members', newestmember = '$newest', reviews = '$reviews', reviewers = '$reviewers' WHERE sitekey = 'SITEKEY'"); 
+		$news = dbquery("SELECT count(nid) as count, nid FROM ".TABLEPREFIX."fanfiction_comments GROUP BY nid");
+		while($n = dbassoc($news)) {
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_news SET comments = '".$n['count']."' WHERE nid = '".$n['nid']."' LIMIT 1");
+		}
+	} // End version 3.2 updates.
+	if($oldVersion[1] < 3) {
+	dbquery("
+CREATE TABLE `".TABLEPREFIX."fanfiction_modules` (
+  `id` int(11) NOT NULL auto_increment,
+  `name` varchar(100) NOT NULL default 'Test Module',
+  `version` varchar(10) NOT NULL default '1.0',
+  PRIMARY KEY  (`id`),
+  KEY `name_version` (`name`,`version`)
+)");
+	list($panelCount) = dbrow(dbquery("SELECT count(panel_name) AS count FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_type = 'A' AND panel_level = '1' AND panel_hidden = '0'"));
+	$panelCount++;
+	dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_panels` (`panel_name`, `panel_title`, `panel_url`, `panel_level`, `panel_order`, `panel_hidden`, `panel_type`) VALUES ('modules', 'Modules', '', 1, ".$panelCount.", 0, 'A')");
+	// Insert the modules into the table.
+	$dir = opendir(_BASEDIR."modules");
+	while($folder = readdir($dir)) {
+		if($folder == "." || $folder == ".." || !is_dir("modules/$folder")) continue;
+		if(file_exists("modules/$folder/version.php")) {
+			$moduleVersion = ""; $moduleName = ""; 
+			include("modules/$folder/version.php");
+			if(empty($moduleName)) $moduleName = $folder;
+			// The next few lines try to determine if the module is installed.  
+			if($folder == "challenges" && !isset($anonchallenges)) continue;
+			if($folder == "recommendations" && !isset($anonrecs)) continue;
+			
+			dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_modules(`name`, `version`) VALUES('$moduleName', '1.0')");
+		}
+	}
+	if($ratings == "1") dbquery("UPDATE ".TABLEPREFIX."fanfiction_reviews SET rating = '-1' WHERE rating = '0'");
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET rating = '0', reviews = '0'"); // Set them all to 0 before we re-insert.
+	$stories = dbquery("SELECT AVG(rating) as average, item FROM ".TABLEPREFIX."fanfiction_reviews WHERE type = 'ST' AND rating != '-1' GROUP BY item");
+	while($s = dbassoc($stories)) {
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET rating = '".round($s['average'])."' WHERE sid = '".$s['item']."'");
+	}
+	$stories = dbquery("SELECT COUNT(reviewid) as count, item FROM ".TABLEPREFIX."fanfiction_reviews WHERE type = 'ST' AND review != 'No Review' GROUP BY item");
+	while($s = dbassoc($stories)) {
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET reviews = '".$s['count']."' WHERE sid = '".$s['item']."'");
+	}
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET rating = '0', reviews = '0'");
+	$chapters = dbquery("SELECT AVG(rating) as average, chapid FROM ".TABLEPREFIX."fanfiction_reviews WHERE type = 'ST' AND rating != '-1' GROUP BY chapid");
+	while($c = dbassoc($chapters)) {
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET rating = '".round($c['average'])."' WHERE chapid = '".$c['chapid']."'");
+	}
+	$chapters = dbquery("SELECT COUNT(reviewid) as count, chapid FROM ".TABLEPREFIX."fanfiction_reviews WHERE type = 'ST' AND review != 'No Review' GROUP BY chapid");
+	while($c = dbassoc($chapters)) {
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET reviews = '".$c['count']."' WHERE chapid = '".$c['chapid']."'");
+	}
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_series SET rating = '0', reviews = '0'");
+	$series = dbquery("SELECT seriesid FROM ".TABLEPREFIX."fanfiction_series");
+	while($s = dbassoc($series)) {
+		$thisseries = $s['seriesid'];
+		include("includes/seriesreviews.php");
+	}
+	} // End 3.3 updates
+	// Version 3.3.1 updates
+	if($oldVersion[1] == 3 && empty($oldVersion[2])) {
+		if(isset($anonchallenges)) dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_codeblocks` (`code_text`, `code_type`, `code_module`) VALUES('include(_BASEDIR.\"modules/challenges/stats.php\");', 'sitestats', 'challenges');");
+	}
+	// Versin 3.4 updates
+	if($oldVersion[1] < 4) {
+		dbquery("CREATE TABLE `".TABLEPREFIX."fanfiction_coauthors` (
+  `sid` int(11) NOT NULL default '0',
+  `uid` int(11) NOT NULL default '0',
+  PRIMARY KEY  (`sid`,`uid`)
+) ENGINE=MyISAM;");
+		dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_authorprefs` ADD `stories` INT NOT NULL DEFAULT '0'");
+		$alist = array( );
+		$authors = dbquery("SELECT uid, count(uid) AS count FROM ".TABLEPREFIX."fanfiction_stories WHERE validated > 0 GROUP BY uid");
+		while($a = dbassoc($authors)) {
+			$alist[$a['uid']] = $a['count'];
+		}
+		$coauthors = dbquery("SELECT coauthors,sid FROM ".TABLEPREFIX."fanfiction_stories WHERE coauthors != '0'");
+		while($ca = dbassoc($coauthors)) {
+			$co = explode(",", $ca['coauthors']);
+			foreach($co AS $a) {
+				if(!isNumber($a)) continue;
+				if(in_array($a, $alist)) $alist[$a]++;
+				else $alist[$a] = 1;
+				dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_coauthors(`uid`, `sid`) VALUES('$a', '".$ca['sid']."')");
+			}
+		}
+		foreach($alist AS $a => $s) {
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET stories = '$s' WHERE uid = '$a' LIMIT 1");
+		}
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET coauthors = '1' WHERE coauthors != '0'");
+	}
+	if($oldVersion[1] == 4 && !isset($oldVersion[2])) {
+		$statsupdate = dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET sitekey = '".SITEKEY."' WHERE sitekey = 'SITEKEY' LIMIT 1");
+		$coauthors = dbquery("SHOW TABLES LIKE '".TABLEPREFIX."fanfiction_coauthors'"); 
+		if(!dbnumrows($coauthors)) { 
+			dbquery("CREATE TABLE `".TABLEPREFIX."fanfiction_coauthors` (
+			  `sid` int(11) NOT NULL default '0',
+			  `uid` int(11) NOT NULL default '0',
+			  PRIMARY KEY  (`sid`,`uid`)
+			) ENGINE=MyISAM;");
+			dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_authorprefs` ADD `stories` INT NOT NULL DEFAULT '0'");
+		}		
+		$authors = dbquery("SELECT uid, count(uid) AS count FROM ".TABLEPREFIX."fanfiction_stories WHERE validated > 0 GROUP BY uid");
+		while($a = dbassoc($authors)) {
+			$alist[$a['uid']] = $a['count'];
+		}
+		$coauthors = dbquery("SELECT uid, count(sid) AS count FROM ".TABLEPREFIX."fanfiction_coauthors GROUP BY uid");
+		while($ca = dbassoc($coauthors)) {
+			if(in_array($ca['uid'], $alist)) $alist[$ca['uid']] = $alist[$ca['uid']] + $ca['count'];
+			else $alist[$ca['uid']] = $ca['count'];
+		}
+		foreach($alist AS $a => $s) {
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET stories = '$s' WHERE uid = '$a' LIMIT 1");
+		}
+	}
+	if($oldVersion[1] == 4 && $oldVersion[2] < 2) {
+		$coauthors = dbquery("SHOW TABLES LIKE '".TABLEPREFIX."fanfiction_coauthors'"); 
+		if(!dbnumrows($coauthors)) { 
+			dbquery("CREATE TABLE `".TABLEPREFIX."fanfiction_coauthors` (
+			  `sid` int(11) NOT NULL default '0',
+			  `uid` int(11) NOT NULL default '0',
+			  PRIMARY KEY  (`sid`,`uid`)
+			) ENGINE=MyISAM;");
+			dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_authorprefs` ADD `stories` INT NOT NULL DEFAULT '0'");
+		}
+		$storiesAdded = dbquery("SHOW COLUMNS FROM ".TABLEPREFIX."fanfiction_authorprefs LIKE 'stories'");
+		if(!$storiesAdded) {
+			dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_authorprefs` ADD `stories` INT NOT NULL DEFAULT '0'");
+			$authors = dbquery("SELECT uid, count(uid) AS count FROM ".TABLEPREFIX."fanfiction_stories WHERE validated > 0 GROUP BY uid");
+			while($a = dbassoc($authors)) {
+				$alist[$a['uid']] = $a['count'];
+			}
+			$coauthors = dbquery("SELECT uid, count(sid) AS count FROM ".TABLEPREFIX."fanfiction_coauthors GROUP BY uid");
+			while($ca = dbassoc($coauthors)) {
+				if(in_array($ca['uid'], $alist)) $alist[$ca['uid']] = $alist[$ca['uid']] + $ca['count'];
+				else $alist[$ca['uid']] = $ca['count'];
+			}
+			foreach($alist AS $a => $s) {
+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET stories = '$s' WHERE uid = '$a' LIMIT 1");
+			}
+		}
+	}
+	if($oldVersion[1] == 5) { // Try to fix some errors for people
+		// Recalculate the story count for authors.
+		$authors = dbquery("SELECT uid, count(uid) AS count FROM ".TABLEPREFIX."fanfiction_stories WHERE validated > 0 GROUP BY uid");
+		$alist = array( );
+		while($a = dbassoc($authors)) {
+			$alist[$a['uid']] = $a['count'];
+		}
+		$coauthors = dbquery("SELECT uid, count(sid) AS count FROM ".TABLEPREFIX."fanfiction_coauthors GROUP BY uid");
+		while($ca = dbassoc($coauthors)) {
+			if(isset($alist[$ca['uid']])) $alist[$ca['uid']] = $alist[$ca['uid']] + $ca['count'];
+			else $alist[$ca['uid']] = $ca['count'];
+		}
+		foreach($alist AS $a => $s) {
+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET stories = '$s' WHERE uid = '$a' LIMIT 1");
+		}
+		// Recalculate the number of authors
+		list($authors) = dbrow(dbquery("SELECT count(uid) FROM ".TABLEPREFIX."fanfiction_authorprefs WHERE stories > 0"));
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET authors = '$authors' WHERE sitekey = '".SITEKEY."'"); 
+	}
+	if($oldVersion[1] == 5 && $oldVersion[2] < 3) {
+		// fix the indexes for the inseries table.
+		$exists = dbnumrows(dbquery("SHOW INDEX FROM ".TABLEPREFIX."fanfiction_inseries WHERE Key_name = 'seriesid'"));
+		if($exists) dbquery("alter table ".TABLEPREFIX."fanfiction_inseries drop index seriesid;");
+		$exists = dbnumrows(dbquery("SHOW INDEX FROM ".TABLEPREFIX."fanfiction_inseries WHERE Key_name = 'inorder'"));
+		if($exists) dbquery("alter table ".TABLEPREFIX."fanfiction_inseries drop index inorder;");
+		dbquery("alter table ".TABLEPREFIX."fanfiction_inseries add index (seriesid,inorder);");
+		$exists = dbnumrows(dbquery("SHOW INDEX FROM ".TABLEPREFIX."fanfiction_inseries WHERE Key_name = 'sid'"));
+		if($exists) dbquery("alter table ".TABLEPREFIX."fanfiction_inseries drop index sid;");
+		$exists = dbnumrows(dbquery("SHOW INDEX FROM ".TABLEPREFIX."fanfiction_inseries WHERE Key_name = 'PRIMARY'"));
+		if($exists) dbquery("alter table ".TABLEPREFIX."fanfiction_inseries drop primary key");
+	//	dbquery("alter ignore table ".TABLEPREFIX."fanfiction_inseries add primary key (sid,seriesid,subseriesid);");
+		dbquery("alter table " . TABLEPREFIX . "fanfiction_inseries add primary key (sid,seriesid);");
+	}	
+	$update = dbquery("UPDATE ".$settingsprefix."fanfiction_settings SET version = '3.5.5' WHERE sitekey = '".SITEKEY."'");
+	if($update) {
+		$output .= write_message(_ACTIONSUCCESSFUL);
+		header("Location: update.php");
+		exit();
+	}
+	else $output .= write_error(_ERROR);
+}
+else if($confirm == "no") {
+	$output .= write_message(_ACTIONCANCELLED);
+}
+else {
+  	if($oldVersion[0] == 3 && ($oldVersion[1] < 4 || $oldVersion[1] == 4 && (!isset($oldVersion[2]) || $oldVersion[2] < 3))) $output .= write_message(_CONFIRMUPDATE. "<br /> <a href='update355.php?confirm=yes'>"._YES."</a> "._OR. " <a href='update355.php?confirm=no'>"._NO."</a>");
+	else $output .= write_message("Are you ready to update? <a href='update355.php?confirm=yes'>"._YES."</a> "._OR." <a href='update355.php?confirm=no'>"._NO."</a>");
+}
+}
+else {
+	$output .= write_message(_ALREADYUPDATED);
+	header("Location: update.php");
+	exit();
+}
+$tpl->assign( "output", $output );
+$tpl->printToScreen();
+dbclose( );
+?>

file:b/user.php (new)
--- /dev/null
+++ b/user.php
@@ -1,1 +1,73 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+if(isset($_GET['action'])) $current = $_GET['action'];
+else $current = "login";
 
+	if($current == "logout" ) {
+		define("_LOGOUTCHECK", true);		
+		include("user/logout.php");
+	}
+	
+	if(!empty($_POST['submit']) && $current == "login") {
+	session_start();
+	define("_LOGINCHECK", true);		
+		include("user/login.php");
+	}
+
+require_once("header.php");
+//make a new TemplatePower object
+if(file_exists("$skindir/default.tpl")) $tpl = new TemplatePower( "$skindir/default.tpl" );
+else $tpl = new TemplatePower("default_tpls/default.tpl");
+if(file_exists("$skindir/listings.tpl")) $tpl->assignInclude( "listings", "./$skindir/listings.tpl" );
+else $tpl->assignInclude( "listings", "./default_tpls/listings.tpl" );
+include("includes/pagesetup.php");
+
+if($action) $current = $action;
+else $current = "user";
+// end main function 
+if((empty($action) || $action == "login") && isMEMBER) {
+	$output .= "<div id=\"pagetitle\">"._USERACCOUNT."</div>
+		<div class=\"tblborder\" id=\"useropts\" style=\"padding: 5px; width: 50%; margin: 1em 25%;\">";
+	$panelquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_hidden != '1' AND panel_level = '1' AND (panel_type = 'U' ".(!$submissionsoff || isADMIN ? " OR panel_type = 'S'" : "").($favorites ? " OR panel_type = 'F'" : "").") ORDER BY panel_type, panel_order, panel_title ASC");
+	if(!dbnumrows($panelquery)) $output .= _FATALERROR;
+	while($panel = dbassoc($panelquery)) {
+		if(!$panel['panel_url']) $output .=  "<a href=\"user.php?action=".$panel['panel_name']."\">".$panel['panel_title']."</a><br />\n";
+		else $output .= "<a href=\"".$panel['panel_url']."\">".$panel['panel_title']."</a><br />\n";
+	}
+	$output .= "</div>\n";
+}
+else if(!empty($action)) {
+	$panelquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_name = '$action' AND (panel_type='U' ".(!$submissionsoff || isADMIN ? " OR panel_type = 'S'" : "").($favorites ? " OR panel_type = 'F'" : "").") LIMIT 1");
+	if(dbnumrows($panelquery)) {
+		$panel = dbassoc($panelquery);
+		if($panel['panel_level'] > 0 && !isMEMBER) accessDenied( );
+		if($panel['panel_url'] && file_exists(_BASEDIR.$panel['panel_url'])) require_once(_BASEDIR.$panel['panel_url']);
+		else if(file_exists("user/{$action}.php")) require_once("user/{$action}.php");
+		else $output = write_error(_ERROR);
+	}
+	else $output .= write_error(_ERROR);
+}
+else $output = write_error(_NOTAUTHORIZED);
+$tpl->assign( "output", $output );
+$tpl->printToScreen();
+dbclose( );
+?>

file:b/user/contact.php (new)
--- /dev/null
+++ b/user/contact.php
@@ -1,1 +1,53 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+	if(!$uid) $output .= write_error(_ERROR);
+	else {
+		$author = dbquery("SELECT "._PENNAMEFIELD." as penname, "._EMAILFIELD." as email FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '$uid' LIMIT 1");
+		list($penname, $email) = dbrow($author);
+		$output .= "<div class='sectionheader'>"._CONTACTAUTHOR."</div>";
+		if(isset($_POST['submit'])) {
+			if($captcha && !isMEMBER && !captcha_confirm()) $output .= write_error(_CAPTCHAFAIL);
+			else {
+				include_once(_BASEDIR."includes/emailer.php");
+				if(!$email) $output .= write_error(_ERROR);
+				else $result = sendemail($penname, $email, $_POST['email'], $siteemail , descript(strip_tags($_POST['subject'])), descript($_POST['comments'])."<br /><br />".(isMEMBER ? sprintf(_SITESIG2, "<a href='".$url."/viewuser.php?uid=".USERUID."'>".USERPENNAME."</a>") : _SITESIG), "html");
+				if($result)  $output .= write_message(_ACTIONSUCCESSFUL);
+				else $output .= write_error(_ERROR);
+			}
+		}
+		else {
+			$output .= "<form method=\"POST\" enctype=\"multipart/form-data\" style=\"width: 400px; margin: 0 auto;\" action=\"viewuser.php?action=contact&amp;uid=$uid\">
+				<label for=\"email\">"._YOUREMAIL.":</label> <INPUT type=\"text\" class=\"textbox\" name=\"email\"><br />
+				<label for=\"subject\">"._SUBJECT.":</label> <INPUT  type=\"text\" class=\"textbox\" name=\"subject\"><br />
+				<label for=\"comments\">"._COMMENTS.":</label> <TEXTAREA  class=\"textbox\" name=\"comments\" cols=\"50\" rows=\"6\"></TEXTAREA><br />";
+			if(!USERUID && !empty($captcha)) $output .= "<div><span class=\"label\">"._CAPTCHANOTE."</span><input MAXLENGTH=5 SIZE=5 name=\"userdigit\" type=\"text\" value=\"\"><br /><img width=120 height=30 src=\""._BASEDIR."includes/button.php\" style=\"border: 1px solid #111;\"></div>";
+			$output .= "<div style=\"text-align: center;\"><INPUT name=\"submit\" class=\"button\" type=\"submit\" value=\""._SUBMIT."\"></div></form>";
+			$output .= write_message(_REQUIREDFIELDS._RESPECTNOTE);
+		}
+	}
+	$tpl->assign( "output", $output );	
+?>

file:b/user/editbio.php (new)
--- /dev/null
+++ b/user/editbio.php
@@ -1,1 +1,215 @@
-
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+if(!function_exists("random_char")) {
+
+function random_char($string)
+{
+	$length = strlen($string);
+	$position = mt_rand(0, $length - 1);
+	$output = ($string[$position]);
+	return $output;
+}
+
+function random_string ($charset_string, $length)
+{
+	$return_string = random_char($charset_string);
+	for ($x = 1; $x < $length; $x++)
+	$return_string .= random_char($charset_string);
+	return $return_string;
+}
+
+}
+	$uid = isset($_REQUEST['uid']) ? $_REQUEST['uid'] : false;
+	if(!$uid) $uid = USERUID;
+
+	if((!isADMIN || uLEVEL > 2) && $uid != USERUID && $action == "editbio") $output .= write_error(_NOTAUTHORIZED);
+	if(isMEMBER) $output .= "<div id=\"pagetitle\">"._EDITPERSONAL."</div>";
+	else $output .= "<div id=\"pagetitle\">"._NEWACCOUNT."</div>";
+	if(!empty($_POST['submit'])) {
+		$penname = isset($_POST['newpenname']) ? escapestring($_POST['newpenname']) : false;
+		$email = escapestring($_POST['email']);
+		if(!isset($email) && !isADMIN) $output .= "<div style='text-align: center;'>"._EMAILREQUIRED."</div>";
+		else if($penname && !preg_match("!^[a-z0-9-_ ]{3,30}$!i", $penname)) $output .= "<div style='text-align: center;'>"._BADUSERNAME."</div>";
+		else if(!validEmail($email)) $output .= "<div style='text-align: center;'>"._INVALIDEMAIL." "._TRYAGAIN."</div>";
+		else if($action == "register") {
+			if(!$penname || !preg_match("!^[a-z0-9-_ ]{3,30}$!i", $penname)) $output .= write_error(_PENEMAILREQUIRED);
+			else if($pwdsetting && empty($_POST['password'])) $output .= write_error(_PWDREQUIRED."  "._TRYAGAIN);
+			else  {
+				$result = dbquery("SELECT "._PENNAMEFIELD." FROM "._AUTHORTABLE." WHERE "._PENNAMEFIELD." = '".escapestring($penname)."'");
+				$result2 = dbquery("SELECT "._EMAILFIELD." as email FROM "._AUTHORTABLE." WHERE "._EMAILFIELD." = '$email'");
+				if($captcha && !captcha_confirm()) $output .= write_error(_CAPTCHAFAIL);
+				else if(dbnumrows($result) > 0) $output .= write_error(_PENNAMEINUSE."  "._TRYAGAIN);
+				else if(dbnumrows($result2) > 0) $output .= write_error(_EMAILINUSE."  "._TRYAGAIN);
+				else if(preg_match("!^[a-z0-9-_ ]{3,30}$!i", $penname)) {
+					if(!$pwdsetting) {
+						$charset = '23456789' . 'abcdefghijkmnpqrstuvwxyz' . 'ABCDEFGHJKLMNPQRSTUVWXYZ';
+						$pass = random_string($charset, 10);
+						$encryppass = md5($pass);
+					}
+					else {
+						if($_POST['password'] != $_POST['password2']) {
+							$output .=  write_error(_PASSWORDTWICE);
+							$tpl->assign("output", $output);
+							$tpl->printToScreen( );
+							dbclose( );
+							exit( );
+						}
+						$pass = $_POST['password2'];
+						$encryppass = md5($pass);
+					}
+					dbquery("INSERT INTO ".substr(_AUTHORTABLE, 0, strpos(_AUTHORTABLE, "as author"))." (penname, realname, bio, email, date, password) VALUES ('".escapestring($penname)."', '".escapestring(strip_tags($_POST['realname']))."', '".strip_tags(escapestring($_POST['bio']), $allowed_tags)."', '$email', now(), '$encryppass')");
+					$useruid = dbinsertid();
+					if($logging) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_REGISTER, $penname, $useruid, $_SERVER['REMOTE_ADDR']))."', '".$useruid."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'RG', " . time() . ")");
+					if(empty($siteskin)) {
+						$skinquery = dbquery("SELECT skin FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".SITEKEY."'");
+						list($skin) = dbrow($skinquery);
+					}
+					else $skin = $siteskin;
+					dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_authorprefs(uid, userskin, storyindex, sortby, tinyMCE) VALUES('".$useruid."', '$skin', '$displayindex', '$defaultsort', '$tinyMCE')");
+/* The section adds fields from the authorfields table to the authorinfo table allowing dynamic additions to the bio/registration page */
+					$fields = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_authorfields WHERE field_on = '1'");
+					while($field = dbassoc($fields)) {
+						if(!$uid) continue;
+						$oldfield = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_authorinfo WHERE field='".$field['field_id']."' AND uid = '".$useruid."'");
+						if(dbnumrows($oldfield) > 0) {
+							$newinfo = isset($_POST["af_".$field['field_name']]) ? escapestring($_POST["af_".$field['field_name']]) : false;
+							if(!empty($newinfo)) dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorinfo SET info='$newinfo' WHERE uid = '$useruid' AND field = '".$field['field_id']."'");
+							else dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_authorinfo WHERE uid = '$useruid' AND field = '".$field['field_id']."'");
+						}
+						else if(!empty($_POST["af_".$field['field_name']])) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_authorinfo(`uid`, `info`, `field`) VALUES('$useruid', '".escapestring($_POST["af_".$field['field_name']])."', '".$field['field_id']."');");
+					}
+/* End dynamic fields */
+					$subject = _SIGNUPSUBJECT;
+					$mailtext = _SIGNUPMESSAGE._LOGIN.": $penname\n"._PASSWORD.": $pass \n\n";
+					if(!$pwdsetting) $mailtext .= _SIGNUPWARNING;
+					include("includes/emailer.php");
+					sendemail($penname, $email, $sitename, $siteemail, $subject, $mailtext, "html");
+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_stats SET newestmember = '".$useruid."', members = members + 1");
+					if(defined("AUTHORPREFIX")) dbquery("UPDATE ".AUTHORPREFIX."fanfiction_stats SET newestmember = '".$useruid."', members = members + 1");
+					unset($_POST['submit']);
+					$output = write_message(_ACTIONSUCCESSFUL);
+					define("_LOGINCHECK", true);
+					include("user/login.php");
+				}
+				else $output .= _BADUSERNAME;
+			}
+		}
+		else{
+			 if(($_POST['password']) && ($_POST['password2'])) {
+				if($_POST['password'] == $_POST['password2']) {
+					$encryppassword = md5($_POST['password']);
+					dbquery("UPDATE "._AUTHORTABLE." SET password='$encryppassword' WHERE uid = '$uid'");
+				}
+				else $output .=  write_error(_PASSWORDTWICE);
+			}
+			if(isset($_POST['oldpenname']) && $penname != $_POST['oldpenname']) {
+				$checkresult = dbquery("SELECT * FROM "._AUTHORTABLE." WHERE penname = '".escapestring($penname)."'");
+				if(dbnumrows($checkresult)) {
+					$output .= write_message(_PENNAMEINUSE."  "._TRYAGAIN);
+				}
+				else {
+					dbquery("UPDATE "._AUTHORTABLE." SET penname = '".escapestring($penname)."' WHERE uid = '$_POST[uid]'");
+					if($logging) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_NEWPEN, USERPENNAME, USERUID, $_POST[oldpenname], $uid, $penname))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'EB', " . time() . ")");
+				}
+			}
+/* The section adds fields from the authorfields table to the authorinfo table allowing dynamic additions to the bio/registration page */
+			$fields = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_authorfields WHERE field_on = '1'");
+			while($field = dbassoc($fields)) {
+				$uid = isset($_POST['uid']) && isNumber($_POST['uid']) ? $_POST['uid'] : false;
+				if(!$uid) continue;
+				$oldfield = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_authorinfo WHERE field='".$field['field_id']."' AND uid = '".$uid."'");
+				if(dbnumrows($oldfield) > 0) {
+					$newinfo = isset($_POST["af_".$field['field_name']]) ? escapestring(descript($_POST["af_".$field['field_name']])) : false;
+					if(!empty($newinfo)) dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorinfo SET info='".$newinfo."' WHERE uid = '$uid' AND field = '".descript($field['field_id'])."'");
+					else dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_authorinfo WHERE uid = '$uid' AND field = '".$field['field_id']."'");
+				}
+				else if(!empty($_POST["af_".$field['field_name']])) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_authorinfo(`uid`, `info`, `field`) VALUES('$uid', '".escapestring($_POST["af_".$field['field_name']])."', '".$field['field_id']."');");
+			}
+/* End dynamic fields */
+			dbquery("UPDATE "._AUTHORTABLE." SET realname='".descript(strip_tags(escapestring($_POST['realname'])), $allowed_tags)."', email='$email', bio='".descript(strip_tags(escapestring($_POST['bio']), $allowed_tags))."', image='".($imageupload && !empty($_POST['image']) ? escapestring($_POST['image']) : "")."' WHERE uid = '$uid'");
+			$output .= write_message(_ACTIONSUCCESSFUL."  ".(isset($_GET['uid']) ? _BACK2ADMIN : _BACK2ACCT));
+		}
+	}
+	else {
+		if($action != "register") {
+			$result = dbquery("SELECT * FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '$uid' LIMIT 1");
+			$user = dbassoc($result);
+			$result2 = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_authorinfo WHERE uid = '$uid'");
+			while($field = dbassoc($result2)) {
+				$user["af_".$field['field']] = $field['info'];
+			}
+		}
+		if($action == "register") {
+			$query = dbquery("SELECT message_text FROM ".TABLEPREFIX."fanfiction_messages WHERE message_name = 'tos'");
+			list($tos) = dbrow($query);
+			$output .= "<div class='tblborder' style='width: 90%; margin: 1em auto;'>$tos</div>";
+		}
+		$output .= "<div id='settingsform'><form method=\"POST\" id=\"editbio\" name=\"editbio\" enctype=\"multipart/form-data\" style='margin: 0 auto;' action=\"user.php?action=$action".($uid != USERUID ? "&uid=".$uid : "")."\">
+		<div><label for='newpenname'>"._PENNAME.":</label>";
+		if((isADMIN && uLEVEL == 1) || $action == "register")
+			$output .= "<INPUT name=\"newpenname\" type=\"text\" class=\"textbox\" maxlength=\"200\" value=\"".(isset($user) ? $user['penname'] : "")."\"><INPUT name=\"oldpenname\" type=\"hidden\" value=\"".(isset($user) ? $user['penname'] : "")."\"><font color=\"red\">*</font> ";
+		else if(isset($user)) $output .= " ".$user['penname'];
+		$output .= "</div>
+	 	<div><label for='realname'>"._REALNAME.": </label><INPUT type=\"text\" class=\"textbox=\" name=\"realname\" maxlength=\"200\" value=\"".(isset($user) ? $user['realname'] : "")."\"></div>
+	 	<div><label for='email'>"._EMAIL.":</label><INPUT  type=\"text\" class=\"textbox=\" name=\"email\" value=\"".(isset($user) ? $user['email'] : "")."\" maxlength=\"200\" size=\"35\"><font color=\"red\">*</font></div>
+	 	<div><label for='bio'>"._BIO.":</label></div>
+		<div style='width: 450px; margin: 0 auto;'><textarea class=\"textbox\" name=\"bio\" cols=\"50\" rows=\"6\">".(isset($user) ? stripslashes($user['bio']) : "")."</TEXTAREA></div>";
+/* The section adds fields to the form from the authorfields table to the authorinfo table allowing dynamic additions to the bio/registration page */
+		$authorfields = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_authorfields WHERE field_on = '1'");
+		while($field = dbassoc($authorfields)) {
+			if($field['field_type'] == 1 || $field['field_type'] == 4 || $field['field_type'] == 6) 
+				$output .= "<div><label for='".$field['field_name']."'>".$field['field_title'].":</label>\n<input type='text' class='textbox' name='af_".$field['field_name']."'".(!empty($user["af_".$field['field_id']]) ? "value='".$user["af_".$field['field_id']]."'" : "").">\n</div>\n";
+			if($field['field_type'] == 2) {
+				$output .= "<div><label for='".$field['field_name']."'>".$field['field_title'].":</label>\n
+						<select class='textbox' name='af_".$field['field_name']."'>\n";
+				$opts = explode("|#|", $field['field_options']);
+				foreach($opts as $opt) {
+					$output .= "<option".(!empty($user["af_".$field['field_id']]) && $user["af_".$field['field_id']] == $opt ? " selected" : "").">$opt</option>\n";
+				}
+				$output .= "</select>\n</div>\n";
+			}
+			if($field['field_type'] == 5) eval(stripslashes($field['field_code_in']));
+			if($field['field_type'] == 3) {
+				$output .= "<div class='fieldset'><span class='label'>".$field['field_title'].":</span>\n";
+				$output .= "<input type='radio' name='af_".$field['field_name']."' id='af_".$field['field_name']._YES."' value='"._YES."'".(!empty($user["af_".$field['field_id']]) && $user["af_".$field['field_id']] == _YES ? "checked='checked'" : "")."> <label for='".$field['field_name']._YES."'>"._YES."</label>\n
+					<input type='radio' name='af_".$field['field_name']."' id='af_".$field['field_name']._NO."' value='"._NO."'".(!empty($user["af_".$field['field_id']]) && $user["af_".$field['field_id']] == _NO ? "checked='checked'" : "")."> <label for='".$field['field_name']._NO."'>"._NO."</label></div>\n";
+			}
+		}
+/* End dynamic fields */
+	 	if($imageupload == "1")
+	 		$output .= "<div><label for='image'>"._IMAGE.":</label> <INPUT  type=\"text\" class=\"textbox=\" name=\"image\" maxlength=\"200\" value=\"".(!empty($user['image']) ? $user['image'] : "")."\"></div>";
+		if($action != "register" || $pwdsetting)
+	 	$output .= "<div><label for='password'>"._PASSWORD.":</label>  <INPUT name=\"password\" class=\"textbox\" value=\"\" type=\"password\">".($action == "register" ? "<font color=\"red\">*</font>" : "")."</div>
+			<div><label for='password2'>"._PASSWORD2.":</label> <INPUT name=\"password2\" class=\"textbox=\" value=\"\" type=\"password\">".($action == "register" ? "<font color=\"red\">*</font>" : "")."</div>";
+		if(!empty($captcha) && $action == "register") $output .= "<div><label for='userdigit'>"._CAPTCHANOTE."</label><input MAXLENGTH=5 SIZE=5 name=\"userdigit\" type=\"text\" value=\"\"><div style='text-align: center;'><img width=120 height=30 src=\""._BASEDIR."includes/button.php\" style=\"border: 1px solid #111;\"></div></div>";
+	 	$output .= "<div style='text-align: center; margin: 1em;'><INPUT type=\"hidden\" name=\"uid\" value=\"".(isset($user) ? $user['uid'] : "")."\"><INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\">";
+	 	if(!isADMIN && $action != "register")
+	 	{
+			 	$output .= " [<a href=\"admin.php?action=members&delete=$uid\">"._DELETE."</a>]";
+	 	}
+	 	$output .= "</div></form></div>".write_message("<font color=\"red\">*</font> "._REQUIREDFIELDS);
+	}
+?>

--- /dev/null
+++ b/user/editprefs.php
@@ -1,1 +1,79 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+	$output = "<div id='pagetitle'>".($action == "register" ? _SETPREFS : _EDITPREFS)."</div>";
+	if(isset($_POST['submit'])) {
+		$useralertson = isset($_POST['useralertson']) && $_POST['useralertson'] == "on" ? 1 : 0;
+		$newreviews = isset($_POST['newreviews']) && $_POST['newreviews'] == "on" ? 1 : 0;
+		$newrespond = isset($_POST['newrespond']) && $_POST['newrespond'] == "on" ? 1 : 0;
+		$ageconsent = isset($_POST['ageconsent']) && isNumber($_POST['ageconsent']) ? $_POST['ageconsent'] : 0;
+		$tinyMCE = isset($_POST['tinyMCE']) && $_POST['tinyMCE'] == "on" ? 1 : 0;
+		$storyindex = isset($_POST['storyindex']) && $_POST['storyindex'] == "on" ? 1 : 0;
+		$sortby = isset($_POST['sortby']) && $_POST['sortby'] == 1 ? 1 : 0;
+		$skinnew = descript(strip_tags($_POST['skinnew']));
+		if($skinnew != $skin) $_SESSION[$sitekey."_skin"] = $skinnew;
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET alertson = '$useralertson', newreviews = '$newreviews', newrespond = '$newrespond', ageconsent = '$ageconsent', tinyMCE ='$tinyMCE', userskin = '$skinnew', storyindex = '$storyindex', sortby = '$sortby' WHERE uid = '".USERUID."'");
+		$output .= write_message(_ACTIONSUCCESSFUL." "._BACK2ACCT);
+	}
+	else {
+		$result = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_authorprefs WHERE uid = '".USERUID."' LIMIT 1");
+		if(dbnumrows($result) == 0) {
+			dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_authorprefs(`uid`, `userskin`) VALUES('".USERUID."', '$skin')");
+			$result = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_authorprefs WHERE uid = '".USERUID."' LIMIT 1");
+		}
+		$user = dbassoc($result);
+		$output .= "<form method=\"POST\" enctype=\"multipart/form-data\" style='width: 425px; margin: 0 auto;' action=\"user.php?action=editprefs\">
+		<label for='newreviews'>"._CONTACTREVIEWS.":</label> <INPUT name=\"newreviews\" type=\"checkbox\" class=\"checkbox\"".($user['newreviews'] ? " checked" : "")."> <A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_NEWREV."</span></A><br />
+		<label for='newrespond'>"._CONTACTRESPOND.":</label> <INPUT name=\"newrespond\" type=\"checkbox\" class=\"checkbox\"".($user['newrespond'] ? " checked" : "")."><A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_NEWRESP."</span></A><br />";
+		if($alertson) 
+		$output .= "<label for='useralertson'>"._ALERTSON2."</label> <INPUT name=\"useralertson\" type=\"checkbox\" class=\"checkbox\"".($user['alertson'] ? " checked" : "")."><A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_FAVALERT."</span></A><br />";
+		$output .= "<label for='storyindex'>"._DISPLAYINDEX."</label> <INPUT name=\"storyindex\" type=\"checkbox\" class=\"checkbox\"".($user['storyindex'] ? " checked" : "")."><A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_TOC."</span></A><br />";
+		$output .= "<label for='tinyMCE'>"._USETINYMCE."</label> <INPUT name=\"tinyMCE\" type=\"checkbox\" class=\"checkbox\"".($user['tinyMCE'] ? " checked" : "")."><A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_TINYMCE."</span></A><br />";
+		if($agestatement) {
+			$output .= "<div style=\"margin: 1ex 0;\">"._AGECONSENT." <span style='white-space: nowrap;'>
+				<input type=\"radio\" class=\"radio\" id=\"ageyes\" value=\"1\" name=\"ageconsent\" ".($user['ageconsent'] ? " checked" : "")."> <label for=\"ageyes\">"._YES."</label>
+				<input type=\"radio\" class=\"radio\" id=\"ageno\" value=\"0\" name=\"ageconsent\" ".(!$user['ageconsent'] ? " checked" : "")."> <label for=\"ageno\">"._NO."</label></span><A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_AGE."</span></A></div>";
+		}
+		$output .= "<label for='sortby'>"._DEFAULTSORT.": </label><select name='sortby' class='textbox'>
+				<option value='1'".($user['sortby'] ? " selected" : "").">"._MOSTRECENT."</option>
+				<option value='0'".(!$user['sortby'] ? " selected" : "").">"._ALPHA."</option>
+			</select><A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_DEFAULTSORT."</span></A><br />
+			<label for='skinnew'>"._SKIN.":</label> <select name=\"skinnew\">";
+		if(!isset($hiddenskins)) $hiddenskins = array( );
+		if(is_string($hiddenskins)) $hiddenskins = explode(",", $hiddenskins);
+			$directory = opendir(_BASEDIR."skins");
+		while($filename = readdir($directory)) {
+			if($filename== "." || $filename== ".." || !is_dir(_BASEDIR."skins/".$filename) || (in_array($filename, $hiddenskins) && !isADMIN)) continue;
+			$skinlist[strtolower($filename)] = "<option value=\"$filename\"".($siteskin == $filename ? " selected" : "").">$filename</option>";
+		}
+		ksort($skinlist);
+		foreach($skinlist as $s) { $output .= $s; }
+		unset($skinlist, $s);
+		closedir($directory);
+		$output .= "</select><A HREF=\"#\" class=\"pophelp\">[?]<span>"._HELP_SKIN."</span></A><br /><INPUT type=\"submit\" class=\"button\" id=\"submit\" name=\"submit\" value=\""._SUBMIT."\"></form>";
+	}
+
+?>

file:b/user/favau.php (new)
--- /dev/null
+++ b/user/favau.php
@@ -1,1 +1,131 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+if(empty($favorites)) accessDenied( );
+
+	if(empty($uid)) {
+		$uid = USERUID;
+		$output .= "<div id='pagetitle'>"._YOURSTATS."</div>";
+	}
+	$output .= "<div class='sectionheader'>"._FAVORITEAUTHORS."</div>";
+	
+	$add = !empty($_GET['add']) ? $_GET['add'] : "";
+	$delete = isset($_GET['delete']) && isNumber($_GET['delete']) ? $_GET['delete'] : false;
+	$edit = isset($_GET['edit']) && isNumber($_GET['edit']) ? $_GET['edit'] : false;
+	$author = explode(",", $add);
+	$author = array_filter($author, "isNumber");
+	$array_pennames = array();
+	$pennames = '';
+	if(($add || $edit || $delete) && !isMEMBER) accessDenied( );
+
+	if(isMEMBER && $uid == USERUID) {
+		if($delete) {
+			$result = dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '".USERUID."' AND item = '$delete' AND type = 'AU' LIMIT 1");
+			if($result) $output .= write_message(_ACTIONSUCCESSFUL." "._BACK2ACCT);
+			else $output .= write_error(_ERROR);
+		}
+		if($add && isset($_POST['submit'])) {
+			$comment = escapestring(descript(strip_tags(replace_naughty($_POST['comments']), $allowed_tags)));
+			foreach($author AS $a) {
+				$result = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_favorites(uid, item, type, comments) VALUES('".USERUID."', '$a', 'AU', '$comment') ON DUPLICATE KEY UPDATE comments = '$comment'");
+			}
+			if($result) $output .= write_message(_ACTIONSUCCESSFUL." "._BACK2ACCT);
+			else $output .= write_error(_ERROR);
+		}
+		if($edit && isset($_POST['submit'])) {
+			$result = dbquery("UPDATE ".TABLEPREFIX."fanfiction_favorites SET comments = '".escapestring(descript(strip_tags(replace_naughty($_POST['comments']), $allowed_tags)))."' WHERE uid = '".USERUID."' AND item = '$edit' AND type = 'AU'");
+			if($result) $output .= write_message(_ACTIONSUCCESSFUL." "._BACK2ACCT);
+			else $output .= write_error(_ERROR);
+		}
+		if(($add || $edit) && !isset($_POST['submit'])) {
+			if($add) {
+				$check = dbquery("SELECT item FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '".USERUID."' AND ".findclause("item", $author)." AND type = 'AU'");
+				if(dbnumrows($check)) {
+					while($c = dbassoc($check)) {
+						$edit[] = $c['item'];
+					}
+					$edit = array_diff($author, $edit);
+				}
+				else {
+					$pQuery = dbquery("SELECT "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." WHERE ".findclause(_UIDFIELD, $author));
+					while($pRes = dbassoc($pQuery)) {
+						$array_pennames[] = $pRes['penname'];
+					}
+					$pennames = implode(", ", $array_pennames);
+				}
+				$output = "<div class='sectionheader'>"._ADDTOFAVORITES.": ".$pennames."</div>";
+			}
+			if($edit) {
+				$pQuery = dbquery("SELECT fav.*, "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_favorites as fav ON fav.item = "._UIDFIELD." AND fav.type = 'AU' AND fav.uid = '".USERUID."' WHERE "._UIDFIELD." = '$edit' LIMIT 1");
+				if(dbnumrows($pQuery)) {
+					$info = dbassoc($pQuery);
+					$pennames = $info['penname'];
+					$output .= "<div class='sectionheader'>"._EDITFAVORITES.": ".$pennames."</div>";
+				}
+				else {
+					$author = array($edit);
+					$pQuery = dbquery("SELECT "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." WHERE ".findclause(_UIDFIELD, $author));
+					while($pRes = dbassoc($pQuery)) {
+						$array_pennames[] = $pRes['penname'];
+					}
+					$pennames = implode(", ", $array_pennames);
+					$output .= "<div class='sectionheader'>"._ADDTOFAVORITES.": ".$pennames."</div>";
+				}
+			}
+			$author = implode(",", $author);
+			$output .= "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"user.php?action=favau&amp;".( $add ? "add=$author" : "edit=$edit")."\">\n
+				<div style=\"width: 350px; margin: 0 auto; text-align: left;\"><label for=\"comments\">"._COMMENTS.":</label><br />
+				<textarea class=\"textbox\" name=\"comments\" id=\"comments\" cols=\"40\" rows=\"5\">".(isset($info['comments']) ? $info['comments'] : "")."</textarea><br />
+				<INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></div></form>";
+		}
+	}
+	if(!$add && !$edit) {
+		$query = "SELECT "._UIDFIELD." as uid, "._PENNAMEFIELD." as penname, fav.comments as comments FROM ".TABLEPREFIX."fanfiction_favorites as fav, "._AUTHORTABLE." WHERE fav.uid = '$uid' AND fav.type = 'AU' AND fav.item = "._UIDFIELD." ORDER BY "._PENNAMEFIELD;
+		$countquery = dbquery("SELECT COUNT(item) FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '$uid' AND type = 'AU' GROUP BY uid");
+		list($count) = dbrow($countquery);
+		$x = 1;
+		if($count) {
+				$list = dbquery($query."  LIMIT $offset, $itemsperpage");
+				while($author = dbassoc($list)) { 
+					$output .= "<span class='label'>$x.</span> <a href=\"viewuser.php?uid=".$author['uid']."\">".$author['penname']."</a><br />";
+					if(file_exists("./$skindir/favcomment.tpl")) $cmt = new TemplatePower( "./$skindir/favcomment.tpl" );
+					else $cmt = new TemplatePower( "./default_tpls/favcomment.tpl" );
+					$cmt->prepare( );
+					$cmt->newBlock("comment");
+					$cmt->assign("comment", format_story($author['comments']));
+					if(USERUID == $uid) 
+					$cmt->assign("commentoptions", "<div class='adminoptions'><span class='label'>"._OPTIONS.":</span> <a href=\"user.php?action=favau&amp;edit=".$author['uid']."\">"._EDIT."</a> | <a href=\"user.php?action=favau&amp;delete=".$author['uid']."\">"._REMOVEFAV."</a></div>");
+					$cmt->assign("oddeven", ($x % 2 ? "odd" : "even"));
+					$output .= $cmt->getOutputContent( );
+					$x++;
+				}
+			if($count > $itemsperpage) $output .= build_pagelinks("viewuser.php?action=favau&amp;uid=$uid&amp;", $count, $offset);
+		}
+		else $output .= write_message(_NORESULTS);
+	}
+	$tpl->assign("output", $output);
+	$tpl->gotoBlock( "_ROOT" );
+?>
+

file:b/user/favlist.php (new)
--- /dev/null
+++ b/user/favlist.php
@@ -1,1 +1,44 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+if(empty($favorites)) accessDenied( );
+
+	$output = "<div class=\"tblborder\" style=\"padding: 5px; width: 300px; margin: 1em auto;\">";
+	$panelquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_type = 'F' AND panel_name != 'favlist' ORDER BY panel_title ASC");
+	if(!$panelquery) $output .= write_error(_ERROR);
+	while($panel = dbassoc($panelquery)) {
+		$panellink = "";
+		if(substr($panel['panel_name'], 0, 3) == "fav" && $type = substr($panel['panel_name'], 3)) {
+			if($panel['panel_name'] == "favlist") continue;
+			$itemcount = 0;
+			$countquery = dbquery("SELECT COUNT(item) FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '$uid' AND type = '$type'");
+			list($itemcount) = dbrow($countquery);
+			$output .= "<a href=\"viewuser.php?action=".$panel['panel_name']."&amp;uid=$uid\">".preg_replace("<\{author\}>", $penname, stripslashes($panel['panel_title'])).(isset($itemcount) ? " [$itemcount]" : "")."</a><br />\n";
+		}
+	}
+	$output .= "</div>";
+	$tpl->assign("output", $output);
+?>
+

file:b/user/favse.php (new)
--- /dev/null
+++ b/user/favse.php
@@ -1,1 +1,111 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+if(empty($favorites)) accessDenied( );
+
+	if(empty($uid)) {
+		$uid = USERUID;
+		$output .= "<div id='pagetitle'>"._YOURSTATS."</div>";
+	}
+	$add = isset($_GET['add']) && isNumber($_GET['add']) ? $add = $_GET['add'] : false;
+	$edit = isset($_GET['edit']) && isNumber($_GET['edit']) ? $_GET['edit'] : false;
+	$author = isset($_GET['author']) && isNumber($_GET['author']) ? $_GET['author'] : false;
+	$delete = isset($_GET['delete']) && isNumber($_GET['delete']) ? $_GET['delete'] : false;
+	if(($add || $edit || $delete) && !isMEMBER) accessDenied( );
+
+	$output .= "<div class='sectionheader'>"._FAVORITESERIES."</div>";
+	if($delete) {
+		$result = dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '".USERUID."' AND item = '$delete' AND type = 'SE' LIMIT 1");
+		if($result) $output .= write_message(_ACTIONSUCCESSFUL);
+		else $output .= write_error(_ERROR);
+	}
+	else if($add && isset($_POST['submit'])) {
+		$result = false;
+		$check = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '".USERUID."' AND item = '$seriesid' AND type = 'SE' LIMIT 1");
+		if(dbnumrows($check) == 0)
+			$result = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_favorites(uid, item, type, comments) VALUES ('".USERUID."', '$seriesid', 'SE', '".escapestring(descript(strip_tags(replace_naughty($_POST['comments']), $allowed_tags)))."')");
+		if($result) $output .= write_message(_ACTIONSUCCESSFUL." "._BACK2ACCT);
+	}
+	else if($edit && isset($_POST['submit'])) {
+		$result = dbquery("UPDATE ".TABLEPREFIX."fanfiction_favorites SET comments = '".escapestring(descript(strip_tags(replace_naughty($_POST['comments']), $allowed_tags)))."' WHERE uid = '".USERUID."' AND item = '$edit' AND type = 'SE'");
+		if($result) $output .= write_message(_ACTIONSUCCESSFUL." "._BACK2ACCT);
+		else $output .= write_error(_ERROR);
+	}
+	else if(($add || $edit) && !isset($_POST['submit'])) {
+		$stories = dbassoc(dbquery("SELECT series.*, "._PENNAMEFIELD." as penname FROM ".TABLEPREFIX."fanfiction_series as series, "._AUTHORTABLE." WHERE series.uid = "._UIDFIELD." AND seriesid = '".($add ? $add : $edit)."' LIMIT 1"));
+		$tpl->newBlock("listings");
+		include("includes/seriesblock.php");
+		$tpl->gotoBlock("listings");
+		
+		if($add) {
+			$check = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '".USERUID."' AND item = '$add' AND type = 'SE' LIMIT 1");
+			if(dbnumrows($check)) {
+				$edit = $add;
+				$add = false;
+			}
+		}
+		if($edit) {
+			$query = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '".USERUID."' AND type = 'SE' AND item = '$edit' LIMIT 1");
+			$info = dbassoc($query);
+		}			
+		$tpl->assign("pagelinks", "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"user.php?action=favse&amp;add=1&amp;seriesid=".($add ? $add : $edit)."\">\n
+			<div style=\"width: 350px; margin: 0 auto; text-align: left;\"><label for=\"comments\">"._COMMENTS.":</label><br />
+			<textarea class=\"textbox\" name=\"comments\" id=\"comments\" cols=\"40\" rows=\"5\">".(isset($info['comments']) ? $info['comments'] : "")."</textarea><br />
+			<INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></div></form>");
+			$tpl->gotoBlock("_ROOT");
+
+	}
+	else {
+	$storyquery = "SELECT series.*, "._PENNAMEFIELD." as penname, fav.comments as comments FROM ".TABLEPREFIX."fanfiction_series as series, ".TABLEPREFIX."fanfiction_favorites as fav, "._AUTHORTABLE." WHERE fav.uid = '$uid' AND fav.type = 'SE' AND series.uid = "._UIDFIELD." AND fav.item = series.seriesid ORDER BY series.title";
+	$countquery = dbquery("SELECT COUNT(item) FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '$uid' AND type = 'SE' GROUP BY uid");
+	list($seriescount) = dbrow($countquery);
+	if($seriescount) {
+		$tpl->newBlock("listings");
+		$list = dbquery($storyquery."  LIMIT $offset, $itemsperpage");
+		$count = 0;
+		while($stories = dbassoc($list)) { 
+			include("includes/seriesblock.php"); 
+			if(file_exists("./$skindir/favcomment.tpl")) $cmt = new TemplatePower( "./$skindir/favcomment.tpl" );
+			else $cmt = new TemplatePower( "./default_tpls/favcomment.tpl" );
+			$cmt->prepare( );
+			$cmt->newBlock("comment");
+			$cmt->assign("comment", $stories['comments'] ? "<div class='comments'><span class='label'>"._COMMENTS.": </span>".strip_tags($stories['comments'])."</div>" : "");
+			if(USERUID == $uid) 
+				$cmt->assign("commentoptions", "<div class='adminoptions'><span class='label'>"._OPTIONS.":</span> <a href=\"user.php?action=favse&amp;edit=".$stories['seriesid']."\">"._EDIT."</a> | <a href=\"user.php?action=favse&amp;delete=".$stories['seriesid']."\">"._REMOVEFAV."</a></div>");
+			$cmt->assign("oddeven", ($count % 2 ? "odd" : "even"));
+			$tpl->assign("comment", $cmt->getOutputContent( ));
+			$count++;
+		}
+		if($seriescount > $itemsperpage) {
+			$tpl->gotoBlock("listings");
+			$tpl->assign("pagelinks", build_pagelinks(basename($_SERVER['PHP_SELF'])."?action=favse&amp;uid=$uid&amp;", $seriescount, $offset));
+		}
+
+	}
+	else $output .= write_message(_NORESULTS);
+	}
+	$tpl->gotoBlock( "_ROOT" );
+?>
+

file:b/user/favst.php (new)
--- /dev/null
+++ b/user/favst.php
@@ -1,1 +1,116 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.0
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+if(empty($favorites)) accessDenied( );
+
+	if(empty($uid)) {
+		$uid = USERUID;
+		$output .= "<div id='pagetitle'>"._YOURSTATS."</div>";
+	}
+	$add = isset($_GET['add']) ? $_GET['add'] : false;
+	$edit = isset($_GET['edit']) ? $_GET['edit'] : false;
+	$delete = isset($_GET['delete']) ? $_GET['delete'] : false;
+	if($add) $output .= "<div class='sectionheader'>"._ADDTOFAVORITES."</div>";
+	else if($edit) $output .= "<div class='sectionheader'>"._EDITFAVORITES."</div>";
+	else $output .= "<div class='sectionheader'>"._FAVORITESTORIES."</div>";
+	if(($add || $edit || $delete) && !isMEMBER) accessDenied( );
+
+	if($delete && isNumber($delete)) {
+		$result = dbquery("DELETE FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '".USERUID."' AND item = '$delete' AND type = 'ST' LIMIT 1");
+		if($result) $output .= write_message(_ACTIONSUCCESSFUL." "._BACK2ACCT);
+		else $output .= write_error(_ERROR);
+	}
+	if($add && isset($_POST['submit'])) {
+		$check = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '".USERUID."' AND item = '$sid' AND type = 'ST' LIMIT 1");
+		if(!dbnumrows($check))
+			$result = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_favorites(uid, item, type, comments) VALUES ('".USERUID."', '$sid', 'ST', '".escapestring(descript(strip_tags(replace_naughty($_POST['comments']), $allowed_tags)))."')");
+		if($result) $output .= write_message(_ACTIONSUCCESSFUL." "._BACK2ACCT);
+	}
+	if($edit && isset($_POST['submit'])) {
+		$result = dbquery("UPDATE ".TABLEPREFIX."fanfiction_favorites SET comments = '".escapestring(descript(strip_tags(replace_naughty($_POST['comments']), $allowed_tags)))."' WHERE uid = '$uid' AND item = '$edit' AND type = 'ST'");
+		if($result) $output .= write_message(_ACTIONSUCCESSFUL." "._BACK2ACCT);
+		else $output .= write_error(_ERROR);
+	}
+	if(($add || $edit) && !isset($_POST['submit'])) {
+		if($add) {
+			$check = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '".USERUID."' AND item = '$sid' AND type = 'ST' LIMIT 1");
+			if(dbnumrows($check)) {
+				$edit = $sid;
+				$add = false;
+			}
+		}
+		if($edit) {
+			$query = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '".USERUID."' AND type = 'ST' AND item = '$edit' LIMIT 1");
+			$info = dbassoc($query);
+		}
+		$storyinfo = dbquery(_STORYQUERY." AND sid = '".($edit? $edit : $sid)."'");
+		$stories = dbassoc($storyinfo);
+		if(!$stories) $output .= write_error(_ERROR);
+		else {
+			$tpl->newBlock("listings");
+			$tpl->newBlock("storyblock");
+			include("includes/storyblock.php");
+			$tpl->gotoBlock("listings");
+			$tpl->assign("pagelinks", "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"user.php?action=favst&amp;".($edit? "edit=$edit" : "add=1")."&amp;sid=".(isset($sid) ? $sid : $edit)."\">\n
+				<div style=\"width: 350px; margin: 0 auto; text-align: left;\"><label for=\"comments\">"._COMMENTS.":</label><br />
+				<textarea class=\"textbox\" name=\"comments\" id=\"comments\" cols=\"40\" rows=\"5\">".(isset($info['comments']) ? $info['comments'] : "")."</textarea><br />
+				<INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></div></form>");
+			$tpl->gotoBlock("_ROOT");
+		}
+	}
+	else if(!isset($_POST['submit'])) {
+		$storyquery = "SELECT stories.*, "._PENNAMEFIELD." as penname, fav.comments as comments,  stories.date as date, stories.updated as updated FROM ".TABLEPREFIX."fanfiction_stories as stories, ".TABLEPREFIX."fanfiction_favorites as fav, "._AUTHORTABLE." WHERE fav.uid = '$uid' AND fav.type = 'ST' AND stories.uid = "._UIDFIELD." AND fav.item = stories.sid "._ORDERBY;
+		$countquery = dbquery("SELECT COUNT(item) FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '$uid' AND type = 'ST' GROUP BY uid");
+		list($storycount) = dbrow($countquery);
+		if($storycount) {
+			$list = dbquery($storyquery."  LIMIT $offset, $itemsperpage");
+			$tpl->newBlock("listings");
+			$count = 0;
+			while($stories = dbassoc($list)) { 
+				$tpl->newBlock("storyblock");
+				include("includes/storyblock.php");
+				if(!empty($stories['comments']) || USERUID == $uid || isADMIN) {
+				if(file_exists("./$skindir/favcomment.tpl")) $cmt = new TemplatePower( "./$skindir/favcomment.tpl" );
+				else $cmt = new TemplatePower( "./default_tpls/favcomment.tpl" );
+				$cmt->prepare( );
+				$cmt->newBlock("comment");
+				$cmt->assign("comment", $stories['comments'] ? "<div class='comments'><span class='label'>"._COMMENTS.": </span>".strip_tags($stories['comments'])."</div>" : "");
+				if(USERUID == $uid) 
+				$cmt->assign("commentoptions", "<div class='adminoptions'><span class='label'>"._OPTIONS.":</span> <a href=\"user.php?action=favst&amp;edit=".$stories['sid']."\">"._EDIT."</a> | <a href=\"user.php?action=favst&amp;delete=".$stories['sid']."\">"._REMOVEFAV."</a></div>");
+				$cmt->assign("oddeven", ($count % 2 ? "odd" : "even"));
+				$tpl->assign("comment", $cmt->getOutputContent( ));
+				$tpl->gotoBlock( "listings" );
+				}
+			}	
+			if($storycount > $itemsperpage) {
+				$tpl->gotoBlock("listings");
+				$tpl->assign("pagelinks", build_pagelinks(basename($_SERVER['PHP_SELF'])."?action=favst&amp;uid=$uid&amp;", $storycount, $offset));
+			}
+		}
+		else $output .= write_message(_NORESULTS);
+		$tpl->gotoBlock( "_ROOT" );
+	}
+?>
+

file:b/user/index.php (new)
--- /dev/null
+++ b/user/index.php

file:b/user/login.php (new)
--- /dev/null
+++ b/user/login.php
@@ -1,1 +1,112 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+	if(isset($_POST['submit']) && preg_match("!^[-a-z0-9_ ]{3,30}$!i", $_POST['penname'])) {
+		if(!defined("_LOGINCHECK")) exit( );
+		define("_BASEDIR", "");
+		include_once("config.php");
+		$settings = dbquery("SELECT tableprefix, maintenance, sitekey, debug FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");
+		list($tableprefix, $maintenance, $sitekey, $debug) = dbrow($settings);
+		$tempdebug = $debug;
+		$debug = 0;
+		define("TABLEPREFIX", $tableprefix);
+		define("SITEKEY", $sitekey);
+		include_once("includes/queries.php");
+		$result = dbquery("SELECT *, "._UIDFIELD." as uid FROM "._AUTHORTABLE." LEFT JOIN ".$tableprefix."fanfiction_authorprefs AS ap ON ap.uid = "._UIDFIELD." WHERE "._PENNAMEFIELD." = '".$_POST['penname']."'");
+		$passwd = dbassoc($result);
+		if(!dbnumrows($result)) {
+			require_once("header.php");
+			//make a new TemplatePower object
+			if(file_exists("$skindir/default.tpl")) $tpl = new TemplatePower( "$skindir/default.tpl" );
+			else $tpl = new TemplatePower("default_tpls/default.tpl");
+			include_once("includes/pagesetup.php");
+			$output = write_error(_NOSUCHACCOUNT);
+			$tpl->assign("output", $output);
+			$tpl->printToScreen( );
+			dbclose( );
+			exit( );
+		}
+		if($maintenance && $passwd['level'] < 0) {
+			header("Location: maintenance.php");
+			exit( );
+		}
+		$encryptedpassword = md5($_POST['password']);
+		if($passwd['level'] == -1) {
+			require_once("header.php");
+			//make a new TemplatePower object
+			if(file_exists("$skindir/default.tpl")) $tpl = new TemplatePower( "$skindir/default.tpl" );
+			else $tpl = new TemplatePower("default_tpls/default.tpl");
+			include_once("includes/pagesetup.php");
+			$output = write_error(_ACCOUNTLOCKED);
+			$tpl->assign("output", $output);
+			$tpl->printToScreen( );
+			dbclose( );
+			exit( );
+		}
+		if($passwd['password'] == $encryptedpassword) {
+			if(isset($_POST['cookiecheck'])) {
+				setcookie($sitekey."_useruid",$passwd['uid'], time()+60*60*24*30, "/");
+				setcookie($sitekey."_salt", md5($passwd['email'] . $encryptedpassword),  time()+60*60*24*30, "/");
+			}
+			if(!isset($_SESSION)) session_start( );
+			$_SESSION[$sitekey."_useruid"] = $passwd['uid'];
+			$_SESSION[$sitekey."_salt"] = md5($passwd['email'] . $encryptedpassword);
+			$logincode = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'login'");
+			while($code = dbassoc($logincode)) {
+				eval($code['code_text']);
+			}
+		}
+
+		else { 
+			require_once("header.php");
+			//make a new TemplatePower object
+			if(file_exists("$skindir/default.tpl")) $tpl = new TemplatePower( "$skindir/default.tpl" );
+			else $tpl = new TemplatePower("default_tpls/default.tpl");
+			include_once("includes/pagesetup.php");
+			$output .= "<div id=\"pagetitle\">"._MEMBERLOGIN."</div>";
+			$output .= "<div style='text-align: center;'>"._WRONGPASSWORD."</div>";
+			$tpl->assign("output", $output);
+			$tpl->printToScreen( );
+			dbclose( );
+			exit( );
+		}
+		$debug = $tempdebug;
+	}
+	else if(!isMEMBER) {
+		$output .= "<div id=\"pagetitle\">"._MEMBERLOGIN."</div>";
+		$output .= "<div style=\"width: 250px; margin: 0 auto; text-align: center;\"><form method=\"POST\" enctype=\"multipart/form-data\" action=\"user.php?action=login".(isset($_GET['sid']) && isNumber($_GET['sid']) ? "&amp;sid=".$_GET['sid'] : "")."\">
+		<div class=\"label\" style=\"float: left;  width: 30%; text-align: right;\"><label for=\"penname\">"._PENNAME.":</label></div><INPUT type=\"text\" class=\"textbox\" name=\"penname\" id=\"penname\"><br />
+		<div class=\"label\" style=\"float: left; width: 30%; text-align: right;\"><label for=\"pswd\">"._PASSWORD.":</label></div><INPUT type=\"password\" class=\"textbox\" id=\"pswd\" name=\"password\"><br />
+		<INPUT type=\"checkbox\" class=\"checkbox\" name=\"cookiecheck\" id=\"cookiecheck\" value=\"1\"><label for=\"cookiecheck\">"._REMEMBERME."</label><br />
+		<INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\">
+		</form></div>";
+		$linkquery = dbquery("SELECT * from ".TABLEPREFIX."fanfiction_pagelinks WHERE link_name = 'login' OR link_name = 'lostpassword'");
+		while($link = dbassoc($linkquery)) {
+			if($link['link_access'] && !isMEMBER) continue;
+			if($link['link_access'] == 2 && !isADMIN) continue;
+			$pagelinks[$link['link_name']] = array("id" => $link['link_id'], "text" => $link['link_text'], "url" => _BASEDIR.$link['link_url'], "link" => "<a href=\"".$link['link_url']."\" title=\"".$link['link_text']."\"".($link['link_target'] ? " target=\"_blank\"" : "").($current == $link['link_name'] ? " id=\"current\"" : "").">".$link['link_text']."</a>");
+		}
+		$output .= "<div style='text-align: center;'>".$pagelinks['register']['link']." | ".$pagelinks['lostpassword']['link']."</div>";
+	}
+?>

file:b/user/logout.php (new)
--- /dev/null
+++ b/user/logout.php
@@ -1,1 +1,33 @@
+<?php
+if(!defined("_LOGOUTCHECK")) exit( );
+	define("_BASEDIR", "");
+	include("config.php");
+	session_start( );
+	foreach ($_SESSION as $VarName => $Value)  { 
+		if(substr($VarName, 0, strlen($sitekey)) == $sitekey) {
+			if(strpos($VarName, "skin")) continue;
+			$_SESSION[$VarName] = "";
+			unset($_SESSION[$VarName]);
+			unset($_COOKIE[$VarName]);
+			setcookie($VarName, '', time() - 1000, '/', '', '' );
+		}
+	} 
+	foreach ($_COOKIE as $VarName => $Value)  { 
+		if(substr($VarName, 0, strlen($sitekey)) == $sitekey) {
+			unset($_COOKIE[$VarName]);
+			setcookie($VarName, "", time() - 1000, '/', '', '' );
+		}
+	} 
+require_once("header.php");
+//make a new TemplatePower object
+if(file_exists("$skindir/default.tpl")) $tpl = new TemplatePower( "$skindir/default.tpl" );
+else $tpl = new TemplatePower("default_tpls/default.tpl");
+if(file_exists("$skindir/listings.tpl")) $tpl->assignInclude( "listings", "./$skindir/listings.tpl" );
+else $tpl->assignInclude( "listings", "./default_tpls/listings.tpl" );
+include("includes/pagesetup.php");
 
+$output .= write_message(_ACTIONSUCCESSFUL);
+$tpl->assign("output", $output);
+$tpl->printToScreen( );
+exit( );
+?>

--- /dev/null
+++ b/user/lostpassword.php
@@ -1,1 +1,83 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+if(!function_exists("random_char")) {
+
+function random_char($string)
+{
+	$length = strlen($string);
+	$position = mt_rand(0, $length - 1);
+	return ($string[$position]);
+}
+
+function random_string ($charset_string, $length)
+{
+	$return_string = random_char($charset_string);
+	for ($x = 1; $x < $length; $x++)
+	$return_string .= random_char($charset_string);
+	return $return_string;
+}
+
+}
+if(isMEMBER) accessDenied( );
+	$output = "<div id=\"pagetitle\">"._LOSTPASSWORD."</div>";
+
+	  if(isset($_POST['submit'])) {
+		if(validEmail($_POST['email'])) {
+			$result = dbquery("SELECT "._UIDFIELD." as uid, "._PENNAMEFIELD." as penname, "._EMAILFIELD." AS email FROM "._AUTHORTABLE." WHERE email = '".strtolower(escapestring(descript($_POST['email'])))."'");
+			list($uid, $penname, $email) = dbrow($result);
+			if(dbnumrows($result) == 0) $output .= write_message(_BADEMAIL);
+			else {
+				include("includes/emailer.php");
+				mt_srand((double)microtime() * 1000000);
+				$charset = '23456789' . 'abcdefghijkmnpqrstuvwxyz' . 'ABCDEFGHJKLMNPQRSTUVWXYZ';		
+				$pass = random_string($charset, 10);
+				$encryppass = md5($pass);
+				$subject = _NEWPWDSUB;
+				$mailtext = sprintf(_NEWPWDMSG, $pass);
+
+		
+				$result = sendemail($penname, $email, $sitename, $siteemail, $subject, $mailtext, "html");
+				if($result) {
+					$output .= write_message(_PASSWORDSENT);
+					dbquery("UPDATE ".substr(_AUTHORTABLE, 0, strpos(_AUTHORTABLE, "as author"))." SET password='$encryppass' WHERE uid = '".$uid."'");
+				}
+				else $output .=  write_message(_EMAILFAILED);
+				if($logging) 
+					dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`, `log_timestamp`) VALUES('".escapestring(sprintf(_LOG_LOST_PASSWORD, $penname, $uid, ($result ? _YES : _NO)))."', '$uid', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'LP', " . time() . ")");
+			}
+
+		}
+		else $output .= write_message(_BADEMAIL);
+	}
+	else {
+		$output .= "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"user.php?action=lostpassword\">
+		<table align=\"center\" width=\"300\">
+		<tr><td>"._ENTEREMAIL."</td></tr>
+		<tr><td><INPUT  type=\"text\" class=\"textbox=\" name=\"email\"> <INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\"></form>
+		</td></tr></table>";
+	}
+
+?>

--- /dev/null
+++ b/user/manageimages.php
@@ -1,1 +1,221 @@
-
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+if(!defined("_CHARSET")) exit( );
+
+// $upfile = isset($_FILES['upfile']) ? $_FILES['upfile'] : false;
+include("includes/upload_class.php");
+function buildImageList( ) {
+		$dir = opendir(STORIESPATH."/".USERUID."/images/");
+		while($file = readdir($dir)) {
+			if(!in_array($file, array(".", "..", "/", "index.php", "imagelist.js"))) {
+				$image_files[] = "[\"".STORIESPATH."/".USERUID."/images/$file\", \"".STORIESPATH."/".USERUID."/images/$file\"]";
+			}
+		}
+		if(isset($image_files)) {
+			$handle = fopen(STORIESPATH."/".USERUID."/images/imagelist.js", 'w');
+			$text = "var tinyMCEImageList = new Array(\n";
+			$text .= implode(", \n", $image_files);
+			$text .= ");\n\n";
+			fwrite($handle, $text);
+			fclose($handle);
+		}
+}
+
+class multi_upfiles extends file_upload {
+	
+	var $number_of_files = 0;
+	var $names_array;
+	var $tmp_names_array;
+	var $error_array;
+	var $wrong_extensions = 0;
+	var $bad_filenames = array( );
+	
+	function extra_text($msg_num) {
+		switch ($this->language) {
+			case "de":
+			// add you translations here
+			break;
+			default:
+			$extra_msg[1] = "<strong>".$this->the_file."</strong>";
+			$extra_msg[2] = sprintf(_WRONGEXT, $this->wrong_extensions, $this->ext_string);
+			$extra_msg[3] = "<strong>".$this->the_file."</strong> "._IMAGETOOBIG;
+			$extra_msg[4] = _NOFILESSELECTED;
+			$extra_msg[5] = _BADFILENAMES."<strong>".implode(",", $this->bad_filenames)."</strong>";
+		}
+		return $extra_msg[$msg_num];
+	}
+	// some error (HTTP)reporting, change the messages or remove options if you like.
+	// this method checkes the number of files for upload
+	// this example works with one or more files
+	function count_files() {
+		foreach ($this->names_array as $test) {
+			if ($test != "") {
+				$this->number_of_files++;
+			}
+		}
+		if ($this->number_of_files > 0) {
+			return true;
+		} else {
+			return false;
+		} 
+	}
+	function get_img_size($file) {
+		$img_size = getimagesize($file);
+		$this->x_size = $img_size[0];
+		$this->y_size = $img_size[1];
+	}
+	function upload_multi_files () {
+		global $output, $imageheight, $imagewidth; 
+		$this->message = array();
+		if ($this->count_files()) {
+			foreach ($this->names_array as $key => $value) { 
+				if ($value != "") {
+					$this->the_file = $value;
+					$new_name = $this->set_file_name();
+					$ext = $this->get_extension($new_name);
+					$validImage = true;
+					if($ext == ".jpg" || $ext == ".gif" || $ext == ".jpeg") {
+						$this->get_img_size($this->tmp_names_array[$key]);
+						if($this->x_size > $imageheight) {
+							$this->message[] = $this->extra_text(3);
+							$validImage = false;
+						}
+						else if($this->y_size > $imagewidth) {
+							$this->message[] = $this->extra_text(3);
+							$validImage = false;
+						}
+					}
+					if($validImage) {
+						if ($this->check_file_name($new_name)) {
+							if ($this->validateExtension()) {
+								$this->file_copy = $new_name;
+								$this->the_temp_file = $this->tmp_names_array[$key];
+								if (is_uploaded_file($this->the_temp_file)) {
+									if($this->move_upload($this->the_temp_file, $this->file_copy)) {
+										$this->message[] = $this->error_text($this->error_array[$key]);
+										if ($this->rename_file) $this->message[] = $this->error_text(16);
+										sleep(1); // wait a seconds to get an new timestamp (if rename is set)
+									} else {
+										$this->message[] = $this->extra_text(1);
+										$this->message[] = $this->error_text($this->error_array[$key]);
+									}
+								}
+							} else {
+								$this->wrong_extensions++;
+						}
+						} else {
+							$this->bad_filenames[] = $this->the_file;
+						}
+					}
+				}
+			}
+			if (count($this->bad_filenames) > 0) $this->message[] = $this->extra_text(5);
+			if ($this->wrong_extensions > 0) {
+				$this->show_extensions();
+				$this->message[] = $this->extra_text(2);
+			}
+		} else {
+			$this->message[] = $this->extra_text(3);
+		}
+		$output .= write_message(is_array($this->message) ? implode("<br />", $this->message) : _ERROR);
+	}
+}
+
+		
+$output .= "<div id=\"pagetitle\">"._MANAGEIMAGES."</div>";
+if($imageupload) {
+
+	$max_size = 1024*250; // the max. size for uploading
+	
+
+	if(isset($_POST['submit'])) {
+		$multi_upload = new multi_upfiles;
+		$multi_upload->upload_dir = STORIESPATH."/".USERUID."/images/"; // "files" is the folder for the uploaded files (you have to create this folder)
+		$multi_upload->extensions = array(".png", ".gif", ".jpg", ".jpeg"); // specify the allowed extensions here
+		$multi_upload->message[] = $multi_upload->extra_text(4); // a different standard message for multiple files
+		//$multi_upload->rename_file = true; // set to "true" if you want to rename all files with a timestamp value
+		$multi_upload->do_filename_check = "n"; // check filename ...
+
+		$multi_upload->tmp_names_array = $_FILES['upfile']['tmp_name'];
+		$multi_upload->names_array = $_FILES['upfile']['name'];
+		$multi_upload->error_array = $_FILES['upfile']['error'];
+		$multi_upload->replace = "n"; 
+		$multi_upload->upload_multi_files();
+		buildImageList( );
+	}
+	if(isset($_GET['upload']) && !isset($_POST['submit'])) {
+			$output .= "<form method=\"post\" action=\"user.php?action=manageimages&upload=upload\" ENCTYPE=\"multipart/form-data\">
+					<input type=\"hidden\" name=\"MAX_FILE_SIZE\" value=\"$max_size\">";
+			for($x = 1; $x < 6; $x++) {
+				$output .= "<div style='width: 300px; margin: 0 auto;'><label for='upfile$x'>"._IMAGE." $x:</label><input id=\"upfile$x\" type=\"file\" class=\"textbox\" name=\"upfile[]\"></div>";
+			}
+			$output .= "<div style='text-align: center;'><input name=\"submit\" type=\"submit\" class=\"button\" value=\"upload\"></div></form>";
+	}
+	else {
+		if(isset($_GET['delete'])) {
+			$folder = STORIESPATH."/".USERUID."/images";
+			$validFile = false;
+			$directory = opendir($folder);
+			while($filename = readdir($directory)) {
+				if($filename == $_GET['delete']) $validFile = true;
+			}
+			if($validFile) {
+				$success = unlink($folder ."/". $_GET['delete']);
+				if($success) $output .= write_message(_ACTIONSUCCESSFUL);
+				else $output .= write_error(_ERROR);
+			}
+		}
+		$folder1 = STORIESPATH."/".USERUID."";
+		if(!file_exists($folder1)) {
+			mkdir($folder1, 0755);
+			chmod($folder1, 0777);
+		}
+
+		$folder = STORIESPATH."/".USERUID."/images";
+		if (!file_exists($folder)) {
+			mkdir($folder, 0755);
+			chmod($folder, 0777);
+		}
+
+		$directory = opendir("$folder");
+		$output .= "<div style=\"width: 90%; margin: 0 auto;\"><table cellpadding=\"3\" cellspacing=\"0\" width=\"100%\" class=\"tblborder\">
+				<tr><th class='tblborder'>"._FILENAME."</th><th class='tblborder'>"._IMAGECODE."</th><th class='tblborder'>"._OPTIONS."</th></tr>";
+		$count = 0;
+		while($filename = readdir($directory)) {
+			if($filename=="." || $filename==".." || $filename == "imagelist.js") continue;
+			list($imght, $imgwth, $type, $attr) = getimagesize("$folder/$filename");
+			$output .= "<tr><td class='tblborder'>$filename</td><td class='tblborder'>&#60;img src=\"$folder/$filename\"&#62;</td><td class='tblborder' style='text-align: center;'><a href=\"javascript:pop('$folder/$filename', $imgwth, $imght, 'yes')\">"._VIEW."</a> | <a href=\"user.php?action=manageimages&amp;delete=$filename\" onclick=\"return confirm('"._CONFIRMDELETE."')\">"._DELETE."</a></td></tr>";
+			$count++;
+		}
+		if($count == 0) $output .= "<tr><td colspan='3' style='text-align: center;'>"._NORESULTS."</td></tr>";
+		$output .= "</table></div>";
+		$output .= write_message("<a href=\"user.php?action=manageimages&amp;upload=upload\">"._UPLOADIMAGE."</a>");
+
+	}
+}
+else { 
+	$output .= write_message(_NOTAUTHORIZED);
+}
+?>

file:b/user/manfavs.php (new)
--- /dev/null
+++ b/user/manfavs.php
@@ -1,1 +1,53 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+if(empty($favorites)) accessDenied( );
+
+if(!isset($uid)) {
+	$output .= "<div id=\"pagetitle\">"._MANAGEFAVORITES."</div>";
+	$uid = USERUID;
+}
+else {
+	$authquery = dbquery("SELECT "._PENNAMEFIELD." FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '$uid'");
+	list($penname) = dbrow($authquery);
+	 $output .= "<div class='sectionheader'>"._FAVORITESOF." $penname</div>";
+}
+	$output .= "<div class=\"tblborder\" style=\"padding: 5px; width: 200px; margin: 0 auto;\">";
+	$panelquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_type = 'F' AND panel_name != 'favlist' ORDER BY panel_title ASC");
+	if(!$panelquery) $output .= write_error(_ERROR);
+	while($panel = dbassoc($panelquery)) {
+		$panellink = "";
+		if(substr($panel['panel_name'], 0, 3) == "fav" && $type = substr($panel['panel_name'], 3)) {
+			if($panel['panel_name'] == "favlist") continue;
+			$itemcount = 0;
+			$countquery = dbquery("SELECT COUNT(item) FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '$uid' AND type = '$type'");
+			list($itemcount) = dbrow($countquery);
+			if(empty($panel['panel_url'])) $output .=  "<a href=\"user.php?action=".$panel['panel_name']."\">".$panel['panel_title']." [$itemcount]</a><br />\n";
+			else $output .= "<a href=\"".$panel['panel_url']."\">".$panel['panel_title']." [$itemcount]</a><br />\n";
+		}
+	}
+	$output .= "</div>\n";
+?>

file:b/user/profile.php (new)
--- /dev/null
+++ b/user/profile.php
@@ -1,1 +1,91 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+// Build the user's profile information
+$tpl->newBlock("profile");
+$result2 = dbquery("SELECT *, date as date FROM "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs as ap ON ap.uid = "._UIDFIELD." WHERE "._UIDFIELD." = '$uid' LIMIT 1");
+$userinfo = dbassoc($result2);
+$nameinfo = "";
+if($userinfo['email'])
+	$nameinfo .= " [<a href=\"viewuser.php?action=contact&amp;uid=".$userinfo['uid']."\">"._CONTACT."</a>]";
+if(!empty($favorites) && isMEMBER && $userinfo['uid'] != USERUID) {
+	$fav = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '".USERUID."' AND type = 'AU' AND item = '".$userinfo['uid']."'");
+	if(dbnumrows($fav) == 0) $nameinfo .= " [<a href=\"user.php?action=favau&amp;uid=".USERUID."&amp;add=".$userinfo['uid']."\">"._ADDAUTHOR2FAVES."</a>]";
+}
+ 
+$tpl->assign("userpenname", $userinfo['penname']." ".$nameinfo);
+$tpl->assign("membersince", date("$dateformat", $userinfo['date']));
+if($userinfo['realname'])
+	$tpl->assign("realname", $userinfo['realname']);
+if($userinfo['bio']) {
+	$bio = nl2br($userinfo['bio']);	
+	$tpl->assign("bio", stripslashes($bio));
+}
+if($userinfo['image'])
+	$tpl->assign("image", "<img src=\"".$userinfo['image']."\">");
+$tpl->assign("userlevel", isset($userinfo['level']) && $userinfo['level'] > 0 && $userinfo['level'] < 4 ? _ADMINISTRATOR.(isADMIN ? " - ".$userinfo['level'] : "") : _MEMBER);
+/* Dynamic authorinfo fields */
+$result2 = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_authorinfo WHERE uid = '$uid'");
+$dynamicfields = "";
+while($field = dbassoc($result2)) {
+	if($field['info'] == "") continue;
+	$fieldinfo = dbassoc(dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_authorfields WHERE field_id = '".$field['field']."' LIMIT 1"));
+	if($fieldinfo) {
+		$thisfield = "";
+		if($fieldinfo['field_on'] == 0) continue;
+		if($fieldinfo['field_type'] == 1) { $thisfield = format_link($field['info']);
+		}
+		if($fieldinfo['field_type'] == 4) {
+			$thisfield = preg_replace("@\{info\}@", $field['info'], $fieldinfo['field_options']);
+			$thisfield = format_link($thisfield);
+		}
+		if($fieldinfo['field_type'] == 2 || $fieldinfo['field_type'] == 6) {
+			$thisfield = stripslashes($field['info']);
+		}
+		if($fieldinfo['field_type'] == 3) {
+			$thisfield = $field['info'];
+		}
+		else eval($fieldinfo['field_code_out']);
+		$tpl->assign($fieldinfo['field_name'], $thisfield);
+		$dynamicfields .= "<div class='authorfields'><span class='label'>".$fieldinfo['field_title'].":</span> ".$thisfield."</div>";
+	}
+}
+$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'userprofile'");
+while($code = dbassoc($codequery)) {
+	eval($code['code_text']);
+}
+if(!empty($dynamicfields)) $tpl->assign("authorfields", $dynamicfields);
+/* End dynamic fields */
+$tpl->assign("reportthis", "[<a href=\""._BASEDIR."contact.php?action=report&amp;url=viewuser.php?uid=".$uid."\">"._REPORTTHIS."</a>]");
+$adminopts = "";
+if(isADMIN && uLEVEL < 3) {
+	$adminopts .= "<div class=\"adminoptions\"><span class='label'>"._ADMINOPTIONS.":</span> ".(isset($userinfo['validated']) && $userinfo['validated'] ? "[<a href=\"admin.php?action=members&amp;revoke=$uid\" class=\"vuadmin\">"._REVOKEVAL."</a>] " : "[<a href=\"admin.php?action=members&amp;validate=$uid\" class=\"vuadmin\">"._VALIDATE."</a>] ")."[<a href=\"user.php?action=editbio&amp;uid=$uid\" class=\"vuadmin\">"._EDIT."</a>] [<a href=\"admin.php?action=members&amp;delete=$uid\" class=\"vuadmin\">"._DELETE."</a>]";
+	$adminopts .= " [<a href=\"admin.php?action=members&amp;".($userinfo['level'] < 0 ? "unlock=".$userinfo['uid']."\" class=\"vuadmin\">"._UNLOCKMEM : "lock=".$userinfo['uid']."\" class=\"vuadmin\">"._LOCKMEM)."</a>]";
+	$adminopts .= " [<a href=\"admin.php?action=admins&amp;".(isset($userinfo['level']) && $userinfo['level'] > 0 ? "revoke=$uid\" class=\"vuadmin\">"._REVOKEADMIN."</a>] [<a href=\"admin.php?action=admins&amp;do=edit&amp;uid=$uid\" class=\"vuadmin\">"._EDITADMIN : "do=new&amp;uid=$uid\" class=\"vuadmin\">"._MAKEADMIN)."</a>]</div>";
+	$tpl->assign("adminoptions", $adminopts);
+}
+$tpl->gotoBlock("_ROOT");
+?>

file:b/user/queries.php (new)
--- /dev/null
+++ b/user/queries.php
@@ -1,1 +1,17 @@
+<?php
 
+// Default query strings used throughout the script.  You may need to alter these to bridge to other scripts or databases.
+
+define ("_UIDFIELD", "author.uid");  // Do not change the aliasing (the "author." part)!
+define ("_PENNAMEFIELD", "author.penname");  // Do not change the aliasing (the "author." part)!
+define ("_EMAILFIELD", "author.email");  // Do not change the aliasing (the "author." part)!
+define ("_PASSWORDFIELD", "author.password"); //  Do not change the aliasing (the "author." part)!
+define ("_AUTHORTABLE", TABLEPREFIX."fanfiction_authors as author"); // Do not change the aliasing (the "as author" part)!
+
+define ("_STORYQUERY",  "SELECT stories.*, "._PENNAMEFIELD." as penname, stories.date as date, stories.updated as updated FROM ("._AUTHORTABLE.", ".TABLEPREFIX."fanfiction_stories as stories) WHERE "._UIDFIELD." = stories.uid AND stories.validated > 0 ");
+define ("_STORYCOUNT", "SELECT count(sid) FROM ".TABLEPREFIX."fanfiction_stories as stories WHERE validated > 0");
+define ("_SERIESQUERY", "SELECT series.*, "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE.", ".TABLEPREFIX."fanfiction_series as series WHERE "._UIDFIELD." = series.uid ");
+define ("_SERIESCOUNT", "SELECT COUNT(seriesid) FROM ".TABLEPREFIX."fanfiction_series as series ");
+define ("_MEMBERLIST", "SELECT count( stories.sid ) as stories, "._PENNAMEFIELD." as penname, "._UIDFIELD." as uid FROM "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs AS ap ON "._UIDFIELD." = ap.uid LEFT JOIN ".TABLEPREFIX."fanfiction_stories AS stories ON stories.validated > 0 AND (FIND_IN_SET("._UIDFIELD.", stories.coauthors) > 0 OR stories.uid = "._UIDFIELD.") ");
+define ("_MEMBERCOUNT", "SELECT COUNT(DISTINCT "._UIDFIELD.") FROM "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_stories as stories ON stories.validated > 0 AND (FIND_IN_SET("._UIDFIELD.", stories.coauthors) > 0 OR stories.uid = "._UIDFIELD.")  LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs as ap ON "._UIDFIELD." = ap.uid");
+?>

file:b/user/register.php (new)
--- /dev/null
+++ b/user/register.php
@@ -1,1 +1,28 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+include("user/editbio.php");
+?>

--- /dev/null
+++ b/user/reviewsby.php
@@ -1,1 +1,116 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+if(!function_exists("catlist")) include("includes/listings.php");
+
+if(!isset($uid)) {
+	$uid = USERUID;
+	$output .=  "<div id='pagetitle'>"._YOURREVIEWS."</div>";
+}
+else {
+	$authquery = dbquery("SELECT "._PENNAMEFIELD." FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '$uid'");
+	list($penname) = dbrow($authquery);
+	$output .= "<div class='sectionheader'>"._REVIEWSBY." ".$penname."</div>";
+}
+$revcount = dbquery("SELECT COUNT(reviewid) FROM ".TABLEPREFIX."fanfiction_reviews WHERE uid = '$uid' AND review != 'No Review'");
+list($reviewcount) = dbrow($revcount);
+if($reviewcount) {
+	$revquery = dbquery("SELECT rev.*, rev.date as date, "._PENNAMEFIELD." FROM ".TABLEPREFIX."fanfiction_reviews as rev, "._AUTHORTABLE." WHERE rev.uid = "._UIDFIELD." AND rev.uid = '$uid' AND rev.review != 'No Review' ORDER BY type, item LIMIT $offset, $itemsperpage");
+	$counter = 0;
+	$count = 0;
+	while($reviews = dbassoc($revquery)) {
+		$tpl->newBlock("listings");
+		if(empty($lastreview)) $lastreview = array('type' => '', 'item' => '');
+		$adminlink = "";
+		if(file_exists("$skindir/reviewblock.tpl")) $revlist = new TemplatePower( "$skindir/reviewblock.tpl" );
+		else $revlist = new TemplatePower("default_tpls/reviewblock.tpl");
+		$revlist->prepare( );
+		if($reviews['type'] == 'ST') {
+			$storyquery = dbquery(_STORYQUERY." AND sid = '".$reviews['item']."' LIMIT 1");
+			$stories = dbassoc($storyquery);
+			$authoruid = $stories['uid'];
+			if($lastreview['type'] != 'ST' || $lastreview['item'] != $reviews['item']) {
+				$tpl->newBlock("storyblock");
+				include("includes/storyblock.php");
+			}
+			if($reviews['chapid']) {
+				$chapquery = dbquery("SELECT title, inorder FROM ".TABLEPREFIX."fanfiction_chapters WHERE chapid = '".$reviews['chapid']."' LIMIT 1");
+				list($chaptitle, $chapnum) = dbrow($chapquery);
+			}
+		}
+		else if($reviews['type'] == "SE" && ($lastreview['type'] != 'SE' || $lastreview['item'] != $reviews['item'])) {
+			$storyquery = dbquery(_SERIESQUERY." AND seriesid = '".$reviews['item']."' LIMIT 1");
+			$stories = dbassoc($storyquery);
+			$authoruid = $stories['uid'];
+			include("includes/seriesblock.php");
+		}
+		else { 
+			$codeblocks = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'reviewsby'");
+			while($code = dbassoc($codeblocks)) {
+				eval($code['code_text']);
+			}
+		}
+		if(isADMIN) $adminlink = _ADMINOPTIONS.": [<a href=\"reviews.php?action=edit&amp;reviewid=".$reviews['reviewid']."\">"._EDIT."</a>]";
+		if( isADMIN || (USERUID && USERUID == $reviews['uid'])) $adminlink .= " [<a href=\"reviews.php?action=delete&amp;reviewid=".$reviews['reviewid']."\">"._DELETE."</a>]";
+		if($reviews['uid']) {
+			if(USERUID == $reviews['uid'] && $revdelete == 2 && !isADMIN) $adminlink .= " [<a href=\"reviews.php?action=delete&amp;reviewid=".$reviews['reviewid']."\">"._DELETE."</a>]";
+			$reviewer = "<a href=\"viewuser.php?uid=".$reviews['uid']."\">".$reviews['reviewer']."</a>";
+			$member = _SIGNED;
+		}
+		else {
+			if(USERUID == $authoruid && $revdelete && !isADMIN) $adminlink .= " [<a href=\"reviews.php?action=delete&amp;reviewid=".$reviews['reviewid']."\">"._DELETE."</a>]";
+			$reviewer = $reviews['reviewer'];
+			$member = _ANONYMOUS;
+		}
+		if(!empty($authoruid) && USERUID == $authoruid) $adminlink .= " [<a href=\"user.php?action=revres&amp;reviewid=".$reviews['reviewid']."\">"._RESPOND."</a>]";
+		$revlist->newBlock("reviewsblock");
+		$revlist->assign("reviewer"   , $reviewer );
+		$revlist->assign("review"   , $reviews['review']);
+		$revlist->assign("reviewdate", date("$dateformat", $reviews['date']) );
+		$revlist->assign("rating", ratingpics($reviews['rating']) );
+		$revlist->assign("member", $member );
+		$revlist->assign("chapter", (isset($chaptitle) ? _CHAPTER." $chapnum: $chaptitle" : (!empty($stories['title']) ? $stories['title'] : _NONE)) );
+		$revlist->assign("chapternumber", isset($chapnum) ? $chapnum : "" );
+		if(!empty($adminlink)) $revlist->assign("adminoptions", "<div class=\"adminoptions\">$adminlink</div>");
+		$revlist->assign("oddeven", ($counter % 2 ? "odd" : "even"));
+		unset($adminlink);
+		$tpl->gotoBlock("listings");
+		$tpl->assign("pagelinks", $revlist->getOutputContent( ));
+		$tpl->gotoBlock("_ROOT");
+		$counter++;
+		$lastreview = $reviews;
+	}
+	if($reviewcount > $itemsperpage) {
+		$tpl->gotoBlock("_ROOT");
+		$tpl->newBlock("listings");
+		$tpl->assign("pagelinks", build_pagelinks(basename($_SERVER['PHP_SELF'])."?action=reviewsby&amp;uid=$uid&amp;", $reviewcount, $offset));
+	}		
+}
+else {
+	$output .= write_message(_NORESULTS);
+}
+	$tpl->gotoBlock("_ROOT");
+	$tpl->assign("output", $output);
+?>

--- /dev/null
+++ b/user/revreceived.php
@@ -1,1 +1,65 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+		$output .= "<div id=\"pagetitle\">"._MANAGEREVIEWS."</div>";
+		$count = dbquery("SELECT count(s.sid) FROM ".TABLEPREFIX."fanfiction_stories AS s LEFT JOIN ".TABLEPREFIX."fanfiction_coauthors AS c ON s.sid = c.sid WHERE s.uid = '".USERUID."' OR c.uid = '".USERUID."'");
+		list($numrows)= dbrow($count);
+		$count2 = dbquery("SELECT count(seriesid) FROM ".TABLEPREFIX."fanfiction_series WHERE uid = '".USERUID."'");
+		list($numrows2)= dbrow($count2);
+		$output .= "<table class=\"tblborder\" cellspacing=\"0\" cellpadding=\"4\" style='width: 90%; margin: 0 auto;'><tr><th>"._SERIES."</th><th>"._REVIEWS."</th><th>"._UNRESPONDED."</th></tr>";
+		$x = 0;
+		if($numrows2 > 0) {
+			$query = dbquery("SELECT series.seriesid, series.title, series.reviews, sum(reviews.respond) as respond  FROM ".TABLEPREFIX."fanfiction_series as series, ".TABLEPREFIX."fanfiction_reviews as reviews WHERE series.uid = '".USERUID."' AND series.seriesid = reviews.item AND reviews.type = 'SE' GROUP BY reviews.item ORDER BY series.title");
+			while($story = dbassoc($query)) {
+				if($story['reviews'] > 0) {
+					$output .= "<tr><td class=\"tblborder\"><a href=\"reviews.php?type=SE&amp;item=".$story['seriesid']."\">".$story['title']."</a></td><td class=\"tblborder\" align=\"center\">".$story['reviews']."</td><td class=\"tblborder\" align=\"center\">".($story['reviews'] - $story['respond'])."</td></tr>";
+					$x++;
+				}
+			}
+		}
+		if($x == 0) $output .= "<tr><td class=\"tblborder\" colspan=\"3\" align=\"center\">"._NORESULTS."</td></tr>";
+		$output .= "<tr><th>"._STORIES."</th><th>"._REVIEWS."</th><th>"._UNRESPONDED."</th></tr>";
+		$x = 0;
+		if($numrows > 0) {
+			$query = dbquery("SELECT story.sid, story.title, story.reviews, sum(reviews.respond) as respond FROM ".TABLEPREFIX."fanfiction_stories as story JOIN ".TABLEPREFIX."fanfiction_reviews as reviews ON story.sid = reviews.item AND reviews.type = 'ST' LEFT JOIN ".TABLEPREFIX."fanfiction_coauthors AS c ON c.sid = story.sid WHERE (story.uid = '".USERUID."' OR c.uid = '".USERUID."') GROUP BY reviews.item ORDER BY story.title");
+			while($story = dbassoc($query)) {
+				if($story['reviews'] > 0) {
+				        $output .= "<tr><td class=\"tblborder\">".$story['title']."</td><td class=\"tblborder\" align=\"center\"><a href=\"reviews.php?type=ST&amp;item="
+			                  .$story['sid']."\">".$story['reviews']."</a></td><td class=\"tblborder\" align=\"center\"><a href=\"reviews.php?type=ST&amp;item="
+			                  .$story['sid']."&amp;unresponded=1\">".($story['reviews'] - $story['respond'])."</a></td></tr>";
+
+					$x++;
+				}
+			}
+		}
+		if($x == 0) $output .= "<tr><td class=\"tblborder\" colspan=\"3\" align=\"center\">"._NORESULTS."</td></tr>";
+		// For other items that might receive reviews such as fan art.
+		$code = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'revreceived'");
+		while($c = dbassoc($code)) {
+			eval($c['code_text']);
+		}
+		$output .= "</table>";
+?>

file:b/user/revres.php (new)
--- /dev/null
+++ b/user/revres.php
@@ -1,1 +1,127 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+	$output .= "<div id=\"pagetitle\">"._MANAGEREVIEWS."</div>";
+	if(isset($_POST['submit'])) {
+		$reviewid = isset($_POST['reviewid']) && isNumber($_POST['reviewid']) ? $_POST['reviewid'] : false;
+		$result = dbquery("SELECT review, reviewid, item, type, chapid, uid FROM ".TABLEPREFIX."fanfiction_reviews WHERE reviewid = '".$_POST['rid']."' LIMIT 1");
+		list($review, $reviewid, $item, $type, $chapid, $uid) = dbrow($result);
+		$updated = escapestring($review . "<br><br><i>"._AUTHORSRESPONSE.": " .replace_naughty(descript($_POST['response'], $allowed_tags))."</i>");
+		$success = dbquery("UPDATE ".TABLEPREFIX."fanfiction_reviews SET review = '$updated', respond = '1' WHERE reviewid = '$reviewid'");
+		if($uid) {
+			$prefsquery = dbquery("SELECT "._UIDFIELD." as uid, "._EMAILFIELD." as email, "._PENNAMEFIELD." as penname, newrespond FROM ".TABLEPREFIX."fanfiction_authorprefs as ap LEFT JOIN "._AUTHORTABLE." ON ap.uid = "._UIDFIELD." WHERE ap.uid = "._UIDFIELD." AND "._UIDFIELD." = '$uid' LIMIT 1");
+			$prefs = dbassoc($prefsquery);
+			if(isset($prefs['newrespond']) && $prefs['newrespond'] == 1) {
+				include("includes/emailer.php");
+				sendemail($prefs['penname'], $prefs['email'], $sitename, $siteemail, _RESPONSESUBJECT, preg_replace(array("@\{penname\}@", "@\{review\}@"), array(USERPENNAME, $reviewid), _RESPONSETEXT), "html");
+			}
+		}
+		$back = sprintf(_BACK2REVIEWS, "item=$item&amp;type=$type".(isset($chapid) ? "&amp;chapid=$chapid" : ""));
+		if($success) $output .= write_message(_ACTIONSUCCESSFUL."  ".$back);
+		else $output .= write_error(_ERROR);
+	}
+	else {
+		$reviewid = isset($_GET['reviewid']) && isNumber($_GET['reviewid']) ? $_GET['reviewid'] : false;
+		if(!$reviewid) accessDenied( );
+		$result = dbquery("SELECT review.*, review.date as date FROM ".TABLEPREFIX."fanfiction_reviews as review LEFT JOIN ".TABLEPREFIX."fanfiction_authors as member ON member.uid = review.uid WHERE review.reviewid = '$reviewid' LIMIT 1");
+		$reviews = dbassoc($result);
+		if(!empty($reviews['respond'])) {
+			$tpl->assign("output", write_message(_ALREADYRESPONDED));
+			$tpl->printToScreen( );
+			dbclose( );
+			exit( );
+
+		}
+		$type = $reviews['type'];
+		if($type == "SE") $query2 = "SELECT uid FROM ".TABLEPREFIX."fanfiction_series WHERE seriesid = '".$reviews['item']."'";
+		else if($type == "ST") {
+			$query2 = "SELECT uid, coauthors FROM ".TABLEPREFIX."fanfiction_stories WHERE sid = '".$reviews['item']."' LIMIT 1";
+		}
+		else { 
+			$codeblock = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'reviewto'");
+			while($code = dbassoc($codeblock)) {
+				eval($code['code_text']);
+			}
+		}
+		$user = dbassoc(dbquery($query2));
+		$array_coauthors = array();
+		if(!empty($user['coauthors'])) {
+			$coQuery = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_coauthors WHERE sid = '".$reviews['item']."'");
+			while($c = dbassoc($coQuery)) {
+				$array_coauthors[] = $c['uid'];
+			}
+		}
+		if(USERUID == $user['uid'] || (!empty($user['coauthors']) && in_array(USERUID, $array_coauthors))) {
+			if($type == "ST") {
+				$storyquery = dbquery("SELECT s.title, s.uid, r.rid, r.rating, r.ratingwarning, r.warningtext, s.sid FROM ".TABLEPREFIX."fanfiction_stories as s, ".TABLEPREFIX."fanfiction_ratings as r WHERE s.sid = '".$reviews['item']."' AND s.rid = r.rating LIMIT 1");
+				$story = dbassoc($storyquery);
+				$authoruid = $story['uid'];
+				$title = title_link($story);
+			}
+			else if($type == "SE") {
+				$storyquery = dbquery("SELECT title, uid FROM ".TABLEPREFIX."fanfiction_series WHERE seriesid = '$item' LIMIT 1");
+				list($title, $authoruid) = dbrow($storyquery);
+				$title = stripslashes($title);
+				$title = "<a href=\"series.php?seriesid=$item\">$title</a>";
+			}
+			else { 
+				$titlequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'revtitle'");
+				while($code = dbassoc($titlequery)) {
+					eval($code['code_text']);
+				}
+			}
+			if($reviews['uid']) {
+				$reviewer = "<a href=\"viewuser.php?uid=".$reviews['uid']."\">".$reviews['reviewer']."</a>";
+				$member = _SIGNED;
+			}
+			else {
+				if(USERUID == $authoruid && $revdelete && !isADMIN) $adminlink .= " [<a href=\"reviews.php?action=delete&amp;reviewid=".$reviews['reviewid']."\">"._DELETE."</a>]";
+				$reviewer = $reviews['reviewer'];
+				$member = _ANONYMOUS;
+			}
+			if(file_exists("$skindir/reviewblock.tpl")) $revlist = new TemplatePower( "$skindir/reviewblock.tpl" );
+			else $revlist = new TemplatePower("default_tpls/reviewblock.tpl");
+			$revlist->prepare( );
+			$revlist->newBlock("reviewsblock");
+			$revlist->assign("reviewer"   , $reviewer );
+			$revlist->assign("review"   , $reviews['review']);
+			$revlist->assign("chapter", (isset($chaptitle) ? _CHAPTER." $chapnum: $chaptitle" : ($story['title'] ? $story['title'] : _NONE)) );
+			$revlist->assign("reviewdate", date("$dateformat", $reviews['date']) );
+			$revlist->assign("rating", ratingpics($reviews['rating']) );
+			$revlist->assign("member", $member );
+			$revlist->assign("oddeven", "odd");
+			$output .= $revlist->getOutputContent( );
+			$output .= "<form method=\"POST\" enctype=\"multipart/form-data\" action=\"user.php?action=revres\">";
+			$output .= "<INPUT type=\"hidden\" name=\"rid\" value=\"$reviewid\">
+				<div style=\"text-align: center;\"><label for=\"response\">"._AUTHORSRESPONSE.":</label><span style='clear: left;'>&nbsp;</span></div>
+				<div class='shorttextarea'><textarea class=\"textbox\" name=\"response\" id=\"response\" style='width: 100%;' rows=\"5\"></TEXTAREA></div>";
+			if($tinyMCE) 
+				$output .= "<div class='tinytoggle'><input type='checkbox' name='toggle' onclick=\"toogleEditorMode('response');\" checked><label for='toggle'>"._TINYMCETOGGLE."</label></div>";
+			$output .= "<div style=\"text-align: center;\"><INPUT type=\"submit\" class=\"button\" name=\"submit\" id=\"submit\" value=\""._SUBMIT."\"></div></form>";
+		}
+		else accessDenied( );
+	}
+?>

file:b/user/seriesby.php (new)
--- /dev/null
+++ b/user/seriesby.php
@@ -1,1 +1,43 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+$countquery = dbquery(_SERIESCOUNT." WHERE uid = '$uid'");
+list($numseries) = dbrow($countquery);
+if($numseries) {
+	$count = 0;
+	$tpl->newBlock("listings");
+	$tpl->assign("seriesheader", "<div class='sectionheader'>"._SERIESBY." $penname</div>");
+	$seriesquery = dbquery(_SERIESQUERY." AND series.uid = '$uid' LIMIT $offset, $itemsperpage");
+	while($stories = dbassoc($seriesquery)) {
+		include("includes/seriesblock.php");
+	}
+	$tpl->gotoBlock("listings");
+	if($numseries > $itemsperpage) $tpl->assign("pagelinks", build_pagelinks("viewuser.php?action=seriesby&amp;uid=$uid&amp;", $numseries, $offset));
+	$tpl->gotoBlock("_ROOT");
+}
+else $output .= write_message(_NORESULTS);
+?>
+

file:b/user/stats.php (new)
--- /dev/null
+++ b/user/stats.php
@@ -1,1 +1,133 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+
+$stat = isset($_GET['stat']) ? $_GET['stat'] : false;
+if(!empty($_GET['favstor'])) $stat = "favstor";
+if(!empty($_GET['favseries'])) $stat = "favseries";
+if(!empty($_GET['favauthor'])) $stat = "favauthor";
+if(!isset($uid)) {
+	$uid = USERUID;
+	$pagetitle =  "<div id='pagetitle'>"._YOURSTATS."</div>";
+	$penname = USERPENNAME;
+}
+else {
+	$authquery = dbquery("SELECT "._PENNAMEFIELD." FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '$uid'");
+	list($penname) = dbrow($authquery);
+	$pagetitle = "<div class='sectionheader'>"._STATSFOR." ".$penname."</div>";
+}
+$output = $pagetitle;
+$storyquery = dbquery("SELECT s.title, s.sid, s.rating, s.reviews, s.count, count(fs.item) as fscount FROM ".TABLEPREFIX."fanfiction_stories as s LEFT JOIN ".TABLEPREFIX."fanfiction_favorites as fs ON s.sid = fs.item AND fs.type = 'ST' LEFT JOIN ".TABLEPREFIX."fanfiction_coauthors AS c ON s.sid = c.sid WHERE (s.uid = '$uid' OR c.uid = '$uid') AND s.validated > 0 GROUP BY s.sid");
+$storycount = dbnumrows($storyquery);
+$thislink = basename($_SERVER['PHP_SELF']).(basename($_SERVER['PHP_SELF']) == "viewuser.php" ? "?uid=$uid&amp;" : "?");
+$authorof[] = "<a href='".$thislink."action=stats&amp;stat=stories'>$storycount "._STORIES."</a>";
+if($stat == "stories" && dbnumrows($storyquery)) {
+	$hidechapters = isset($_GET["chapters"]) ? $_GET["chapters"] : false;
+	$output .= "<p style=\"text-align: right; margin: 1em;\"><a href=\"{$thislink}action=stats&amp;stat=stories&amp;chapters=".($hidechapters != "view" ? "view\">"._VIEWCHAPTERS : "hide\">"._HIDECHAPTERS)."</a></p>
+		<table cellpadding=\"3\" cellspacing=\"0\" style=\"width: 90%; margin: 0 auto;\" class=\"tblborder\"><tr><th>"._STORIES."</th>".($reviewsallowed ? "<th>"._REVIEWS."</th>" : "").($favorites ? "<th>"._FAVORITE."</th>" : "")."<th>"._READS."</th></tr>";
+	while($story = dbassoc($storyquery)) {
+		$output .= "<tr><td class=\"tblborder\"><a href=\"viewstory.php?sid=".$story['sid']."\">".$story['title']."</a> ".ratingpics($story['rating'])."</td>".
+			($reviewsallowed ? "<td class=\"tblborder\" align=\"center\"><a href=\"reviews.php?type=ST&amp;item=".$story['sid']."\">".$story['reviews']."</a></td>" : "").
+			($favorites ? "<td class=\"tblborder\" align=\"center\">".($story['fscount'] ? "<a href=\"".$thislink."action=stats&amp;favstor=".$story['sid']."\">".$story['fscount']."</a>" : $story['fscount'])."</td>" : "")."
+			<td class=\"tblborder\" align=\"center\">".(isset($story['count']) ? $story['count'] : 0 )."</td></tr>";
+		if($hidechapters && $hidechapters != "hide") {
+			$query2 = dbquery("SELECT chapid, title, inorder, rating, reviews, validated, count FROM ".TABLEPREFIX."fanfiction_chapters WHERE sid = '".$story['sid']."' ORDER BY inorder"); 
+			while($chapter = dbassoc($query2)) {
+				$output .= "<tr><td class=\"tblborder\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"viewstory.php?sid=".$story['sid']."&amp;chapid=".$chapter['chapid']."\">".$chapter['title']."</a> ".ratingpics($chapter['rating'])."</td>".
+				($reviewsallowed ? "<td class=\"tblborder\" align=\"center\">".($chapter['reviews'] ? "<a href=\"reviews.php?type=ST&amp;item=".$story['sid']."&amp;chapid=".$chapter['chapid']."\">".$chapter['reviews']."</a>" : "0")."</td>" : "").
+				($favorites ? "<td class=\"tblborder\" align=\"center\"> --- </td>" : "")."
+				<td class=\"tblborder\" align=\"center\">".(isset($chapter['count']) ? $chapter['count'] : 0 )."</td></tr>";			}
+		}
+	}
+	$output .= "</table>";
+	if(dbnumrows($storyquery) < 1) $output .= write_message(_NORESULTS);
+}
+$seriesquery = dbquery("SELECT s.title, s.seriesid, s.rating, s.reviews, count(fs.item) as count FROM ".TABLEPREFIX."fanfiction_series as s LEFT JOIN ".TABLEPREFIX."fanfiction_favorites as fs ON s.seriesid = fs.item AND fs.type = 'SE' WHERE s.uid = '$uid' GROUP BY s.seriesid");
+$seriescount = dbnumrows($seriesquery);
+$authorof[] =  "<a href='".$thislink."action=stats&amp;stat=series'>$seriescount "._SERIES."</a>";
+if($stat == "series" && dbnumrows($seriesquery)) {
+	$output .= "<center><h4>"._SERIES."</h4></center><table class=\"tblborder\"  width=\"90%\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\"><tr><th>"._TITLE."</th>".($reviewsallowed ? "<th>"._REVIEWS."</th>" : "").($favorites ? "<th>"._FAVORITE."</th>" : "")."</tr>";
+	while($series = dbassoc($seriesquery)) {
+		$output .= "<tr><td class=\"tblborder\"><a href=\"series.php?seriesid=$series[seriesid]\">".stripslashes($series['title'])."</a> ".ratingpics($series['rating'])."</td>".($reviewsallowed ? "<td class=\"tblborder\" align=\"center\"><a href=\"reviews.php?type=SE&amp;item=$series[seriesid]\">$series[reviews]</a></td>" : "").($favorites ? "<td class=\"tblborder\" align=\"center\">".($series['count'] ? "<a href=\"user.php?action=stats&amp;favseries=$series[seriesid]\">$series[count]</a>" : "0")."</td>" : "")."</td></tr>";
+		$serieslist[] = $series['seriesid'];
+	}
+	$output .= "</table>";
+}
+$reviewquery = dbquery("SELECT count(reviewid) FROM ".TABLEPREFIX."fanfiction_reviews WHERE uid = '$uid' AND review != 'No Review'");
+list($reviewcount) = dbrow($reviewquery);
+$authorof[] = "<a href='".$thislink."action=reviewsby'>$reviewcount "._REVIEWS."</a>";
+$aocode = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'AO'");
+while($ao = dbassoc($aocode)) {
+	eval($ao['code_text']);
+}
+if(empty($stat)) $output .= "<div class='authorstats'><span class='label'>"._AUTHOROF."</span> ". implode(", ", $authorof)."</div>";
+if($favorites) {
+	$favof = dbquery("SELECT count(uid) FROM ".TABLEPREFIX."fanfiction_favorites WHERE item = '$uid' AND type = 'AU'");
+	list($favcount) = dbrow($favof);
+	if(isset($_GET['favstor']) && isNumber($_GET['favstor'])) {
+		$favstor = $_GET['favstor'];
+		$squery = "SELECT title FROM ".TABLEPREFIX."fanfiction_stories WHERE sid = '$favstor' LIMIT 1";
+		$story = dbquery($squery);
+		list($title) = dbrow($story);
+		$output =  "<div class='sectionheader'>"._FAVORITE.": $title</div>";
+		$countquery = "SELECT count(uid) FROM ".TABLEPREFIX."fanfiction_favorites WHERE type = 'ST' AND item = '$favstor'";
+		$authorquery = "SELECT ap.stories, "._PENNAMEFIELD." as penname, "._UIDFIELD." as uid FROM ".TABLEPREFIX."fanfiction_favorites as fav LEFT JOIN "._AUTHORTABLE." ON fav.uid = "._UIDFIELD." LEFT JOIN  ".TABLEPREFIX."fanfiction_authorprefs AS ap ON ap.uid = fav.uid WHERE fav.item = '$favstor' AND fav.type = 'ST' GROUP BY fav.uid";
+		$pagelink= $thislink."action=stats&amp;favstor=$favstor".($offset > 0 ? "&amp;offset=$offset" : "")."&amp;";
+		include("includes/members_list.php");
+	}
+	else if(isset($_GET['favseries']) && isNumber($_GET['favseries'])) {
+		$favseries = $_GET['favseries'];
+		$story = dbquery("SELECT title FROM ".TABLEPREFIX."fanfiction_series WHERE seriesid = '$favseries' LIMIT 1");
+		list($title) = dbrow($story);
+		$output =  "<div class='sectionheader'>"._FAVORITE.": $title</div>";
+		$countquery = "SELECT count(uid) FROM ".TABLEPREFIX."fanfiction_favorites WHERE item = '$favseries' AND type = 'SE'";
+		$authorquery = "SELECT ap.stories,"._PENNAMEFIELD." as penname, "._UIDFIELD." as uid FROM ".TABLEPREFIX."fanfiction_favorites as fav LEFT JOIN "._AUTHORTABLE." ON fav.uid = "._UIDFIELD." LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs AS ap ON ap.uid = fav.uid WHERE fav.item = '$favseries' AND fav.type = 'SE' GROUP BY fav.uid";
+		$pagelink= $thislink."action=stats&amp;favseries=$favseries".($offset > 0 ? "&amp;offset=$offset" : "")."&amp;";
+		include("includes/members_list.php");
+	}
+	else if($stat == "favauthor") {
+		$output =  "<div class='sectionheader'>"._FAVORITE.": $penname</div>";
+		$countquery = "SELECT count(uid) FROM ".TABLEPREFIX."fanfiction_favorites WHERE item = '$uid' AND type = 'AU'";
+		$authorquery = "SELECT ap.stories, "._PENNAMEFIELD." as penname, "._UIDFIELD." as uid FROM ".TABLEPREFIX."fanfiction_favorites AS fav LEFT JOIN "._AUTHORTABLE." ON fav.uid = "._UIDFIELD." LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs as ap ON ap.uid = fav.uid WHERE  fav.item = '$uid' AND fav.type = 'AU' GROUP BY fav.uid";
+		$pagelink= $thislink."action=stats&amp;stat=favauthor".($offset > 0 ? "&amp;offset=$offset" : "")."&amp;";
+		include("includes/members_list.php");
+	}
+
+	$favlist = array( );
+	$panelquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_type = 'F' AND panel_name != 'favlist' ORDER BY panel_title ASC");
+	if(!$panelquery) $output .= write_error(_ERROR);
+	while($panel = dbassoc($panelquery)) {
+		$panellink = "";
+		if(substr($panel['panel_name'], 0, 3) == "fav" && $type = substr($panel['panel_name'], 3)) {
+			if($panel['panel_name'] == "favlist") continue;
+			$itemcount = 0;
+			$countquery = dbquery("SELECT COUNT(item) FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '$uid' AND type = '$type'");
+			list($itemcount) = dbrow($countquery);
+			$favlist[] = "<a href=\"".$thislink."action=".$panel['panel_name']."&amp;uid=$uid\">".(isset($itemcount) ? " $itemcount " : "").stripslashes($panel['panel_title'])."</a>";
+		}
+	}
+	if(empty($stat)) $output .= "<div class='authorstats'><span class='label'>"._FAVOF.": </span> <a href='".$thislink."action=stats&amp;stat=favauthor'>$favcount "._MEMBERS."</a><br /><span class='label'>".(USERUID == $uid ? _YOURFAVORITES : _FAVORITESOF." $penname").": </span>".implode(", ", $favlist)."</div>";
+}
+?>

--- /dev/null
+++ b/user/storiesby.php
@@ -1,1 +1,48 @@
+<?php
+// ----------------------------------------------------------------------
+// eFiction 3.2
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+if(!defined("_CHARSET")) exit( );
+$sort = "<form name=\"sort\" action=\"\"><label for=\"sort\">"._SORT.":</label> <select name=\"sort\" class=\"textbox\" onchange=\"if(this.selectedIndex.value != 'false') document.location = document.sort.sort.options[document.sort.sort.selectedIndex].value\"><option value=\"false\">"._OPTIONS."</option>";
+$sort .= "<option value=\"viewuser.php?".($action ? "action=".$action : "")."uid=$uid&amp;sort=alpha\">"._ALPHA."</option>";
+$sort.= "<option value=\"viewuser.php?".($action ? "action=".$action : "")."uid=$uid&amp;sort=update\">"._MOSTRECENT."</option></select></form>";
+$tpl->assign("sort", $sort);
+
+$countquery = dbquery("SELECT count(stories.sid) FROM ".TABLEPREFIX."fanfiction_stories as stories LEFT JOIN ".TABLEPREFIX."fanfiction_coauthors as coauth ON stories.sid = coauth.sid WHERE validated > 0 AND (stories.uid = '$uid' OR coauth.uid = '$uid')");
+list($numstories) = dbrow($countquery);
+if($numstories) {
+	$count = 0;
+	$tpl->newBlock("listings");
+	$tpl->assign("stories", "<div class='sectionheader'>"._STORIESBY." $penname</div>");
+	$storyquery = dbquery("SELECT stories.*, "._PENNAMEFIELD." as penname, stories.date as date, stories.updated as updated FROM ("._AUTHORTABLE.", ".TABLEPREFIX."fanfiction_stories as stories) LEFT JOIN ".TABLEPREFIX."fanfiction_coauthors as coauth ON coauth.sid = stories.sid WHERE "._UIDFIELD." = stories.uid AND stories.validated > 0 AND (stories.uid = '$uid' OR coauth.uid = '$uid') GROUP BY stories.sid "._ORDERBY." LIMIT $offset, $itemsperpage");
+	while($stories = dbassoc($storyquery)) {
+		$tpl->newBlock("storyblock");
+		include("includes/storyblock.php");
+	}
+	$tpl->gotoBlock("listings");
+	if($numstories > $itemsperpage) $tpl->assign("pagelinks", build_pagelinks("viewuser.php?action=storiesby&amp;uid=$uid".(isset($_GET['sort']) ? ($_GET['sort'] == "alpha" ? "&amp;sort=alpha" : "&amp;sort=update") : "")."&amp;", $numstories, $offset));
+	$tpl->gotoBlock("_ROOT");
+}
+else $output .= write_message(_NORESULTS);
+?>
+

file:b/version.php (new)
--- /dev/null
+++ b/version.php
@@ -1,1 +1,19 @@
+<?php
+if(!defined("_CHARSET")) exit( );
+$version = "3.5.6";
 
+/* shortcut 
+$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_stories LIKE 'date'"));
+if($tmp['Type'] == "datetime") {
+    dbquery("UPDATE " . TABLEPREFIX . "fanfiction_settings SET version = '3.5.5' WHERE sitekey = '" . SITEKEY . "'");
+}
+
+
+$tmp = dbassoc(dbquery("SHOW COLUMNS FROM " . TABLEPREFIX . "fanfiction_news LIKE 'time'"));
+ 
+if ($tmp['Type'] == "datetime")
+{
+    dbquery("UPDATE " . TABLEPREFIX . "fanfiction_settings SET version = '3.5.5' WHERE sitekey = '" . SITEKEY . "'");
+}
+
+*/

file:b/viewpage.php (new)
--- /dev/null
+++ b/viewpage.php
@@ -1,1 +1,45 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+$current = $_GET['page'];
+
+include ("header.php");
+
+//make a new TemplatePower object
+
+if(file_exists("$skindir/default.tpl")) $tpl = new TemplatePower( "$skindir/default.tpl" );
+else $tpl = new TemplatePower("default_tpls/default.tpl");
+//let TemplatePower do its thing, parsing etc.
+
+include("includes/pagesetup.php");
+
+$page = dbquery("SELECT message_title, message_text FROM ".TABLEPREFIX."fanfiction_messages WHERE ".($current ? "message_name = '".escapestring($current)."'" : "message_id = '".(isNumber($_GET['id']) ? $_GET[id] : "0")."'")." LIMIT 1");
+if(dbnumrows($page)) list($title, $text) = dbrow($page);
+else $text = write_message(_ERROR);
+if(strpos($text, "?>") === false) $tpl->assign("output", "<div id='pagetitle'>$title</div>\n\n$text");
+else {
+	eval("?>".$text."<?php ");
+	$tpl->assign("output", "<div id='pagetitle'>$title</div>\n\n$text");
+}
+$tpl->printToScreen();
+dbclose( );
+?>

file:b/viewseries.php (new)
--- /dev/null
+++ b/viewseries.php
@@ -1,1 +1,157 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional 
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+//Begin basic page setup
+$current = "series";
+
+
+include ("header.php");
+
+if(file_exists( "$skindir/default.tpl")) $tpl = new TemplatePower("$skindir/default.tpl" );
+else $tpl = new TemplatePower(_BASEDIR."default_tpls/default.tpl");
+if(file_exists("$skindir/listings.tpl")) $tpl->assignInclude( "listings", "$skindir/listings.tpl" );
+else $tpl->assignInclude( "listings", _BASEDIR."default_tpls/listings.tpl" );
+$tpl->assignInclude( "header", "$skindir/header.tpl" );
+$tpl->assignInclude( "footer", "$skindir/footer.tpl" );
+include(_BASEDIR."includes/pagesetup.php");
+
+
+$seriesid = (isset($_GET['seriesid']) && is_numeric($_GET['seriesid'])) ? escapestring($_GET['seriesid']) : false;
+$sresult = dbquery(_SERIESQUERY." AND seriesid = '$seriesid' LIMIT 1");
+$series = dbassoc($sresult);
+if(file_exists("$skindir/series_title.tpl")) $titleblock = new TemplatePower( "$skindir/series_title.tpl" );
+else $titleblock = new TemplatePower( "default_tpls/series_title.tpl" );
+$titleblock->prepare( );
+$titleblock->newBlock("series");
+$titleblock->assign("pagetitle", stripslashes($series['title'])." "._BY." <a href=\"viewuser.php?uid=".$series['uid']."\">".$series['penname']."</a>");
+$titleblock->assign("summary", stripslashes($series['summary']));
+$titleblock->assign("category", $series['catid'] ? catlist($series['catid']) : _NONE);
+$titleblock->assign("characters", $series['characters'] ? charlist($series['characters']) : _NONE);
+$titleblock->assign("numstories", $series['numstories']);
+if($series['classes']) {
+	$classes = array( );
+	foreach(explode(",", $series['classes']) as $c) {
+		$classes[$classlist[$c]['type']][] = "<a href='browse.php?type=class&amp;type_id=".$classlist["$c"]['type']."&amp;classid=$c'>".$classlist[$c]['name']."</a>";
+	}
+}
+$allclasslist = "";
+foreach($classtypelist as $num => $c) {
+	if(isset($classes[$num])) {
+		$titleblock->assign($c['name'], implode(", ", $classes[$num]));
+		$allclasslist .= "<span class='label'>".$c['title'].": </span> ".implode(", ", $classes[$num])."<br />";
+	}
+	else {
+		$titleblock->assign($c['name'], _NONE);
+		$allclasslist .= "<span class='label'>".$c['title'].": </span> "._NONE."<br />";
+	}
+}
+$seriesType = array(_CLOSED, _MODERATED, _OPEN);
+$titleblock->assign("open", $seriesType[$series['isopen']]);
+$codeblocks = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'seriestitle'");
+while($code = dbassoc($codeblocks)) {
+	eval($code['code_text']);
+}
+$titleblock->assign("classifications", $allclasslist);
+if(isADMIN) $titleblock->assign("adminoptions", "<div class=\"adminoptions\">"._ADMINOPTIONS.": [<a href=\"series.php?action=add&amp;add=stories&amp;seriesid=$seriesid\">"._ADD2SERIES."</a>] [<a href=\"series.php?action=edit&amp;seriesid=$seriesid\">"._EDIT."</a>] [<a href=\"series.php?action=delete&amp;seriesid=$seriesid\">"._DELETE."</a>]</div>");
+$jumpmenu = "";
+if($reviewsallowed && (isMEMBER || $anonreviews)) {
+	$titleblock->assign("score", ratingpics($series['rating']));
+	$titleblock->assign("reviews", "<a href=\"reviews.php?type=SE&amp;item=$seriesid\">"._REVIEWS."</a>");
+	$titleblock->assign("numreviews", "<a href=\"reviews.php?type=SE&amp;item=$seriesid\">".$series['reviews']."</a>");
+	$titleblock->assign("submitreviews", "<a href=\"reviews.php?action=add&amp;type=SE&amp;item=$seriesid\">"._SUBMITREVIEW."</a>");
+	$jumpmenu .= "<option value=\"reviews.php?action=add&amp;type=SE&amp;item=$seriesid\">"._SUBMITREVIEW."</option>";
+}
+if(isMEMBER && $favorites) {
+	$addtofaves = "[<a href=\"user.php?action=favse&amp;uid=".USERUID."&amp;add=$seriesid\">"._ADDSERIES2FAVES."</a>]";
+	$jumpmenu .= "<option value=\"user.php?action=favse&amp;uid=".USERUID."&amp;add=$seriesid\">"._ADDSERIES2FAVES."</option>";
+	if($series['isopen'] == 0) { // Only closed series.
+		$addtofaves .= " [<a href=\"user.php?action=favau&amp;uid=".USERUID."&amp;add=".$series['uid']."\">"._ADDAUTHOR2FAVES."</a>]";
+		$jumpmenu .= "<option value=\"user.php?action=favau&amp;uid=".USERUID."&amp;add=".$series['uid']."\">"._ADDAUTHOR2FAVES."</option>";
+	}
+}
+if($series['isopen'] && isMEMBER) {
+	$jumpmenu .= "<option value=\"series.php?action=add&amp;add=stories&amp;seriesid=".$seriesid."&amp;stories=".USERUID."\">"._ADD2SERIES."</option>";
+	$titleblock->assign("addtoseries", "[<a href='series.php?action=add&amp;add=stories&seriesid=$seriesid&amp;stories=".USERUID."'>"._ADD2SERIES."</a>]");
+}
+$jumpmenu = "<form name=\"jump2\" action=\"\"><select name=\"jump2\" onchange=\"if(this.selectedIndex.value != 'false') document.location = document.jump2.jump2.options[document.jump2.jump2.selectedIndex].value\"><option value=\"false\">"._OPTIONS."</option>".$jumpmenu."</select></form>";
+$titleblock->assign("jumpmenu", $jumpmenu);
+if(isset($addtofaves)) $titleblock->assign("addtofaves", $addtofaves);
+$parents = dbquery("SELECT s.title, s.seriesid FROM ".TABLEPREFIX."fanfiction_inseries as i, ".TABLEPREFIX."fanfiction_series as s WHERE s.seriesid = i.seriesid AND i.subseriesid = '$seriesid'");
+$plinks = array( );
+while($p = dbassoc($parents)) {
+	$plinks[] = "<a href='series.php?seriesid=".$p['seriesid']."'>".$p['title']."</a>";
+}
+$titleblock->assign("parentseries", count($plinks) ? implode(", ", $plinks) : _NONE);
+$codeblocks = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'seriestitle'");
+while($code = dbassoc($codeblocks)) {
+	eval($code['code_text']);
+}
+$output = $titleblock->getOutputContent( );
+$cquery = dbquery("SELECT subseriesid, sid, inorder FROM ".TABLEPREFIX."fanfiction_inseries WHERE seriesid = '$seriesid' AND confirmed = 1");
+$scount = dbnumrows($cquery);
+$serieslist = array( );
+if($scount) {
+	$subs = array( );
+	$stories = array( );
+	while($item = dbassoc($cquery)) {
+		if($item['subseriesid']) $subs[$item['inorder']] = $item['subseriesid'];
+		else $stories[$item['inorder']] = $item['sid'];
+	}
+	if(count($subs) > 0) {
+		$subsquery = dbquery(_SERIESQUERY." AND FIND_IN_SET(seriesid, '".implode(",", $subs)."') > 0");
+		while($sub = dbassoc($subsquery)) {
+			$serieslist[array_search($sub['seriesid'], $subs)] = $sub;
+		}
+	}
+	if(count($stories)) {
+		$seriesstoryquery = dbquery(_STORYQUERY." AND FIND_IN_SET(sid, '".implode(",", $stories)."') > 0");
+		while($story = dbassoc($seriesstoryquery)) {
+			$serieslist[array_search($story['sid'], $stories)] = $story;
+		}
+	}
+}
+ksort($serieslist);
+$count = 0;
+for($a = $offset + 1; $a <= $itemsperpage + $offset; $a++) {
+	$tpl->newBlock("listings");
+	$stories = isset($serieslist[$a]) ? $serieslist[$a] : false;
+	if(isset($stories['seriesid'])) {
+		$tpl->newBlock("seriesblock");
+		include("includes/seriesblock.php");
+	}
+	else if(isset($stories['sid'])) {
+		$tpl->newBlock("storyblock");
+		include("includes/storyblock.php");
+// print_r($stories);
+	}
+	$tpl->gotoBlock("_ROOT");
+}
+if($scount > $itemsperpage) {
+	$tpl->gotoBlock("listings");
+	$tpl->assign("pagelinks", build_pagelinks("viewseries.php?seriesid=$seriesid&amp;", $scount, $offset));
+}
+$tpl->gotoBlock( "_ROOT" );
+$tpl->assign("output", $output);
+$tpl->printToScreen( );
+
+?>

file:b/viewstory.php (new)
--- /dev/null
+++ b/viewstory.php
@@ -1,1 +1,405 @@
-
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Valid HTML 4.01 Transitional
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
+
+
+$current = "viewstory";
+
+include ("header.php");
+if(isset($_GET['action'])) $action = $_GET['action'];
+else $action = false;
+if(isset($_GET['textsize']) && isNumber($_GET['textsize'])) $textsize = $_GET['textsize'];
+else $textsize = 0;
+if(empty($chapter)) $chapter = isset($_GET['chapter']) && isNumber($_GET['chapter']) ? $_GET['chapter'] : false;
+
+	// Get the story information
+	$storyquery = dbquery("SELECT "._PENNAMEFIELD." as penname, "._UIDFIELD." as uid, story.*, story.date as date, story.updated as updated, story.validated as valid FROM ".TABLEPREFIX."fanfiction_stories as story, "._AUTHORTABLE." WHERE story.sid = '".$sid."' AND story.uid = "._UIDFIELD);
+	$storyinfo = dbassoc($storyquery);
+	if($storyinfo['coauthors'] == 1) {
+	$array_coauthors = array();
+		$coauth = dbquery("SELECT "._PENNAMEFIELD." as penname, co.uid FROM ".TABLEPREFIX."fanfiction_coauthors AS co LEFT JOIN "._AUTHORTABLE." ON co.uid = "._UIDFIELD." WHERE co.sid = '".$sid."'");
+		while($c = dbassoc($coauth)) {
+		$array_coauthors[$c['uid']] = $c['penname'];
+		}
+		$storyinfo['coauthors'] = $array_coauthors;
+		unset($array_coauthors);
+	}
+	else $storyinfo['coauthors'] = array();
+	//  Check that the story is valid and that the visitor has permissions to read this story
+	$warning = "";
+	if(!$storyinfo) $warning = _INVALIDSTORY;
+	if(!$storyinfo['valid'] && !isADMIN && ($storyinfo['uid'] != USERUID || !in_array(USERUID, $storyinfo['coauthors']))) $warning = _ACCESSDENIED;
+	$ratingquery = dbquery("SELECT ratingwarning, warningtext FROM ".TABLEPREFIX."fanfiction_ratings WHERE rid = '".$storyinfo['rid']."' LIMIT 1");
+	$rating = dbassoc($ratingquery);
+	$warninglevel = sprintf("%03b", $rating['ratingwarning']);
+	$title = $storyinfo['title'];
+	if($warninglevel[0] && !isMEMBER) $warning = _RUSERSONLY."<br />";
+	else if($warninglevel[1] && empty($_SESSION[SITEKEY."_ageconsent"]) && !$ageconsent) $warning = _AGECHECK."<br /><a href='viewstory.php?sid=".$storyinfo['sid']."&amp;ageconsent=ok&amp;warning=".$storyinfo['rid']."'>".$rating['warningtext']."</a>";
+	else if($warninglevel[2] && empty($_SESSION[SITEKEY."_warned"][$storyinfo['rid']])) {
+		$warning = $rating['warningtext']."<br /><a href='viewstory.php?sid=".$storyinfo['sid']."&amp;warning=".$storyinfo['rid']."'>"._CONTINUE."</a>";
+	}
+
+	// if the above checks came back with a warning, output an error page.
+	if(!empty($warning)) {
+		$current = "storyerror";
+		// load our template files to set up the page.
+		if(file_exists("$skindir/default.tpl")) $tpl = new TemplatePower( "$skindir/default.tpl" );
+		else $tpl = new TemplatePower("default_tpls/default.tpl");
+		include("includes/pagesetup.php");
+		$tpl->assign("output", "<div id='pagetitle'>".$title."</div>".write_error($warning));
+		$tpl->printToScreen( );
+		dbclose( );
+		exit( ); 
+	}
+	// End 
+
+$reviews = ""; $numreviews = ""; $reviewslink = ""; $form = ""; $rr = "";
+
+if($action == "printable") {
+	$settingsresults = dbquery("SELECT store, storiespath FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".SITEKEY."'");
+	list($store, $storiespath) = dbrow($settingsresults);
+	if(file_exists("$skindir/printstory.tpl")) $tpl = new TemplatePower( "$skindir/printstory.tpl" );
+	else $tpl = new TemplatePower("default_tpls/printstory.tpl");
+	include("includes/pagesetup.php");
+	$tpl->assign("title", stripslashes($storyinfo['title']));
+	$tpl->assign("author", author_link($storyinfo));
+	if(empty($chapter)) $chapter = "all"; // shouldn't happen but just in case
+	$stories = $storyinfo;
+	include("includes/storyblock.php");
+	unset($stories);
+	if($chapter == "all") {
+		if($storyinfo['storynotes']) {
+			$tpl->newBlock("storynotes");
+			$tpl->assign( "storynotes", format_story($storyinfo['storynotes']));
+			$tpl->gotoBlock("_ROOT");
+		}
+		$chapterinfo = dbquery("SELECT *, "._PENNAMEFIELD." as penname FROM (".TABLEPREFIX."fanfiction_chapters as c, "._AUTHORTABLE.") WHERE sid = '$sid' AND c.uid = "._UIDFIELD." AND c.validated > 0 ORDER BY inorder");
+		while($c = dbassoc($chapterinfo)) {
+			$tpl->newBlock("storyindexblock");
+			$tpl->assign("chapternumber", $c['inorder']);
+			$tpl->assign("title", "<a href='#".$c['inorder']."'>".$c['title']."</a>");
+			$tpl->assign("author", $c['penname']);
+			$tpl->gotoBlock("_ROOT");
+			$tpl->newBlock("chapterblock");
+			$tpl->assign("chaptertitle", "<a name='".$c['inorder']."'></a>".$c['title']);
+			$tpl->assign("chapterauthor", $c['penname']);
+			if(!empty($c['notes'])) {
+				$tpl->newBlock("notes");
+				$tpl->assign( "notes", format_story($c['notes']));
+				$tpl->gotoBlock("chapterblock");
+			}
+			if($store == "files") {
+				//shouldn't happen, but somehow has on occasion. :(
+				if(!$c['uid']) {
+					errorExit( );
+				}
+				$file = STORIESPATH."/".$c['uid']."/".$c['chapid'].".txt";
+				$log_file = @fopen($file, "r");
+				$file_contents = @fread($log_file, filesize($file));
+				$story = $file_contents;
+				@fclose($log_file);
+			}
+			else $story = $c['storytext'];
+			// The following lines cleans up problems between pre-2.0 stories and 2.0 stories.  If there's html, don't send it through nl2br and then clean up smart quotes.
+			$story = format_story($story);
+			$tpl->assign("chaptertext", $story);	
+			$tpl->assign("back2top", "<a href='#1'>"._BACK2INDEX."</a>");
+			if(!empty($c['endnotes'])) {
+				$tpl->newBlock("endnotes");
+				$tpl->assign( "endnotes", format_story($c['endnotes']));
+				$tpl->gotoBlock("chapterblock");
+			}
+		}
+	}
+	else {
+		$chapterinfo = dbquery("SELECT *, "._PENNAMEFIELD." as penname FROM (".TABLEPREFIX."fanfiction_chapters as c, "._AUTHORTABLE.") WHERE sid = '$sid' AND inorder = '$chapter' AND c.uid = "._UIDFIELD." LIMIT 1");
+		$c = dbassoc($chapterinfo);
+		// if the *CHAPTER* hasn't been validated and the viewer isn't an admin or the author throw them a warning.  
+		if(empty($c['validated']) && !isADMIN && USERUID != $c['uid'] && !in_array(USERUID, $stories['coauthors'])) {
+			$warning = write_error(_ACCESSDENIED);
+			$tpl->assign("archivedat", $warning);
+			$tpl->printToScreen( );
+			dbclose( );
+			exit( );
+		}
+
+		if($c['inorder'] == 1 && !empty($storyinfo['storynotes'])) {
+			$tpl->newBlock("storynotes");
+			$tpl->assign( "storynotes", format_story($storyinfo['storynotes']));
+			$tpl->gotoBlock("_ROOT");
+		}
+
+		$tpl->newBlock("chapterblock");
+		$tpl->assign("chaptertitle", $c['title']);
+		$tpl->assign("chapternumber", $c['inorder']);
+		$tpl->assign("chapterauthor", $c['penname']);
+		if(!empty($c['notes'])) {
+			$tpl->newBlock("notes");
+			$tpl->assign( "notes", format_story($c['notes']));
+			$tpl->gotoBlock("chapterblock");
+		}
+		//shouldn't happen, but somehow has on occasion. :(
+		if($store == "files") {
+			if(!$c['uid']) {
+				errorExit( );
+			}
+			$file = STORIESPATH."/".$c['uid']."/".$c['chapid'].".txt";
+			$log_file = @fopen($file, "r");
+			$file_contents = @fread($log_file, filesize($file));
+			$story = $file_contents;
+			@fclose($log_file);
+		}
+		else $story = $c['storytext'];
+		// The following lines cleans up problems between pre-2.0 stories and 2.0 stories.  If there's html, don't send it through nl2br and then clean up smart quotes.
+		$story = format_story($story);
+		$tpl->assign("chaptertext", $story);	
+			if(!empty($c['endnotes'])) {
+				$tpl->newBlock("endnotes");
+				$tpl->assign( "endnotes", format_story($c['endnotes']));
+				$tpl->gotoBlock("chapterblock");
+			}
+	}
+	$tpl->gotoBlock("_ROOT");
+	// Hook for adding content to the printed version of the story.
+	$codeblocks = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'printstory'");
+	while($code = dbassoc($codeblocks)) {
+		eval($code['code_text']);
+	}	
+	$tpl->assign("archivedat", _ARCHIVEDAT." <a href=\"$url/viewstory.php?sid=$sid\">$url/viewstory.php?sid=$sid</a>");
+	$copyquery = dbquery("SELECT message_text FROM ".TABLEPREFIX."fanfiction_messages WHERE message_name = 'printercopyright' LIMIT 1");
+	list($copyright) = dbrow($copyquery);
+	$tpl->assign("copyright", $copyright);
+}
+else if(($displayindex && empty($chapter)) || !empty($_GET['index'])) {
+	if(file_exists("$skindir/storyindex.tpl")) $tpl = new TemplatePower( "$skindir/storyindex.tpl" );
+	else $tpl = new TemplatePower("default_tpls/storyindex.tpl");
+	include("includes/pagesetup.php");
+	$stories = $storyinfo;
+	// Hook for adding content to only the index of the story.
+	$codeblocks = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'storyindex'");
+	while($code = dbassoc($codeblocks)) {
+		eval($code['code_text']);
+	}
+	include("includes/storyblock.php");
+	$printicon = "<a href=\"viewstory.php?action=printable&amp;textsize=$textsize&amp;sid=$sid&amp;chapter=all\" target=\"_blank\"><img src='".(isset($printer) ? $printer : "images/print.gif")."' border='0' alt='"._PRINTER."'></a>";
+	if($reviewsallowed && (isMEMBER || $anonreviews))
+			$reviewslink = "<a href=\"reviews.php?action=add&amp;item=$sid&amp;next=2&amptype=ST\">"._SUBMITREVIEW."</a>";
+	$tpl->assign( "reviewslink", $reviewslink );
+	if($storyinfo['rr']) {
+		$tpl->assign("roundrobin", "[<a href=\"stories.php?action=newchapter&amp;sid=".$sid."\">"._CONTRIBUTE2RR."</a>]");
+	}
+	$tpl->assign( "printicon", $printicon );
+	$tpl->assign( "reviewform", $form);
+	$tpl->assign( "output", $output );
+	if( $storyinfo['storynotes']) {
+		$tpl->newBlock("storynotes");
+		$tpl->assign( "storynotes", format_story($storyinfo['storynotes']));
+		$tpl->gotoBlock("_ROOT");
+	}
+	$chapterinfo = dbquery("SELECT chap.*, "._PENNAMEFIELD." as penname FROM (".TABLEPREFIX."fanfiction_chapters as chap, "._AUTHORTABLE.") WHERE sid = '$sid' AND chap.uid = "._UIDFIELD." AND chap.validated > 0 ORDER BY inorder");
+	$count = 0;
+	while($chap = dbassoc($chapterinfo)) {
+		$tpl->newBlock("storyindexblock");
+		$tpl->assign("chapternumber", $chap['inorder']);
+		$tpl->assign("title", "<a href=\"viewstory.php?sid=$sid&amp;chapter=".$chap['inorder']."\">".$chap['title']."</a>");
+		$tpl->assign("author", "<a href='viewuser.php?uid=".$chap['uid']."'>".$chap['penname']."</a>");
+		$tpl->assign("printicon", "<a href=\"viewstory.php?action=printable&amp;textsize=$textsize&amp;sid=$sid&amp;chapter=".$chap['inorder']."\" target=\"_blank\"><img src='".(isset($printer) ? $printer : "images/print.gif")."' border='0' alt='"._PRINTER."'></a>");
+		$tpl->assign("ratingpics", ratingpics($chap['rating']));
+		if($reviewsallowed) {
+			$tpl->assign("reviews", "<a href=\"reviews.php?type=ST&amp;item=$sid&amp;chapid=".$chap['chapid']."\">"._REVIEWS."</a>");
+			$tpl->assign("numreviews", "<a href=\"reviews.php?type=ST&amp;item=$sid&amp;chapid=".$chap['chapid']."\">".$chap['reviews']."</a>");
+		}
+		if(isADMIN) 
+			$tpl->assign("adminoptions", "<div class=\"adminoptions\"><span class='label'>"._ADMINOPTIONS.":</span> <a href=\"stories.php?action=editchapter&amp;sid=$sid&amp;chapid=".$chap['chapid']."&amp;admin=1\">"._EDIT."</a> | <a href=\"stories.php?action=delete&amp;sid=$sid&amp;chapid=".$chap['chapid']."&amp;admin=1\">"._DELETE."</a> </div>");
+		$tpl->assign("wordcount", $chap['wordcount']);
+		$tpl->assign("chapternotes", format_story($chap['notes']));
+		$tpl->assign("count", ($chap['count'] ? $chap['count'] : 0) );
+		$tpl->assign("oddeven",  ($count % 2 ? "odd" : "even"));
+		$tpl->gotoBlock("_ROOT");
+		$count++;
+	}
+}
+else {
+	if(file_exists("$skindir/viewstory.tpl")) $tpl = new TemplatePower( "$skindir/viewstory.tpl" );
+	else $tpl = new TemplatePower("default_tpls/viewstory.tpl");
+	include("includes/pagesetup.php");
+	$jumpmenu = "";
+	$jumpmenu2 = "";
+	if(empty($chapter) || !$chapter) $chapter = 1;
+	// get information about the story's chapter(s)
+	$chapterinfo = dbquery("SELECT chap.*, "._PENNAMEFIELD." as penname FROM (".TABLEPREFIX."fanfiction_chapters as chap, "._AUTHORTABLE.") WHERE sid = '$sid' AND chap.uid = "._UIDFIELD." ORDER BY inorder");
+	$chapters = dbnumrows($chapterinfo);
+	if($chapters > 1) {
+		$printicon = "<img src='".(isset($printer) ? $printer : "images/print.gif")."' border='0' alt='"._PRINTER."'> <a href=\"viewstory.php?action=printable&amp;textsize=$textsize&amp;sid=$sid&amp;chapter=$chapter\" target=\"_blank\">"._CHAPTER."</a> "._OR." <a href=\"viewstory.php?action=printable&amp;textsize=$textsize&amp;sid=$sid&amp;chapter=all\" target=\"_blank\">"._STORY."</a>";
+		$jumpmenu .= "<form name=\"jump\" action=\"\">";
+		if($chapter > 1) 
+			$prev = "<a href=\"viewstory.php?sid=$sid&amp;".($textsize ? "textsize=$textsize&amp;" : "")."chapter=".($chapter-1)."\" class=\"prev\">"._PREVIOUS."</a> ";
+		$jumpmenu .= "<select class=\"textbox\" name=\"chapter\" onchange=\"if(document.jump.chapter.selectedIndex.value != $chapter) document.location = 'viewstory.php?sid=$sid&amp;textsize=$textsize&amp;chapter=' + document.jump.chapter.options[document.jump.chapter.selectedIndex].value\">";
+		while($chap = dbassoc($chapterinfo)) {
+			if($chap['validated']) $jumpmenu .= "<option value='".$chap['inorder']."'".(isset($chapter) && $chap['inorder'] == $chapter ? " selected" : "").">".$chap['inorder'].". ".stripslashes($chap['title'])."</option>";
+			if($chap['inorder'] == $chapter) {
+				$inorder = $chapter;
+				$notes = isset($chap['notes']) ? format_story($chap['notes']) : false;
+				$endnotes = isset($chap['endnotes']) ? format_story($chap['endnotes']) : false;
+				$chapid = $chap['chapid'];
+				$story = stripslashes($chap['storytext']);
+				$chapterauthor = $chap['uid'];
+				$chapterpenname = $chap['penname'];
+				$valid = $chap['validated'];
+				$chaptertitle = stripslashes($chap['title']);
+			}
+		}
+		$jumpmenu .= "</select>";
+		if($chapter < $chapters) {
+			$nextchapter = $chapter + 1;
+			$next = "<a href=\"viewstory.php?sid=$sid&amp;textsize=$textsize&amp;chapter=".($chapter+1)."\" class=\"next\">"._NEXT."</a>";
+		}
+		else {
+			$nextchapter = "";
+			// Hook for adding content to only the end of the story.
+			$codeblocks = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'storyend'");
+			while($code = dbassoc($codeblocks)) {
+				eval($code['code_text']);
+			}
+		}
+		$jumpmenu .= "</form>";
+	}
+	// if the story has only one chapter this is what happens
+	else {
+		$chapter = dbassoc($chapterinfo);
+		$chapterauthor = $chapter['uid'];
+		$chapterpenname = $chapter['penname'];
+		$chaptertitle = $chapter['title'];
+		$chapid = $chapter['chapid'];
+		$title = stripslashes($chapter['title']);
+		$inorder = $chapter['inorder'];
+		$notes = format_story($chapter['notes']);
+		$endnotes = format_story($chapter['endnotes']);
+		$story = $chapter['storytext'];
+		$valid = $chapter['validated'];
+		$nextchapter = "";
+		$codeblocks = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'storyend'");
+		while($code = dbassoc($codeblocks)) {
+			eval($code['code_text']);
+		}
+		$printicon = "<a href=\"viewstory.php?action=printable&amp;sid=$sid&amp;textsize=$textsize&amp;chapter=1\" target=\"_blank\"><img src='".(isset($printer) ? $priner : "images/print.gif")."' border='0' alt='"._PRINTER."'></a>";
+	}
+	// if the *CHAPTER* hasn't been validated and the viewer isn't an admin or the author throw them a warning.  
+	if(!$valid && !isADMIN && USERUID != $chapterauthor && !in_array($chapterauthor, $storyinfo['coauthors'])) {
+		$warning = accessDenied( );
+	}
+	$stories = $storyinfo;
+	$tpl->gotoBlock("_ROOT");
+	$jumpmenu2 = ""; 
+	include("includes/storyblock.php");
+	unset($adminlinks);
+	if(isADMIN && uLEVEL < 3) 
+		$adminlinks = "<div class=\"adminoptions\"><span class='label'>"._ADMINOPTIONS.":</span> "._EDIT." - <a href=\"stories.php?action=editstory&amp;sid=$sid&amp;admin=1\">"._STORY."</a> "._OR." <a href=\"stories.php?action=editchapter&amp;chapid=$chapid&amp;admin=1\">"._CHAPTER."</a> | "._DELETE." - <a href=\"stories.php?action=delete&amp;sid=$sid&amp;admin=1\">"._STORY."</a> "._OR." <a href=\"stories.php?action=delete&amp;chapid=$chapid&amp;sid=$sid&amp;admin=1\">"._CHAPTER."</a></div>";
+	if(isMEMBER && $favorites) {
+		$jumpmenu2 .= "<option value=\"user.php?action=favst&amp;add=1&amp;sid=$sid\">"._ADDSTORY2FAVES."</option><option value=\"user.php?action=favau&amp;add=1&amp;author=".$stories['uid'].(count($storyinfo['coauthors']) ? ",".implode(",", array_keys($storyinfo['coauthors'])) : "")."\">"._ADDAUTHOR2FAVES."</option>";
+	}
+	if($reviewsallowed ) {
+		if(isMEMBER || $anonreviews) {
+			$reviewslink = "<a href=\"reviews.php?action=add&amp;type=ST&amp;item=$sid&amp;chapid=$chapid&amp;next=$nextchapter\">"._SUBMITREVIEW."</a>";
+			$jumpmenu2 .= "<option value=\"reviews.php?action=add&amp;type=ST&amp;item=$sid&amp;chapid=$chapid&amp;next=$nextchapter\">"._SUBMITREVIEW."</option>";
+		}
+		else $reviewslink = write_message(sprintf(_LOGINTOREVIEW, strtolower($pagelinks['login']['link']), strtolower($pagelinks['register']['link'])));
+	}
+	$tpl->assign("reportthis", "[<a href=\""._BASEDIR."contact.php?action=report&amp;url=viewstory.php?chapid=$chapid\">"._REPORTTHIS."</a>]");
+	$jumpmenu2 .= "<option value=\"contact.php?action=report&amp;url=viewstory.php?chapid=$chapid\">"._REPORTTHIS."</option>";
+	if($stories['rr']) {
+		$rr = "[<a href=\"stories.php?action=newchapter&amp;sid=".$sid."\">"._CONTRIBUTE2RR."</a>]";
+		$jumpmenu2 .= "<option value=\"stories.php?action=newchapter&amp;sid=".$sid."\">"._CONTRIBUTE2RR."</option>";
+	}
+	if(isset($jumpmenu2)) $jumpmenu2 = "<form name=\"jump2\" action=\"\"><select class=\"textbox\" name=\"jump2\" onchange=\"if(this.selectedIndex.value != 'false') document.location = document.jump2.jump2.options[document.jump2.jump2.selectedIndex].value\"><option value=\"false\">"._OPTIONS."</option>".$jumpmenu2."</select></form>";
+	if($reviewsallowed) {
+		if(isMEMBER || $anonreviews) {
+			$item = $sid;
+			$type = "ST";
+			include("includes/reviewform.php");
+		}
+		else $form = write_message(sprintf(_LOGINTOREVIEW, strtolower($pagelinks['login']['link']), strtolower($pagelinks['register']['link'])));
+	}
+	$textsizer = "<a href=\"viewstory.php?sid=$sid".($inorder ? "&amp;chapter=$inorder" : "")."&amp;textsize=".($textsize - 1)."\">-</a> <strong>". _TEXTSIZE. "</strong> <a href=\"viewstory.php?sid=$sid".($inorder ? "&amp;chapter=$inorder" : "")."&amp;textsize=".($textsize + 1)."\">+</a> ";
+	// okay now that we know they can see the story and the chapter add 1 to the story and chapter counts;
+	if(empty($viewed) || (is_array($viewed) && !in_array($sid, $viewed))) {
+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET count = count + 1 WHERE sid = '$sid'  LIMIT 1");
+		$viewed[] = $sid;
+		$_SESSION[SITEKEY."_viewed"] = $viewed;
+	}
+	dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET count = count + 1 WHERE chapid = '$chapid' LIMIT 1");
+	// end counters
+	// if the text of the chapters is being stored in files we need to get that text here
+	if($store == "files") {
+		//shouldn't happen, but somehow has on occasion. :(
+		if(!$chapterauthor) {
+			errorExit(_ERROR);
+		}
+		$file = STORIESPATH."/$chapterauthor/$chapid.txt";
+		$log_file = @fopen($file, "r");
+		$file_contents = @fread($log_file, filesize($file));
+		$story = $file_contents;
+		@fclose($log_file);
+	}
+	$story = format_story($story);
+	if(isset($adminlinks)) $tpl->assign( "adminlinks", $adminlinks );
+	$tpl->assign( "printicon", $printicon );
+	$tpl->assign( "output", $output );
+	if($inorder == 1 && !empty($storyinfo['storynotes'])) {
+		$tpl->gotoBlock("_ROOT");
+		$tpl->newBlock("storynotes");
+		$tpl->assign( "storynotes", stripslashes($storyinfo['storynotes']));
+		$tpl->gotoBlock("_ROOT");
+	}
+	if(!empty($notes)) {
+		$tpl->newBlock("notes");
+		$tpl->assign( "notes", $notes);
+		$tpl->gotoBlock("_ROOT");
+	}
+	if(!empty($endnotes)) {
+		$tpl->newBlock("endnotes");
+		$tpl->assign( "endnotes", $endnotes);
+		$tpl->gotoBlock("_ROOT");
+	}
+	$tpl->gotoBlock("_ROOT");
+	$tpl->assign("chaptertitle", $chaptertitle);
+	$tpl->assign("chapternumber", $inorder);
+	$tpl->assign( "story", "<span style=\"font-size: ".(100 + ($textsize * 20))."%;\">$story</span>" );
+	$tpl->assign("textsizer", $textsizer);
+	if(isset($jumpmenu)) $tpl->assign( "jumpmenu", $jumpmenu);
+	if(isset($jumpmenu2)) $tpl->assign( "jumpmenu2", $jumpmenu2);
+	$tpl->assign( "roundrobin", $rr );
+	$tpl->assign( "reviewform", $form);
+	if(isset($addtofaves)) $tpl->assign( "addtofaves", $addtofaves );
+	if(isset($next)) $tpl->assign( "next", $next );
+	if(isset($prev)) $tpl->assign( "prev", $prev );
+
+}
+// Hook for adding content to view story pages.
+$codeblocks = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'viewstory'");
+while($code = dbassoc($codeblocks)) {
+	eval($code['code_text']);
+}
+$tpl->printToScreen();
+dbclose( );
+
+?>

file:b/viewuser.php (new)
--- /dev/null
+++ b/viewuser.php
@@ -1,1 +1,127 @@
+<?php
+// ----------------------------------------------------------------------
+// Copyright (c) 2007 by Tammy Keefer
+// Based on eFiction 1.1
+// Copyright (C) 2003 by Rebecca Smallwood.
+// http://efiction.sourceforge.net/
+// ----------------------------------------------------------------------
+// LICENSE
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License (GPL)
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// To read the license please visit http://www.gnu.org/copyleft/gpl.html
+// ----------------------------------------------------------------------
 
+// Identify the current page for the pagelinks etc.
+$current = "viewuser";
+
+// Include some files for page setup and core functions
+
+include ("header.php");
+
+//make a new TemplatePower object
+if(file_exists("$skindir/user.tpl")) $tpl = new TemplatePower( "$skindir/user.tpl" );
+else $tpl = new TemplatePower("default_tpls/user.tpl");
+if(file_exists("$skindir/listings.tpl")) $tpl->assignInclude( "listings", "./$skindir/listings.tpl" );
+else $tpl->assignInclude( "listings", "./default_tpls/listings.tpl" );
+$tpl->assignInclude( "header", "./$skindir/header.tpl" );
+$tpl->assignInclude( "footer", "./$skindir/footer.tpl" );
+if(file_exists("$skindir/profile.tpl")) $tpl->assignInclude("profile", "$skindir/profile.tpl");
+else $tpl->assignInclude("profile", "./default_tpls/profile.tpl");
+include("includes/pagesetup.php");	
+// If uid isn't a number kill the script with an error message.  The only way this happens is a hacker.
+if(empty($uid)) {
+	if(!isMEMBER) accessDenied( );
+	else $uid = USERUID;
+}
+if($displayprofile) include("user/profile.php");
+else if(isADMIN && uLEVEL < 3) {
+	$result2 = dbquery("SELECT * FROM "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs as ap ON ap.uid = "._UIDFIELD." WHERE "._UIDFIELD." = '$uid' LIMIT 1");
+	$userinfo = dbassoc($result2);
+	$adminopts = "<div class=\"adminoptions\"><span class='label'>"._ADMINOPTIONS.":</span> ".(isset($userinfo['validated']) && $userinfo['validated'] ? "[<a href=\"admin.php?action=members&amp;revoke=$uid\" class=\"vuadmin\">"._REVOKEVAL."</a>] " : "[<a href=\"admin.php?action=members&amp;validate=$uid\" class=\"vuadmin\">"._VALIDATE."</a>] ")."[<a href=\"user.php?action=editbio&amp;uid=$uid\" class=\"vuadmin\">"._EDIT."</a>] [<a href=\"admin.php?action=members&amp;delete=$uid\" class=\"vuadmin\">"._DELETE."</a>]";
+	$adminopts .= " [<a href=\"admin.php?action=members&amp;".($userinfo['level'] < 0 ? "unlock=".$userinfo['uid']."\" class=\"vuadmin\">"._UNLOCKMEM : "lock=".$userinfo['uid']."\" class=\"vuadmin\">"._LOCKMEM)."</a>]";
+	$adminopts .= " [<a href=\"admin.php?action=admins&amp;".(isset($userinfo['level']) && $userinfo['level'] > 0 ? "revoke=$uid\" class=\"vuadmin\">"._REVOKEADMIN."</a>] [<a href=\"admin.php?action=admins&amp;do=edit&amp;uid=$uid\" class=\"vuadmin\">"._EDITADMIN : "do=new&amp;uid=$uid\" class=\"vuadmin\">"._MAKEADMIN)."</a>]</div>";
+	$tpl->assign("adminoptions", $adminopts);
+}
+
+$infoquery = dbquery("SELECT "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." WHERE "._UIDFIELD." = '$uid' LIMIT 1");
+
+list($penname) = dbrow($infoquery);
+$tpl->assign("pagetitle", "<div id='pagetitle'>$penname</div>");
+$panelquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_panels WHERE ".($action ? "panel_name = '$action' AND (panel_type = 'P' OR panel_type = 'F')" : "panel_type = 'P' AND panel_hidden = 0 ORDER BY panel_order ASC")." LIMIT 1");
+if($panelquery) {
+	$panel = dbassoc($panelquery);
+	if(!empty($panel['panel_url']) && file_exists(_BASEDIR.$panel['panel_url'])) include(_BASEDIR.$panel['panel_url']);
+	else if(file_exists("user/".$panel['panel_name'].".php")) include("user/".$panel['panel_name'].".php");
+	else $output .= write_error(_ERROR);
+}
+else if($action) $output .= write_error(_ERROR);
+
+$tpl->gotoBlock("_ROOT");
+$panelquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_hidden != '1' AND panel_level = '0' AND (panel_type = 'P'".($favorites ? " OR panel_type = 'F'" : "").") ORDER BY panel_type DESC, panel_order ASC, panel_title ASC");
+$numtabs = dbnumrows($panelquery);
+$tabwidth = floor(100 / $numtabs);
+if(!$panelquery) $output .= write_error(_ERROR);
+
+// Special tab counts
+$codequery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_codeblocks WHERE code_type = 'userTabs'");
+while($code = dbassoc($codequery)) {
+	eval($code['code_text']);
+}
+
+while($panel = dbassoc($panelquery)) {
+	$panellink = "";
+	if(substr($panel['panel_name'], -2, 2) == "by") {
+		$itemcount = 0;
+		if($panel['panel_name'] == "storiesby") {
+			$count = dbquery("SELECT stories FROM ".TABLEPREFIX."fanfiction_authorprefs WHERE uid = '$uid'");
+		}
+		else {
+			if(substr($panel['panel_name'], 0, 3) == "val") {
+				$table = substr($panel['panel_name'], 3);
+				$table = substr($table, 0, strlen($table) - 2);
+				$valid = 1;
+			}
+			else {
+				$table = $panel['panel_name'];
+				if(substr($panel['panel_name'], 0, strlen($panel['panel_name']) - 2) == "stories") $valid = 1;
+				else $valid = 0;
+			}
+			$count = dbquery("SELECT COUNT(uid) FROM ".TABLEPREFIX."fanfiction_".substr($table, 0, strlen($panel['panel_name']) - 2)." WHERE (uid = '$uid'".($panel['panel_name'] == "storiesby" ? " OR FIND_IN_SET($uid, coauthors) > 0" : "").")".($valid ? " AND validated > 0" : "").($panel['panel_name'] == "reviewsby" ? " AND review != 'No Review'" : ""));
+		}
+		list($itemcount) = dbrow($count);
+	}
+	if(substr($panel['panel_name'], 0, 3) == "fav" && $type = substr($panel['panel_name'], 3)) {
+		$itemcount = 0;
+		$countquery = dbquery("SELECT COUNT(item) FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '$uid' AND type = '$type'");
+		list($itemcount) = dbrow($countquery);
+	}
+	if($panel['panel_name'] == "favlist") {
+		$itemcount = 0;
+		$countquery = dbquery("SELECT COUNT(item) FROM ".TABLEPREFIX."fanfiction_favorites WHERE uid = '$uid'");
+		list($itemcount) = dbrow($countquery);
+	}
+	if(!empty($tabCounts[$panel['panel_name']])) $itemcount = $tabCounts[$panel['panel_name']];
+	$panellinkplus = "<a href=\"viewuser.php?action=".$panel['panel_name']."&amp;uid=$uid\">".preg_replace("<\{author\}>", $penname, stripslashes($panel['panel_title'])).(isset($itemcount) ? " [$itemcount]" : "")."</a>\n";
+	$panellink = "<a href=\"viewuser.php?action=".$panel['panel_name']."&amp;uid=$uid\">".preg_replace("<\{author\}>", $penname, stripslashes($panel['panel_title']))."</a>\n";
+	$tpl->newBlock("paneltabs");
+	$tpl->assign("tabwidth", $tabwidth);
+	$tpl->assign("class", $action == $panel['panel_name'] || (empty($action) && $panel['panel_order'] == 1 && $panel['panel_type'] == "P") ? "id='active'" : "");
+	$tpl->assign("link", $panellink);
+	$tpl->assign("linkcount", $panellinkplus);
+	$tpl->assign("count", (isset($itemcount) ? " [$itemcount]" : ""));
+	unset($panellink, $panellinkplus, $itemcount);
+}
+$tpl->gotoBlock("_ROOT");	
+$tpl->assign( "output", $output );
+$tpl->printToScreen();
+dbclose( );
+?>