Initial uplad w/ php7 fixes
Initial uplad w/ php7 fixes

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,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

+// ----------------------------------------------------------------------

+

+$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($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/

+// ----------------------------------------------------------------------

+// 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) {

+    $result .= "# Dump of $table \r\n";

+    $result .= "# Dump DATE : " . date("d-M-Y") ."\r\n\r\n";

+

+    $tabledata = dbquery("SELECT * FROM $table");

+

+	while($t = dbassoc($tabledata)) {

+		$result .= "INSERT INTO ".$table." ";

+		$row = array( );

+		foreach($t AS $field => $value) {			

+			$value = escapestring($value);

+			$value = ereg_replace("\n","\\n",$value);

+			if (isset($value)) $row[$field] = "\"$value\"";

+			else $row[$field] = "\"\"";

+		}   

+		$result .= "VALUES(".implode(", ", $row).");\r\n";

+	}

+	return $result . "\r\n\r\n\r\n";

+}

+

+	$alltables = dbquery("SHOW TABLES");

+	$content = "";

+	while ($table = dbassoc($alltables)) {

+		foreach ($table as $db => $tablename) {

+			$content .= datadump($tablename);

+		}

+	}

+	echo $content;

+ 	if($logging) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`) VALUES('".escapestring(sprintf(_LOG_BACKUP, USERPENNAME, USERUID))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'AM')");

+	exit( );

+

+?>

file:b/admin/blocks.php (new)
--- /dev/null
+++ b/admin/blocks.php
@@ -1,1 +1,98 @@
-
+<?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;

+		}

+		dbquery("UPDATE ".TABLEPREFIX."fanfiction_blocks SET block_name = '$block', block_title = '".escapestring($value['title'])."', block_file = '".$value['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]])) {

+				$blocks[$_POST[$x]]['title'] = descript($_POST[$x."_title"]);

+				$blocks[$_POST[$x]]["status"] = $_POST[$x."_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)) {

+	$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'];

+}

+	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, UNIX_TIMESTAMP(stories.updated) as updated, UNIX_TIMESTAMP(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,214 @@
-
+<?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`) VALUES('".escapestring(sprintf(_LOG_RECALCREVIEWS, USERPENNAME, USERUID))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'AM')");

+	$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`) VALUES('".escapestring(sprintf(_LOG_CATCOUNTS, USERPENNAME, USERUID))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'AM')");

+	$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`) VALUES('".escapestring(sprintf(_LOG_OPTIMIZE, USERPENNAME, USERUID))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'AM')");

+	$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.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`) VALUES('".escapestring(sprintf(_LOG_ADMIN_REG, descript($_POST['penname']), $newuid, USERPENNAME, USERUID, $_SERVER['REMOTE_ADDR']))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'RG')");

+				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,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(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));

+			if($_GET['form'] == "new") $result = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_news (title, author, story, time) VALUES ('$title', '$author', '$story', now())");

+			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($_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.*, UNIX_TIMESTAMP(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`) VALUES('".escapestring(sprintf(_LOG_REJECTION, USERPENNAME, USERUID, $title, $sid, $uid, $penname, $inorder, $letter))."', '".USERUID."', INET_ATON('".$_ENV['REMOTE_ADDR']."'), 'RJ')");

+		}

+

+	}

+	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,484 @@
-
+<?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 ? 1 : 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) {

+		$$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='1'".($tinyMCE ? " selected" : "").">"._YES."</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;

+

+	if($_GET['retire'])

+		mysql_query("UPDATE ".$tableprefix."fanfiction_stories SET featured = 2 WHERE sid = ".$_GET['retire']);

+	if($_GET['feature'])

+		mysql_query("UPDATE ".$tableprefix."fanfiction_stories SET featured = 1 WHERE sid = ".$_GET['feature']);

+	$fquery = "SELECT stories.*, stories.title as title, author.penname, DATE_FORMAT(stories.updated, '%Y.%m.%d') as updatesort, DATE_FORMAT(stories.date, '$datim') as date, DATE_FORMAT(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 = mysql_query($fquery) or die(_FATALERROR."Query: ".$fquery."<br />Error: (".mysql_errno( ).") ".mysql_error( ));

+	$output .= "<center><table class=\"tblborder\" cellpadding=\"5\"><tr><th colspan=\"2\" align=\"center\">"._FEATUREDSTORIES."</th></tr>";

+	if(!mysql_num_rows($fresult)) $output .= "<tr><td colspan=\"2\" align=\"center\">"._NOSTORIES."</td><tr>";

+	while($story = mysql_fetch_array($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;

+		$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 = mysql_query($query) or die(_FATALERROR."Query: ".$query."<br />Error: (".mysql_errno( ).") ".mysql_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 = mysql_fetch_assoc($result))

+		{

+			unset($catstring);

+			$result3 = mysql_query("SELECT catid, category FROM ".$tableprefix."fanfiction_categories WHERE FIND_IN_SET(catid, '".$story['catid']."')");

+			while($cats = mysql_fetch_array($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 = mysql_query("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) = mysql_fetch_array($storyquery);

+		if($admincats == "0" || sizeof(array_intersect(explode(",", $catid), explode(",", $admincats)))) {

+			include("includes/emailer.php");

+			if($validated != "1") {

+				mysql_query("UPDATE ".$tableprefix."fanfiction_stories SET validated = '1', updated = NOW() 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 = mysql_query("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 = mysql_fetch_array($favorites)) { 

+						sendemail($favuser['penname'], $favuser['email'], $sitename, $siteemail, $subject, $mailtext, "html");

+					}				

+				}

+			}

+			else if($alertson) {

+				$subject = _STORYALERT;

+				$mailtext = sprintf(_STORYALERTNOTE, $title, $author, $sid, $inorder);

+				$favorites = mysql_query("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 = mysql_fetch_array($favorites)) { 

+					sendemail($favuser['penname'], $favuser['email'], $sitename, $siteemail, $subject, $mailtext, "html");

+				}

+			}

+			mysql_query("UPDATE ".$tableprefix."fanfiction_chapters SET validated = '1' WHERE chapid = '".$_GET['chapid']."'");

+			mysql_query("UPDATE ".$tableprefix."fanfiction_stories SET updated = NOW( ) WHERE sid = '$sid'");

+			$output .= "<center><b>"._STORYVALIDATED."</b></center>";

+		}

+		else

+			$output .= "<br /><br /><center>"._NOTAUTHORIZEDADMIN."  "._TRYAGAIN."</center><br /><br />";

+	}

+	else {

+			$result = mysql_query("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 = mysql_fetch_array($result);

+			$output .= "<b>"._AUTHOR.":</b> ".$story['penname']."<br />";

+			$output .= "<b>"._TITLE.":</b> ".$story['storytitle'].": ".$story['title'];

+			$output .= "<br />";

+			$result3 = mysql_query("SELECT catid, category FROM ".$tableprefix."fanfiction_categories WHERE FIND_IN_SET(catid, '".$story['catid']."')");

+			$catstring = "";

+			$count = 0;

+			while($cats = mysql_fetch_array($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 = mysql_query("SELECT email,penname FROM ".$tableprefix."fanfiction_authors WHERE uid = '".$_GET['uid']."' LIMIT 1");

+			$author = mysql_fetch_array($authorquery);

+			$storyquery = mysql_query("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 = mysql_fetch_array($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 = mysql_query("SELECT email,penname FROM ".$tableprefix."fanfiction_authors WHERE uid = '".$_GET['uid']."' LIMIT 1");

+		$author = mysql_fetch_array($authorquery);

+		$storyquery = mysql_query("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 = mysql_fetch_array($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 = NOW() 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`) VALUES('".escapestring(sprintf(_LOG_VALIDATE_STORY, USERPENNAME, USERUID, $title, $sid, $author, $authoruid))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'VS')");

+				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`) VALUES('".escapestring(sprintf(_LOG_VALIDATE_CHAPTER, USERPENNAME, USERUID, $title, $sid, $author, $authoruid, $inorder))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'VS')");

+			}

+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_chapters SET validated = '1' WHERE chapid = '$_GET[chapid]'");

+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET updated = NOW( ) 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, UNIX_TIMESTAMP(stories.updated) as updated, UNIX_TIMESTAMP(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,87 @@
-
+<?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\">"._VERSIONCHECK."</div>";

+

+	// make sure curl is installed

+	if (function_exists('curl_init')) {

+		$output .= write_message(_RUNNINGVERSION);

+	   // initialize a new curl resource

+	   $ch = curl_init();

+

+	   // set the url to fetch

+	   curl_setopt($ch, CURLOPT_URL, 'http://www.efiction.org/version.txt');

+

+	   // don't give me the headers just the content

+	   curl_setopt($ch, CURLOPT_HEADER, 0);

+

+	   // return the value instead of printing the response to browser

+	   curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

+

+	   // use a user agent to mimic a browser

+	   curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.5) Gecko/20041107 Firefox/1.0');

+

+	   $content = curl_exec($ch);

+	   $currentversion = $content;

+				$output .= write_message(_CURRENTVERSION. "$currentversion");

+

+				if ($currentversion != $version) {

+				$output .= write_message (_UPDATEVERSION);

+				}

+				else $output .= write_message (_UPTODATE);

+

+	   // remember to always close the session and free all resources

+	   curl_close($ch);

+	}

+

+	else if(ini_get("allow_url_fopen")) {

+		$output .= write_message(_RUNNINGVERSION);

+

+		$location = fopen ("http://efiction.org/version.txt", "r");

+		$buffer = '';

+		while (!feof ($location)) {

+			$buffer .= fgets($location, 4096);

+		}

+		fclose ($location);

+

+		if ($buffer != '') {

+			$currentversion = $buffer;

+			$output .= write_message(_CURRENTVERSION. "$currentversion");

+

+			if ($currentversion != $version) {

+			$output .= write_message (_UPDATEVERSION);

+			}

+			else $output .= write_message (_UPTODATE);

+		}

+	}

+	else {	

+		$output .= write_message(_VERSIONNOTALLOWED);

+	}

+

+?>

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" => _EDITBIO);

+$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, UNIX_TIMESTAMP(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;

+

+	$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: (".mysql_errno( ).") ".mysql_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: (".mysql_errno( ).") ".mysql_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: (".mysql_errno( ).") ".mysql_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($_GET['action'] == "list") {

+	$current = "members";

+	$list = "members";

+}

+else if($_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,64 @@
-
+<?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)) {

+	$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: (".mysql_errno( ).") ".mysql_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,31 @@
-
+<?php

+if(!defined("_CHARSET")) exit( );

+

+global $language, $numupdated;

+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'countdown'");

+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'];

+}

+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,33 @@
-
+<?php

+if(!defined("_CHARSET")) exit( );

+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'featured'");

+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'];

+}

+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,35 @@
-
+<?php

+if(!defined("_CHARSET")) exit( );

+

+global $language;

+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'info'");

+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'];

+}

+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,43 @@
-
+<?php

+if(!defined("_CHARSET")) exit( );

+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'login'");

+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'];

+}

+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,84 @@
-
+<?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)) {

+			$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,28 @@
-
+<?php

+if(!defined("_CHARSET")) exit( );

+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'news'");

+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'];

+}

+global $language, $numupdated;

+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, UNIX_TIMESTAMP(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'

+) TYPE=MyISAM;");

+?>

--- /dev/null
+++ b/blocks/online/online.php
@@ -1,1 +1,23 @@
-
+<?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 dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_online(online_uid, online_ip, online_timestamp) VALUES('".(USERUID ? USERUID : 0)."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), '".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,61 @@
-
+<?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)) {

+	$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 = NOW( ) 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', NOW( ))");

+		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 != '0000-00-00 00:00:00' 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`)

+) TYPE=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` DATETIME NOT NULL ,

+`poll_end` DATETIME NULL ,

+`poll_results` VARCHAR( 250 ) NULL ,

+PRIMARY KEY ( `poll_id` ))");

+?>

--- /dev/null
+++ b/blocks/poll/poll.php
@@ -1,1 +1,80 @@
-
+<?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 = "";

+$pollquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_poll WHERE poll_end IS NULL OR poll_end = '0000-00-00 00:00:00' 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, UNIX_TIMESTAMP(poll_start) as start, UNIX_TIMESTAMP(poll_end) as end FROM ".TABLEPREFIX."fanfiction_poll WHERE poll_end IS NOT NULL OR poll_end != '0000-00-00 00:00:00' 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,34 @@
-
+<?php

+if(!defined("_CHARSET")) exit( );

+

+global $language;

+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'random'");

+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'];

+}

+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,38 @@
-
+<?php

+if(!defined("_CHARSET")) exit( );

+

+global $language, $numupdated;

+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'recent'");

+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(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,66 @@
-
+<?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['shout']) && (isMEMBER || !empty($blocks['shoutbox']['guestshouts']))) {

+	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 language=\"javascript\" type=\"text/javascript\">

+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='submit' name='shout' id='shout' value='"._SHOUT."'> <input size='1' class='small' type='text' id='counter' value='200'></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>";

+?>

--- /dev/null
+++ b/bridges/SMF/README.txt
@@ -1,1 +1,38 @@
+This folder contains the files to replace in your eFiction install to bridge it with 

+an installation of SMF.  These files will let you use your SMF members 

+table as the authors table for eFiction.  This bridge assumes your SMF intall 

+and your eFiction install share the same database.

+

+Move the following files to the user/ folder in your eFiction install:

+

+editbio.php

+login.php

+profile.php

+register.php

+logout.php

+

+Move the following files to the includes/ folder in your eFiction install:

+

+get_session_vars.php

+queries.php

+

+Move the en_SMF.php file to the languages/ folder in your eFiction install.

+

+Edit queries.php to point to your SMF tables and directory.

+

+Goto Admin->Page Links and edit your Register and Lost Password links to point to your 

+SMF pages.

+

+Register -> PATHTOSMF/index.php?action=register

+Lost Password -> PATHTOSMF/index.php?action=reminder

+

+If eFiction is a sub-folder under SMF PATHTOSMF will be ../

+If they are siblings the path will be ../SMFFOLDER/ where SMFFOLDER is tha name of SMF's folder.

+If SMF is a subfolder if eFiction PATHTOSMF will be SMFFOLDER/ where SMFFOLDER is tha name of SMF's folder.

+

+Move QueryString.php to the Sources folder of your SMF installation. Note this is the QueryString.php 

+from version 1.1.2 of SMF.

+

+

+

 

--- /dev/null
+++ b/bridges/SMF/blocks/info/admin.php
@@ -1,1 +1,35 @@
-
+<?php

+if(!defined("_CHARSET")) exit( );

+

+global $language;

+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'info'");

+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'];

+}

+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/bridges/SMF/blocks/info/en.php
@@ -1,1 +1,41 @@
-
+<?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");

+define("_POSTS", "Forum Posts");

+define("_BOARDS", "Forum Boards");

+define("_TOPICS", "Forum Topics");

+define("_FORUMCATS", "Forum Categories");

+?>

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

--- /dev/null
+++ b/bridges/SMF/blocks/info/info.php
@@ -1,1 +1,75 @@
-
+<?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']);

+		}

+	}

+	$forums = ssi_boardStats("array");

+	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("totalposts", $forums['posts']);

+		$tpl->assignGlobal("totaltopics", $forums['topics']);

+		$tpl->assignGlobal("totalboards", $forums['boards']);

+		$tpl->assignGlobal("totalforumcategories", $forums['categories']);

+		$tpl->assignGlobal("newestmember", "<a href=\"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'>"._POSTS.": </span>".$forums['posts']."</div>

+<div><span class='label'>"._TOPICS.": </span>".$forums['topics']."</div>

+<div><span class='label'>"._BOARDS.": </span>".$forums['boards']."</div>

+<div><span class='label'>"._FORUMCATS.": </span>".$forums['categories']."</div>

+<div><span class='label'>"._NEWESTMEMBER.": </span><a href=\"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=\"viewuser.php?uid=".$stats['newestmember']."\">$newmember</a>", $loggedinas, $adminnotices, $forums['posts'], $forums['topics'], $forums['boards'], $forums['categories']);

+			$search = array("@\{authors\}@", "@\{members\}@", "@\{reviews\}@", "@{reviewers\}@", "@\{totalwords\}@","@\{chapters\}@", "@\{stories\}@", "@\{series\}@", "@\{newest\}@", "@\{loggedinas\}@", "@\{submissions\}@", "@\{posts\}@", "@\{topics\}@", "@\{boards\}@", "@\{forumcats\}@");

+			$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 class='cleaner'>&nbsp;</div></div>";

+?>

--- /dev/null
+++ b/bridges/SMF/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/bridges/SMF/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/bridges/SMF/blocks/login/admin.php
@@ -1,1 +1,45 @@
-
+<?php

+if(!defined("_CHARSET")) exit( );

+$blockquery = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_blocks WHERE block_name = 'login'");

+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'];

+}

+global $language;

+// Set $loggedin to 0 to see the block

+$loggedin = 0;

+include("blocks/login/login.php");

+// Then set it back to 1. 

+$loggedin = 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/bridges/SMF/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/bridges/SMF/blocks/login/index.php

--- /dev/null
+++ b/bridges/SMF/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/bridges/SMF/blocks/login/login.php
@@ -1,1 +1,22 @@
-
+<?php

+if(!defined("_CHARSET")) exit( );

+if(!isMEMBER) {

+if(!isset($_SESSION)) session_start();

+if(isset($_GET['sid']) && isNumber($_GET['sid'])) $_SESSION['login_url'] = $url."/viewstory.php?sid=".$_GET['sid'];

+else $_SESSION['login_url'] = $url."/user.php";

+	$longform = "{penname} {password} {rememberme} {go} <div id='loginlinks'>{register} | {lostpwd}</div>";

+	$shortform = "{penname} {password} {rememberme} {go}";

+	$content = "<form method=\"POST\"enctype=\"multipart/form-data\" id=\"loginblock\" action=\"".PATHTOSMF."index.php?action=login2\"><input type=\"hidden\" name=\"cookielength\" value=\"-1\" />";

+	$replace = array("<label for=\"penname\">"._PENNAME.":</label><INPUT type=\"text\" class=\"textbox\" name=\"user\" id=\"user\">", 

+			"<label for=\"pswd\">"._PASSWORD.":</label><INPUT type=\"password\" class=\"textbox\" id=\"passwrd\" name=\"passwrd\">",

+			"<span id='rememberme'><INPUT type=\"checkbox\" class=\"checkbox\" name=\"cookieneverexp\" id=\"cookieneverexp\" value=\"1\"><label for=\"cookieneverexp\">"._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/bridges/SMF/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/bridges/SMF/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/bridges/SMF/blocks/online/index.php

--- /dev/null
+++ b/bridges/SMF/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'

+) TYPE=MyISAM;");

+?>

--- /dev/null
+++ b/bridges/SMF/blocks/online/online.php
@@ -1,1 +1,19 @@
-
+<?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");

+

+	$onlineInfo = ssi_whosOnline("array");

+	$tpl->assignGlobal("guests", empty($guests) ? 0 : $onlineInfo['guests']);

+	$omlist = array( );

+	foreach($onlineInfo['users'] as $k => $v) {

+		$omlist[] = "<a href='viewuser.php?uid=".$v['id']."'>".$v['username']."</a>";

+	}

+	$tpl->assignGlobal("onlinemembers", count($omlist) ? implode(", ", $omlist) : "");

+	$content = "<div id='who_online'><span class='label'>"._GUESTS.":</span> ".($onlineInfo['guests'] ? $onlineInfo['guests'] : 0)."<br />\n

+		<span class='label'>"._MEMBERS.":</span> ".($omlist ? implode(", ", $omlist) : "")."</div>";

+

+?>

--- /dev/null
+++ b/bridges/SMF/editbio.php
@@ -1,1 +1,30 @@
-
+<?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 .= "<script language=\"javascript\" type=\"text/javascript\">

+location = \"".PATHTOSMF."index.php?action=profile\";

+</script>";

+?>

--- /dev/null
+++ b/bridges/SMF/en_SMF.php
@@ -1,1 +1,5 @@
-
+<?php

+if(!defined("_CHARSET")) exit( );

+define("_PRIVATEMESSAGE", "Private Message");

+

+?>

--- /dev/null
+++ b/bridges/SMF/get_session_vars.php
@@ -1,1 +1,52 @@
-
+<?php

+// 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(!defined("_CHARSET")) exit( );

+

+if (!empty($_COOKIE[$sitekey."_useruid"])  && !isset($_SESSION[$sitekey."_useruid"])) {

+	$userdata = dbassoc(dbquery("SELECT "._UIDFIELD." as uid, "._PENNAMEFIELD." as penname, "._EMAILFIELD." as email, "._PASSWORDFIELD." as password, ap.* 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.'_pwd'] == md5($userdata['email']+$userdata['password'])) {

+		define("USERUID", $userdata['uid']);

+		define("USERPENNAME", $userdata['penname']);

+		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."_agecontsent"])) $ageconsent = $userdata['ageconsent'];

+		else $ageconsent = $_SESSION[$sitekey."_agecontsent"];

+	}

+}

+$user_info = array( );

+$eFicLang = $language;

+require_once(_BASEDIR.PATHTOSMF."SSI.php");

+$language = $eFicLang;

+$_SESSION['USER_AGENT'] = $_SERVER['HTTP_USER_AGENT'];

+	// SMF has already loaded it's sessions in queries.php.  So we'll pull the data from the $user_info array from there.

+	if($ID_MEMBER) {

+		$eficdata = dbquery("SELECT "._UIDFIELD." as uid, "._PENNAMEFIELD." as penname, ap.level, ap.userskin, ap.ageconsent FROM ".TABLEPREFIX."fanfiction_authorprefs as ap RIGHT JOIN "._AUTHORTABLE." ON ap.uid = "._UIDFIELD." WHERE "._UIDFIELD." = '$ID_MEMBER'");

+		if(dbnumrows($eficdata)) {

+			$userdata = dbassoc($eficdata);

+			if($userdata['level'] != "-1") {

+				define("USERUID", $userdata['uid']);

+				define("USERPENNAME", $userdata['penname']);

+				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."_agecontsent"])) $ageconsent = $userdata['ageconsent'];

+				else $ageconsent = $_SESSION[$sitekey."_agecontsent"];

+			}	

+		}

+	}

+if(!defined("USERUID")) define("USERUID", false);

+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;

+echo "<!-- USERUID ".USERUID." ".$ID_MEMBER." -->";

+?>

--- /dev/null
+++ b/bridges/SMF/index.php

--- /dev/null
+++ b/bridges/SMF/login.php
@@ -1,1 +1,25 @@
-
+<?php

+if(!defined("_CHARSET")) exit( );

+if(!isMEMBER) {

+		$output .= "<div id=\"pagetitle\">"._MEMBERLOGIN."</div>";

+

+if(!isset($_SESSION)) session_start();

+if(isset($_GET['sid']) && isNumber($_GET['sid'])) $_SESSION['login_url'] = $url."/viewstory.php?sid=".$_GET['sid'];

+else $_SESSION['login_url'] = $url."/user.php";

+		$output .= "<div style='text-align: center;'><form method=\"POST\"enctype=\"multipart/form-data\" action=\"".PATHTOSMF."index.php?action=login2\"><div style=\"width: 320px; padding: 5px; margin: 0 auto;\">

+		<input type=\"hidden\" name=\"cookielength\" value=\"-1\" /><input type=\"hidden\" name=\"login_url\" value=\"".$_SESSION['login_url']."\" />

+		<div class=\"label\" style=\"float: left;  width: 30%; text-align: right;\"><label for=\"penname\">"._PENNAME.":</label></div><INPUT type=\"text\" class=\"textbox\" name=\"user\" id=\"user\"><br />

+		<div class=\"label\" style=\"float: left; width: 30%; text-align: right;\"><label for=\"pswd\">"._PASSWORD.":</label></div><INPUT type=\"password\" class=\"textbox\" id=\"passwrd\" name=\"passwrd\"><br />

+		<INPUT type=\"checkbox\" class=\"checkbox\" name=\"cookieneverexp\" id=\"cookieneverexp\" value=\"1\"><label for=\"cookieneverexp\">"._REMEMBERME."</label><br />

+		<INPUT type=\"submit\" class=\"button\" name=\"submit\" value=\""._SUBMIT."\">

+		</div></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>";

+}

+else accessDenied( );

+?>

--- /dev/null
+++ b/bridges/SMF/logout.php
@@ -1,1 +1,37 @@
-
+<?php

+// Generally, you should be able to leave this alone.  This logout function will unset all session variables and cookie variables of the same name that begin with the site's sitekey.

+

+if(!defined("_LOGOUTCHECK")) exit( );

+	define("_BASEDIR", "");

+	include("config.php");

+	include_once("includes/queries.php");

+	session_start( );

+	require_once(PATHTOSMF."SSI.php");

+	$_SESSION['USER_AGENT'] = $_SERVER['HTTP_USER_AGENT'];

+	loadUserSettings( );

+	include_once(PATHTOSMF."Sources/Subs-Auth.php");

+	// If you log out, you aren't online anymore :P.

+	dbquery("DELETE FROM {$db_prefix}log_online WHERE ID_MEMBER = $ID_MEMBER LIMIT 1");

+	$_SESSION['log_time'] = 0;

+	// Empty the cookie! (set it in the past, and for ID_MEMBER = 0)

+	setLoginCookie(-3600, 0);

+	foreach ($_SESSION as $VarName => $Value)  { 

+		if(substr($VarName, 0, strlen($sitekey)) == $sitekey) {

+			if(strpos($VarName, "skin")) continue;

+			unset($$VarName);

+			$_SESSION[$VarName] = ""; 

+			setcookie($VarName, '0');

+		}

+	}

+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( );

+?>

--- /dev/null
+++ b/bridges/SMF/lostpassword.php
@@ -1,1 +1,29 @@
-
+<?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 .= "<script language=\"javascript\" type=\"text/javascript\">

+location = \"".PATHTOSMF."index.php?action=reminder\";

+</script>";

+?>

--- /dev/null
+++ b/bridges/SMF/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/bridges/SMF/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/bridges/SMF/online/index.php

--- /dev/null
+++ b/bridges/SMF/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'

+) TYPE=MyISAM;");

+?>

--- /dev/null
+++ b/bridges/SMF/online/online.php
@@ -1,1 +1,19 @@
-
+<?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");

+

+	$onlineInfo = ssi_whosOnline("array");

+	$tpl->assignGlobal("guests", empty($guests) ? 0 : $onlineInfo['guests']);

+	$omlist = array( );

+	foreach($onlineInfo['users'] as $k => $v) {

+		$omlist[] = "<a href='viewuser.php?uid=".$v['id']."'>".$v['username']."</a>";

+	}

+	$tpl->assignGlobal("onlinemembers", count($omlist) ? implode(", ", $omlist) : "");

+	$content = "<div id='who_online'><span class='label'>"._GUESTS.":</span> ".($onlineInfo['guests'] ? $onlineInfo['guests'] : 0)."<br />\n

+		<span class='label'>"._MEMBERS.":</span> ".($omlist ? implode(", ", $omlist) : "")."</div>";

+

+?>

--- /dev/null
+++ b/bridges/SMF/profile.php
@@ -1,1 +1,76 @@
-
+<?php

+// Build the user's profile information

+if(!defined("_CHARSET")) exit( );

+if(file_exists("languages/{$language}_SMF.php")) include("languages/{$language}_SMF.php");

+else include("languages/en_SMF.php");

+

+$tpl->newBlock("profile");

+$result2 = dbquery("SELECT *, "._UIDFIELD." as uid FROM "._AUTHORTABLE." LEFT JOIN ".TABLEPREFIX."fanfiction_authorprefs as ap ON ap.uid = "._UIDFIELD." WHERE "._UIDFIELD." = '$uid' LIMIT 1");

+$userinfo = dbassoc($result2);

+$nameinfo = "";

+if($userinfo['emailAddress']) {

+	list($allowGuestsContact) = dbrow(dbquery("SELECT panel_level FROM ".TABLEPREFIX."fanfiction_panels WHERE panel_type = 'P' AND panel_name = 'contact' LIMIT 1"));

+	if($allowGuestsContact == "0") $nameinfo .= " [<a href=\"viewuser.php?action=contact&amp;uid=".$userinfo['uid']."\">"._CONTACT."</a>]";

+}

+if(isMEMBER) {

+	$nameinfo .= "[<a href='".PATHTOSMF."index.php?action=pm;sa=send;u=".$userinfo['uid']."'>"._PRIVATEMESSAGE."</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?uid=USERUID&amp;action=favau&amp;author=".$userinfo['uid']."\">"._ADDAUTHOR2FAVES."</a>]";

+}

+$tpl->assign("userpenname", $userinfo['memberName']." ".$nameinfo);

+$tpl->assign("membersince", date("$dateformat", $userinfo['dateRegistered']));

+if($userinfo['realName'])

+	$tpl->assign("realname", $userinfo['realName']);

+if(!empty($userinfo['avatar']))

+	$tpl->assign("image", "<img src=\"".$path_to_smf."avatars/".$userinfo['avatar']."\">");

+$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'");

+if(!empty($userinfo['websiteUrl'])) 

+	$tpl->assign("website", "<a href='".$userinfo['websiteUrl']."'>".(!empty($userinfo['websiteTitle']) ? $userinfo['websiteTitle'] : $userinfo['websiteUrl'])."</a>");

+	$tpl->assign("aol", !empty($userinfo['AOL']) ? "<img src=\"http://big.oscar.aol.com/".$userinfo['AOL']."?on_url=$url/images/aim.gif&amp;off_url=$url/images/aim.gif\"> <a href=\"aim:goim?{aol}ScreenName=".$userinfo['AOL']."\">".$userinfo['AOL']."</a>" : "<img src=\"images/aim.gif\" alt=\""._AOL."\"> "._NONE);

+	$tpl->assign("icq", !empty($userinfo['ICQ']) ? "<img src=\"http://status.icq.com/online.gif?icq=$userinfo[ICQ]&amp;img=5\"> $userinfo[ICQ]" : "<img src=\"images/icq.gif\" alt=\""._ICQ."\"> "._NONE);

+	$tpl->assign("msn", "<img src=\"images/msntalk.gif\" alt=\""._MSN."\"> ".($userinfo['MSN'] ? $userinfo['MSN'] : _NONE));

+	$tpl->assign("yahoo", !empty($userinfo['YIM']) ? "<a href=\"http://edit.yahoo.com/config/send_webmesg?.target=".$userinfo['YIM']."&amp;.src=pg\"><img border=\"0\" src=\"http://opi.yahoo.com/online?u=".$userinfo['YIM']."&amp;m=g&amp;t=1\"> ".$userinfo['YIM']."</a>" : "<img src=\"images/yim.gif\" alt=\""._YAHOO."\"> "._NONE);

+

+$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 =  preg_replace('/(\w+:\/\/)(\S+)/', '<a href="\\1\\2" target="_blank">\\1\\2</a>', $field['info']);

+			if(strpos($thisfield, "http://") == false) $thisfield = preg_replace('/(\S+\.)(\S+)/', '<a href="http://\\1\\2" target="_blank">\\1\\2</a>', $thisfield);

+		}

+		if($fieldinfo['field_type'] == 4) {

+			$thisfield = preg_replace("@\{info\}@", $field['info'], $fieldinfo['field_options']);

+			$thisfield =  preg_replace('/(\w+:\/\/)(\S+)/', '<a href="\\1\\2" target="_blank">'.$field['info'].'</a>', $thisfield);

+			if(strpos($thisfield, "http://") == false) $thisfield = preg_replace('/(\S+\.)(\S+)/', '<a href="http://\\1\\2" target="_blank">\\1\\2</a>', $thisfield);

+		}

+		if($fieldinfo['field_type'] == 2 || $fieldinfo['field_type'] == 6) {

+			$thisfield = stripslashes($field['info']);

+		}

+		if($fieldinfo['field_type'] == 3) {

+			$thisfield = !empty($field['info']) ? _YES : _NO;

+		}

+		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>";

+	}

+}

+if(!empty($dynamicfields)) $tpl->assign("authorfields", $dynamicfields);

+$tpl->assign("reportthis", "[<a href=\""._BASEDIR."contact.php?action=report&amp;url=viewuser.php?uid=".$uid."\">"._REPORTTHIS."</a>]");

+/* End dynamic fields */

+$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=lock&amp;".($userinfo['level'] < 0 ? "unlock=".$userinfo['uid']."\" class=\"vuadmin\">"._UNLOCKMEM : "do=lock&amp;uid=".$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");

+?>

--- /dev/null
+++ b/bridges/SMF/queries.php
@@ -1,1 +1,26 @@
-
+<?php

+

+// The table prefix for SMF

+$db_prefix = "smf_";

+

+// The RELATIVE path to your SMF install from your eFiction install.  

+// The example given is an SMF and eFiction install as sibling folders.

+define("PATHTOSMF", "../smf/");

+

+$db_connection = $dbconnect;

+

+// Default query strings used throughout the script.  You may need to alter these to bridge to other scripts or databases.

+

+define ("_UIDFIELD", "author.ID_MEMBER");  // Do not change the aliasing (the "author." part)!

+define ("_PENNAMEFIELD", "author.realName");  // Do not change the aliasing (the "author." part)!

+define ("_EMAILFIELD", "author.emailAddress");  // Do not change the aliasing (the "author." part)!

+define ("_PASSWORDFIELD", "author.passwd"); //  Do not change the aliasing (the "author." part)!

+define ("_AUTHORTABLE", $db_prefix."members as author"); // Do not change the aliasing (the "as author" part)!

+

+define ("_STORYQUERY",  "SELECT stories.*, "._PENNAMEFIELD." as penname, UNIX_TIMESTAMP(stories.date) as date, UNIX_TIMESTAMP(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");

+?>

--- /dev/null
+++ b/bridges/SMF/register.php
@@ -1,1 +1,7 @@
-
+<?php

+if(!defined("_CHARSET")) exit( );

+

+$output .= "<script language=\"javascript\" type=\"text/javascript\">

+location = \"".PATHTOSMF."index.php?action=register\";

+</script>";

+?>

--- /dev/null
+++ b/bridges/default/README.txt
@@ -1,1 +1,3 @@
-
+This folder contains the default files for connecting to the default author

+table for eFiction.  They are included here as a backup in case you need 

+to restore from a failed bridge.

--- /dev/null
+++ b/bridges/default/editbio.php
@@ -1,1 +1,224 @@
-
+<?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(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)) $output .= "<div style='text-align: center;'>"._INVALIDEMAIL." "._TRYAGAIN."</div>";

+		else if($action == "register") {

+			if(!$penname || empty($email) || !eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email) || !preg_match("/^[-0-9A-Z_-\s]+$/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." = ''");

+				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`) VALUES('".escapestring(sprintf(_LOG_REGISTER, $penname, USERUID, $_SERVER['REMOTE_ADDR']))."', '".$useruid."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'RG')");

+					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)) {

+						$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($_POST["af_".$field['field_name']]) : false;

+							if(!empty($newinfo)) dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorinfo SET info='$newinfo' WHERE uid = '$uid' AND field = '".$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 */

+					$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 = '$penname', members = members + 1");

+					unset($_POST['submit']);

+					$output = write_message(_ACTIONSUCCESSFUL);

+					include("user/login.php");

+				}

+				else $output .= _BADUSERNAME;

+			}

+		}

+		else{

+			$oldinfo = dbassoc(dbquery("SELECT * FROM "._AUTHORTABLE." WHERE uid = '".USERUID."' LIMIT 1"));

+			// Update the password

+			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);

+			}

+			// Update the penname.

+			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`) VALUES('".escapestring(sprintf(_NEWPEN, USERPENNAME, USERUID, $_POST[oldpenname], $uid, $penname))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'EB')");

+				}

+			}

+/* This 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 */

+			// Now we'll update the rest.

+			$result = 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'");

+			if($result) { // only if the info actually got updated.

+				if($oldinfo['email'] != $email) { // Need to reset the session and cookies in this case.

+					$_SESSION[SITEKEY."_salt"] = md5($email+$encryptedpassword);

+					if(isset($_COOKIE[SITEKEY."_salt"])) setcookie(SITEKEY."_salt", md5($email+$encryptedpassword),  time()+60*60*24*30, "/");		

+				}

+			}

+			$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\" 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=40 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)

+	 	{

+			 	$output .= " [<a href=\"admin.php?action=deleteuser&amp;uid=$uid\">"._DELETE."</a>]";

+	 	}

+	 	$output .= "</div></form></div>".write_message("<font color=\"red\">*</font> "._REQUIREDFIELDS);

+	}

+?>

--- /dev/null
+++ b/bridges/default/get_session_vars.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( );

+// 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']);

+		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."_agecontsent"])) $ageconsent = $userdata['ageconsent'];

+		else $ageconsent = $_SESSION[$sitekey."_agecontsent"];

+	}

+}

+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']);

+		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."_agecontsent"])) $ageconsent = $userdata['ageconsent'];

+		else $ageconsent = $_SESSION[$sitekey."_agecontsent"];

+	}

+}

+if(!defined("USERUID")) define("USERUID", false);

+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/bridges/default/index.php

--- /dev/null
+++ b/bridges/default/login.php
@@ -1,1 +1,87 @@
-
+<?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("_LOGINCHECK")) exit( );

+	if(isset($_POST['submit']) && preg_match("!^[a-z0-9_ ]{3,30}$!i", $_POST['penname'])) {

+		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);

+		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($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/corefunctions.php");

+			accessDenied( );

+		}

+		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($passwd['password'] == $encryptedpassword) {

+			if(!isset($_SESSION)) session_start( );

+			$_SESSION[$sitekey."_useruid"] = $passwd['uid'];

+			$_SESSION[$sitekey."_salt"] = md5($passwd['email']+$encryptedpassword);

+		}

+

+		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( );

+		}

+	}

+	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>";

+	}

+?>

--- /dev/null
+++ b/bridges/default/logout.php
@@ -1,1 +1,33 @@
-
+<?php

+if(!defined("_LOGOUTCHECK")) exit( );

+	define("_BASEDIR", "");

+	include("config.php");

+	include("includes/queries.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( );

+?>

--- /dev/null
+++ b/bridges/default/lostpassword.php
@@ -1,1 +1,80 @@
-
+<?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($loggedin) accessDenied( );

+	$output = "<div id=\"pagetitle\">"._LOSTPASSWORD."</div>";

+

+	  if(isset($_POST['submit'])) {

+		  $result = dbquery("SELECT "._UIDFIELD." as uid, "._PENNAMEFIELD." as penname FROM "._AUTHORTABLE." WHERE email = '$_POST[email]'");

+		  list($uid, $penname) = 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, $_POST['email'], $sitename, $siteemail, $subject, $mailtext, "html");

+			if($result) {

+				$output .= write_message(_PASSWORDSENT);

+				dbquery("UPDATE "._AUTHORTABLE." 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`) VALUES('".escapestring(sprintf(_LOG_LOST_PASSWORD, $penname, $uid, ($result ? _YES : _NO)))."', '$uid', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'LP')");

+

+		}

+	}

+	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/bridges/default/profile.php
@@ -1,1 +1,86 @@
-
+<?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 *, UNIX_TIMESTAMP(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) && $loggedin && $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?uid=USERUID&amp;action=favau&amp;author=".$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>";

+	}

+}

+if(!empty($dynamicfields)) $tpl->assign("authorfields", $dynamicfields);

+$tpl->assign("reportthis", "[<a href=\""._BASEDIR."contact.php?action=report&amp;url=viewuser.php?uid=".$uid."\">"._REPORTTHIS."</a>]");

+/* End dynamic fields */

+$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");

+?>

--- /dev/null
+++ b/bridges/default/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, UNIX_TIMESTAMP(stories.date) as date, UNIX_TIMESTAMP(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");

+?>

--- /dev/null
+++ b/bridges/default/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/bridges/eFic2eFic/README.txt
@@ -1,1 +1,3 @@
-
+This folder contains the default files for connecting to the default author

+table for eFiction.  They are included here as a backup in case you need 

+to restore from a failed bridge.

--- /dev/null
+++ b/bridges/eFic2eFic/editbio.php
@@ -1,1 +1,216 @@
-
+<?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(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)) $output .= "<div style='text-align: center;'>"._INVALIDEMAIL." "._TRYAGAIN."</div>";

+		else if($action == "register") {

+			if(!$penname || empty($email) || !eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email) || !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`) VALUES('".escapestring(sprintf(_LOG_REGISTER, $penname, $useruid, $_SERVER['REMOTE_ADDR']))."', '".$useruid."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'RG')");

+					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)) {

+						$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($_POST["af_".$field['field_name']]) : false;

+							if(!empty($newinfo)) dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorinfo SET info='$newinfo' WHERE uid = '$uid' AND field = '".$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 */

+					$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`) VALUES('".escapestring(sprintf(_NEWPEN, USERPENNAME, USERUID, $_POST[oldpenname], $uid, $penname))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'EB')");

+				}

+			}

+/* 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\" 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)

+	 	{

+			 	$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/bridges/eFic2eFic/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", "");

+

+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, UNIX_TIMESTAMP(stories.date) as date, UNIX_TIMESTAMP(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/bridges/index.php (new)
--- /dev/null
+++ b/bridges/index.php

--- /dev/null
+++ b/bridges/php-fusion/README.txt
@@ -1,1 +1,31 @@
+This folder contains the files to replace in your eFiction install to bridge it with 

+an installation of PHP-Fusion.  These files will let you use your PHP-Fusion users 

+table as the authors table for eFiction.  This bridge assumes your PHP-Fusion intall 

+and your eFiction install share the same database.

+

+Move the following files to the users/ folder in your eFiction install:

+

+editbio.php

+login.php

+profile.php

+register.php

+lostpassword.php

+

+Move the following files to the includes/ folder in your eFiction install:

+

+get_session_vars.php

+queries.php

+

+Edit queries.php to point to your PHP-Fusion tables.

+

+Goto Admin->Page Links and edit your Register and Lost Password links to point to your 

+PHP-Fusion pages.

+

+Register -> PATHTOPHPFUSION/register.php 

+Lost Password -> PATHTOPHPFUSION/lostpassword.php

+

+If eFiction is a sub-folder under PHP-Fusion PATHTOPHPFUSION will be ../

+

+

+

 

--- /dev/null
+++ b/bridges/php-fusion/editbio.php
@@ -1,1 +1,30 @@
-
+<?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 .= "<script language=\"javascript\" type=\"text/javascript\">

+location = \""._PATHTOFUSION."edit_profile.php".(isset($_GET['uid']) ? ";u=".$_GET['uid'] : "")."\";

+</script>";

+?>

--- /dev/null
+++ b/bridges/php-fusion/get_session_vars.php
@@ -1,1 +1,54 @@
-
+<?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.

+if (isset($_COOKIE['fusion_user']) && !defined("isMEMBER")) {

+	$cookie_vars = explode(".", $_COOKIE['fusion_user']);

+	$cookie_1 = preg_match("/^[0-9]+$/", $cookie_vars['0']) ? $cookie_vars['0'] : "0";

+	$cookie_2 = (preg_match("/^[0-9a-z]{32}$/", $cookie_vars['1']) ? $cookie_vars['1'] : "");

+	$userdata = dbassoc(dbquery("SELECT * FROM ("._AUTHORTABLE.", ".TABLEPREFIX."fanfiction_authorprefs as ap) WHERE "._UIDFIELD." = '$cookie_1' AND "._PASSWORDFIELD." ='$cookie_2' AND "._UIDFIELD." = ap.uid"));

+	if($userdata) {

+		if($userdata['uid'] == 0) dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_authorprefs(uid, userskin, storyindex, sortby, tinyMCE) VALUES('".$userdata['user_id']."', '$defaultskin', '$displayindex', '$defaultsort', '$tinyMCE')");

+		define("USERUID", $userdata['user_id']);

+		define("USERPENNAME", $userdata['user_name']);

+		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."_agecontsent"])) $ageconsent = $userdata['ageconsent'];

+		else $ageconsent = $_SESSION[$sitekey."_agecontsent"];

+		if (empty($_COOKIE['fusion_lastvisit'])) 

+			setcookie("fusion_lastvisit", $userdata['user_lastvisit'], time() + 3600, "/", "", "0");

+	}

+}

+if(!defined("USERUID")) define("USERUID", false);

+if(!defined("USERPENNAME")) define("USERPENNAME", false);

+if(!defined("uLEVEL")) define("uLEVEL", 0);

+if(!defined("isMEMBER")) define("isMEMBER", false);

+if(!defined("isADMIN")) define("isADMIN", false);

+

+?>

--- /dev/null
+++ b/bridges/php-fusion/index.php

--- /dev/null
+++ b/bridges/php-fusion/login.php
@@ -1,1 +1,71 @@
-
+<?php

+	if(isset($_POST['submit']) && preg_match("!^[a-z0-9_ ]{3,30}$!i", $_POST['penname'])) {

+if(!defined("_LOGINCHECK")) exit( );

+		define("_BASEDIR", "");

+		include("config.php");

+		$settings = dbquery("SELECT tableprefix, maintenance FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+		list($tableprefix, $maintenance) = dbrow($settings);

+		include("includes/queries.php");

+		$result = dbquery("SELECT * FROM "._AUTHORTABLE." LEFT JOIN ".$tableprefix."fanfiction_authorprefs AS ap ON ap.uid = "._UIDFIELD." WHERE "._PENNAMEFIELD." = '".$_POST['penname']."'");

+		$passwd = dbassoc($result);

+		if($maintenance && $passwd['level'] == 0) {

+			header("Location: maintenance.php");

+			exit( );

+		}

+		$encryptedpassword = md5($_POST['password']);

+		if($passwd['user_password'] == $encryptedpassword) {

+			if(!isset($_SESSION)) session_start( );

+			$_SESSION[$sitekey."_useruid"] = $passwd['user_id'];

+			$_SESSION[$sitekey."_salt"] = md5($passwd['user_email']+$encryptedpassword);

+			if(isset($_POST['cookiecheck'])) {

+				$cookie_exp = time() + 3600*24*30; } else { $cookie_exp = time() + 3600*3; 

+			}

+			$cookie_value = $passwd['user_id'].".".$passwd['user_password'];

+			setcookie("fusion_user", $cookie_value, $cookie_exp);

+			setcookie("fusion_lastvisit", $userdata['user_lastvisit'], time() + 3600);

+			define("USERUID", $passwd['uid']);

+			define("USERPENNAME", $passwd['penname']);

+			if(!isset($_SESSION[$sitekey."_skin"])) $siteskin = $passwd['userskin'];

+			else $siteskin = $_SESSION[$sitekey."_skin"];

+			define("uLEVEL", $passwd['level']);

+			define("isADMIN", uLEVEL > 0 ? true : false);

+			define("isMEMBER", true);

+			if(!isset($_SESSION[$sitekey."_agecontsent"])) $ageconsent = $passwd['ageconsent'];

+			else $ageconsent = $_SESSION[$sitekey."_agecontsent"];

+			$cookie_value = $passwd['user_id'].".".$passwd['user_password'];

+			setcookie("fusion_user", $cookie_value, time() + 3600, "/", "", "0");

+			if (empty($_COOKIE['fusion_lastvisit'])) 

+				setcookie("fusion_lastvisit", $userdata['user_lastvisit'], time() + 3600, "/", "", "0");

+		}

+		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");

+			$output2 .= "<div id=\"pagetitle\">"._MEMBERLOGIN."</div>";

+			$output2 .= "<div style='text-align: center;'>"._WRONGPASSWORD."</div>";

+			$tpl->assign("output", $output);

+			$tpl->printToScreen( );

+			dbclose( );

+			exit( );

+		}

+	}

+	else {

+if(!defined("_CHARSET")) exit( );

+		$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>";

+	}

+?>

--- /dev/null
+++ b/bridges/php-fusion/logout.php
@@ -1,1 +1,44 @@
-
+<?php

+if(!defined("_LOGOUTCHECK")) exit( );

+	define("_BASEDIR", "");

+	include("config.php");

+	include("includes/queries.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, '/', '', '' );

+		}

+	} 

+	$result = dbquery("DELETE FROM ".$db_prefix."online WHERE online_ip='".$_SERVER['REMOTE_ADDR']."'");

+	unset($_COOKIE["fusion_user"], $_COOKIE["fusion_lastvisited"], $_COOKIE['fusion_visited']);

+	setcookie("fusion_user", "", time() - 1000);

+	setcookie("fusion_lastvisit", "", time() - 1000);

+	setcookie("fusion_visited", "", 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( );

+dbclose( );

+exit();

+

+//	header("Location: index.php");

+//	exit( );

+?>

--- /dev/null
+++ b/bridges/php-fusion/lostpassword.php
@@ -1,1 +1,29 @@
-
+<?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 .= "<script language=\"javascript\" type=\"text/javascript\">

+location = \""._PATHTOFUSION."lostpassword.php\";

+</script>";

+?>

--- /dev/null
+++ b/bridges/php-fusion/profile.php
@@ -1,1 +1,52 @@
-
+<?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( );

+// Build the user's profile information

+$tpl->newBlock("profile");

+$result2 = dbquery("SELECT *,"._PENNAMEFIELD." as penname,user_avatar as image, user_email as email 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($favorites == "1" && isMEMBER)

+	$nameinfo .= " [<a href=\"viewuser.php?uid=USERUID&amp;action=addfav&amp;author=".$userinfo['uid']."\">"._ADDAUTHOR2FAVES."</a>]";

+$tpl->assign("userpenname", $userinfo['penname']." ".$nameinfo);

+$tpl->assign("membersince", date("$dateformat", $userinfo['user_joined']));

+if($userinfo['image'])

+	$tpl->assign("image", "<img src=\"../images/avatars/".$userinfo['image']."\">");

+$tpl->assign("userlevel", isset($userinfo['level']) && $userinfo['level'] > 0 && $userinfo['level'] < 4 ? _ADMINISTRATOR.(isADMIN ? " - ".$userinfo['level'] : "") : _MEMBER);

+$tpl->assign("aol", !empty($userinfo['user_aol']) ? "<img src=\"http://big.oscar.aol.com/".$userinfo['user_aol']."?on_url=$url/images/aim.gif&amp;off_url=$url/images/aim.gif\"> <a href=\"aim:goim?{aol}ScreenName=".$userinfo['user_aol']."\">".$userinfo['user_aol']."</a>" : "<img src=\"images/aim.gif\" alt=\""._AOL."\"> "._NONE);

+$tpl->assign("icq", !empty($userinfo['user_icq']) ? "<img src=\"http://status.icq.com/online.gif?icq=".$userinfo['user_icq']."&amp;img=5\"> ".$userinfo['user_icq'] : "<img src=\"images/icq.gif\" alt=\""._ICQ."\"> "._NONE);

+$tpl->assign("msn", "<img src=\"images/msntalk.gif\" alt=\""._MSN."\"> ".($userinfo['user_msn'] ? $userinfo['user_msn'] : _NONE));

+$tpl->assign("yahoo", !empty($userinfo['user_yahoo']) ? "<a href=\"http://edit.yahoo.com/config/send_webmesg?.target=".$userinfo['user_yahoo']."&amp;.src=pg\"><img border=\"0\" src=\"http://opi.yahoo.com/online?u=".$userinfo['user_yahoo']."&amp;m=g&amp;t=1\"> ".$userinfo['user_yahoo']."</a>" : "<img src=\"images/yim.gif\" alt=\""._YAHOO."\"> "._NONE);

+$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=lock&amp;".($userinfo['level'] < 0 ? "unlock=".$userinfo['uid']."\" class=\"vuadmin\">"._UNLOCKMEM : "do=lock&amp;uid=".$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");

+?>

--- /dev/null
+++ b/bridges/php-fusion/queries.php
@@ -1,1 +1,23 @@
-
+<?php

+

+// Default query strings used throughout the script.  You may need to alter these to bridge to other scripts or databases.

+

+// Your php-fusion database prefix found in the config.php of your php-fusion directory.

+$db_prefix = "fusion_";

+

+// This should be the relative path to your PHP-Fusion installation.  It will be used for your register, edit bio, etc. pages.

+define("_PATHTOFUSION", "../fusion");

+

+define("_UIDFIELD", "author.user_id");  // Do not change the aliasing (the "author." part)!

+define("_PENNAMEFIELD", "author.user_name");  // Do not change the aliasing (the "author." part)!

+define("_EMAILFIELD", "author.user_email");  // Do not change the aliasing (the "author." part)!

+define("_PASSWORDFIELD", "author.user_password"); // Do not change the aliasing (the "author." part)!

+define("_AUTHORTABLE", $db_prefix."users as author"); // Do not change the aliasing (the "as author" part)!

+

+define ("_STORYQUERY",  "SELECT stories.*, "._PENNAMEFIELD." as penname, UNIX_TIMESTAMP(stories.date) as date, UNIX_TIMESTAMP(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");

+?>

--- /dev/null
+++ b/bridges/php-fusion/register.php
@@ -1,1 +1,29 @@
-
+<?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 .= "<script language=\"javascript\" type=\"text/javascript\">

+location = \""._PATHTOFUSION."register.php\";

+</script>";

+?>

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, UNIX_TIMESTAMP(stories.date) as date, UNIX_TIMESTAMP(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,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\">".($recentdays ? _RECENTSTORIES : _MOSTRECENT)." ".$pagelinks['rss']['link']."</div>";

+	

+	$countquery .= ($recentdays ? " AND updated > '".date("Y-m-d H:i:s", mktime(0, 0, 0, date("m")  , date("d")-$recentdays, date("Y")))."'" : "");

+	$query = $storyquery.($recentdays ? " AND updated > '".date("Y-m-d H:i:s", mktime(0, 0, 0, date("m")  , date("d")-$recentdays, date("Y")))."'" : "");

+	$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."'></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/Skin Changes 2.0 to 3.0.txt
@@ -1,1 +1,69 @@
+Note: This is not a tutorial on how to update a skin.  It's pretty much my notes on what will eventually have to

+go into a tutorial.  Therefore, there's probably things missing.  We'll be working on a real tutorial.

+Optional additions to listings.tpl for stories:

+

+{toc} - Table of Contents link to story index 

+{count} - The view/read count

+{new} - The text "New!" for new stories or alternately a graphic (use the URL to the graphic from the main directory).

+{featuredtext} - The words "Featured Story" or "Past Featured Story" to use instead of the graphics if you wish

+

+This is already done for you in the default_tpls folder.

+

+Also in listings.tpl you will need to add {comment} to both the seriesblock and storyblock sections.  This 

+will be used for favorite stories to show the member's comments about the story. Style the comment with

+favcomment.tpl.  See the default_tpls folder for an example. 

+

+In viewstory.tpl optional addtion:

+

+{toc} - Table of Contents link to story index

+

+The story and chapter notes (beginning and end) have been moved into blocks in viewstory.tpl  This will let you

+style them any way you wish and also hide those blocks when there are no notes to display.  (See the default_tpls

+for an example)

+

+For any new classifications you add you will need to modify listings.tpl, series_title.tpl, and optionally 

+viewstory.tpl and storyindex.tpl to include those additional classifications.  Optionally, you can use {classifications}

+to include all your classifications at one time.  The default_tpls/listings.tpl uses {classifications}

+

+In reviews.tpl you can now add a quick review form to the bottom of the list of reviews instead of the 

+"Submit a Review" link using the {reviewform} variable.  Already done in default_tpls.

+

+The reviewsblock has been pulled into its own .tpl so it can be reused in places other than the reviews page 

+(such as the user panels)

+

+The profile section of the user page has been pulled into its own .tpl, again so that it can be re-used.  

+It should also make it easier for people modding skins.  There is also now a setting in your admin settings for

+whether or not to show the profile at the top of the view user page all the time or only when it's selected.

+

+In user.tpl you no longer have individual variables for the tabs.  Instead it's been put into a block to 

+allow more tabs to be added dynamically without editing the tpl's each time.

+

+<!-- START BLOCK : paneltabs -->

+<div {class}>{link} {count}</div>

+<!-- END BLOCK : paneltabs -->

+

+You can also use {linkcount} to include the count of items inside the link instead of next to it. You don't have 

+to use <div>'s.  This is just an example.

+

+Rather than have the news archive link hardcoded into the news block at the bottom, I've assigned it to a global 

+link (i.e. {home}) so that you can put it where you want.  It's assigned as {newsarchive}

+

+There are a large number of new links you can add to your skins and the menu block.  The list is in the "Page 

+Links" section of the admin panel.

+

+In default_tpls, we changed the "classification" CSS class to "label".  It's more clear what the purpose is

+and shorter. :)

+

+For the new profile block, if you add new fields to the profile information, you will need to either add the 

+individual links such as {yahoo} or remove the individual links and make use of the new {authorfields} variable

+that displays the complete list of custom fields.  If you're creating skins for the use of others, you're 

+encouraged to use {authorfields} instead of the individual links.

+

+The $current variable for the index page was changed to home to solve a conflict with the variable name for the

+pagelink.  This will affect skins like Romance that use the current setting as the name of a containing div.

+

+For the featured, recent, and random blocks, if you use the .tpl option you'll need to remove the name of the 

+block from each of the variables.  For instance {recenttitle} will now be {title}.  This is because each of

+these blocks now uses the storyblock.php code.  Therefore, you can also add any of the information you can

+use in the listings.tpl to your random, featured, and recent blocks. 

 

--- /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,553 @@
-
+-- 

+-- 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` datetime NOT NULL default '0000-00-00 00:00:00',

+  `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` datetime NOT NULL default '0000-00-00 00:00:00',

+  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',

+  `updated` datetime NOT NULL default '0000-00-00 00:00:00',

+  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` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,

+  `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` datetime default NULL,

+  `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` datetime NOT NULL default '0000-00-00 00:00:00',

+  `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` datetime NOT NULL default '0000-00-00 00:00:00',

+  `updated` datetime NOT NULL default '0000-00-00 00:00:00',

+  `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;

--- /dev/null
+++ b/docs/upgade11_step10.sql
@@ -1,1 +1,7 @@
+ALTER TABLE fanfiction_stories ADD `classes` VARCHAR( 200 ) NULL AFTER `catid`,

+CHANGE `summary` `summary` TEXT NULL,

+ADD `coauthors` VARCHAR( 200 ) NULL AFTER `uid`,

+CHANGE `numreviews` `reviews` SMALLINT( 6 ) DEFAULT '0' NOT NULL,

+CHANGE `counter` `count` INT( 11 ) NOT NULL DEFAULT '0' AFTER `reviews`,

+ADD `storynotes` TEXT NULL DEFAULT '' AFTER `summary`;

 

--- /dev/null
+++ b/docs/upgade20_step10.sql
@@ -1,1 +1,11 @@
+ALTER TABLE fanfiction_stories ADD `classes` VARCHAR( 200 ) NULL AFTER `catid`;

+ALTER TABLE fanfiction_series ADD `classes` VARCHAR( 200 ) NULL AFTER `catid`;

+ALTER TABLE fanfiction_series CHANGE `owner` `uid` INT( 11 ) NOT NULL DEFAULT '0'

+ALTER TABLE fanfiction_stories CHANGE `summary` `summary` TEXT NULL

+ALTER TABLE fanfiction_series CHANGE `summary` `summary` TEXT NULL

+ALTER TABLE fanfiction_stories ADD `coauthors` VARCHAR( 200 ) NULL AFTER `uid`

+ALTER TABLE fanfiction_stories ADD `count` INT( 11 ) NOT NULL DEFAULT '0' AFTER `reviews`;

+ALTER TABLE fanfiction_stories ADD `storynotes` TEXT NULL DEFAULT '' AFTER `summary`;

+ALTER TABLE fanfiction_chapters ADD `endnotes` TEXT NULL DEFAULT '' AFTER `storytext`;

+ALTER TABLE fanfiction_chapters ADD `count` INT( 11 ) NOT NULL DEFAULT '0' AFTER `uid`;

 

--- /dev/null
+++ b/docs/upgrade11_step10.sql
@@ -1,1 +1,7 @@
+ALTER TABLE fanfiction_stories ADD `classes` VARCHAR( 200 ) NULL AFTER `catid`,

+CHANGE `summary` `summary` TEXT NULL,

+ADD `coauthors` VARCHAR( 200 ) NULL AFTER `uid`,

+CHANGE `numreviews` `reviews` SMALLINT( 6 ) DEFAULT '0' NOT NULL,

+CHANGE `counter` `count` INT( 11 ) NOT NULL DEFAULT '0' AFTER `reviews`,

+ADD `storynotes` TEXT NULL DEFAULT '' AFTER `summary`;

 

--- /dev/null
+++ b/docs/upgrade11_step4.sql
@@ -1,1 +1,182 @@
+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`)

+) TYPE=MyISAM;

+CREATE TABLE `fanfiction_authorinfo` (

+  `uid` int(11) NOT NULL default '0',

+  `field` int(11) NOT NULL default '0',

+  `info` varchar(255) NOT NULL default ' ',

+  KEY `uid` (`uid`)

+) TYPE=MyISAM;

+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',

+   PRIMARY KEY  (`uid`)

+) TYPE=MyISAM;

+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`)

+) TYPE=MyISAM;

+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 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`)

+) TYPE=MyISAM;

+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`)

+) TYPE=MyISAM;

+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`),

+  KEY `classtype_title` (`classtype_title`)

+) TYPE=MyISAM;

+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`)

+) TYPE=MyISAM;

+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 NULL,

+  KEY `uid` (`uid`)

+) TYPE=MyISAM;

+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',

+  `updated` datetime NOT NULL default '0000-00-00 00:00:00',

+  KEY `sid` (`sid`),

+  KEY `inorder` (`inorder`),

+  KEY `seriesid` (`seriesid`)

+) TYPE=MyISAM;

+CREATE TABLE `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) default NULL,

+  `log_timestamp` timestamp NOT NULL,

+  `log_type` varchar(2) NOT NULL,

+  PRIMARY KEY  (`log_id`)

+) TYPE=MyISAM

+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 NULL,

+  PRIMARY KEY  (`message_id`)

+) TYPE=MyISAM;

+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`)

+) TYPE=MyISAM;

+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_text` (`link_text`),

+  KEY `link_name` (`link_name`)

+) TYPE=MyISAM;

+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_hidden` (`panel_hidden`),

+  KEY `panel_type` (`panel_type`)

+) TYPE=MyISAM;

+CREATE TABLE `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',

+  `challenges` varchar(200) NOT NULL default '',

+  PRIMARY KEY  (`seriesid`),

+  KEY `owner` (`uid`),

+  KEY `catid` (`catid`),

+  KEY `challenges` (`challenges`),

+  KEY `characters` (`characters`),

+  KEY `classes` (`classes`)

+) TYPE=MyISAM;

+

+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'

+) TYPE=MyISAM;

 

--- /dev/null
+++ b/docs/upgrade20_step10.sql
@@ -1,1 +1,11 @@
+ALTER TABLE fanfiction_stories ADD `classes` VARCHAR( 200 ) NULL AFTER `catid`;

+ALTER TABLE fanfiction_series ADD `classes` VARCHAR( 200 ) NULL AFTER `catid`;

+ALTER TABLE fanfiction_series CHANGE `owner` `uid` INT( 11 ) NOT NULL DEFAULT '0'

+ALTER TABLE fanfiction_stories CHANGE `summary` `summary` TEXT NULL

+ALTER TABLE fanfiction_series CHANGE `summary` `summary` TEXT NULL

+ALTER TABLE fanfiction_stories ADD `coauthors` VARCHAR( 200 ) NULL AFTER `uid`

+ALTER TABLE fanfiction_stories ADD `count` INT( 11 ) NOT NULL DEFAULT '0' AFTER `reviews`;

+ALTER TABLE fanfiction_stories ADD `storynotes` TEXT NULL DEFAULT '' AFTER `summary`;

+ALTER TABLE fanfiction_chapters ADD `endnotes` TEXT NULL DEFAULT '' AFTER `storytext`;

+ALTER TABLE fanfiction_chapters ADD `count` INT( 11 ) NOT NULL DEFAULT '0' AFTER `uid`;

 

--- /dev/null
+++ b/docs/upgrade20_step4.sql
@@ -1,1 +1,231 @@
+

+-- --------------------------------------------------------

+

+-- 

+-- 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`)

+) ;

+

+-- --------------------------------------------------------

+

+-- 

+-- 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 ' ',

+  KEY `uid` (`uid`)

+);

+

+-- --------------------------------------------------------

+

+-- 

+-- 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',

+  PRIMARY KEY  (`uid`)

+);

+

+

+-- --------------------------------------------------------

+

+-- 

+-- 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`)

+);

+

+-- --------------------------------------------------------

+

+-- 

+-- 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`)

+);

+

+-- --------------------------------------------------------

+

+-- 

+-- 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`),

+  KEY `classtype_title` (`classtype_title`)

+);

+

+-- --------------------------------------------------------

+

+-- 

+-- 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`)

+) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

+

+-- --------------------------------------------------------

+

+-- 

+-- 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 NOT NULL,

+  KEY `uid` (`uid`)

+);

+

+

+-- --------------------------------------------------------

+

+-- 

+-- 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,

+  `log_ip` int(11) default NULL,

+  `log_timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,

+  `log_type` varchar(2) NOT NULL,

+  PRIMARY KEY  (`log_id`)

+);

+

+-- --------------------------------------------------------

+

+-- 

+-- 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 NOT NULL,

+  PRIMARY KEY  (`message_id`)

+);

+

+

+-- --------------------------------------------------------

+-- 

+-- Table structure for table `fanfiction_modules`

+-- 

+

+CREATE TABLE `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`)

+);

+

+-- --------------------------------------------------------

+

+-- 

+-- 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_text` (`link_text`),

+  KEY `link_name` (`link_name`)

+);

+

+-- --------------------------------------------------------

+

+-- 

+-- 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_hidden` (`panel_hidden`),

+  KEY `panel_type` (`panel_type`)

+);

+

+-- --------------------------------------------------------

+-- 

+-- 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'

+) TYPE=MyISAM;

+

+

 

file:b/header.php (new)
--- /dev/null
+++ b/header.php
@@ -1,1 +1,414 @@
+<?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;

+if(get_magic_quotes_gpc()){

+	foreach($_POST as $var => $val) {

+		$_POST[$var] = is_array( $val ) ? array_map( 'stripslashes', $val ) : stripslashes( $val );

+	}

+	foreach($_GET as $var => $val) {

+		$_GET[$var] = is_array( $val ) ? array_map( 'stripslashes', $val ) : stripslashes( $val );

+	}

+}

+

+// 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(!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) {

+	$$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)) {

+	$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'];

+}

+

+// 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, $tinyMCE) = dbrow($prefs);

+}

+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>";

+if(!isset($titleinfo)) $titleinfo = "$sitename :: $slogan";

+if(isset($metaDesc)) echo "<meta name='description' content='$metaDesc'>";

+echo "<title>$titleinfo</title>

+<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(!empty($tinyMCE)) {

+	echo "<script language=\"javascript\" type=\"text/javascript\" src=\""._BASEDIR."tinymce/jscripts/tiny_mce/tiny_mce.js\"></script>

+	<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>";

+}

+}

+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;}

+#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 { margin: 1ex auto; 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/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,88 @@
+<?php

+

+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 = $ccolor[$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,882 @@
-
+<?php

+/* vim: set expandtab tabstop=4 shiftwidth=4: */

+// +----------------------------------------------------------------------+

+// | TemplatePower:                                                       |

+// | offers you the ability to separate your PHP code and your HTML       |

+// +----------------------------------------------------------------------+

+// |                                                                      |

+// | Copyright (C) 2001,2002  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, rovel@codocad.nl   The Netherlands         |

+// |                                                                      |

+// +----------------------------------------------------------------------+

+// | http://templatepower.codocad.com                                     |

+// +----------------------------------------------------------------------+

+//

+// $Id: Version 3.0.1$

+

+define("T_BYFILE",              0);

+define("T_BYVAR",               1);

+

+define("TP_ROOTBLOCK",    '_ROOT');

+

+class TemplatePowerParser

+{

+  var $tpl_base;              //Array( [filename/varcontent], [T_BYFILE/T_BYVAR] )

+  var $tpl_include;           //Array( [filename/varcontent], [T_BYFILE/T_BYVAR] )

+  var $tpl_count;

+

+  var $parent   = Array();    // $parent[{blockname}] = {parentblockname}

+  var $defBlock = Array();

+

+  var $rootBlockName;

+  var $ignore_stack;

+

+  var $version;

+

+   /**

+    * TemplatePowerParser::TemplatePowerParser()

+    *

+    * @param $tpl_file

+    * @param $type

+    * @return

+	*

+	* @access private

+    */

+   function TemplatePowerParser( $tpl_file, $type )

+   {

+       $this->version        = '3.0.1';

+

+       $this->tpl_base       = Array( $tpl_file, $type );

+       $this->tpl_count      = 0;

+	   $this->ignore_stack   = Array( false );

+   }

+

+   /**

+    * TemplatePowerParser::__errorAlert()

+    *

+    * @param $message

+    * @return

+	*

+	* @access private

+    */

+   function __errorAlert( $message )

+   {

+       print( '<br>'. $message .'<br>\r\n');

+   }

+

+   /**

+    * TemplatePowerParser::__prepare()

+    *

+    * @return

+	*

+	* @access private

+    */

+   function __prepare()

+   {

+       $this->defBlock[ TP_ROOTBLOCK ] = Array();

+       $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

+     */

+    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

+     */

+    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(@file( $tpl_file))

+            {

+	        	$this->{$tplvar}["content"] = @file( $tpl_file );

+        	}

+        	else

+        	{

+	        	$string = "^/[a-z]+/^";

+	        	$tpl_file = preg_replace($string, "/".$skin."/", $tpl_file);

+			$this->{$tplvar}["content"] = @file( $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

+     */

+    function __parseTemplate( $tplvar, $blockname, $initdev )

+    {

+        $coderow = $initdev["coderow"];

+        $varrow  = $initdev["varrow"];

+        $index   = $initdev["index"];

+        $ignore  = $initdev["ignore"];

+

+        while( $index < $this->{$tplvar}["size"] )

+        {

+            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 ) )

+                {

+                    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' )

+                        {

+                           //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

+     */

+    function version()

+    {

+        return $this->version;

+    }

+

+    /**

+     * TemplatePowerParser::assignInclude()

+     *

+     * @param $iblockname

+     * @param $value

+     * @param $type

+	 *

+	 * @return

+	 *

+	 * @access public

+     */

+    function assignInclude( $iblockname, $value, $type=T_BYFILE )

+    {

+        $this->tpl_include["$iblockname"] = Array( $value, $type );

+    }

+}

+

+class TemplatePower extends TemplatePowerParser

+{

+  var $index    = Array();        // $index[{blockname}]  = {indexnumber}

+  var $content  = Array();

+

+  var $currentBlock;

+  var $showUnAssigned;

+  var $serialized;

+  var $globalvars = Array();

+  var $prepared;

+

+    /**

+     * TemplatePower::TemplatePower()

+     *

+     * @param $tpl_file

+     * @param $type

+     * @return

+	 *

+	 * @access public

+     */

+    function TemplatePower( $tpl_file='', $type= T_BYFILE )

+    {

+        TemplatePowerParser::TemplatePowerParser( $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

+     */

+    function __deSerializeTPL( $stpl_file, $type )

+    {

+        if( $type == T_BYFILE )

+        {

+            $serializedTPL = @file( $stpl_file ) or

+                die( $this->__errorAlert('TemplatePower Error: Can\'t open [ '. $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

+     */

+    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

+     */

+    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

+     */

+    function __assignGlobal( $varname, $value )

+    {

+        $this->globalvars[ $varname ] = $value;

+    }

+

+

+    /**

+     * TemplatePower::__outputContent()

+     *

+     * @param $blockname

+     * @return

+	 *

+	 * @access private

+     */

+    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

+                        {

+                            if( $this->showUnAssigned )

+                            {

+                                //$value = '{'. $this->defBlock[ $defblockname ][$k] .'}';

+                                $value = '{'. $defValue .'}';

+                            }

+                            else

+                            {

+                                $value = '';

+                            }

+                        }

+                    }

+                    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] );

+                    }

+                }

+            }

+        }

+    }

+

+    function __printVars()

+    {

+        var_dump($this->defBlock);

+        print("<br>--------------------<br>");

+        var_dump($this->content);

+    }

+

+

+  /**********

+      public members

+            ***********/

+

+    /**

+     * TemplatePower::serializedBase()

+     *

+     * @return

+	 *

+	 * @access public

+     */

+    function serializedBase()

+    {

+        $this->serialized = true;

+        $this->__deSerializeTPL( $this->tpl_base[0], $this->tpl_base[1] );

+    }

+

+    /**

+     * TemplatePower::showUnAssigned()

+     *

+     * @param $state

+     * @return

+	 *

+	 * @access public

+     */

+    function showUnAssigned( $state = true )

+    {

+        $this->showUnAssigned = $state;

+    }

+

+    /**

+     * TemplatePower::prepare()

+     *

+     * @return

+	 *

+	 * @access public

+     */

+    function prepare()

+    {

+        if (!$this->serialized)

+        {

+            TemplatePowerParser::__prepare();

+        }

+

+        $this->prepared = true;

+

+        $this->index[ TP_ROOTBLOCK ]    = 0;

+        $this->__makeContentRoot();

+    }

+

+    /**

+     * TemplatePower::newBlock()

+     *

+     * @param $blockname

+     * @return

+	 *

+	 * @access public

+     */

+    function newBlock( $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

+     */

+    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

+     */

+    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

+     */

+    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

+     */

+    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

+     */

+    function printToScreen()

+    {

+        if ($this->prepared)

+        {

+            $this->__outputContent( TP_ROOTBLOCK .'_0' );

+        }

+        else

+        {

+            $this->__errorAlert('TemplatePower Error: Template isn\'t prepared!');

+        }

+	if(!empty($_GET['benchmark'])) {

+		global  $start;

+		list($usec, $sec) = explode(" ", microtime());

+		$stop = ((float)$usec + (float)$sec);

+		echo "<!-- Benchmark: ".($stop - $start)." -->";

+	}

+    }

+

+    /**

+     * TemplatePower::getOutputContent()

+     *

+     * @return

+	 *

+	 * @access public

+     */

+    function getOutputContent()

+    {

+        ob_start();

+

+        $this->printToScreen();

+

+        $content = ob_get_contents();

+

+        ob_end_clean();

+

+        return $content;

+    }

+}

+?>

--- /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($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,9 @@
-
+<?php

+

+if(function_exists("mysqli_connect")) include_once(_BASEDIR."includes/mysqli_functions.php");

+else if(function_exists("mysql_connect")) include_once(_BASEDIR."includes/mysql_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,194 @@
-
+<?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)) {

+			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`) VALUES('".escapestring(sprintf(_LOG_ADMIN_DEL, USERPENNAME, USERUID, $story['title'], $sid, $penname, $story['uid']))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'DL')");

+	}

+	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.

+	if($story['coauthors'] == 1) {

+		$coauth = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_coauthors WHERE sid = '$sid'");

+		while($c = dbassoc($coauth)) {

+			$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($coauthors)) {

+			$coauthors[] = $story['uid'];

+			dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs SET stories = stories - 1 WHERE FIND_IN_SET(uid, '".implode(",", $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 = array( );

+					while($cRes= dbassoc($cQuery)) {

+						if(!$newauthor) $newauthor = $cRes['uid'];

+						else $coauthors[] = $cRes['uid'];

+					}			

+					if(!empty($newauthor)) {

+						$coauthors = count($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`) VALUES('".escapestring(sprintf(_LOG_ADMIN_DEL_SERIES, USERPENNAME, USERUID, $title))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'DL')");

+	}

+}

+?>

--- /dev/null
+++ b/includes/emailer.php
@@ -1,1 +1,110 @@
-
+<?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;

+	// 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/phpmailer_include.php");

+	$mail = new PHPMailer( );

+	if(file_exists("languages/mailer/phpmailer.lang-".$language.".php"))

+		$mail->SetLanguage($language, "language/mailer/");

+	else 

+		$mail->SetLanguage("en", "language/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 = $from_email;

+	$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 false;

+	} 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."_agecontsent"])) $ageconsent = $userdata['ageconsent'];

+		else $ageconsent = $_SESSION[$sitekey."_agecontsent"];

+	}

+}

+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."_agecontsent"])) $ageconsent = $userdata['ageconsent'];

+		else $ageconsent = $_SESSION[$sitekey."_agecontsent"];

+	}

+}

+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/language/index.php

--- /dev/null
+++ b/includes/language/phpmailer.lang-en.php
@@ -1,1 +1,24 @@
+<?php

+/**

+ * PHPMailer language file.  

+ * English Version

+ */

+

+$PHPMAILER_LANG = array();

+

+$PHPMAILER_LANG["provide_address"] = 'You must provide at least one ' .

+                                     'recipient email address.';

+$PHPMAILER_LANG["mailer_not_supported"] = ' mailer is not supported.';

+$PHPMAILER_LANG["execute"] = 'Could not execute: ';

+$PHPMAILER_LANG["instantiate"] = 'Could not instantiate mail function.';

+$PHPMAILER_LANG["authenticate"] = 'SMTP Error: Could not authenticate.';

+$PHPMAILER_LANG["from_failed"] = 'The following From address failed: ';

+$PHPMAILER_LANG["recipients_failed"] = 'SMTP Error: The following ' .

+                                       'recipients failed: ';

+$PHPMAILER_LANG["data_not_accepted"] = 'SMTP Error: Data not accepted.';

+$PHPMAILER_LANG["connect_host"] = 'SMTP Error: Could not connect to SMTP host.';

+$PHPMAILER_LANG["file_access"] = 'Could not access file: ';

+$PHPMAILER_LANG["file_open"] = 'File Error: Could not open file: ';

+$PHPMAILER_LANG["encoding"] = 'Unknown encoding: ';

+?>

 

--- /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,

+// 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/mysql_functions.php
@@ -1,1 +1,69 @@
-
+<?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 = mysql_connect($dbhost, $dbuser, $dbpass);

+	if(!$mysql_access) {

+		include(_BASEDIR."languages/en.php");

+		die(_FATALERROR." "._NOTCONNECTED);

+	}

+	mysql_select_db($dbname, $mysql_access);

+	return $mysql_access;

+}

+

+

+function dbquery($query) {

+	global $debug, $headerSent, $dbconnect;

+	if($debug  && $headerSent) echo "<!-- $query -->\n";

+	$result = mysql_query($query, $dbconnect) or accessDenied( _FATALERROR.(isADMIN ? "Query: ".$query."<br />Error: (".mysql_errno( ).") ".mysql_error( ) : ""));

+	return $result;

+}

+

+function dbnumrows($query) {

+	global $debug, $dbconnect;

+	if ($query === false && mysql_errno( ) > 0 && $debug) {

+		echo "<!-- dbnumrows ".mysql_error( )." -->\n";

+	}

+	$query = mysql_num_rows($query);

+	return $query;

+}

+

+function dbassoc($query) {

+	global $debug, $dbconnect;

+	if ($query === false && mysql_errno( ) > 0 && $debug) {

+		echo "<!-- dbassoc ".mysql_error( )." -->\n";

+	}

+	$query = mysql_fetch_assoc($query);

+	return $query;

+}

+

+function dbinsertid($tablename = 0) {

+	return mysql_insert_id( );

+}

+

+function dbrow($query) {

+	global $debug, $dbconnect;

+	if ($query === false && mysql_errno( ) > 0 && $debug) {

+		if($error) echo "<!-- dbrow ".mysql_error( )." -->\n";

+	}

+	$query = mysql_fetch_row($query);

+	return $query;

+}

+

+// Used to escape text being put into the database.

+function escapestring($str) {

+   if (!is_array($str)) return mysql_real_escape_string($str);

+   else return array_map('escapestring', $str);

+}

+

+function dbclose( ) {

+	global $dbconnect;

+	mysql_close($dbconnect);

+

+}

+// End DB functions

+}

+?>

--- /dev/null
+++ b/includes/mysqli_functions.php
@@ -1,1 +1,67 @@
-
+<?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);

+	if(mysqli_connect_error()) {

+		include(_BASEDIR."languages/en.php"); // Because we haven't got a language set yet.

+		die(_FATALERROR." "._NOTCONNECTED);

+	}

+	return $mysql_access;

+}

+

+

+function dbquery($query) {

+	global $debug, $headerSent, $dbconnect;

+	if($debug && $headerSent) echo "<!-- $query -->\n";

+	$result = $dbconnect->query($query) or accessDenied( _FATALERROR.(isADMIN ? "Query: ".$query."<br />Error: (".$dbconnect->mysqli_errno.") ".$dbconnect->mysqli_error : ""));

+	return $result;

+}

+

+function dbnumrows($query) {

+	global $debug, $dbconnect;

+	if ($query === false && $debug) {

+		echo "<!-- dbnumrows ".$dbconnect->mysqli_error." -->\n";

+	}

+	return $query->num_rows;

+}

+

+function dbassoc($query) {

+	global $debug, $dbconnect;

+	if ($query === false && $debug) {

+		echo "<!-- dbassoc ".$dbconnect->mysqli_error." -->\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($error) echo "<!-- dbrow ".$dbconnect->mysqli_error." -->\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/phpmailer_include.php
@@ -1,1 +1,1501 @@
-
+<?php

+if(!defined("_CHARSET")) exit( );

+////////////////////////////////////////////////////

+// PHPMailer - PHP email class

+//

+// Class for sending email using either

+// sendmail, PHP mail(), or SMTP.  Methods are

+// based upon the standard AspEmail(tm) classes.

+//

+// Copyright (C) 2001 - 2003  Brent R. Matzelle

+//

+// License: LGPL, see LICENSE

+////////////////////////////////////////////////////

+

+/**

+ * PHPMailer - PHP email transport class

+ * @package PHPMailer

+ * @author Brent R. Matzelle

+ * @copyright 2001 - 2003 Brent R. Matzelle

+ */

+class PHPMailer

+{

+

+    /////////////////////////////////////////////////

+    // PUBLIC VARIABLES

+    /////////////////////////////////////////////////

+

+    /**

+     * Email priority (1 = High, 3 = Normal, 5 = low).

+     * @var int

+     */

+    var $Priority          = 3;

+

+    /**

+     * Sets the CharSet of the message.

+     * @var string

+     */

+    var $CharSet           = "iso-8859-1";

+

+    /**

+     * Sets the Content-type of the message.

+     * @var string

+     */

+    var $ContentType        = "text/plain";

+

+    /**

+     * Sets the Encoding of the message. Options for this are "8bit",

+     * "7bit", "binary", "base64", and "quoted-printable".

+     * @var string

+     */

+    var $Encoding          = "8bit";

+

+    /**

+     * Holds the most recent mailer error message.

+     * @var string

+     */

+    var $ErrorInfo         = "";

+

+    /**

+     * Sets the From email address for the message.

+     * @var string

+     */

+    var $From               = "root@localhost";

+

+    /**

+     * Sets the From name of the message.

+     * @var string

+     */

+    var $FromName           = "Root User";

+

+    /**

+     * Sets 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

+     */

+    var $Sender            = "";

+

+    /**

+     * Sets the Subject of the message.

+     * @var string

+     */

+    var $Subject           = "";

+

+    /**

+     * Sets the Body of the message.  This can be either an HTML or text body.

+     * If HTML then run IsHTML(true).

+     * @var string

+     */

+    var $Body               = "";

+

+    /**

+     * Sets the text-only body of the message.  This automatically sets the

+     * email to multipart/alternative.  This body can be read by mail

+     * clients that do not have HTML email capability such as mutt. Clients

+     * that can read HTML will view the normal Body.

+     * @var string

+     */

+    var $AltBody           = "";

+

+    /**

+     * Sets word wrapping on the body of the message to a given number of 

+     * characters.

+     * @var int

+     */

+    var $WordWrap          = 0;

+

+    /**

+     * Method to send mail: ("mail", "sendmail", or "smtp").

+     * @var string

+     */

+    var $Mailer            = "mail";

+

+    /**

+     * Sets the path of the sendmail program.

+     * @var string

+     */

+    var $Sendmail          = "/usr/sbin/sendmail";

+    

+    /**

+     * Path to PHPMailer plugins.  This is now only useful if the SMTP class 

+     * is in a different directory than the PHP include path.  

+     * @var string

+     */

+    var $PluginDir         = "";

+

+    /**

+     *  Holds PHPMailer version.

+     *  @var string

+     */

+    var $Version           = "1.73";

+

+    /**

+     * Sets the email address that a reading confirmation will be sent.

+     * @var string

+     */

+    var $ConfirmReadingTo  = "";

+

+    /**

+     *  Sets the hostname to use in Message-Id and Received headers

+     *  and as default HELO string. If empty, the value returned

+     *  by SERVER_NAME is used or 'localhost.localdomain'.

+     *  @var string

+     */

+    var $Hostname          = "";

+

+    /////////////////////////////////////////////////

+    // SMTP VARIABLES

+    /////////////////////////////////////////////////

+

+    /**

+     *  Sets the SMTP hosts.  All hosts must be separated by a

+     *  semicolon.  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").

+     *  Hosts will be tried in order.

+     *  @var string

+     */

+    var $Host        = "localhost";

+

+    /**

+     *  Sets the default SMTP server port.

+     *  @var int

+     */

+    var $Port        = 25;

+

+    /**

+     *  Sets the SMTP HELO of the message (Default is $Hostname).

+     *  @var string

+     */

+    var $Helo        = "";

+

+    /**

+     *  Sets SMTP authentication. Utilizes the Username and Password variables.

+     *  @var bool

+     */

+    var $SMTPAuth     = false;

+

+    /**

+     *  Sets SMTP username.

+     *  @var string

+     */

+    var $Username     = "";

+

+    /**

+     *  Sets SMTP password.

+     *  @var string

+     */

+    var $Password     = "";

+

+    /**

+     *  Sets the SMTP server timeout in seconds. This function will not 

+     *  work with the win32 version.

+     *  @var int

+     */

+    var $Timeout      = 10;

+

+    /**

+     *  Sets SMTP class debugging on or off.

+     *  @var bool

+     */

+    var $SMTPDebug    = false;

+

+    /**

+     * Prevents the SMTP connection from being closed after each mail 

+     * sending.  If this is set to true then to close the connection 

+     * requires an explicit call to SmtpClose(). 

+     * @var bool

+     */

+    var $SMTPKeepAlive = false;

+

+    /**#@+

+     * @access private

+     */

+    var $smtp            = NULL;

+    var $to              = array();

+    var $cc              = array();

+    var $bcc             = array();

+    var $ReplyTo         = array();

+    var $attachment      = array();

+    var $CustomHeader    = array();

+    var $message_type    = "";

+    var $boundary        = array();

+    var $language        = array();

+    var $error_count     = 0;

+    var $LE              = "\n";

+    /**#@-*/

+    

+    /////////////////////////////////////////////////

+    // VARIABLE METHODS

+    /////////////////////////////////////////////////

+

+    /**

+     * Sets message type to HTML.  

+     * @param bool $bool

+     * @return void

+     */

+    function IsHTML($bool) {

+        if($bool == true)

+            $this->ContentType = "text/html";

+        else

+            $this->ContentType = "text/plain";

+    }

+

+    /**

+     * Sets Mailer to send message using SMTP.

+     * @return void

+     */

+    function IsSMTP() {

+        $this->Mailer = "smtp";

+    }

+

+    /**

+     * Sets Mailer to send message using PHP mail() function.

+     * @return void

+     */

+    function IsMail() {

+        $this->Mailer = "mail";

+    }

+

+    /**

+     * Sets Mailer to send message using the $Sendmail program.

+     * @return void

+     */

+    function IsSendmail() {

+        $this->Mailer = "sendmail";

+    }

+

+    /**

+     * Sets Mailer to send message using the qmail MTA. 

+     * @return void

+     */

+    function IsQmail() {

+        $this->Sendmail = "/var/qmail/bin/sendmail";

+        $this->Mailer = "sendmail";

+    }

+

+

+    /////////////////////////////////////////////////

+    // RECIPIENT METHODS

+    /////////////////////////////////////////////////

+

+    /**

+     * Adds a "To" address.  

+     * @param string $address

+     * @param string $name

+     * @return void

+     */

+    function AddAddress($address, $name = "") {

+        $cur = count($this->to);

+        $this->to[$cur][0] = trim($address);

+        $this->to[$cur][1] = $name;

+    }

+

+    /**

+     * Adds a "Cc" address. Note: this function works

+     * with the SMTP mailer on win32, not with the "mail"

+     * mailer.  

+     * @param string $address

+     * @param string $name

+     * @return void

+    */

+    function AddCC($address, $name = "") {

+        $cur = count($this->cc);

+        $this->cc[$cur][0] = trim($address);

+        $this->cc[$cur][1] = $name;

+    }

+

+    /**

+     * Adds a "Bcc" address. Note: this function works

+     * with the SMTP mailer on win32, not with the "mail"

+     * mailer.  

+     * @param string $address

+     * @param string $name

+     * @return void

+     */

+    function AddBCC($address, $name = "") {

+        $cur = count($this->bcc);

+        $this->bcc[$cur][0] = trim($address);

+        $this->bcc[$cur][1] = $name;

+    }

+

+    /**

+     * Adds a "Reply-to" address.  

+     * @param string $address

+     * @param string $name

+     * @return void

+     */

+    function AddReplyTo($address, $name = "") {

+        $cur = count($this->ReplyTo);

+        $this->ReplyTo[$cur][0] = trim($address);

+        $this->ReplyTo[$cur][1] = $name;

+    }

+

+

+    /////////////////////////////////////////////////

+    // MAIL SENDING METHODS

+    /////////////////////////////////////////////////

+

+    /**

+     * Creates message and assigns Mailer. If the message is

+     * not sent successfully then it returns false.  Use the ErrorInfo

+     * variable to view description of the error.  

+     * @return bool

+     */

+    function Send() {

+        $header = "";

+        $body = "";

+        $result = true;

+

+        if((count($this->to) + count($this->cc) + count($this->bcc)) < 1)

+        {

+            $this->SetError($this->Lang("provide_address"));

+            return false;

+        }

+

+        // Set whether the message is multipart/alternative

+        if(!empty($this->AltBody))

+            $this->ContentType = "multipart/alternative";

+

+        $this->error_count = 0; // reset errors

+        $this->SetMessageType();

+        $header .= $this->CreateHeader();

+        $body = $this->CreateBody();

+

+        if($body == "") { return false; }

+

+        // Choose the mailer

+        switch($this->Mailer)

+        {

+            case "sendmail":

+                $result = $this->SendmailSend($header, $body);

+                break;

+            case "mail":

+                $result = $this->MailSend($header, $body);

+                break;

+            case "smtp":

+                $result = $this->SmtpSend($header, $body);

+                break;

+            default:

+            $this->SetError($this->Mailer . $this->Lang("mailer_not_supported"));

+                $result = false;

+                break;

+        }

+

+        return $result;

+    }

+    

+    /**

+     * Sends mail using the $Sendmail program.  

+     * @access private

+     * @return bool

+     */

+    function SendmailSend($header, $body) {

+        if ($this->Sender != "")

+            $sendmail = sprintf("%s -oi -f %s -t", $this->Sendmail, $this->Sender);

+        else

+            $sendmail = sprintf("%s -oi -t", $this->Sendmail);

+

+        if(!@$mail = popen($sendmail, "w"))

+        {

+            $this->SetError($this->Lang("execute") . $this->Sendmail);

+            return false;

+        }

+

+        fputs($mail, $header);

+        fputs($mail, $body);

+        

+        $result = pclose($mail) >> 8 & 0xFF;

+        if($result != 0)

+        {

+            $this->SetError($this->Lang("execute") . $this->Sendmail);

+            return false;

+        }

+

+        return true;

+    }

+

+    /**

+     * Sends mail using the PHP mail() function.  

+     * @access private

+     * @return bool

+     */

+    function MailSend($header, $body) {

+        $to = "";

+        for($i = 0; $i < count($this->to); $i++)

+        {

+            if($i != 0) { $to .= ", "; }

+            $to .= $this->to[$i][0];

+        }

+

+        if ($this->Sender != "" && strlen(ini_get("safe_mode"))< 1)

+        {

+            $old_from = ini_get("sendmail_from");

+            ini_set("sendmail_from", $this->Sender);

+            $params = sprintf("-oi -f %s", $this->Sender);

+            $rt = @mail($to, $this->EncodeHeader($this->Subject), $body, 

+                        $header, $params);

+        }

+        else

+            $rt = @mail($to, $this->EncodeHeader($this->Subject), $body, $header);

+

+        if (isset($old_from))

+            ini_set("sendmail_from", $old_from);

+

+        if(!$rt)

+        {

+            $this->SetError($this->Lang("instantiate"));

+            return false;

+        }

+

+        return true;

+    }

+

+    /**

+     * Sends mail via SMTP using PhpSMTP (Author:

+     * Chris Ryan).  Returns bool.  Returns false if there is a

+     * bad MAIL FROM, RCPT, or DATA input.

+     * @access private

+     * @return bool

+     */

+    function SmtpSend($header, $body) {

+        include_once(_BASEDIR."includes/smtp_include.php");

+        $error = "";

+        $bad_rcpt = array();

+

+        if(!$this->SmtpConnect())

+            return false;

+

+        $smtp_from = ($this->Sender == "") ? $this->From : $this->Sender;

+        if(!$this->smtp->Mail($smtp_from))

+        {

+            $error = $this->Lang("from_failed") . $smtp_from;

+            $this->SetError($error);

+            $this->smtp->Reset();

+            return false;

+        }

+

+        // Attempt to send attach all recipients

+        for($i = 0; $i < count($this->to); $i++)

+        {

+            if(!$this->smtp->Recipient($this->to[$i][0]))

+                $bad_rcpt[] = $this->to[$i][0];

+        }

+        for($i = 0; $i < count($this->cc); $i++)

+        {

+            if(!$this->smtp->Recipient($this->cc[$i][0]))

+                $bad_rcpt[] = $this->cc[$i][0];

+        }

+        for($i = 0; $i < count($this->bcc); $i++)

+        {

+            if(!$this->smtp->Recipient($this->bcc[$i][0]))

+                $bad_rcpt[] = $this->bcc[$i][0];

+        }

+

+        if(count($bad_rcpt) > 0) // Create error message

+        {

+            for($i = 0; $i < count($bad_rcpt); $i++)

+            {

+                if($i != 0) { $error .= ", "; }

+                $error .= $bad_rcpt[$i];

+            }

+            $error = $this->Lang("recipients_failed") . $error;

+            $this->SetError($error);

+            $this->smtp->Reset();

+            return false;

+        }

+

+        if(!$this->smtp->Data($header . $body))

+        {

+            $this->SetError($this->Lang("data_not_accepted"));

+            $this->smtp->Reset();

+            return false;

+        }

+        if($this->SMTPKeepAlive == true)

+            $this->smtp->Reset();

+        else

+            $this->SmtpClose();

+

+        return true;

+    }

+

+    /**

+     * Initiates a connection to an SMTP server.  Returns false if the 

+     * operation failed.

+     * @access private

+     * @return bool

+     */

+    function SmtpConnect() {

+        if($this->smtp == NULL) { $this->smtp = new SMTP(); }

+

+        $this->smtp->do_debug = $this->SMTPDebug;

+        $hosts = explode(";", $this->Host);

+        $index = 0;

+        $connection = ($this->smtp->Connected()); 

+

+        // Retry while there is no connection

+        while($index < count($hosts) && $connection == false)

+        {

+            if(strstr($hosts[$index], ":"))

+                list($host, $port) = explode(":", $hosts[$index]);

+            else

+            {

+                $host = $hosts[$index];

+                $port = $this->Port;

+            }

+

+            if($this->smtp->Connect($host, $port, $this->Timeout))

+            {

+                if ($this->Helo != '')

+                    $this->smtp->Hello($this->Helo);

+                else

+                    $this->smtp->Hello($this->ServerHostname());

+        

+                if($this->SMTPAuth)

+                {

+                    if(!$this->smtp->Authenticate($this->Username, 

+                                                  $this->Password))

+                    {

+                        $this->SetError($this->Lang("authenticate"));

+                        $this->smtp->Reset();

+                        $connection = false;

+                    }

+                }

+                $connection = true;

+            }

+            $index++;

+        }

+        if(!$connection)

+            $this->SetError($this->Lang("connect_host"));

+

+        return $connection;

+    }

+

+    /**

+     * Closes the active SMTP session if one exists.

+     * @return void

+     */

+    function SmtpClose() {

+        if($this->smtp != NULL)

+        {

+            if($this->smtp->Connected())

+            {

+                $this->smtp->Quit();

+                $this->smtp->Close();

+            }

+        }

+    }

+

+    /**

+     * Sets the language for all class error messages.  Returns false 

+     * if it cannot load the language file.  The default language type

+     * is English.

+     * @param string $lang_type Type of language (e.g. Portuguese: "br")

+     * @param string $lang_path Path to the language file directory

+     * @access public

+     * @return bool

+     */

+    function SetLanguage($lang_type, $lang_path = "language/") {

+        if(file_exists($lang_path.'phpmailer.lang-'.$lang_type.'.php'))

+            include($lang_path.'phpmailer.lang-'.$lang_type.'.php');

+        else if(file_exists($lang_path.'phpmailer.lang-en.php'))

+            include($lang_path.'phpmailer.lang-en.php');

+        else

+        {

+            $this->SetError("Could not load language file");

+            return false;

+        }

+        $this->language = $PHPMAILER_LANG;

+    

+        return true;

+    }

+

+    /////////////////////////////////////////////////

+    // MESSAGE CREATION METHODS

+    /////////////////////////////////////////////////

+

+    /**

+     * Creates recipient headers.  

+     * @access private

+     * @return string

+     */

+    function AddrAppend($type, $addr) {

+        $addr_str = $type . ": ";

+        $addr_str .= $this->AddrFormat($addr[0]);

+        if(count($addr) > 1)

+        {

+            for($i = 1; $i < count($addr); $i++)

+                $addr_str .= ", " . $this->AddrFormat($addr[$i]);

+        }

+        $addr_str .= $this->LE;

+

+        return $addr_str;

+    }

+    

+    /**

+     * Formats an address correctly. 

+     * @access private

+     * @return string

+     */

+    function AddrFormat($addr) {

+        if(empty($addr[1]))

+            $formatted = $addr[0];

+        else

+        {

+            $formatted = $this->EncodeHeader($addr[1], 'phrase') . " <" . 

+                         $addr[0] . ">";

+        }

+

+        return $formatted;

+    }

+

+    /**

+     * Wraps message for use with mailers that do not

+     * automatically perform wrapping and for quoted-printable.

+     * Original written by philippe.  

+     * @access private

+     * @return string

+     */

+    function WrapText($message, $length, $qp_mode = false) {

+        $soft_break = ($qp_mode) ? sprintf(" =%s", $this->LE) : $this->LE;

+

+        $message = $this->FixEOL($message);

+        if (substr($message, -1) == $this->LE)

+            $message = substr($message, 0, -1);

+

+        $line = explode($this->LE, $message);

+        $message = "";

+        for ($i=0 ;$i < count($line); $i++)

+        {

+          $line_part = explode(" ", $line[$i]);

+          $buf = "";

+          for ($e = 0; $e<count($line_part); $e++)

+          {

+              $word = $line_part[$e];

+              if ($qp_mode and (strlen($word) > $length))

+              {

+                $space_left = $length - strlen($buf) - 1;

+                if ($e != 0)

+                {

+                    if ($space_left > 20)

+                    {

+                        $len = $space_left;

+                        if (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", $this->LE);

+                    }

+                    else

+                    {

+                        $message .= $buf . $soft_break;

+                    }

+                    $buf = "";

+                }

+                while (strlen($word) > 0)

+                {

+                    $len = $length;

+                    if (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", $this->LE);

+                    else

+                        $buf = $part;

+                }

+              }

+              else

+              {

+                $buf_o = $buf;

+                $buf .= ($e == 0) ? $word : (" " . $word); 

+

+                if (strlen($buf) > $length and $buf_o != "")

+                {

+                    $message .= $buf_o . $soft_break;

+                    $buf = $word;

+                }

+              }

+          }

+          $message .= $buf . $this->LE;

+        }

+

+        return $message;

+    }

+    

+    /**

+     * Set the body wrapping.

+     * @access private

+     * @return void

+     */

+    function SetWordWrap() {

+        if($this->WordWrap < 1)

+            return;

+            

+        switch($this->message_type)

+        {

+           case "alt":

+              // fall through

+           case "alt_attachments":

+              $this->AltBody = $this->WrapText($this->AltBody, $this->WordWrap);

+              break;

+           default:

+              $this->Body = $this->WrapText($this->Body, $this->WordWrap);

+              break;

+        }

+    }

+

+    /**

+     * Assembles message header.  

+     * @access private

+     * @return string

+     */

+    function CreateHeader() {

+        $result = "";

+        

+        // Set the boundaries

+        $uniq_id = md5(uniqid(time()));

+        $this->boundary[1] = "b1_" . $uniq_id;

+        $this->boundary[2] = "b2_" . $uniq_id;

+

+        $result .= $this->HeaderLine("Date", $this->RFCDate());

+        if($this->Sender == "")

+            $result .= $this->HeaderLine("Return-Path", trim($this->From));

+        else

+            $result .= $this->HeaderLine("Return-Path", trim($this->Sender));

+        

+        // To be created automatically by mail()

+        if($this->Mailer != "mail")

+        {

+            if(count($this->to) > 0)

+                $result .= $this->AddrAppend("To", $this->to);

+            else if (count($this->cc) == 0)

+                $result .= $this->HeaderLine("To", "undisclosed-recipients:;");

+            if(count($this->cc) > 0)

+                $result .= $this->AddrAppend("Cc", $this->cc);

+        }

+

+        $from = array();

+        $from[0][0] = trim($this->From);

+        $from[0][1] = $this->FromName;

+        $result .= $this->AddrAppend("From", $from); 

+

+        // sendmail and mail() extract Bcc from the header before sending

+        if((($this->Mailer == "sendmail") || ($this->Mailer == "mail")) && (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(trim($this->Subject)));

+

+        $result .= sprintf("Message-ID: <%s@%s>%s", $uniq_id, $this->ServerHostname(), $this->LE);

+        $result .= $this->HeaderLine("X-Priority", $this->Priority);

+        $result .= $this->HeaderLine("X-Mailer", "PHPMailer [version " . $this->Version . "]");

+        

+        if($this->ConfirmReadingTo != "")

+        {

+            $result .= $this->HeaderLine("Disposition-Notification-To", 

+                       "<" . trim($this->ConfirmReadingTo) . ">");

+        }

+

+        // Add custom headers

+        for($index = 0; $index < count($this->CustomHeader); $index++)

+        {

+            $result .= $this->HeaderLine(trim($this->CustomHeader[$index][0]), 

+                       $this->EncodeHeader(trim($this->CustomHeader[$index][1])));

+        }

+        $result .= $this->HeaderLine("MIME-Version", "1.0");

+

+        switch($this->message_type)

+        {

+            case "plain":

+                $result .= $this->HeaderLine("Content-Transfer-Encoding", $this->Encoding);

+                $result .= sprintf("Content-Type: %s; charset=\"%s\"",

+                                    $this->ContentType, $this->CharSet);

+                break;

+            case "attachments":

+                // fall through

+            case "alt_attachments":

+                if($this->InlineImageExists())

+                {

+                    $result .= sprintf("Content-Type: %s;%s\ttype=\"text/html\";%s\tboundary=\"%s\"%s", 

+                                    "multipart/related", $this->LE, $this->LE, 

+                                    $this->boundary[1], $this->LE);

+                }

+                else

+                {

+                    $result .= $this->HeaderLine("Content-Type", "multipart/mixed;");

+                    $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');

+                }

+                break;

+            case "alt":

+                $result .= $this->HeaderLine("Content-Type", "multipart/alternative;");

+                $result .= $this->TextLine("\tboundary=\"" . $this->boundary[1] . '"');

+                break;

+        }

+

+        if($this->Mailer != "mail")

+            $result .= $this->LE.$this->LE;

+

+        return $result;

+    }

+

+    /**

+     * Assembles the message body.  Returns an empty string on failure.

+     * @access private

+     * @return string

+     */

+    function CreateBody() {

+        $result = "";

+

+        $this->SetWordWrap();

+

+        switch($this->message_type)

+        {

+            case "alt":

+                $result .= $this->GetBoundary($this->boundary[1], "", 

+                                              "text/plain", "");

+                $result .= $this->EncodeString($this->AltBody, $this->Encoding);

+                $result .= $this->LE.$this->LE;

+                $result .= $this->GetBoundary($this->boundary[1], "", 

+                                              "text/html", "");

+                

+                $result .= $this->EncodeString($this->Body, $this->Encoding);

+                $result .= $this->LE.$this->LE;

+    

+                $result .= $this->EndBoundary($this->boundary[1]);

+                break;

+            case "plain":

+                $result .= $this->EncodeString($this->Body, $this->Encoding);

+                break;

+            case "attachments":

+                $result .= $this->GetBoundary($this->boundary[1], "", "", "");

+                $result .= $this->EncodeString($this->Body, $this->Encoding);

+                $result .= $this->LE;

+     

+                $result .= $this->AttachAll();

+                break;

+            case "alt_attachments":

+                $result .= sprintf("--%s%s", $this->boundary[1], $this->LE);

+                $result .= sprintf("Content-Type: %s;%s" .

+                                   "\tboundary=\"%s\"%s",

+                                   "multipart/alternative", $this->LE, 

+                                   $this->boundary[2], $this->LE.$this->LE);

+    

+                // Create text body

+                $result .= $this->GetBoundary($this->boundary[2], "", 

+                                              "text/plain", "") . $this->LE;

+

+                $result .= $this->EncodeString($this->AltBody, $this->Encoding);

+                $result .= $this->LE.$this->LE;

+    

+                // Create the HTML body

+                $result .= $this->GetBoundary($this->boundary[2], "", 

+                                              "text/html", "") . $this->LE;

+    

+                $result .= $this->EncodeString($this->Body, $this->Encoding);

+                $result .= $this->LE.$this->LE;

+

+                $result .= $this->EndBoundary($this->boundary[2]);

+                

+                $result .= $this->AttachAll();

+                break;

+        }

+        if($this->IsError())

+            $result = "";

+

+        return $result;

+    }

+

+    /**

+     * Returns the start of a message boundary.

+     * @access private

+     */

+    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;

+        $result .= $this->HeaderLine("Content-Transfer-Encoding", $encoding);

+        $result .= $this->LE;

+       

+        return $result;

+    }

+    

+    /**

+     * Returns the end of a message boundary.

+     * @access private

+     */

+    function EndBoundary($boundary) {

+        return $this->LE . "--" . $boundary . "--" . $this->LE; 

+    }

+    

+    /**

+     * Sets the message type.

+     * @access private

+     * @return void

+     */

+    function SetMessageType() {

+        if(count($this->attachment) < 1 && strlen($this->AltBody) < 1)

+            $this->message_type = "plain";

+        else

+        {

+            if(count($this->attachment) > 0)

+                $this->message_type = "attachments";

+            if(strlen($this->AltBody) > 0 && count($this->attachment) < 1)

+                $this->message_type = "alt";

+            if(strlen($this->AltBody) > 0 && count($this->attachment) > 0)

+                $this->message_type = "alt_attachments";

+        }

+    }

+

+    /**

+     * Returns a formatted header line.

+     * @access private

+     * @return string

+     */

+    function HeaderLine($name, $value) {

+        return $name . ": " . $value . $this->LE;

+    }

+

+    /**

+     * Returns a formatted mail line.

+     * @access private

+     * @return string

+     */

+    function TextLine($value) {

+        return $value . $this->LE;

+    }

+

+    /////////////////////////////////////////////////

+    // ATTACHMENT METHODS

+    /////////////////////////////////////////////////

+

+    /**

+     * Adds an attachment from a path on the filesystem.

+     * Returns false if the file could not be found

+     * or accessed.

+     * @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.

+     * @return bool

+     */

+    function AddAttachment($path, $name = "", $encoding = "base64", 

+                           $type = "application/octet-stream") {

+        if(!@is_file($path))

+        {

+            $this->SetError($this->Lang("file_access") . $path);

+            return false;

+        }

+

+        $filename = basename($path);

+        if($name == "")

+            $name = $filename;

+

+        $cur = count($this->attachment);

+        $this->attachment[$cur][0] = $path;

+        $this->attachment[$cur][1] = $filename;

+        $this->attachment[$cur][2] = $name;

+        $this->attachment[$cur][3] = $encoding;

+        $this->attachment[$cur][4] = $type;

+        $this->attachment[$cur][5] = false; // isStringAttachment

+        $this->attachment[$cur][6] = "attachment";

+        $this->attachment[$cur][7] = 0;

+

+        return true;

+    }

+

+    /**

+     * Attaches all fs, string, and binary attachments to the message.

+     * Returns an empty string on failure.

+     * @access private

+     * @return string

+     */

+    function AttachAll() {

+        // Return text of body

+        $mime = array();

+

+        // Add all attachments

+        for($i = 0; $i < count($this->attachment); $i++)

+        {

+            // Check for string attachment

+            $bString = $this->attachment[$i][5];

+            if ($bString)

+                $string = $this->attachment[$i][0];

+            else

+                $path = $this->attachment[$i][0];

+

+            $filename    = $this->attachment[$i][1];

+            $name        = $this->attachment[$i][2];

+            $encoding    = $this->attachment[$i][3];

+            $type        = $this->attachment[$i][4];

+            $disposition = $this->attachment[$i][6];

+            $cid         = $this->attachment[$i][7];

+            

+            $mime[] = sprintf("--%s%s", $this->boundary[1], $this->LE);

+            $mime[] = sprintf("Content-Type: %s; name=\"%s\"%s", $type, $name, $this->LE);

+            $mime[] = sprintf("Content-Transfer-Encoding: %s%s", $encoding, $this->LE);

+

+            if($disposition == "inline")

+                $mime[] = sprintf("Content-ID: <%s>%s", $cid, $this->LE);

+

+            $mime[] = sprintf("Content-Disposition: %s; filename=\"%s\"%s", 

+                              $disposition, $name, $this->LE.$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", $this->boundary[1], $this->LE);

+

+        return join("", $mime);

+    }

+    

+    /**

+     * Encodes attachment in requested format.  Returns an

+     * empty string on failure.

+     * @access private

+     * @return string

+     */

+    function EncodeFile ($path, $encoding = "base64") {

+        if(!@$fd = fopen($path, "rb"))

+        {

+            $this->SetError($this->Lang("file_open") . $path);

+            return "";

+        }

+        $magic_quotes = get_magic_quotes_runtime();

+        set_magic_quotes_runtime(0);

+        $file_buffer = fread($fd, filesize($path));

+        $file_buffer = $this->EncodeString($file_buffer, $encoding);

+        fclose($fd);

+        set_magic_quotes_runtime($magic_quotes);

+

+        return $file_buffer;

+    }

+

+    /**

+     * Encodes string to requested format. Returns an

+     * empty string on failure.

+     * @access private

+     * @return string

+     */

+    function EncodeString ($str, $encoding = "base64") {

+        $encoded = "";

+        switch(strtolower($encoding)) {

+          case "base64":

+              // chunk_split is found in PHP >= 3.0.6

+              $encoded = chunk_split(base64_encode($str), 76, $this->LE);

+              break;

+          case "7bit":

+          case "8bit":

+              $encoded = $this->FixEOL($str);

+              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 to best of Q, B, quoted or none.  

+     * @access private

+     * @return string

+     */

+    function EncodeHeader ($str, $position = 'text') {

+      $x = 0;

+      

+      switch (strtolower($position)) {

+        case 'phrase':

+          if (!preg_match('/[\200-\377]/', $str)) {

+            // Can't use addslashes as we don't know what value has magic_quotes_sybase.

+            $encoded = addcslashes($str, "\0..\37\177\\\"");

+

+            if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str))

+              return ($encoded);

+            else

+              return ("\"$encoded\"");

+          }

+          $x = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);

+          break;

+        case 'comment':

+          $x = preg_match_all('/[()"]/', $str, $matches);

+          // Fall-through

+        case 'text':

+        default:

+          $x += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);

+          break;

+      }

+

+      if ($x == 0)

+        return ($str);

+

+      $maxlen = 75 - 7 - strlen($this->CharSet);

+      // Try to select the encoding which should produce the shortest output

+      if (strlen($str)/3 < $x) {

+        $encoding = 'B';

+        $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("=".$this->LE, "\n", trim($encoded));

+      }

+

+      $encoded = preg_replace('/^(.*)$/m', " =?".$this->CharSet."?$encoding?\\1?=", $encoded);

+      $encoded = trim(str_replace("\n", $this->LE, $encoded));

+      

+      return $encoded;

+    }

+    

+    /**

+     * Encode string to quoted-printable.  

+     * @access private

+     * @return string

+     */

+    function EncodeQP ($str) {

+        $encoded = $this->FixEOL($str);

+        if (substr($encoded, -(strlen($this->LE))) != $this->LE)

+            $encoded .= $this->LE;

+

+        // Replace every high ascii, control and = characters

+        $encoded = preg_replace('/([\000-\010\013\014\016-\037\075\177-\377])/e',

+                  "'='.sprintf('%02X', ord('\\1'))", $encoded);

+        // Replace every spaces and tabs when it's the last character on a line

+        $encoded = preg_replace("/([\011\040])".$this->LE."/e",

+                  "'='.sprintf('%02X', ord('\\1')).'".$this->LE."'", $encoded);

+

+        // Maximum line length of 76 characters before CRLF (74 + space + '=')

+        $encoded = $this->WrapText($encoded, 74, true);

+

+        return $encoded;

+    }

+

+    /**

+     * Encode string to q encoding.  

+     * @access private

+     * @return string

+     */

+    function EncodeQ ($str, $position = "text") {

+        // There should not be any EOL in the string

+        $encoded = preg_replace("[\r\n]", "", $str);

+

+        switch (strtolower($position)) {

+          case "phrase":

+            $encoded = preg_replace("/([^A-Za-z0-9!*+\/ -])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded);

+            break;

+          case "comment":

+            $encoded = preg_replace("/([\(\)\"])/e", "'='.sprintf('%02X', ord('\\1'))", $encoded);

+          case "text":

+          default:

+            // Replace every high ascii, control =, ? and _ characters

+            $encoded = preg_replace('/([\000-\011\013\014\016-\037\075\077\137\177-\377])/e',

+                  "'='.sprintf('%02X', ord('\\1'))", $encoded);

+            break;

+        }

+        

+        // Replace every spaces to _ (more readable than =20)

+        $encoded = str_replace(" ", "_", $encoded);

+

+        return $encoded;

+    }

+

+    /**

+     * Adds a string or binary attachment (non-filesystem) to the list.

+     * 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.

+     * @return void

+     */

+    function AddStringAttachment($string, $filename, $encoding = "base64", 

+                                 $type = "application/octet-stream") {

+        // Append to $attachment array

+        $cur = count($this->attachment);

+        $this->attachment[$cur][0] = $string;

+        $this->attachment[$cur][1] = $filename;

+        $this->attachment[$cur][2] = $filename;

+        $this->attachment[$cur][3] = $encoding;

+        $this->attachment[$cur][4] = $type;

+        $this->attachment[$cur][5] = true; // isString

+        $this->attachment[$cur][6] = "attachment";

+        $this->attachment[$cur][7] = 0;

+    }

+    

+    /**

+     * Adds an embedded attachment.  This can include images, sounds, and 

+     * just about any other document.  Make sure to set the $type to an 

+     * image type.  For JPEG images use "image/jpeg" and for GIF images 

+     * use "image/gif".

+     * @param string $path Path to the attachment.

+     * @param string $cid Content ID of the attachment.  Use this to identify 

+     *        the Id for accessing the image in an HTML form.

+     * @param string $name Overrides the attachment name.

+     * @param string $encoding File encoding (see $Encoding).

+     * @param string $type File extension (MIME) type.  

+     * @return bool

+     */

+    function AddEmbeddedImage($path, $cid, $name = "", $encoding = "base64", 

+                              $type = "application/octet-stream") {

+    

+        if(!@is_file($path))

+        {

+            $this->SetError($this->Lang("file_access") . $path);

+            return false;

+        }

+

+        $filename = basename($path);

+        if($name == "")

+            $name = $filename;

+

+        // Append to $attachment array

+        $cur = count($this->attachment);

+        $this->attachment[$cur][0] = $path;

+        $this->attachment[$cur][1] = $filename;

+        $this->attachment[$cur][2] = $name;

+        $this->attachment[$cur][3] = $encoding;

+        $this->attachment[$cur][4] = $type;

+        $this->attachment[$cur][5] = false; // isStringAttachment

+        $this->attachment[$cur][6] = "inline";

+        $this->attachment[$cur][7] = $cid;

+    

+        return true;

+    }

+    

+    /**

+     * Returns true if an inline attachment is present.

+     * @access private

+     * @return bool

+     */

+    function InlineImageExists() {

+        $result = false;

+        for($i = 0; $i < count($this->attachment); $i++)

+        {

+            if($this->attachment[$i][6] == "inline")

+            {

+                $result = true;

+                break;

+            }

+        }

+        

+        return $result;

+    }

+

+    /////////////////////////////////////////////////

+    // MESSAGE RESET METHODS

+    /////////////////////////////////////////////////

+

+    /**

+     * Clears all recipients assigned in the TO array.  Returns void.

+     * @return void

+     */

+    function ClearAddresses() {

+        $this->to = array();

+    }

+

+    /**

+     * Clears all recipients assigned in the CC array.  Returns void.

+     * @return void

+     */

+    function ClearCCs() {

+        $this->cc = array();

+    }

+

+    /**

+     * Clears all recipients assigned in the BCC array.  Returns void.

+     * @return void

+     */

+    function ClearBCCs() {

+        $this->bcc = array();

+    }

+

+    /**

+     * Clears all recipients assigned in the ReplyTo array.  Returns void.

+     * @return void

+     */

+    function ClearReplyTos() {

+        $this->ReplyTo = array();

+    }

+

+    /**

+     * Clears all recipients assigned in the TO, CC and BCC

+     * array.  Returns void.

+     * @return void

+     */

+    function ClearAllRecipients() {

+        $this->to = array();

+        $this->cc = array();

+        $this->bcc = array();

+    }

+

+    /**

+     * Clears all previously set filesystem, string, and binary

+     * attachments.  Returns void.

+     * @return void

+     */

+    function ClearAttachments() {

+        $this->attachment = array();

+    }

+

+    /**

+     * Clears all custom headers.  Returns void.

+     * @return void

+     */

+    function ClearCustomHeaders() {

+        $this->CustomHeader = array();

+    }

+

+

+    /////////////////////////////////////////////////

+    // MISCELLANEOUS METHODS

+    /////////////////////////////////////////////////

+

+    /**

+     * Adds the error message to the error container.

+     * Returns void.

+     * @access private

+     * @return void

+     */

+    function SetError($msg) {

+        $this->error_count++;

+        $this->ErrorInfo = $msg;

+    }

+

+    /**

+     * Returns the proper RFC 822 formatted date. 

+     * @access private

+     * @return string

+     */

+    function RFCDate() {

+        $tz = date("Z");

+        $tzs = ($tz < 0) ? "-" : "+";

+        $tz = abs($tz);

+        $tz = ($tz/3600)*100 + ($tz%3600)/60;

+        $result = sprintf("%s %s%04d", date("D, j M Y H:i:s"), $tzs, $tz);

+

+        return $result;

+    }

+    

+    /**

+     * Returns the appropriate server variable.  Should work with both 

+     * PHP 4.1.0+ as well as older versions.  Returns an empty string 

+     * if nothing is found.

+     * @access private

+     * @return mixed

+     */

+    function ServerVar($varName) {

+        global $HTTP_SERVER_VARS;

+        global $HTTP_ENV_VARS;

+

+        if(!isset($_SERVER))

+        {

+            $_SERVER = $HTTP_SERVER_VARS;

+            if(!isset($_SERVER["REMOTE_ADDR"]))

+                $_SERVER = $HTTP_ENV_VARS; // must be Apache

+        }

+        

+        if(isset($_SERVER[$varName]))

+            return $_SERVER[$varName];

+        else

+            return "";

+    }

+

+    /**

+     * Returns the server hostname or 'localhost.localdomain' if unknown.

+     * @access private

+     * @return string

+     */

+    function ServerHostname() {

+        if ($this->Hostname != "")

+            $result = $this->Hostname;

+        elseif ($this->ServerVar('SERVER_NAME') != "")

+            $result = $this->ServerVar('SERVER_NAME');

+        else

+            $result = "localhost.localdomain";

+

+        return $result;

+    }

+

+    /**

+     * Returns a message in the appropriate language.

+     * @access private

+     * @return string

+     */

+    function Lang($key) {

+        if(count($this->language) < 1)

+            $this->SetLanguage("en"); // set the default language

+    

+        if(isset($this->language[$key]))

+            return $this->language[$key];

+        else

+            return "Language string failed to load: " . $key;

+    }

+    

+    /**

+     * Returns true if an error occurred.

+     * @return bool

+     */

+    function IsError() {

+        return ($this->error_count > 0);

+    }

+

+    /**

+     * Changes every end of line from CR or LF to CRLF.  

+     * @access private

+     * @return string

+     */

+    function FixEOL($str) {

+        $str = str_replace("\r\n", "\n", $str);

+        $str = str_replace("\r", "\n", $str);

+        $str = str_replace("\n", $this->LE, $str);

+        return $str;

+    }

+

+    /**

+     * Adds a custom header. 

+     * @return void

+     */

+    function AddCustomHeader($custom_header) {

+        $this->CustomHeader[] = explode(":", $custom_header, 2);

+    }

+}

+

+?>

--- /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, UNIX_TIMESTAMP(stories.date) as date, UNIX_TIMESTAMP(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)."', 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)."', 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/smtp_include.php
@@ -1,1 +1,1046 @@
-
+<?php

+if(!defined("_CHARSET")) exit( );

+////////////////////////////////////////////////////

+// SMTP - PHP SMTP class

+//

+// Version 1.02

+//

+// Define an SMTP class that can be used to connect

+// and communicate with any SMTP server. It implements

+// all the SMTP functions defined in RFC821 except TURN.

+//

+// Author: Chris Ryan

+//

+// License: LGPL, see LICENSE

+////////////////////////////////////////////////////

+

+/**

+ * SMTP is rfc 821 compliant and implements all the rfc 821 SMTP

+ * commands except TURN which will always return a not implemented

+ * error. SMTP also provides some utility methods for sending mail

+ * to an SMTP server.

+ * @package PHPMailer

+ * @author Chris Ryan

+ */

+class SMTP

+{

+    /**

+     *  SMTP server port

+     *  @var int

+     */

+    var $SMTP_PORT = 25;

+    

+    /**

+     *  SMTP reply line ending

+     *  @var string

+     */

+    var $CRLF = "\r\n";

+    

+    /**

+     *  Sets whether debugging is turned on

+     *  @var bool

+     */

+    var $do_debug;       # the level of debug to perform

+

+    /**#@+

+     * @access private

+     */

+    var $smtp_conn;      # the socket to the server

+    var $error;          # error if any on the last call

+    var $helo_rply;      # the reply the server sent to us for HELO

+    /**#@-*/

+

+    /**

+     * Initialize the class so that the data is in a known state.

+     * @access public

+     * @return void

+     */

+    function SMTP() {

+        $this->smtp_conn = 0;

+        $this->error = null;

+        $this->helo_rply = null;

+

+        $this->do_debug = 0;

+    }

+

+    /*************************************************************

+     *                    CONNECTION FUNCTIONS                  *

+     ***********************************************************/

+

+    /**

+     * Connect to the server specified on the port specified.

+     * If the port is not specified use the default SMTP_PORT.

+     * If tval is specified then a connection will try and be

+     * established with the server for that number of seconds.

+     * If tval is not specified the default is 30 seconds to

+     * try on the connection.

+     *

+     * SMTP CODE SUCCESS: 220

+     * SMTP CODE FAILURE: 421

+     * @access public

+     * @return bool

+     */

+    function Connect($host,$port=0,$tval=30) {

+        # set the error val to null so there is no confusion

+        $this->error = null;

+

+        # make sure we are __not__ connected

+        if($this->connected()) {

+            # ok we are connected! what should we do?

+            # for now we will just give an error saying we

+            # are already connected

+            $this->error =

+                array("error" => "Already connected to a server");

+            return false;

+        }

+

+        if(empty($port)) {

+            $port = $this->SMTP_PORT;

+        }

+

+        #connect to the smtp server

+        $this->smtp_conn = fsockopen($host,    # the host of the server

+                                     $port,    # the port to use

+                                     $errno,   # error number if any

+                                     $errstr,  # error message if any

+                                     $tval);   # give up after ? secs

+        # verify we connected properly

+        if(empty($this->smtp_conn)) {

+            $this->error = array("error" => "Failed to connect to server",

+                                 "errno" => $errno,

+                                 "errstr" => $errstr);

+            if($this->do_debug >= 1) {

+                echo "SMTP -> ERROR: " . $this->error["error"] .

+                         ": $errstr ($errno)" . $this->CRLF;

+            }

+            return false;

+        }

+

+        # sometimes the SMTP server takes a little longer to respond

+        # so we will give it a longer timeout for the first read

+        // Windows still does not have support for this timeout function

+        if(substr(PHP_OS, 0, 3) != "WIN")

+           socket_set_timeout($this->smtp_conn, $tval, 0);

+

+        # get any announcement stuff

+        $announce = $this->get_lines();

+

+        # set the timeout  of any socket functions at 1/10 of a second

+        //if(function_exists("socket_set_timeout"))

+        //   socket_set_timeout($this->smtp_conn, 0, 100000);

+

+        if($this->do_debug >= 2) {

+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $announce;

+        }

+

+        return true;

+    }

+

+    /**

+     * Performs SMTP authentication.  Must be run after running the

+     * Hello() method.  Returns true if successfully authenticated.

+     * @access public

+     * @return bool

+     */

+    function Authenticate($username, $password) {

+        // Start authentication

+        fputs($this->smtp_conn,"AUTH LOGIN" . $this->CRLF);

+

+        $rply = $this->get_lines();

+        $code = substr($rply,0,3);

+

+        if($code != 334) {

+            $this->error =

+                array("error" => "AUTH not accepted from server",

+                      "smtp_code" => $code,

+                      "smtp_msg" => substr($rply,4));

+            if($this->do_debug >= 1) {

+                echo "SMTP -> ERROR: " . $this->error["error"] .

+                         ": " . $rply . $this->CRLF;

+            }

+            return false;

+        }

+

+        // Send encoded username

+        fputs($this->smtp_conn, base64_encode($username) . $this->CRLF);

+

+        $rply = $this->get_lines();

+        $code = substr($rply,0,3);

+

+        if($code != 334) {

+            $this->error =

+                array("error" => "Username not accepted from server",

+                      "smtp_code" => $code,

+                      "smtp_msg" => substr($rply,4));

+            if($this->do_debug >= 1) {

+                echo "SMTP -> ERROR: " . $this->error["error"] .

+                         ": " . $rply . $this->CRLF;

+            }

+            return false;

+        }

+

+        // Send encoded password

+        fputs($this->smtp_conn, base64_encode($password) . $this->CRLF);

+

+        $rply = $this->get_lines();

+        $code = substr($rply,0,3);

+

+        if($code != 235) {

+            $this->error =

+                array("error" => "Password not accepted from server",

+                      "smtp_code" => $code,

+                      "smtp_msg" => substr($rply,4));

+            if($this->do_debug >= 1) {

+                echo "SMTP -> ERROR: " . $this->error["error"] .

+                         ": " . $rply . $this->CRLF;

+            }

+            return false;

+        }

+

+        return true;

+    }

+

+    /**

+     * Returns true if connected to a server otherwise false

+     * @access private

+     * @return bool

+     */

+    function Connected() {

+        if(!empty($this->smtp_conn)) {

+            $sock_status = socket_get_status($this->smtp_conn);

+            if($sock_status["eof"]) {

+                # hmm this is an odd situation... the socket is

+                # valid but we aren't connected anymore

+                if($this->do_debug >= 1) {

+                    echo "SMTP -> NOTICE:" . $this->CRLF .

+                         "EOF caught while checking if connected";

+                }

+                $this->Close();

+                return false;

+            }

+            return true; # everything looks good

+        }

+        return false;

+    }

+

+    /**

+     * Closes the socket and cleans up the state of the class.

+     * It is not considered good to use this function without

+     * first trying to use QUIT.

+     * @access public

+     * @return void

+     */

+    function Close() {

+        $this->error = null; # so there is no confusion

+        $this->helo_rply = null;

+        if(!empty($this->smtp_conn)) {

+            # close the connection and cleanup

+            fclose($this->smtp_conn);

+            $this->smtp_conn = 0;

+        }

+    }

+

+

+    /***************************************************************

+     *                        SMTP COMMANDS                       *

+     *************************************************************/

+

+    /**

+     * 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 seperated by and additional <CRLF>.

+     *

+     * Implements rfc 821: DATA <CRLF>

+     *

+     * SMTP CODE INTERMEDIATE: 354

+     *     [data]

+     *     <CRLF>.<CRLF>

+     *     SMTP CODE SUCCESS: 250

+     *     SMTP CODE FAILURE: 552,554,451,452

+     * SMTP CODE FAILURE: 451,554

+     * SMTP CODE ERROR  : 500,501,503,421

+     * @access public

+     * @return bool

+     */

+    function Data($msg_data) {

+        $this->error = null; # so no confusion is caused

+

+        if(!$this->connected()) {

+            $this->error = array(

+                    "error" => "Called Data() without being connected");

+            return false;

+        }

+

+        fputs($this->smtp_conn,"DATA" . $this->CRLF);

+

+        $rply = $this->get_lines();

+        $code = substr($rply,0,3);

+

+        if($this->do_debug >= 2) {

+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;

+        }

+

+        if($code != 354) {

+            $this->error =

+                array("error" => "DATA command not accepted from server",

+                      "smtp_code" => $code,

+                      "smtp_msg" => substr($rply,4));

+            if($this->do_debug >= 1) {

+                echo "SMTP -> ERROR: " . $this->error["error"] .

+                         ": " . $rply . $this->CRLF;

+            }

+            return false;

+        }

+

+        # the server is ready to accept data!

+        # according to rfc 821 we should not send more than 1000

+        # including the CRLF

+        # characters on a single line 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.

+        # in addition we will be looking for lines that start with

+        # a period '.' and append and additional period '.' to that

+        # line. NOTE: this does not count towards are limit.

+

+        # normalize the line breaks so we know the explode works

+        $msg_data = str_replace("\r\n","\n",$msg_data);

+        $msg_data = str_replace("\r","\n",$msg_data);

+        $lines = explode("\n",$msg_data);

+

+        # we need to find a good way to determine is headers are

+        # in the msg_data or if it is a straight msg body

+        # currently I'm assuming rfc 822 definitions of msg headers

+        # and if the first field of the first line (':' sperated)

+        # does not contain a space then it _should_ be a header

+        # and we can process all lines before a blank "" line as

+        # headers.

+        $field = substr($lines[0],0,strpos($lines[0],":"));

+        $in_headers = false;

+        if(!empty($field) && !strstr($field," ")) {

+            $in_headers = true;

+        }

+

+        $max_line_length = 998; # used below; set here for ease in change

+

+        while(list(,$line) = @each($lines)) {

+            $lines_out = null;

+            if($line == "" && $in_headers) {

+                $in_headers = false;

+            }

+            # ok we need to break this line up into several

+            # smaller lines

+            while(strlen($line) > $max_line_length) {

+                $pos = strrpos(substr($line,0,$max_line_length)," ");

+

+                # Patch to fix DOS attack

+                if(!$pos) {

+                    $pos = $max_line_length - 1;

+                }

+

+                $lines_out[] = substr($line,0,$pos);

+                $line = substr($line,$pos + 1);

+                # if we are processing headers we need to

+                # add a LWSP-char to the front of the new line

+                # rfc 822 on long msg headers

+                if($in_headers) {

+                    $line = "\t" . $line;

+                }

+            }

+            $lines_out[] = $line;

+

+            # now send the lines to the server

+            while(list(,$line_out) = @each($lines_out)) {

+                if(strlen($line_out) > 0)

+                {

+                    if(substr($line_out, 0, 1) == ".") {

+                        $line_out = "." . $line_out;

+                    }

+                }

+                fputs($this->smtp_conn,$line_out . $this->CRLF);

+            }

+        }

+

+        # ok all the message data has been sent so lets get this

+        # over with aleady

+        fputs($this->smtp_conn, $this->CRLF . "." . $this->CRLF);

+

+        $rply = $this->get_lines();

+        $code = substr($rply,0,3);

+

+        if($this->do_debug >= 2) {

+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;

+        }

+

+        if($code != 250) {

+            $this->error =

+                array("error" => "DATA not accepted from server",

+                      "smtp_code" => $code,

+                      "smtp_msg" => substr($rply,4));

+            if($this->do_debug >= 1) {

+                echo "SMTP -> ERROR: " . $this->error["error"] .

+                         ": " . $rply . $this->CRLF;

+            }

+            return false;

+        }

+        return true;

+    }

+

+    /**

+     * Expand takes the name and asks the server to list all the

+     * people who are members of the _list_. Expand will return

+     * back and array of the result or false if an error occurs.

+     * Each value in the array returned has the format of:

+     *     [ <full-name> <sp> ] <path>

+     * The definition of <path> is defined in rfc 821

+     *

+     * Implements rfc 821: EXPN <SP> <string> <CRLF>

+     *

+     * SMTP CODE SUCCESS: 250

+     * SMTP CODE FAILURE: 550

+     * SMTP CODE ERROR  : 500,501,502,504,421

+     * @access public

+     * @return string array

+     */

+    function Expand($name) {

+        $this->error = null; # so no confusion is caused

+

+        if(!$this->connected()) {

+            $this->error = array(

+                    "error" => "Called Expand() without being connected");

+            return false;

+        }

+

+        fputs($this->smtp_conn,"EXPN " . $name . $this->CRLF);

+

+        $rply = $this->get_lines();

+        $code = substr($rply,0,3);

+

+        if($this->do_debug >= 2) {

+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;

+        }

+

+        if($code != 250) {

+            $this->error =

+                array("error" => "EXPN not accepted from server",

+                      "smtp_code" => $code,

+                      "smtp_msg" => substr($rply,4));

+            if($this->do_debug >= 1) {

+                echo "SMTP -> ERROR: " . $this->error["error"] .

+                         ": " . $rply . $this->CRLF;

+            }

+            return false;

+        }

+

+        # parse the reply and place in our array to return to user

+        $entries = explode($this->CRLF,$rply);

+        while(list(,$l) = @each($entries)) {

+            $list[] = substr($l,4);

+        }

+

+        return $list;

+    }

+

+    /**

+     * Sends the HELO command to the smtp server.

+     * This makes sure that we and the server are in

+     * the same known state.

+     *

+     * Implements from rfc 821: HELO <SP> <domain> <CRLF>

+     *

+     * SMTP CODE SUCCESS: 250

+     * SMTP CODE ERROR  : 500, 501, 504, 421

+     * @access public

+     * @return bool

+     */

+    function Hello($host="") {

+        $this->error = null; # so no confusion is caused

+

+        if(!$this->connected()) {

+            $this->error = array(

+                    "error" => "Called Hello() without being connected");

+            return false;

+        }

+

+        # if a hostname for the HELO wasn't specified determine

+        # a suitable one to send

+        if(empty($host)) {

+            # we need to determine some sort of appopiate default

+            # to send to the server

+            $host = "localhost";

+        }

+

+        // Send extended hello first (RFC 2821)

+        if(!$this->SendHello("EHLO", $host))

+        {

+            if(!$this->SendHello("HELO", $host))

+                return false;

+        }

+

+        return true;

+    }

+

+    /**

+     * Sends a HELO/EHLO command.

+     * @access private

+     * @return bool

+     */

+    function SendHello($hello, $host) {

+        fputs($this->smtp_conn, $hello . " " . $host . $this->CRLF);

+

+        $rply = $this->get_lines();

+        $code = substr($rply,0,3);

+

+        if($this->do_debug >= 2) {

+            echo "SMTP -> FROM SERVER: " . $this->CRLF . $rply;

+        }

+

+        if($code != 250) {

+            $this->error =

+                array("error" => $hello . " not accepted from server",

+                      "smtp_code" => $code,

+                      "smtp_msg" => substr($rply,4));

+            if($this->do_debug >= 1) {

+                echo "SMTP -> ERROR: " . $this->error["error"] .

+                         ": " . $rply . $this->CRLF;

+            }

+            return false;

+        }

+

+        $this->helo_rply = $rply;

+        

+        return true;

+    }

+

+    /**

+     * Gets help information on the keyword specified. If the keyword

+     * is not specified then returns generic help, ussually contianing

+     * A list of keywords that help is available on. This function

+     * returns the results back to the user. It is up to the user to

+     * handle the returned data. If an error occurs then false is

+     * returned with $this->error set appropiately.

+     *

+     * Implements rfc 821: HELP [ <SP> <string> ] <CRLF>

+     *

+     * SMTP CODE SUCCESS: 211,214

+     * SMTP CODE ERROR  : 500,501,502,504,421

+     * @access public

+     * @return string

+     */

+    function Help($keyword="") {

+        $this->error = null; # to avoid confusion

+

+        if(!$this->connected()) {

+            $this->error = array(

+                    "error" => "Called Help() without being connected");

+            return false;

+        }

+

+        $extra = "";

+        if(!empty($keyword)) {

+            $extra = " " . $keyword;

+        }

+

+        fputs($this->smtp_conn,"HELP" . $extra . $this->CRLF);

+

+        $rply = $this->get_lines();

+        $code = substr($rply,0,3);

+

+        if($this->do_debug >= 2) {

+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;

+        }

+

+        if($code != 211 && $code != 214) {

+            $this->error =

+                array("error" => "HELP not accepted from server",

+                      "smtp_code" => $code,

+                      "smtp_msg" => substr($rply,4));

+            if($this->do_debug >= 1) {

+                echo "SMTP -> ERROR: " . $this->error["error"] .

+                         ": " . $rply . $this->CRLF;

+            }

+            return false;

+        }

+

+        return $rply;

+    }

+

+    /**

+     * 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>

+     *

+     * SMTP CODE SUCCESS: 250

+     * SMTP CODE SUCCESS: 552,451,452

+     * SMTP CODE SUCCESS: 500,501,421

+     * @access public

+     * @return bool

+     */

+    function Mail($from) {

+        $this->error = null; # so no confusion is caused

+

+        if(!$this->connected()) {

+            $this->error = array(

+                    "error" => "Called Mail() without being connected");

+            return false;

+        }

+

+        fputs($this->smtp_conn,"MAIL FROM:<" . $from . ">" . $this->CRLF);

+

+        $rply = $this->get_lines();

+        $code = substr($rply,0,3);

+

+        if($this->do_debug >= 2) {

+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;

+        }

+

+        if($code != 250) {

+            $this->error =

+                array("error" => "MAIL not accepted from server",

+                      "smtp_code" => $code,

+                      "smtp_msg" => substr($rply,4));

+            if($this->do_debug >= 1) {

+                echo "SMTP -> ERROR: " . $this->error["error"] .

+                         ": " . $rply . $this->CRLF;

+            }

+            return false;

+        }

+        return true;

+    }

+

+    /**

+     * Sends the command NOOP to the SMTP server.

+     *

+     * Implements from rfc 821: NOOP <CRLF>

+     *

+     * SMTP CODE SUCCESS: 250

+     * SMTP CODE ERROR  : 500, 421

+     * @access public

+     * @return bool

+     */

+    function Noop() {

+        $this->error = null; # so no confusion is caused

+

+        if(!$this->connected()) {

+            $this->error = array(

+                    "error" => "Called Noop() without being connected");

+            return false;

+        }

+

+        fputs($this->smtp_conn,"NOOP" . $this->CRLF);

+

+        $rply = $this->get_lines();

+        $code = substr($rply,0,3);

+

+        if($this->do_debug >= 2) {

+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;

+        }

+

+        if($code != 250) {

+            $this->error =

+                array("error" => "NOOP not accepted from server",

+                      "smtp_code" => $code,

+                      "smtp_msg" => substr($rply,4));

+            if($this->do_debug >= 1) {

+                echo "SMTP -> ERROR: " . $this->error["error"] .

+                         ": " . $rply . $this->CRLF;

+            }

+            return false;

+        }

+        return true;

+    }

+

+    /**

+     * Sends the quit command to the server and then closes the socket

+     * if there is no error or the $close_on_error argument is true.

+     *

+     * Implements from rfc 821: QUIT <CRLF>

+     *

+     * SMTP CODE SUCCESS: 221

+     * SMTP CODE ERROR  : 500

+     * @access public

+     * @return bool

+     */

+    function Quit($close_on_error=true) {

+        $this->error = null; # so there is no confusion

+

+        if(!$this->connected()) {

+            $this->error = array(

+                    "error" => "Called Quit() without being connected");

+            return false;

+        }

+

+        # send the quit command to the server

+        fputs($this->smtp_conn,"quit" . $this->CRLF);

+

+        # get any good-bye messages

+        $byemsg = $this->get_lines();

+

+        if($this->do_debug >= 2) {

+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $byemsg;

+        }

+

+        $rval = true;

+        $e = null;

+

+        $code = substr($byemsg,0,3);

+        if($code != 221) {

+            # use e as a tmp var cause Close will overwrite $this->error

+            $e = array("error" => "SMTP server rejected quit command",

+                       "smtp_code" => $code,

+                       "smtp_rply" => substr($byemsg,4));

+            $rval = false;

+            if($this->do_debug >= 1) {

+                echo "SMTP -> ERROR: " . $e["error"] . ": " .

+                         $byemsg . $this->CRLF;

+            }

+        }

+

+        if(empty($e) || $close_on_error) {

+            $this->Close();

+        }

+

+        return $rval;

+    }

+

+    /**

+     * Sends the command RCPT to the SMTP server with the TO: argument of $to.

+     * Returns true if the recipient was accepted false if it was rejected.

+     *

+     * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>

+     *

+     * SMTP CODE SUCCESS: 250,251

+     * SMTP CODE FAILURE: 550,551,552,553,450,451,452

+     * SMTP CODE ERROR  : 500,501,503,421

+     * @access public

+     * @return bool

+     */

+    function Recipient($to) {

+        $this->error = null; # so no confusion is caused

+

+        if(!$this->connected()) {

+            $this->error = array(

+                    "error" => "Called Recipient() without being connected");

+            return false;

+        }

+

+        fputs($this->smtp_conn,"RCPT TO:<" . $to . ">" . $this->CRLF);

+

+        $rply = $this->get_lines();

+        $code = substr($rply,0,3);

+

+        if($this->do_debug >= 2) {

+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;

+        }

+

+        if($code != 250 && $code != 251) {

+            $this->error =

+                array("error" => "RCPT not accepted from server",

+                      "smtp_code" => $code,

+                      "smtp_msg" => substr($rply,4));

+            if($this->do_debug >= 1) {

+                echo "SMTP -> ERROR: " . $this->error["error"] .

+                         ": " . $rply . $this->CRLF;

+            }

+            return false;

+        }

+        return true;

+    }

+

+    /**

+     * Sends the RSET command to abort and transaction that is

+     * currently in progress. Returns true if successful false

+     * otherwise.

+     *

+     * Implements rfc 821: RSET <CRLF>

+     *

+     * SMTP CODE SUCCESS: 250

+     * SMTP CODE ERROR  : 500,501,504,421

+     * @access public

+     * @return bool

+     */

+    function Reset() {

+        $this->error = null; # so no confusion is caused

+

+        if(!$this->connected()) {

+            $this->error = array(

+                    "error" => "Called Reset() without being connected");

+            return false;

+        }

+

+        fputs($this->smtp_conn,"RSET" . $this->CRLF);

+

+        $rply = $this->get_lines();

+        $code = substr($rply,0,3);

+

+        if($this->do_debug >= 2) {

+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;

+        }

+

+        if($code != 250) {

+            $this->error =

+                array("error" => "RSET failed",

+                      "smtp_code" => $code,

+                      "smtp_msg" => substr($rply,4));

+            if($this->do_debug >= 1) {

+                echo "SMTP -> ERROR: " . $this->error["error"] .

+                         ": " . $rply . $this->CRLF;

+            }

+            return false;

+        }

+

+        return true;

+    }

+

+    /**

+     * 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.

+     *

+     * Implements rfc 821: SEND <SP> FROM:<reverse-path> <CRLF>

+     *

+     * SMTP CODE SUCCESS: 250

+     * SMTP CODE SUCCESS: 552,451,452

+     * SMTP CODE SUCCESS: 500,501,502,421

+     * @access public

+     * @return bool

+     */

+    function Send($from) {

+        $this->error = null; # so no confusion is caused

+

+        if(!$this->connected()) {

+            $this->error = array(

+                    "error" => "Called Send() without being connected");

+            return false;

+        }

+

+        fputs($this->smtp_conn,"SEND FROM:" . $from . $this->CRLF);

+

+        $rply = $this->get_lines();

+        $code = substr($rply,0,3);

+

+        if($this->do_debug >= 2) {

+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;

+        }

+

+        if($code != 250) {

+            $this->error =

+                array("error" => "SEND not accepted from server",

+                      "smtp_code" => $code,

+                      "smtp_msg" => substr($rply,4));

+            if($this->do_debug >= 1) {

+                echo "SMTP -> ERROR: " . $this->error["error"] .

+                         ": " . $rply . $this->CRLF;

+            }

+            return false;

+        }

+        return true;

+    }

+

+    /**

+     * 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>

+     *

+     * SMTP CODE SUCCESS: 250

+     * SMTP CODE SUCCESS: 552,451,452

+     * SMTP CODE SUCCESS: 500,501,502,421

+     * @access public

+     * @return bool

+     */

+    function SendAndMail($from) {

+        $this->error = null; # so no confusion is caused

+

+        if(!$this->connected()) {

+            $this->error = array(

+                "error" => "Called SendAndMail() without being connected");

+            return false;

+        }

+

+        fputs($this->smtp_conn,"SAML FROM:" . $from . $this->CRLF);

+

+        $rply = $this->get_lines();

+        $code = substr($rply,0,3);

+

+        if($this->do_debug >= 2) {

+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;

+        }

+

+        if($code != 250) {

+            $this->error =

+                array("error" => "SAML not accepted from server",

+                      "smtp_code" => $code,

+                      "smtp_msg" => substr($rply,4));

+            if($this->do_debug >= 1) {

+                echo "SMTP -> ERROR: " . $this->error["error"] .

+                         ": " . $rply . $this->CRLF;

+            }

+            return false;

+        }

+        return true;

+    }

+

+    /**

+     * 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 or mail it to them if they are not.

+     *

+     * Implements rfc 821: SOML <SP> FROM:<reverse-path> <CRLF>

+     *

+     * SMTP CODE SUCCESS: 250

+     * SMTP CODE SUCCESS: 552,451,452

+     * SMTP CODE SUCCESS: 500,501,502,421

+     * @access public

+     * @return bool

+     */

+    function SendOrMail($from) {

+        $this->error = null; # so no confusion is caused

+

+        if(!$this->connected()) {

+            $this->error = array(

+                "error" => "Called SendOrMail() without being connected");

+            return false;

+        }

+

+        fputs($this->smtp_conn,"SOML FROM:" . $from . $this->CRLF);

+

+        $rply = $this->get_lines();

+        $code = substr($rply,0,3);

+

+        if($this->do_debug >= 2) {

+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;

+        }

+

+        if($code != 250) {

+            $this->error =

+                array("error" => "SOML not accepted from server",

+                      "smtp_code" => $code,

+                      "smtp_msg" => substr($rply,4));

+            if($this->do_debug >= 1) {

+                echo "SMTP -> ERROR: " . $this->error["error"] .

+                         ": " . $rply . $this->CRLF;

+            }

+            return false;

+        }

+        return true;

+    }

+

+    /**

+     * 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 implimented in the future

+     *

+     * Implements from rfc 821: TURN <CRLF>

+     *

+     * SMTP CODE SUCCESS: 250

+     * SMTP CODE FAILURE: 502

+     * SMTP CODE ERROR  : 500, 503

+     * @access public

+     * @return bool

+     */

+    function Turn() {

+        $this->error = array("error" => "This method, TURN, of the SMTP ".

+                                        "is not implemented");

+        if($this->do_debug >= 1) {

+            echo "SMTP -> NOTICE: " . $this->error["error"] . $this->CRLF;

+        }

+        return false;

+    }

+

+    /**

+     * Verifies that the name is recognized by the server.

+     * Returns false if the name could not be verified otherwise

+     * the response from the server is returned.

+     *

+     * Implements rfc 821: VRFY <SP> <string> <CRLF>

+     *

+     * SMTP CODE SUCCESS: 250,251

+     * SMTP CODE FAILURE: 550,551,553

+     * SMTP CODE ERROR  : 500,501,502,421

+     * @access public

+     * @return int

+     */

+    function Verify($name) {

+        $this->error = null; # so no confusion is caused

+

+        if(!$this->connected()) {

+            $this->error = array(

+                    "error" => "Called Verify() without being connected");

+            return false;

+        }

+

+        fputs($this->smtp_conn,"VRFY " . $name . $this->CRLF);

+

+        $rply = $this->get_lines();

+        $code = substr($rply,0,3);

+

+        if($this->do_debug >= 2) {

+            echo "SMTP -> FROM SERVER:" . $this->CRLF . $rply;

+        }

+

+        if($code != 250 && $code != 251) {

+            $this->error =

+                array("error" => "VRFY failed on name '$name'",

+                      "smtp_code" => $code,

+                      "smtp_msg" => substr($rply,4));

+            if($this->do_debug >= 1) {

+                echo "SMTP -> ERROR: " . $this->error["error"] .

+                         ": " . $rply . $this->CRLF;

+            }

+            return false;

+        }

+        return $rply;

+    }

+

+    /*******************************************************************

+     *                       INTERNAL FUNCTIONS                       *

+     ******************************************************************/

+

+    /**

+     * Read in as many lines as possible

+     * 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 private

+     * @return string

+     */

+    function get_lines() {

+        $data = "";

+        while($str = fgets($this->smtp_conn,515)) {

+            if($this->do_debug >= 4) {

+                echo "SMTP -> get_lines(): \$data was \"$data\"" .

+                         $this->CRLF;

+                echo "SMTP -> get_lines(): \$str is \"$str\"" .

+                         $this->CRLF;

+            }

+            $data .= $str;

+            if($this->do_debug >= 4) {

+                echo "SMTP -> get_lines(): \$data is \"$data\"" . $this->CRLF;

+            }

+            # if the 4th character is a space then we are done reading

+            # so just break the loop

+            if(substr($str,3,1) == " ") { break; }

+        }

+        return $data;

+    }

+

+}

+

+

+ ?>

--- /dev/null
+++ b/includes/storyblock.php
@@ -1,1 +1,123 @@
-
+<?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) {

+		$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)) {

+			$coauthors[$c['uid']] = $c['penname'];

+		}

+		$stories['coauthors'] = $coauthors;

+		unset($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"   , $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']) {

+		foreach(explode(",", $stories['classes']) as $c) {

+			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: (".mysql_errno( ).") ".mysql_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,176 @@
-
+<?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\");'>";

+	$couids = array() ;

+	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>";

+			$couids[] = $c['uid'];

+		}

+		$couids = implode(",", $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 = eregi_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,26 @@
-
+<?php

+define("_BASEDIR", "../");

+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,976 @@
-
+<?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", "../");

+

+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 = "";

+

+include ("../includes/class.TemplatePower.inc.php");

+

+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" );

+

+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(!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $_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', now( ))");

+				$skinquery = dbquery("SELECT skin FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".SITEKEY."'");

+				list($skin) = dbrow($skinquery);

+				define("USERUID", dbinsertid( ));

+				$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` datetime NOT NULL default '0000-00-00 00:00:00',

+  `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` datetime NOT NULL default '0000-00-00 00:00:00',

+  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` timestamp NOT NULL,

+  `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` datetime default NULL,

+  `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` datetime NOT NULL default '0000-00-00 00:00:00',

+  `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` datetime default NULL,

+  `updated` datetime NOT NULL default '0000-00-00 00:00:00',

+  `uid` int(11) NOT NULL default '0',

+  `coauthors` varchar(50) 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);

+			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);

+			define("_BASEDIR", "../");

+			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($_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']);

+			$mysql_access = mysql_connect($dbhost, $dbuser, $dbpass);

+			if(!$mysql_access) {

+				$output .= write_message(_CONFIGFAILED);

+			}

+		}

+		if(isset($_POST['submit']) && $mysql_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($mysql_access)) include("../config.php");

+			if(isset($tinyMCE)) $output .= write_message(_CONFIG2DETECTED);

+			else if(isset($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,193 @@
-
+<?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.");



+

+?>

--- /dev/null
+++ b/install/languages/en.php
@@ -1,1 +1,200 @@
-
+<?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.");

+

+?>

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

--- /dev/null
+++ b/install/upgrade11.php
@@ -1,1 +1,1138 @@
-
+<?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 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 );

+	}

+}

+

+Header('Cache-Control: private, no-cache, must-revalidate, max_age=0, post-check=0, pre-check=0');

+header ("Pragma: no-cache"); 

+header ("Expires: 0"); 

+

+//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 1.1 to $version Upgrade</title>

+<style>

+LABEL { float: left; display: block; width: 50%; 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>";

+

+$output = "";

+define("_BASEDIR", "../");

+include ("../includes/class.TemplatePower.inc.php");

+if(isset($_GET['step']) && $_GET['step'] > 2) {

+	include("../config.php");

+	$settings = dbquery("SELECT tableprefix, language FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+	list($tableprefix, $language) = dbrow($settings);

+	define("SITEKEY", $sitekey);

+	define("TABLEPREFIX", $tableprefix);

+}

+if(isset($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 ("../languages/en.php");

+include ("../languages/en_admin.php");

+include("languages/en.php");

+}

+include("../includes/corefunctions.php");

+

+

+//  So I don't have to keep updating the version number in 3 different files.

+include("../version.php");

+

+$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", "Upgrade eFiction 1.1 to eFiction $version");

+$tpl->gotoBlock( "_ROOT" );

+$tpl->newBlock("footer");

+$tpl->assign( "footer", "eFiction $version &copy; 2006. <a href='http://efiction.org/'>http://efiction.org/</a>");

+$tpl->gotoBlock( "_ROOT" );

+

+switch($_GET['step']) {

+	case "18":

+		$output .= "<div id='pagetitle'>"._MISCDBUPDATE."</div>";

+		if(isset($_GET['install'])) {

+			if($_GET['install'] == "automatic") {

+				include("../config.php");

+				$settings = dbquery("SELECT tableprefix FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+				list($tableprefix) = dbrow($settings);

+				$alter1 = dbquery("ALTER TABLE `".$tableprefix."fanfiction_characters` ADD `bio` TEXT NULL, ADD `image` VARCHAR( 200 ) NOT NULL");

+				$output .= write_message(_ALTER11CHARACTERS.($alter1 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+				$alter1 = dbquery("ALTER TABLE `".$tableprefix."fanfiction_categories` CHANGE `locked` `locked` CHAR( 1 ) DEFAULT '0' NOT NULL");

+				$output .= write_message(_ALTER11CATEGORIES.($alter1 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+				$alter1 = dbquery("ALTER TABLE `".$tableprefix."fanfiction_ratings` CHANGE `ratingwarning` `ratingwarning` CHAR( 1 ) DEFAULT '0' NOT NULL ");

+				$output .= write_message(_ALTER11RATINGS.($alter1 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+				$alter1 = dbquery("DROP TABLE IF EXISTS `".$tableprefix."fanfiction_settings_old`");

+				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("alter table ".$tableprefix."fanfiction_comments drop index nid;");

+				dbquery("alter table ".$tableprefix."fanfiction_comments add index commentlist (nid,time);");

+				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_stories drop index validated;");

+				dbquery("create index validateduid on ".$tableprefix."fanfiction_stories (validated,uid);");

+				dbquery("create index recent on ".$tableprefix."fanfiction_stories (updated,validated);");

+				$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");

+				}

+				$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(uid) as totalm FROM ".$tableprefix."fanfiction_authors");

+				list($members) = dbrow($authorquery);

+

+				list($newest) = dbrow(dbquery("SELECT uid as uid FROM ".$tableprefix."fanfiction_authors ORDER BY uid 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 series = '$totalseries', chapters = '$chapters', members = '$members', newestmember = '$newest', reviews = '$reviews', reviewers = '$reviewers' WHERE sitekey = '".$sitekey."'"); 

+				$alltables = dbquery("SHOW TABLES");

+				while ($table = dbassoc($alltables)) {

+					foreach ($table as $db => $tablename) {

+						dbquery("OPTIMIZE TABLE `".$tablename."`");

+					}

+				}

+				$output .= write_message(_UPGRADE11END);

+			}

+			else $output .= write_message(_MISCDBUPDATEMANUAL._UPGRADE11END);

+		}

+		else $output .= write_message(_MISCDBUPDATEINFO."<br /><br /><a href='upgrade11.php?step=18&amp;install=automatic'>"._AUTO."</a> "._OR." <a href='upgrade11.php?step=18&amp;install=manual'>"._MANUAL2."</a>");

+	break;

+	case "17":

+		$output .= "<div id='pagetitle'>"._NEWSUPDATE."</div>";

+		if(isset($_GET['install'])) {

+			include("../config.php");

+

+			$settings = dbquery("SELECT tableprefix FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+			list($tableprefix) = dbrow($settings);

+			dbquery("ALTER TABLE `".$tableprefix."fanfiction_news` ADD `comments` INT NOT NULL DEFAULT '0'");

+			$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']);

+			}

+			$comments = dbquery("SELECT uname FROM ".$tableprefix."fanfiction_comments GROUP BY uname");

+			while($uname = dbassoc($comments)) {

+				unset($uid);

+				$nameinfo = dbquery("SELECT uid FROM ".$tableprefix."fanfiction_authors WHERE penname = '".$uname['uname']."'");

+				list($uid) = dbrow($nameinfo);

+				if(empty($uid)) $uid = 0;

+				dbquery("UPDATE ".$tableprefix."fanfiction_comments SET uname = '$uid' WHERE uname = '".$uname['uname']."'");

+			}

+			$result2 = dbquery("ALTER TABLE `".$tableprefix."fanfiction_comments` CHANGE `uname` `uid` INT NOT NULL DEFAULT '0';");

+			$output .= write_message(_NEWSUPDATERESULT.($result2 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));	

+			$output .= write_message("<a href='upgrade11.php?step=18'>"._CONTINUE."</a>");				

+

+		}

+		else $output .= write_message(_NEWSUPDATEINFO."<br /><a href='upgrade11.php?step=17&amp;install=automatic'>"._CONTINUE."</a>");

+

+	break;

+	case "16":

+		$output .= "<div id='pagetitle'>"._AUTHORUPDATE."</div>";

+		if(isset($_GET['install'])) {

+			include("../config.php");

+			define("_BASEDIR", "../");

+			$settings = dbquery("SELECT tableprefix, defaultsort, displayindex, tinyMCE, storiespath FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+			list($defaultsort, $displayindex, $tinyMCE, $storiespath) = dbrow($settings);

+			$result = dbquery("INSERT INTO ".$tableprefix."fanfiction_authorprefs(`uid`, `newreviews`, `validated`, `userskin`, `level`, `categories`, `contact`) SELECT uid, newreviews, validated, userskin, level, categories, contact FROM ".$tableprefix."fanfiction_authors");

+			$result2 = dbquery("UPDATE ".$tableprefix."fanfiction_authorprefs set sortby = '$defaultsort', storyindex = '$displayindex', tinyMCE = '$tinyMCE'");

+			$authors = dbquery("SELECT author.penname, author.uid, count(stories.uid) as count FROM ".$tableprefix."fanfiction_authors as author, ".$tableprefix."fanfiction_stories as stories WHERE author.uid = stories.uid GROUP BY stories.uid");

+			while($author = dbassoc($authors)) {

+				if( file_exists( _BASEDIR.STORIESPATH."/$author[penname]/") ) {

+					$moved = rename(_BASEDIR.STORIESPATH."/$author[penname]/", _BASEDIR.STORIESPATH."/$author[uid]/");

+					$output .= $author['penname'].($moved ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">")."<br />";

+				}

+			}

+			$output .= write_message(_AUTHORRESULT.($result ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$fields = dbquery("SELECT * FROM ".$tableprefix."fanfiction_authorfields WHERE field_on = 1");

+			while($f = dbassoc($fields)) {

+				$col = dbquery("SHOW COLUMNS FROM ".$tableprefix."fanfiction_authors LIKE '".$f['field_name']."'");

+				if(dbnumrows($col) > 0) {

+					$result = dbquery("INSERT INTO ".$tableprefix."fanfiction_authorinfo(`uid`, `info`) SELECT uid, ".$f['field_name']." FROM ".$tableprefix."fanfiction_authors WHERE ".$f['field_name']." IS NOT NULL AND ".$f['field_name']." != ''");

+					$result2 = dbquery("UPDATE ".$tableprefix."fanfiction_authorinfo SET field = ".$f['field_id']." WHERE field = 0");

+				}

+			}

+			$result2 = dbquery("ALTER TABLE `".$tableprefix."fanfiction_authors` DROP `validated`, DROP `userskin`, DROP `level`, DROP `contact`, DROP `categories`, DROP `carry`, CHANGE `admincreated` `admincreated` CHAR( 1 ) DEFAULT '0' NOT NULL;");

+			$output .= write_message(_AUTHORDROPRESULT.($result2 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));	

+			$output .= write_message("<a href='upgrade11.php?step=17'>"._CONTINUE."</a>");				

+

+		}

+		else $output .= write_message(_AUTHORUPDATEINFO."<br /><a href='upgrade11.php?step=16&amp;install=automatic'>"._CONTINUE."</a>");

+	break;

+	case "15":

+		$output .= "<div id='pagetitle'>"._AUTHORFIELDS."</div>";

+		include("../config.php");

+		$settings = dbquery("SELECT tableprefix FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+		list($tableprefix) = dbrow($settings);

+		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');

+		

+				$settings = dbquery("SELECT tableprefix FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+				list($tableprefix) = dbrow($settings);

+

+				$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." "._FIELDUPDATE."<br /><br /> <a href='upgrade11.php?step=16'>"._CONTINUE."</a>");

+			}

+			else {

+				$output .= write_message(_FIELDMANUAL," "._FIELDUPDATE."<br /><br /><a href='upgrade11.php?step=16'>"._CONTINUE."</a>");

+			}

+		}

+		else $output .= write_message(_FIELDDATAINFO."<br /><br /><a href='upgrade11.php?step=15&amp;install=automatic'>"._AUTO."</a> "._OR." <a href='upgrade11.php?step=15&amp;install=manual'>"._MANUAL2."</a>");

+	break;

+	case "14":

+		$output .= "<div id='pagetitle'>"._UPDATECATORDER."</div>";

+		if(isset($_GET['install'])) {

+			if($_GET['install'] == "automatic") {

+				include("../config.php");

+				$settings = dbquery("SELECT tableprefix FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+				list($tableprefix) = dbrow($settings);

+				$selectA = "SELECT category, catid FROM ".$tableprefix."fanfiction_categories ORDER BY leveldown, 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) or die(_FATALERROR."Query: ".$selectB."<br />Error: (".mysql_errno( ).") ".mysql_error( ));

+					while($sub = dbassoc($resultB)) {

+						dbquery("UPDATE ".$tableprefix."fanfiction_categories SET displayorder = $count WHERE catid = $sub[catid]");

+						$count++;

+					}

+				}

+				$output .= write_message(_ACTIONSUCCESSFUL."<br /> <a href='upgrade11.php?step=15'>"._CONTINUE."</a>");

+			}

+		}

+		else {

+			include("../config.php");

+			$output .= write_message(_UPDATECATORDERINFO." <BR /><BR /><a href='upgrade11.php?step=14&amp;install=automatic'>"._CONTINUE."</a>");

+		}

+	break;

+	case "13":

+		$output .= "<div id='pagetitle'>"._FAVUPDATE."</div>";

+		if(isset($_GET['install'])) {

+			include("../config.php");

+			$settings = dbquery("SELECT tableprefix FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+			list($tableprefix) = dbrow($settings);

+			$favst = dbquery("INSERT INTO ".$tableprefix."fanfiction_favorites(uid, item, type) SELECT uid, sid, 'ST' FROM ".$tableprefix."fanfiction_favstor");

+			$output .= write_message(_FAV1.($favst ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$favau = dbquery("INSERT INTO ".$tableprefix."fanfiction_favorites(uid, item, type) SELECT uid, favuid, 'AU' FROM ".$tableprefix."fanfiction_favauth");

+			$output .= write_message(_FAV3.($favau ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$drop1 = dbquery("DROP TABLE `".$tableprefix."fanfiction_favstor`");

+			$output .= write_message(_FAV4.($drop1 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$drop3 = dbquery("DROP TABLE `".$tableprefix."fanfiction_favauth`");

+			$output .= write_message(_FAV6.($drop3 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$output .= write_message("<a href='upgrade11.php?step=14'>"._CONTINUE."</a>");		

+		}

+		else $output .= write_message(_FAVUPDATEINFO11."<br /><a href='upgrade11.php?step=13&amp;install=automatic'>"._CONTINUE."</a>");

+	break;

+	case "12":

+		$output .= "<div id='pagetitle'>"._UPDATESTORIES11."</div>";

+		if(isset($_GET['install'])) {

+			if($_GET['install'] == "automatic") {

+				include("../config.php");

+				$settings = dbquery("SELECT tableprefix FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+				list($tableprefix) = dbrow($settings);

+				$characters = dbquery("SELECT charid, charname FROM ".$tableprefix."fanfiction_characters");

+					while($char = dbassoc($characters)) {

+					$character[stripslashes($char[charname])] = $char[charid];

+				}

+				$ratlist = dbquery("SELECT * FROM ".$tableprefix."fanfiction_ratings");

+				while($rate = dbassoc($ratlist)) {

+					$ratingslist[$rate['rating']] = $rate['rid'];

+				}

+				$classresults = dbquery("SELECT * FROM ".$tableprefix."fanfiction_classes");

+				while($class = dbassoc($classresults)) {

+					$classlist[$class['class_name']] = array("id" => $class['class_id'], "type" => $class['class_type'], "name" => $class['class_name']);

+				}

+				$offset = isset($_GET['offset']) ? $_GET['offset'] : 0;

+				$stories = dbquery("SELECT s.*, AVG( re.rating ) AS rating, count( re.rating ) AS reviews FROM ".$tableprefix."fanfiction_stories AS s LEFT JOIN ".$tableprefix."fanfiction_reviews AS re ON s.sid = re.chapid GROUP BY s.sid LIMIT $offset, 200");

+				while($chapter = dbassoc($stories)) {

+					dbquery("INSERT INTO ".$tableprefix."fanfiction_chapters(`chapid` , `title` , `inorder` , `storytext` , `validated` , `wordcount` , `rating` , `reviews` , `sid` , `uid` ) VALUES('$chapter[sid]', '".addslashes($chapter[chapter])."', '".($chapter[inorder] + 1)."', '".addslashes($chapter[storytext])."', '$chapter[validated]', '$chapter[wordcount]', '".(empty($chapter[rating]) ? "0" : $chapter[rating])."', '$chapter[reviews]', '$chapter[psid]', '$chapter[uid]')");

+					if($chapter['sid'] == $chapter['psid']) {		

+						unset($genres, $warnings, $g, $w, $classes, $characters, $c, $clist, $rid);

+						$characters = explode(",", $chapter['charid']);

+						foreach($characters as $c) {

+							$clist[] = $character[$c];

+						}

+						$genres = explode(",", $chapter['gid']);

+						foreach($genres as $g) {

+							if($g && $g != " " && $classlist[$g]['type'] == 1) $classes[] = $classlist[$g]['id'];

+						}

+						$warnings = explode(",", $chapter['wid']);

+						foreach($warnings as $w) {

+							if($w && $w != " " && $classlist[$w]['type'] == 2) $classes[] = $classlist[$w]['id'];

+						}

+						$rid = $ratingslist[$chapter['rid']];

+						dbquery("UPDATE ".$tableprefix."fanfiction_stories SET rid = '$rid', classes = '".($classes ? implode(",", $classes) : "")."', charid = '".($clist ? implode(",", $clist) : "")."' WHERE sid = '$chapter[sid]'");

+					}

+				}

+				if(dbnumrows($stories)) $output .= write_message(_STORIES." ".($offset + 1)."-".($offset + dbnumrows($stories)).".<br /><a href='upgrade11.php?step=12&amp;install=automatic&amp;offset=".($offset+200)."'>"._CONTINUE."</a>");

+				else {

+					dbquery("DELETE FROM ".$tableprefix."fanfiction_stories WHERE sid != psid");

+					dbquery("ALTER TABLE `".$tableprefix."fanfiction_stories` CHANGE `featured` `featured` CHAR( 1 ) DEFAULT '0' NOT NULL ,

+CHANGE `validated` `validated` CHAR( 1 ) DEFAULT '0' NOT NULL ,

+CHANGE `rr` `rr` CHAR( 1 ) DEFAULT '0' NOT NULL, DROP `chapter`, 

+DROP `inorder`, 

+DROP `storytext`, 

+DROP `psid`,

+DROP `gid`,

+DROP `wid`,

+CHANGE `catid` `catid` VARCHAR( 100 ) DEFAULT '0' NOT NULL, 

+ADD `rating` TINYINT( 4 ) NOT NULL");

+	$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']."'");

+	}					$output .= write_message(_STORIESUPDATED."<br /><br /><a href='upgrade11.php?step=13&amp;install=automatic'>"._CONTINUE."</a>");

+				}

+			}

+		}

+		else {

+			include("../config.php");

+			$output .= write_message(_UPDATESTORIES11INFO."<br /><br /> <a href='upgrade11.php?step=12&amp;install=automatic'>"._CONTINUE."</a>");

+		}

+	break;

+	case "11":

+		$output .= "<div id='pagetitle'>"._REVIEWUPDATE."</div>";

+		if(isset($_GET['install'])) {

+			include("../config.php");

+			$settings = dbquery("SELECT tableprefix FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+			list($tableprefix) = dbrow($settings);

+			$alter = dbquery("ALTER TABLE `".$tableprefix."fanfiction_reviews` CHANGE `psid` `item` INT( 11 ) NOT NULL DEFAULT '0'");

+			$output .= write_message(_REVIEWALTER7.($alter ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$alter2 = dbquery("ALTER TABLE `".$tableprefix."fanfiction_reviews` ADD `type` VARCHAR( 2 ) NOT NULL DEFAULT 'ST'");

+			$output .= write_message(_REVIEWALTER2.($alter2 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$alter3 = dbquery("ALTER TABLE `".$tableprefix."fanfiction_reviews` CHANGE `member` `uid` INT( 11 ) NOT NULL DEFAULT '0'");

+			$output .= write_message(_REVIEWALTER3.($alter3 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$alter4 = dbquery("ALTER TABLE `".$tableprefix."fanfiction_reviews` ADD `respond` CHAR( 1 ) DEFAULT '0' NOT NULL");

+			$output .= write_message(_REVIEWALTER5.($alter4 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$update1 = dbquery("UPDATE ".$tableprefix."fanfiction_reviews SET type = 'ST' WHERE item > 0");

+			$alter5 = dbquery("ALTER TABLE `".$tableprefix."fanfiction_reviews` CHANGE `sid` `chapid` INT( 11 ) NOT NULL DEFAULT '0'");

+			$output .= write_message(_REVIEWALTER6.($alter5 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+

+			$output .= write_message(_REVIEWUPDATE1.($update1 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$update3 = dbquery("UPDATE ".$tableprefix."fanfiction_reviews SET respond = 1 WHERE review LIKE \"%Author's Response:%\"");

+			$output .= write_message(_REVIEWUPDATE3.($update3 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$output .= write_message("<a href='upgrade11.php?step=12'>"._CONTINUE."</a>");

+		}

+		else $output .= write_message(_REVIEWUPDATEINFO."<br /><a href='upgrade11.php?step=11&amp;install=automatic'>"._CONTINUE."</a>");

+

+	break;

+	case "10":

+		$output .= "<div id='pagetitle'>"._UPDATESTORIESTABLE11."</div>";

+		if(isset($_GET['install'])) {

+			if($_GET['install'] == "automatic") {

+				include("../config.php");

+				$settings = dbquery("SELECT tableprefix FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+				list($tableprefix) = dbrow($settings);

+				$result = dbquery("ALTER TABLE ".$tableprefix."fanfiction_stories ADD `classes` VARCHAR( 200 ) NULL AFTER `catid`;");

+				if($result) $result = dbquery("ALTER TABLE ".$tableprefix."fanfiction_stories CHANGE `summary` `summary` TEXT NULL");

+				if($result) $result = dbquery("ALTER TABLE ".$tableprefix."fanfiction_stories ADD `coauthors` tinyint(1) NULL AFTER `uid`");

+				if($result) $result = dbquery("ALTER TABLE ".$tableprefix."fanfiction_stories CHANGE `numreviews` `reviews` SMALLINT( 6 ) DEFAULT '0' NOT NULL");

+				if($result) $result = dbquery("ALTER TABLE ".$tableprefix."fanfiction_stories CHANGE `counter` `count` INT( 11 ) NOT NULL DEFAULT '0' AFTER `reviews`;");

+				if($result) $result = dbquery("ALTER TABLE ".$tableprefix."fanfiction_stories ADD `storynotes` TEXT NULL AFTER `summary`;");

+				if($result) $output .= write_message(_ACTIONSUCCESSFUL."<br /> <a href='upgrade11.php?step=11'>"._CONTINUE."</a>");

+			}

+			else if($_GET['install'] == "manual") {

+				$output .= write_message(_UPDATESTORIESTABLEMANUAL11."<br /> <a href='upgrade11.php?step=11'>"._CONTINUE."</a>");

+			}

+		}

+		else {

+			include("../config.php");

+			$output .= write_message(_UPDATESTORIESTABLEINFO11." <a href='upgrade11.php?step=10&amp;install=automatic'>"._AUTO."</a> "._OR." <a href='upgrade11.php?step=10&amp;install=manual'>"._MANUAL2."</a>");

+		}

+	break;	case "9":

+		$output .= "<div id='pagetitle'>"._MOVECLASSES."</div>";

+		if(isset($_GET['install'])) {

+			include("../config.php");

+			$settings = dbquery("SELECT tableprefix FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+			list($tableprefix) = dbrow($settings);

+			$newclass = dbquery("INSERT INTO ".$tableprefix."fanfiction_classtypes (`classtype_name`, `classtype_title`) VALUES('genres', 'Genres');");

+			$genres = dbquery("SELECT * FROM ".$tableprefix."fanfiction_genres");

+			$output .= "<table class='tblborder' style='margin: 1em auto; padding: 1em;' cellpadding='5'><tr><th>Genres</th><th>Result</th></tr>";

+			while($g = dbassoc($genres)) {

+				$result = dbquery("INSERT INTO ".$tableprefix."fanfiction_classes (`class_type`, `class_name`) VALUES('1', '".$g['genre']."')");

+				$output .= "<tr><td>".$g['genre']."</td><td align='center'>" . ($result ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") ."</td></tr>";

+			}

+			$output .= "</table>";

+			// Ditto with the warnings

+			$newclass = dbquery("INSERT INTO ".$tableprefix."fanfiction_classtypes (`classtype_name`, `classtype_title`) VALUES('warnings', 'Warnings');");

+			$output .= "<table class='tblborder' style='margin: 1em auto; padding: 1em;' cellpadding='5'><tr><th>Warnings</th><th>Result</th></tr>";

+			$warnings = dbquery("SELECT * FROM ".$tableprefix."fanfiction_warnings");

+			while($w = dbassoc($warnings)) {

+				$result = dbquery("INSERT INTO ".$tableprefix."fanfiction_classes (`class_type`, `class_name`) VALUES('2', '$w[warning]')");

+				$output .= "<tr><td>".$w['warning']."</td><td align='center'>" . ($result ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") ."</td></tr>";

+			}

+			$output .= "</table>";

+			$drop1 = dbquery("DROP TABLE `".$tableprefix."fanfiction_genres`");

+			$output .= write_message(_DROPGENRES.($drop1 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$drop2 = dbquery("DROP TABLE `".$tableprefix."fanfiction_warnings`");

+			$output .= write_message(_DROPWARNINGS.($drop2 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			

+			$output .= write_message(_MOVECLASSFAIL."<br /><a href='upgrade11.php?step=10'>continue</a>");

+		}

+		else $output .= write_message(_MOVECLASSESINFO."<br /><a href='upgrade11.php?step=9&amp;install=automatic'>"._CONTINUE."</a>");

+	break;

+	case "8":

+		$output .= "<div id='pagetitle'>"._MESSAGEDATA."</div>";

+		if(isset($_GET['install'])) {

+			if($_GET['install'] == "automatic") {

+				include("../config.php");

+				$settings = dbquery("SELECT tableprefix FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+				list($tableprefix) = dbrow($settings);

+				$output .= "<table class='tblborder' style='margin: 1em auto; padding: 1em;' cellpadding='5'><tr><th>Message</th><th>Result</th></tr>";

+				$settings = dbquery("SELECT * FROM ".$tableprefix."fanfiction_settings_old");

+				if(!$settings) $settings = dbquery("SELECT * FROM ".$tableprefix."fanfiction_settings");

+				$messages = dbassoc($settings);

+				foreach($messages as $name => $text) {

+					

+					$msg = dbquery("INSERT INTO `".$tableprefix."fanfiction_messages` (`message_name`, `message_title`, `message_text`) VALUES ('$name', '".$defaulttitles[$name]."', '".addslashes($text)."');");

+					$output .= "<tr><td>".$defaulttitles[$name]."</td><td align='center'>" . ($msg ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") ."</td></tr>";

+				}

+				$msg = dbquery("INSERT INTO `".$tableprefix."fanfiction_messages`(`message_name`, `message_title`, `message_text`) VALUES ('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`(`message_name`, `message_title`, `message_text`) VALUES ('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`(`message_name`, `message_title`, `message_text`) VALUES ('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`(`message_name`, `message_title`, `message_text`) VALUES('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 /><a href='upgrade11.php?step=9'>continue</a>");

+			}

+		}

+		else $output .= write_message(_MESSAGEDATAUPGRADE."<br /><a href='upgrade11.php?step=8&amp;install=automatic'>"._CONTINUE."</a>");

+

+	break;

+	case "7":

+		$output .= "<div id='pagetitle'>"._BLOCKDATA."</div>";

+		if(isset($_GET['install'])) {

+			if($_GET['install'] == "automatic") {

+				include("../config.php");

+				$settings = dbquery("SELECT tableprefix FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+				list($tableprefix) = dbrow($settings);

+				$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='upgrade11.php?step=8'>"._CONTINUE."</a>");

+			}

+			else {

+				$output .= write_message(_BLOCKDATAMANUAL."<br /><br /><a href='upgrade11.php?step=7'>"._CONTINUE."</a>");

+			}

+		}

+		else $output .= write_message(_BLOCKDATANEW."<br /><br /><a href='upgrade11.php?step=7&amp;install=automatic'>"._AUTO."</a> "._OR." <a href='iupgrade11.php?step=7&amp;install=manual'>"._MANUAL2."</a>");

+	break;

+	case "6":

+		$output .= "<div id='pagetitle'>"._LINKDATA."</div>";

+		if(isset($_GET['install'])) {

+			if($_GET['install'] == "automatic") {

+				include("../config.php");

+				$settings = dbquery("SELECT tableprefix FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+				list($tableprefix) = dbrow($settings);

+				$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"),

+					array("genres_link", "Genres", "browse.php?type=class&amp;type_id=1", "0", "0"),

+					array("warnings_link", "Warnings", "browse.php?type=class&amp;type_id=2", "0", "0")

+				);

+				$output .= "<table class='tblborder' style='margin: 1em auto; padding: 1em;' cellpadding='5'><tr><th>Pages</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 /><a href='upgrade11.php?step=7'>"._CONTINUE."</a>");

+			}

+			else {

+				$output .= write_message(_LINKMANUAL."<br /><a href='upgrade11.php?step=7'>"._CONTINUE."</a>");

+			}

+		}

+		else $output .= write_message(_LINKDATAINFO." "._LINKSETUP." <a href='upgrade11.php?step=6&amp;install=automatic'>"._AUTO."</a> "._OR." <a href='upgrade11.php?step=6&amp;install=manual'>"._MANUAL2."</a>");

+	break;

+	case "5":

+		$output .= "<div id='pagetitle'>"._PANELDATA."</div>";

+		if(isset($_GET['install'])){

+			if($_GET['install'] == "automatic") {

+				include("../config.php");

+				$settings = dbquery("SELECT tableprefix FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+				list($tableprefix) = dbrow($settings);

+				$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("manfavs","Manage Favorites","","1","2","0","F"),

+					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("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 /> <a href='upgrade11.php?step=6'>"._CONTINUE."</a>");

+			}

+			else {

+				$output .= write_message(_PANELMANUAL."<br /> <a href='upgrade11.php?step=6'>"._CONTINUE."</a>");

+			}

+		}

+		else $output .= write_message(_PANELDATAINFO." "._PANELSETUP." <a href='upgrade11.php?step=5&amp;install=automatic'>"._AUTO."</a> "._OR." <a href='upgrade11.php?step=5&amp;install=manual'>"._MANUAL2."</a>");

+	break;

+	case "4":

+		$output .= "<div id='pagetitle'>"._INSTALLTABLES."</div>";

+		if(isset($_GET['install'])) {

+			if($_GET['install'] == "automatic") {

+				include("../config.php");

+				$settings = dbquery("SELECT tableprefix FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+				list($tableprefix) = dbrow($settings);

+				$output .= "<table class='tblborder' style='margin: 1em auto; padding: 1em;' cellpadding='5'><tr><th>Table</th><th>Result</th></tr>";

+				$authorfields = dbquery("CREATE TABLE `".$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`)

+) TYPE=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 `".$tableprefix."fanfiction_authorinfo` (

+  `uid` int(11) NOT NULL default '0',

+  `field` int(11) NOT NULL default '0',

+  `info` varchar(255) NOT NULL default ' ',

+  KEY `uid` (`uid`)

+) TYPE=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 `".$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`)

+) TYPE=MyISAM;");

+$output .= "<tr><td>".$tableprefix."fanfiction_authorprefs</td><td align='center'>" . ($authorprefs ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") ."</td></tr>";

+				$blocks = dbquery("CREATE TABLE `".$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`)

+) TYPE=MyISAM;");

+$output .= "<tr><td>".$tableprefix."fanfiction_blocks</td><td align='center'>" . ($blocks ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") ."</td></tr>";

+				$chapters = dbquery("CREATE TABLE `".$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`)

+) TYPE=MyISAM;");

+$output .= "<tr><td>".$tableprefix."fanfiction_chapters</td><td align='center'>" . ($chapters ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") ."</td></tr>";

+				$classes = dbquery("CREATE TABLE `".$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`)

+) TYPE=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 `".$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`),

+  KEY `classtype_title` (`classtype_title`)

+) TYPE=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 `".TABLEPREFIX."fanfiction_coauthors` (

+  `sid` int(11) NOT NULL default '0',

+  `uid` int(11) NOT NULL default '0',

+  PRIMARY KEY  (`sid`,`uid`)

+) TYPE=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 `".$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`)

+) TYPE=MyISAM;");

+$output .= "<tr><td>".$tableprefix."fanfiction_codeblocks</td><td align='center'>" . ($codeblocks ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") ."</td></tr>";

+				$favorites = dbquery("CREATE TABLE `".$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 NULL,

+  KEY `uid` (`uid`)

+) TYPE=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 `".$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`)

+) TYPE=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 `".$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` timestamp NOT NULL,

+  `log_type` varchar(2) NOT NULL,

+  PRIMARY KEY  (`log_id`)

+) TYPE=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 `".$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 NULL,

+  PRIMARY KEY  (`message_id`)

+) TYPE=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 `".$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>";

+				$pagelinks = dbquery("CREATE TABLE `".$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_text` (`link_text`),

+  KEY `link_name` (`link_name`)

+) TYPE=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 `".$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_hidden` (`panel_hidden`),

+  KEY `panel_type` (`panel_type`)

+) TYPE=MyISAM;");

+$output .= "<tr><td>".$tableprefix."fanfiction_panels</td><td align='center'>" . ($panels ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") ."</td></tr>";

+				$series = dbquery("CREATE TABLE `".$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',

+  PRIMARY KEY  (`seriesid`),

+  KEY `catid` (`catid`),

+  KEY `characters` (`characters`),

+  KEY `classes` (`classes`),

+  KEY `owner` (`uid`,`title`)

+) TYPE=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 `".$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'

+) TYPE=MyISAM");

+	dbquery("INSERT INTO ".$tableprefix."fanfiction_stats(`sitekey`) VALUES('".$sitekey."')");

+$output .= "<tr><td>".$tableprefix."fanfiction_stats</td><td align='center'>" . ($stats ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") ."</td></tr>";

+$output .= "</table>";

+$output .= write_message(_NEWTABLEAUTOFAIL11."<br /> <a href='upgrade11.php?step=5'>"._CONTINUE."</a>");

+			}

+			else if($_GET['install'] == "manual") {

+				$output .= write_message(_NEWTABLESSETUP."<br /> <a href='upgrade11.php?step=5'>"._CONTINUE."</a>");

+			}

+		}

+		else {

+			include("../config.php");

+			$output .= write_message(_NEWTABLESSETUP." <a href='upgrade11.php?step=4&amp;install=automatic'>"._AUTO."</a> "._OR." <a href='upgrade11.php?step=4&amp;install=manual'>"._MANUAL2."</a>");

+		}

+	break;

+	case "3":			

+		define ("_BASEDIR", "../");

+		include("../config.php");

+		define("SITEKEY", $sitekey);

+		if(!$_GET['sect']) $sect = "main";

+		else $sect = $_GET['sect'];

+		$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 = stripslashes($val);

+		}

+		define("TABLEPREFIX", $tableprefix);

+		if((empty($sect) || $sect == "main") && !isset($_POST['submit'])) $output .= write_message(_SKINWARNING);

+		if($sect == "submissions") {

+			if($_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($sect == "email" && $_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='upgrade11.php?step=4'>"._CONTINUE."</a>");

+			}

+			else include("../admin/settings.php");

+		}

+		else include("../admin/settings.php");

+	break;

+	case "2":

+		$output .= "<div id='pagetitle'>"._CONFIGDATA."</div>";

+		define ("_BASEDIR", "../");		

+		include("../config.php");

+		if(isset($_POST['sitekey'])) {

+			// relative path

+			if(file_exists("../".$databasepath."/dbconfig.php")) include("../".$databasepath."/dbconfig.php");

+			// absolute path

+			else if(file_exists($databasepath."/dbconfig.php")) include($databasepath."/dbconfig.php");

+			include_once("../includes/dbfunctions.php");

+			$dbconnect = dbconnect($dbhost, $dbuser, $dbpass, $dbname );

+			$sitekey = !empty($_POST['sitekey']) ? descript($_POST['sitekey']) : random_string($randomcharset, 10);

+			$settingsprefix = descript($_POST['settingsprefix']);

+			$sitesettings = dbquery("INSERT INTO ".$settingsprefix."fanfiction_settings(

+			`sitename`, `slogan`, `url`, `siteemail`, `store`, `autovalidate`, `multiplecats`, `reviewsallowed`, `ratings`, `roundrobins`, 

+			`submissionsoff`, `anonreviews`, `itemsperpage`, `imageupload`, `imageheight`, `imagewidth`, `skin`) 

+			VALUES('$sitename', '$slogan', '$url', '$siteemail', '$store', '$autovalidate', '$numcats', '$reviewsallowed', '$ratings', '$roundrobins',

+			'$submissionsoff', '$anonreviews', '$itemsperpage', '$imageupload', '$imageheight', '$imagewidth', '$skin')");

+			if($sitesettings) $output .= write_message("<img src=\"../images/check.gif\">"._SITESETTINGSMOVED);

+			$handle = fopen("../config.php", 'w');

+			if(!$handle) {

+				chmod("../config.php", 0666);

+				$handle = fopen("../config.php", 'w');

+			}

+			if ($handle) {

+				$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("<img src=\"../images/check.gif\">"._CONFIG_WRITTEN."<br /><a href='upgrade11.php?step=3'>"._CONTINUE."</a>");

+			}

+			else $output .= write_message(_ERROR_CONFIGWRITE);						

+		}

+		else {

+			$output .=  

+				"<form method='POST' enctype='multipart/form-data' action='upgrade11.php?step=2' class='tblborder' style='width: 325px; margin: 1em auto;'>

+						<label for='sitekey'>"._SITEKEY."</label><input type='text' name='sitekey' value='".random_string($randomcharset, 10)."' id='sitekey'><br />

+						<input type='hidden' name='settingsprefix' value='".$_GET['settingsprefix']."'>

+						<div style='text-align: center; margin: 1em;'><INPUT type=\"submit\"class=\"button\" name=\"submit\" value=\"submit\"></div>

+					</form>";

+			$output .= write_message(_HELP_SITEKEY." "._SITEKEYNOTE);

+		}

+	break;

+	default:

+		$output .= "<div id='pagetitle'>Create Settings Table</div>";

+		include("../config.php");

+		if(isset($_POST['submit'])) {

+			// relative path

+			if(file_exists("../".$databasepath."/dbconfig.php")) include("../".$databasepath."/dbconfig.php");

+			// absolute path

+			else if(file_exists($databasepath."/dbconfig.php")) include($databasepath."/dbconfig.php");

+			include("../includes/dbfunctions.php");

+			$dbconnect = dbconnect($dbhost, $dbuser, $dbpass, $dbname );

+			$settings = dbquery("SHOW TABLES LIKE '".$tableprefix."fanfiction_settings'");

+			if($settings) dbquery("RENAME TABLE ".$tableprefix."fanfiction_settings TO ".$tableprefix."fanfiction_settings_old");

+								$settings = dbquery("CREATE TABLE IF NOT EXISTS`".$_POST['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`)

+) TYPE=MyISAM;");

+if($settings) $output .= write_message("<img src=\"../images/check.gif\"> "._SETTINGSTABLESUCCESS." <br /><a href='upgrade11.php?step=2&amp;settingsprefix=".$_POST['settingsprefix']."'>"._CONTINUE."</a>");

+else $output .= write_message(_SETTINGSTABLEAUTOFAIL." <br /><a href='upgrade11.php?step=2&amp;settingsprefix=".$_POST['settingsprefix']."'>"._CONTINUE."</a> ");

+		}

+		else {

+			$install = isset($_GET['install']) ? $_GET['install'] : false;

+			if($install == "manual") {

+				$output .= write_message(_SETTINGSTABLEMANUAL."<br /><a href='upgrade11.php?step=2'>"._CONTINUE."</a>");

+			}

+			else if($install == "automatic") {

+				$output .=  

+					"<form method='POST' enctype='multipart/form-data' action='upgrade11.php?step=1' class='tblborder' style='width: 325px; margin: 1em auto;'>

+						<label for='settingsprefix'>"._SETTINGSPREFIX."</label><input type='text' name='settingsprefix' id='settingsprefix' value='".$tableprefix."'><br />

+						<div style='text-align: center; margin: 1em;'><INPUT type=\"submit\"class=\"button\" name=\"submit\" value=\"submit\"></div>

+					</form>";

+				$output .= write_message(_SETTINGSTABLENOTE);

+			}

+			else { 

+				$output .= write_message(_SETTINGSTABLESETUP." <a href='upgrade11.php?install=automatic'>"._AUTO."</a> "._OR." <a href='upgrade11.php?install=manual'>"._MANUAL2."</a>");

+			}

+		}

+}

+$tpl->assign("output", $output);

+

+$tpl->printToScreen();

+if($step > 1) dbclose( );

+?>

--- /dev/null
+++ b/install/upgrade20.php
@@ -1,1 +1,1186 @@
-
+<?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 isNumber($num) {

+	return preg_match("/^[0-9]+$/", $num);

+}

+

+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';

+

+function descript($text, $addbreaks = 0) {

+	// 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)[^>]*>#iUu',">",$text);

+	// remove javascript: and vbscript: protocol

+	$text = preg_replace('#([a-z]*)=([\`\'\"]*)script:#iUu','$1=$2nojscript...',$text);

+	$text = preg_replace('#([a-z]*)=([\`\'\"]*)javascript:#iUu','$1=$2nojavascript...',$text);

+	$text = preg_replace('#([a-z]*)=([\'\"]*)vbscript:#iUu','$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);

+	do {

+        	$thistext = $text;

+		$text = preg_replace('#</*(applet|meta|xml|blink|link|style|script|embed|object|iframe|frame|frameset|ilayer|layer|bgsound|title|base)[^>]*>#i',"",$text);

+	} while ($thistext != $text); 

+	if($addbreaks && strpos($text, "<br>") === false && strpos($text, "<p>") === false && strpos($text, "<br />") === false) $text = nl2br($text);

+	return $text;

+}

+

+function write_message($text) {

+	return "<div style='text-align: center; margin: 1em;'>$text</div>";

+}

+// 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 );

+	}

+}

+

+function storiesInSeries($thisseries) {

+	

+		$storylist = array( );

+	$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;

+}

+

+Header('Cache-Control: private, no-cache, must-revalidate, max_age=0, post-check=0, pre-check=0');

+header ("Pragma: no-cache"); 

+header ("Expires: 0"); 

+

+//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>

+#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; padding-top: 1px;}

+#settingsform .textbox { margin: 1px 0; }

+#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; }

+LABEL { float: left; display: block; width: 50%; text-align: right; padding-right: 10px; clear: left;}

+.row { float: left; width: 99%; }

+a.pophelp{

+    position: relative; /*this is the key*/

+    z-index:24;

+    vertical-align: super;

+}

+

+a.pophelp:hover{z-index:100; border: none;}

+

+a.pophelp span{display: none; position: absolute;}

+

+a.pophelp:hover span{ /*the span will display just on :hover state*/

+    display:block;

+    position:absolute;

+    top:2em; left:4em; width: 225px;

+    border:1px solid #000;

+    background-color:#CCC; color:#000;

+    text-decoration: none;

+    text-align: left;

+    padding: 5px;

+    font-weight: normal;

+}

+</style>

+<link rel=\"stylesheet\" type=\"text/css\" href='../default_tpls/style.css'></head>";

+

+$output = "";

+define("_BASEDIR", "../");

+

+include ("../includes/class.TemplatePower.inc.php");

+include("../config.php");

+if(isset($_GET['step']) && $_GET['step'] > 2) {

+	$settings = dbquery("SELECT tableprefix, language FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".$sitekey."'");

+	list($tableprefix, $language) = dbrow($settings);

+	define("TABLEPREFIX", $tableprefix);

+	define("SITEKEY", $sitekey);

+}

+if(isset($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 ("../languages/en.php");

+include ("../languages/en_admin.php");

+include("languages/en.php");

+}

+//  So I don't have to keep updating the version number in 3 different files.

+include("../version.php");

+

+$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", "Upgrade eFiction 2.0.X to eFiction $version");

+$tpl->gotoBlock( "_ROOT" );

+$tpl->newBlock("footer");

+$tpl->assign( "footer", "eFiction $version &copy; 2006. <a href='http://efiction.org/'>http://efiction.org/</a>");

+$tpl->gotoBlock( "_ROOT" );

+

+switch($_GET['step']) {

+	case "19":

+		$output .= "<div id='pagetitle'>"._OPTIMIZEDB."</div>";

+

+		if(isset($_GET['install'])) {

+			if($_GET['install'] == "automatic") {

+				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("alter table ".TABLEPREFIX."fanfiction_comments drop index nid;");

+				dbquery("alter table ".TABLEPREFIX."fanfiction_comments add index commentlist (nid,time);");

+				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,subseriesid);");

+				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);");

+				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'");

+				$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(uid) as totalm FROM ".TABLEPREFIX."fanfiction_authors");

+				list($members) = dbrow($authorquery);

+

+				list($newest) = dbrow(dbquery("SELECT uid as uid FROM ".TABLEPREFIX."fanfiction_authors ORDER BY uid 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 series = '$totalseries', chapters = '$chapters', members = '$members', newestmember = '$newest', reviews = '$reviews', reviewers = '$reviewers' WHERE sitekey = '".SITEKEY."'"); 

+				$alltables = dbquery("SHOW TABLES");

+				while ($table = dbassoc($alltables)) {

+					foreach ($table as $db => $tablename) {

+						dbquery("OPTIMIZE TABLE `".$tablename."`");

+					}

+				}

+				$output .= write_message(_DONE."<br />"._UPGRADEEND);

+			}

+			else {

+				$output .= write_message(_OPTIMIZEMANUAL." "._UPGRADEEND);

+			}

+		}

+		else $output .= write_message(_OPTIMIZEINFO."<br /><br /><a href='upgrade20.php?step=19&amp;install=automatic'>"._AUTO."</a> "._OR." <a href='upgrade20.php?step=19&amp;install=manual'>"._MANUAL2."</a>");

+	break;

+	case "18":

+		$output .= "<div id='pagetitle'>"._SERIESREVIEWS."</div>";

+		if(isset($_GET['install'])) {

+

+

+	

+			$series = dbquery("SELECT seriesid FROM ".TABLEPREFIX."fanfiction_series");

+			if(dbnumrows($series)) {

+				while($s = dbassoc($series)) {

+					$thisseries = $s['seriesid'];

+					include("../includes/seriesreviews.php");

+				}

+			}

+			$output .= write_message("<a href='upgrade20.php?step=19'>"._CONTINUE."</a>");				

+		}

+		else $output .= write_message(_SERIESREVIEWSINFO."<br /><a href='upgrade20.php?step=18&amp;install=automatic'>"._CONTINUE."</a>");

+	break;

+	case "17":

+		$output .= "<div id='pagetitle'>"._NEWSUPDATE."</div>";

+		if(isset($_GET['install'])) {

+

+

+

+	

+			$comments = dbquery("SELECT uname FROM ".TABLEPREFIX."fanfiction_comments GROUP BY uname");

+			while($uname = dbassoc($comments)) {

+				unset($uid);

+				$nameinfo = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_authors WHERE penname = '".$uname['uname']."'");

+				list($uid) = dbrow($nameinfo);

+				if(empty($uid)) $uid = 0;

+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_comments SET uname = '$uid' WHERE uname = '".$uname['uname']."'");

+			}

+			$result2 = dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_comments` CHANGE `uname` `uid` INT NOT NULL DEFAULT '0';");

+			$output .= write_message(_NEWSUPDATERESULT.($result2 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));	

+			$output .= write_message("<a href='upgrade20.php?step=18'>"._CONTINUE."</a>");				

+

+		}

+		else $output .= write_message(_NEWSUPDATEINFO."<br /><a href='upgrade20.php?step=17&amp;install=automatic'>"._CONTINUE."</a>");

+

+	break;

+	case "16":

+		$output .= "<div id='pagetitle'>"._AUTHORUPDATE."</div>";

+		if(isset($_GET['install'])) {

+

+

+			$settings = dbquery("SELECT tableprefix, defaultsort, displayindex, tinyMCE FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".SITEKEY."'");

+			list($defaultsort, $displayindex, $tinyMCE) = dbrow($settings);

+			$fix = dbquery("UPDATE ".TABLEPREFIX."fanfiction_authors SET ageconsent = 0 WHERE ageconsent != 1");

+			$result = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_authorprefs(`uid`, `newreviews`, `ageconsent`, `alertson`, `validated`, `userskin`, `level`, `categories`, `contact`) SELECT uid, newreviews, ageconsent, alertson, validated, userskin, level, categories, contact FROM ".TABLEPREFIX."fanfiction_authors");

+			$result2 = dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorprefs set sortby = '$defaultsort', storyindex = '$displayindex', tinyMCE = '$tinyMCE'");

+			$output .= write_message(_AUTHORRESULT.($result ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$fields = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_authorfields WHERE field_on = 1");

+			while($f = dbassoc($fields)) {

+				$result = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_authorinfo(`uid`, `info`) SELECT uid, ".$f['field_name']." FROM ".TABLEPREFIX."fanfiction_authors WHERE ".$f['field_name']." IS NOT NULL AND ".$f['field_name']." != ''");

+				$result2 = dbquery("UPDATE ".TABLEPREFIX."fanfiction_authorinfo SET field = ".$f['field_id']." WHERE field = 0");

+			}

+			$result2 = dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_authors` DROP `newreviews`, DROP `validated`, DROP `userskin`, DROP `level`, DROP `contact`, DROP `categories`, DROP `ageconsent`, DROP `betareader`, DROP `alertson`, DROP `AOL`, DROP `Yahoo`, DROP `ICQ`, DROP `MSN`;");

+			$output .= write_message(_AUTHORDROPRESULT.($result2 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));	

+			$output .= write_message("<a href='upgrade20.php?step=17'>"._CONTINUE."</a>");				

+

+		}

+		else $output .= write_message(_AUTHORUPDATEINFO."<br /><a href='upgrade20.php?step=16&amp;install=automatic'>"._CONTINUE."</a>");

+	break;

+	case "15":

+		$output .= "<div id='pagetitle'>"._AUTHORFIELDS."</div>";

+		include("../config.php");

+		$settings = dbquery("SELECT tableprefix FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".SITEKEY."'");

+

+		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." "._FIELDUPDATE."<br /><br /> <a href='upgrade20.php?step=16'>"._CONTINUE."</a>");

+			}

+			else {

+				$output .= write_message(_FIELDMANUAL," "._FIELDUPDATE."<br /><br /><a href='upgrade20.php?step=16'>"._CONTINUE."</a>");

+			}

+		}

+		else $output .= write_message(_FIELDDATAINFO."<br /><br /><a href='upgrade20.php?step=15&amp;install=automatic'>"._AUTO."</a> "._OR." <a href='upgrade20.php?step=15&amp;install=manual'>"._MANUAL2."</a>");

+	break;

+	case "14":

+		$output .= "<div id='pagetitle'>"._CHALLENGEUPDATE."</div>";

+		include("../config.php");

+		$settings = dbquery("SELECT tableprefix FROM ".$settingsprefix."fanfiction_settings WHERE sitekey = '".SITEKEY."'");

+

+		$challenges = dbquery("SELECT chalid, characters FROM ".TABLEPREFIX."fanfiction_challenges");

+		if(dbnumrows($challenges)) {

+			if(isset($_GET['install'])) {

+				$altersettings = dbquery("ALTER TABLE `".$settingsprefix."fanfiction_settings` ADD `anonchallenges` TINYINT( 1 ) NOT NULL DEFAULT 0");

+				$output .= write_message(_CHALLENGESETTING.($altersettings ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+				$alter = dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_challenges` ADD `responses` int(11) NOT NULL DEFAULT 0");

+				$output .= write_message(_CHALLENGESALTER.($alter ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+				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/stats.php\");', 'sitestats', 'challenges');");

+				$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');");

+				$adminquery = dbquery("SELECT count(panel_id) FROM `".TABLEPREFIX."fanfiction_panels` WHERE panel_type = 'A' AND panel_hidden = '0'");

+				list($adminpanels) = dbrow($adminquery);

+				$adminpanels++;

+				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/admin.php', '1', $adminpanels, 0, 'A');");

+				$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', 'browse.php?type=challenges', '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);");

+				$characters = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_characters");

+				while($char = dbassoc($characters)) {

+					$charlist[stripslashes($char['charname'])] = $char['charid'];

+				}

+				while($c = dbassoc($challenges)) {

+					unset($newchars, $count, $count1, $count2);

+					if($c['characters']) {

+						$chars = explode(",", $c['characters']);

+						foreach($chars as $char) {

+							if(isset($charlist[$char])) $newchars[] = $charlist[$char];

+						}

+					}

+					$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', characters = '".(isset($newchars) ? implode(",", $newchars) : "")."' WHERE chalid = $c[chalid]");

+				}

+				$output .= write_message("<a href='upgrade20.php?step=15'>"._CONTINUE."</a>");				

+			}

+			else $output .= write_message(_CHALLENGEUPDATEINFO."<br /><a href='upgrade20.php?step=14&amp;install=automatic'>"._CONTINUE."</a>");

+		}

+		else $output .= write_message(_CHALLENGESEMPTY."<a href='upgrade20.php?step=15'>"._CONTINUE."</a>");

+	break;

+	case "13":

+		$output .= "<div id='pagetitle'>"._FAVUPDATE."</div>";

+		if(isset($_GET['install'])) {

+

+

+	

+			$favst = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_favorites(uid, item, type) SELECT uid, sid, 'ST' FROM ".TABLEPREFIX."fanfiction_favstor");

+			$output .= write_message(_FAV1.($favst ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$favse = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_favorites(uid, item, type) SELECT uid, seriesid, 'SE' FROM ".TABLEPREFIX."fanfiction_favseries");

+			$output .= write_message(_FAV2.($favse ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$favau = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_favorites(uid, item, type) SELECT uid, favuid, 'AU' FROM ".TABLEPREFIX."fanfiction_favauth");

+			$output .= write_message(_FAV3.($favau ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$drop1 = dbquery("DROP TABLE `".TABLEPREFIX."fanfiction_favstor`");

+			$output .= write_message(_FAV4.($drop1 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$drop2 = dbquery("DROP TABLE `".TABLEPREFIX."fanfiction_favseries`");

+			$output .= write_message(_FAV5.($drop2 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$drop3 = dbquery("DROP TABLE `".TABLEPREFIX."fanfiction_favauth`");

+			$output .= write_message(_FAV6.($drop3 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$output .= write_message("<a href='upgrade20.php?step=14'>"._CONTINUE."</a>");		

+		}

+		else $output .= write_message(_FAVUPDATEINFO."<br /><a href='upgrade20.php?step=13&amp;install=automatic'>"._CONTINUE."</a>");

+	break;

+	case "12":

+		$output .= "<div id='pagetitle'>"._REVIEWUPDATE."</div>";

+		if(isset($_GET['install'])) {

+

+

+	

+			$alter = dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_reviews` CHANGE `sid` `item` INT( 11 ) NOT NULL DEFAULT '0'");

+			$output .= write_message(_REVIEWALTER1.($alter ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$alter2 = dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_reviews` ADD `type` VARCHAR( 2 ) NOT NULL DEFAULT 'ST'");

+			$output .= write_message(_REVIEWALTER2.($alter2 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$alter3 = dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_reviews` CHANGE `member` `uid` INT( 11 ) NOT NULL DEFAULT '0'");

+			$output .= write_message(_REVIEWALTER3.($alter3 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$update1 = dbquery("UPDATE ".TABLEPREFIX."fanfiction_reviews SET type = 'ST' WHERE item > 0");

+			$output .= write_message(_REVIEWUPDATE1.($update1 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$update2 = dbquery("UPDATE ".TABLEPREFIX."fanfiction_reviews SET type = 'SE', item = seriesid WHERE seriesid > 0");

+			$output .= write_message(_REVIEWUPDATE2.($update2 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$alter4 = dbquery("ALTER TABLE `".TABLEPREFIX."fanfiction_reviews` DROP `seriesid`");

+			$output .= write_message(_REVIEWALTER4.($alter4 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$output .= write_message("<a href='upgrade20.php?step=13'>"._CONTINUE."</a>");

+		}

+		else $output .= write_message(_REVIEWUPDATEINFO."<br /><a href='upgrade20.php?step=12&amp;install=automatic'>"._CONTINUE."</a>");

+

+	break;

+	case "11":

+		$output .= "<div id='pagetitle'>"._UPDATESTORIES."</div>";

+		if(isset($_GET['install'])) {

+

+

+	

+			$characters = dbquery("SELECT charid, charname FROM ".TABLEPREFIX."fanfiction_characters");

+				while($char = dbassoc($characters)) {

+				$character[stripslashes($char[charname])] = $char[charid];

+			}

+			$ratlist = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_ratings");

+			while($rate = dbassoc($ratlist)) {

+				$ratingslist[$rate['rating']] = $rate['rid'];

+			}

+			$classresults = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_classes");

+			while($class = dbassoc($classresults)) {

+				$classlist[$class['class_name']] = array("id" => $class['class_id'], "type" => $class['class_type'], "name" => $class['class_name']);

+			}

+			$offset = isset($_GET['offset']) ? $_GET['offset'] : 0;

+			$stories = dbquery("SELECT sid, gid, wid, charid, rid FROM ".TABLEPREFIX."fanfiction_stories LIMIT $offset, 200");

+			while($story = dbassoc($stories)) {

+				unset($genres, $warnings, $g, $w, $classes, $characters, $c, $clist, $rid);

+				$characters = explode(",", $story['charid']);

+				foreach($characters as $c) {

+					$clist[] = $character[$c];

+				}

+				$genres = explode(",", $story['gid']);

+				foreach($genres as $g) {

+					if($g && $g != " " && $classlist[$g]['type'] == 1) $classes[] = $classlist[$g]['id'];

+				}

+				$warnings = explode(",", $story['wid']);

+				foreach($warnings as $w) {

+					if($w && $w != " " && $classlist[$w]['type'] == 2) $classes[] = $classlist[$w]['id'];

+				}

+				$rid = $ratingslist[$story['rid']];

+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_stories SET rid = '$rid', classes = '".($classes ? implode(",", $classes) : "")."', charid = '".($clist ? implode(",", $clist) : "")."' WHERE sid = '$story[sid]'");

+			}

+			if(dbnumrows($stories)) $output .= write_message(_STORIES." ".($offset + 1)."-".($offset + dbnumrows($stories)).".<br /><a href='upgrade20.php?step=11&amp;install=automatic&amp;offset=".($offset+200)."'>"._CONTINUE."</a>");

+			else {

+				$seriesquery = dbquery("SELECT seriesid, genres, warnings FROM ".TABLEPREFIX."fanfiction_series");

+				while($series = dbassoc($seriesquery)) {

+					unset($genres, $warnings, $g, $w, $classes);

+					$genres = explode(",", $series[genres]);

+					foreach($genres as $g) {

+						if($g && $g != " " && $classlist[$g]['type'] == 1) $classes[] = $classlist[$g]['id'];

+					}

+					$warnings = explode(",", $series[warnings]);

+					foreach($warnings as $w) {

+						if($w && $w != " " && $classlist[$w]['type'] == 2) $classes[] = $classlist[$w]['id'];

+					}

+					dbquery("UPDATE ".TABLEPREFIX."fanfiction_series SET classes = '".($classes ? implode(",", $classes) : "")."' WHERE seriesid = '$series[seriesid]'");

+				}

+				dbquery("UPDATE ".TABLEPREFIX."fanfiction_inseries SET confirmed = 1");

+				$drop1 = dbquery("ALTER TABLE ".TABLEPREFIX."fanfiction_stories drop `gid`, drop `wid`;");

+				$output .= write_message(_DROPGWSTORIES.($drop1 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));				

+				$output .= write_message((dbnumrows($seriesquery) ? _SERIES." 1-".dbnumrows($seriesquery)."<br />" : "")."<a href='upgrade20.php?step=12'>"._CONTINUE."</a>");

+			}

+		}

+		else $output .= write_message(_UPDATESTORIESINFO."<br /><a href='upgrade20.php?step=11&amp;install=automatic'>"._CONTINUE."</a>");

+	break;

+	case "10":

+		$output .= "<div id='pagetitle'>"._UPDATESTORIESTABLE."</div>";

+		if(isset($_GET['install'])) {

+			if($_GET['install'] == "automatic") {

+	

+

+		

+				$result = dbquery("ALTER TABLE ".TABLEPREFIX."fanfiction_stories ADD `classes` VARCHAR( 200 ) NULL AFTER `catid`;");

+				$result = dbquery("ALTER TABLE ".TABLEPREFIX."fanfiction_series ADD `classes` VARCHAR( 200 ) NULL AFTER `catid`;");

+				$result = dbquery("ALTER TABLE ".TABLEPREFIX."fanfiction_series CHANGE `owner` `uid` INT( 11 ) NOT NULL DEFAULT '0'");

+				$result = dbquery("ALTER TABLE ".TABLEPREFIX."fanfiction_stories CHANGE `summary` `summary` TEXT NULL");

+				$result = dbquery("ALTER TABLE ".TABLEPREFIX."fanfiction_series CHANGE `summary` `summary` TEXT NULL");

+				$result = dbquery("ALTER TABLE ".TABLEPREFIX."fanfiction_stories ADD `coauthors` tinyint(1) NOT NULL default '0' AFTER `uid`");

+				$result = dbquery("ALTER TABLE ".TABLEPREFIX."fanfiction_stories ADD `count` INT( 11 ) NOT NULL DEFAULT '0' AFTER `reviews`;");

+				$result = dbquery("ALTER TABLE ".TABLEPREFIX."fanfiction_stories ADD `storynotes` TEXT NULL AFTER `summary`;");

+				$result = dbquery("ALTER TABLE ".TABLEPREFIX."fanfiction_chapters ADD `endnotes` TEXT NULL AFTER `storytext`;");

+				$result = dbquery("ALTER TABLE ".TABLEPREFIX."fanfiction_chapters ADD `count` INT( 11 ) NOT NULL DEFAULT '0' AFTER `uid`;");

+

+				if($result) $output .= write_message(_ACTIONSUCCESSFUL."<br /> <a href='upgrade20.php?step=11'>"._CONTINUE."</a>");

+			}

+			else if($_GET['install'] == "manual") {

+				$output .= write_message(_UPDATESTORIESTABLEMANUAL."<br /> <a href='upgrade20.php?step=11'>"._CONTINUE."</a>");

+			}

+		}

+		else {

+

+			$output .= write_message(_UPDATESTORIESTABLEINFO." <a href='upgrade20.php?step=10&amp;install=automatic'>"._AUTO."</a> "._OR." <a href='upgrade20.php?step=10&amp;install=manual'>"._MANUAL2."</a>");

+		}

+	break;

+	case "9":

+		$output .= "<div id='pagetitle'>"._MOVECLASSES."</div>";

+		if(isset($_GET['install'])) {

+

+

+	

+			$newclass = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_classtypes (`classtype_name`, `classtype_title`) VALUES('genres', 'Genres');");

+			$genres = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_genres");

+			$output .= "<table class='tblborder' style='margin: 1em auto; padding: 1em;' cellpadding='5'><tr><th>Genres</th><th>Result</th></tr>";

+			while($g = dbassoc($genres)) {

+				$result = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_classes (`class_type`, `class_name`) VALUES('1', '".$g['genre']."')");

+				$output .= "<tr><td>".$g['genre']."</td><td align='center'>" . ($result ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") ."</td></tr>";

+			}

+			$output .= "</table>";

+			// Ditto with the warnings

+			$newclass = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_classtypes (`classtype_name`, `classtype_title`) VALUES('warnings', 'Warnings');");

+			$output .= "<table class='tblborder' style='margin: 1em auto; padding: 1em;' cellpadding='5'><tr><th>Warnings</th><th>Result</th></tr>";

+			$warnings = dbquery("SELECT * FROM ".TABLEPREFIX."fanfiction_warnings");

+			while($w = dbassoc($warnings)) {

+				$result = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_classes (`class_type`, `class_name`) VALUES('2', '$w[warning]')");

+				$output .= "<tr><td>".$w['warning']."</td><td align='center'>" . ($result ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") ."</td></tr>";

+			}

+			$output .= "</table>";

+			$drop1 = dbquery("DROP TABLE `".TABLEPREFIX."fanfiction_genres`");

+			$output .= write_message(_DROPGENRES.($drop1 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			$drop2 = dbquery("DROP TABLE `".TABLEPREFIX."fanfiction_warnings`");

+			$output .= write_message(_DROPWARNINGS.($drop2 ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">"));

+			

+			$output .= write_message(_MOVECLASSFAIL."<br /><a href='upgrade20.php?step=10'>continue</a>");

+		}

+		else $output .= write_message(_MOVECLASSESINFO."<br /><a href='upgrade20.php?step=9&amp;install=automatic'>"._CONTINUE."</a>");

+	break;

+	case "8":

+		$output .= "<div id='pagetitle'>"._MESSAGEDATA."</div>";

+		if(isset($_GET['install'])) {

+			if($_GET['install'] == "automatic") {

+	

+

+		

+				$directory = opendir("../messages");

+				$output .= "<table class='tblborder' style='margin: 1em auto; padding: 1em;' cellpadding='5'><tr><th>Message</th><th>Result</th></tr>";

+				while($filename = readdir($directory)) {

+					if($filename=="." || $filename=="..") continue;

+					$text = "";

+					$out = fopen ("../messages/".$filename, "r");

+					while (!feof($out)) { $text .= fgets($out, 10000); }

+					$msgname = substr($filename, 0, strrpos($filename, "."));

+					$msg = dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_messages` (`message_name`, `message_title`, `message_text`) VALUES ('$msgname', '".$defaulttitles[$msgname]."', '".addslashes($text)."');");

+				$output .= "<tr><td>".$defaulttitles[$msgname]."</td><td align='center'>" . ($msg ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") ."</td></tr>";

+				}

+				$msg = dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_messages` (`message_name`, `message_title`, `message_text`) VALUES('maintenance', 'Site Maintenance', '<p style=\"text-align: center;\">This site is currently undergoing maintenance.  Please check back soon.  Thank you.</p>');");

+				$msg = dbquery("INSERT INTO `".TABLEPREFIX."fanfiction_messages` (`message_name`, `message_title`, `message_text`) VALUES ('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>";

+				$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 /><a href='upgrade20.php?step=9'>continue</a>");

+			}

+		}

+		else $output .= write_message(_MESSAGEDATAUPGRADE."<br /><a href='upgrade20.php?step=8&amp;install=automatic'>"._CONTINUE."</a>");

+

+	break;

+	case "7":

+		$output .= "<div id='pagetitle'>"._BLOCKDATA."</div>";

+		if(isset($_GET['install'])) {

+			if($_GET['install'] == "automatic") {

+	

+				include("../blocks_config.php");

+				$blocks['news']['num'] = 1;

+				$blocks['recent']['num'] = 1;

+				define("_BASEDIR", "../");

+

+		

+				$output .= "<table class='tblborder' style='margin: 1em auto; padding: 1em;' cellpadding='5'><tr><th>Block</th><th>Result</th></tr>";

+				foreach($blocks as $block =>$value) {

+					unset($blockvars);

+					foreach($value as $var=>$val) {

+						if($var != "name" && $var != "title" && $var != "file" && $var != "status") $blockvars[$var] = $val;

+					}

+					$b = dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_blocks (`block_name`, `block_title`, `block_file`, `block_status`, `block_variables`) VALUES('$block', '".escapestring($value['title'])."', '".$value['file']."', '".$value['status']."', '".($blockvars ? addslashes(serialize($blockvars)) : "")."');");

+					$output .= "<tr><td>".$value['title']."</td><td align='center'>" . ($b ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") ."</td></tr>";

+				}

+				$output .= "</table>";

+				$output .= write_message(_BLOCKDATAFAILUPGRADE."<br /><a href='upgrade20.php?step=8'>"._CONTINUE."</a>");

+			}

+		}

+		else $output .= write_message(_BLOCKDATAUPGRADE." <br /><a href='upgrade20.php?step=7&amp;install=automatic'>"._CONTINUE."</a>");

+	break;

+	case "6":

+		$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"),

+					array("genres_link", "Genres", "browse.php?type=class&amp;type_id=1", "0", "0"),

+					array("warnings_link", "Warnings", "browse.php?type=class&amp;type_id=2", "0", "0")

+				);

+				$output .= "<table class='tblborder' style='margin: 1em auto; padding: 1em;' cellpadding='5'><tr><th>Pages</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 /><a href='upgrade20.php?step=7'>"._CONTINUE."</a>");

+			}

+			else {

+				$output .= write_message(_LINKMANUAL."<br /><a href='upgrade20.php?step=7'>"._CONTINUE."</a>");

+			}

+		}

+		else $output .= write_message(_LINKDATAINFO." "._LINKSETUP." <a href='upgrade20.php?step=6&amp;install=automatic'>automatic</a> "._OR." <a href='upgrade20.php?step=6&amp;install=manual'>manual</a>");

+	break;

+	case "5":

+		$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("manfavs","Manage Favorites","","1","4","0","U"),

+					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("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 /> <a href='upgrade20.php?step=6'>"._CONTINUE."</a>");

+			}

+			else {

+				$output .= write_message(_PANELMANUAL."<br /> <a href='upgrade20.php?step=6'>"._CONTINUE."</a>");

+			}

+		}

+		else $output .= write_message(_PANELDATAINFO." "._PANELSETUP." <a href='upgrade20.php?step=5&amp;install=automatic'>"._AUTO."</a> "._OR." <a href='upgrade20.php?step=5&amp;install=manual'>"._MANUAL2."</a>");

+	break;

+	case "4":

+		$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 `".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`)

+) TYPE=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 `".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`)) TYPE=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 `".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`)

+) TYPE=MyISAM;");

+$output .= "<tr><td>".TABLEPREFIX."fanfiction_authorprefs</td><td align='center'>" . ($authorprefs ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") ."</td></tr>";				

+				$blocks = dbquery("CREATE TABLE `".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`)

+) TYPE=MyISAM;");

+$output .= "<tr><td>".TABLEPREFIX."fanfiction_blocks</td><td align='center'>" . ($blocks ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") ."</td></tr>";

+				$classes = dbquery("CREATE TABLE `".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`)

+) TYPE=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 `".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`)

+) TYPE=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 `".TABLEPREFIX."fanfiction_coauthors` (

+  `sid` int(11) NOT NULL default '0',

+  `uid` int(11) NOT NULL default '0',

+  PRIMARY KEY  (`sid`,`uid`)

+) TYPE=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 `".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`)

+) TYPE=MyISAM;");

+$output .= "<tr><td>".TABLEPREFIX."fanfiction_codeblocks</td><td align='center'>" . ($codeblocks ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") ."</td></tr>";

+				$favorites = dbquery("CREATE TABLE `".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`)

+) TYPE=MyISAM;");

+$output .= "<tr><td>".TABLEPREFIX."fanfiction_favorites</td><td align='center'>" . ($favorites ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") ."</td></tr>";

+				$logs = dbquery("CREATE TABLE `".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` timestamp NOT NULL,

+  `log_type` varchar(2) NOT NULL,

+  PRIMARY KEY  (`log_id`)

+) TYPE=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 `".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`)

+) TYPE=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 `".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>";

+				$pagelinks = dbquery("CREATE TABLE `".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`)

+) TYPE=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 `".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`)

+) TYPE=MyISAM;");

+$output .= "<tr><td>".TABLEPREFIX."fanfiction_panels</td><td align='center'>" . ($panels ? "<img src=\"../images/check.gif\">" : "<img src=\"../images/X.gif\">") ."</td></tr>";

+	$stats = 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'

+) TYPE=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>";

+$output .= "</table>";

+$output .= write_message(_NEWTABLEAUTOFAIL."<br /> <a href='upgrade20.php?step=5'>"._CONTINUE."</a>");

+			}

+			else if($_GET['install'] == "manual") {

+				$output .= write_message(_NEWTABLESSETUP."<br /> <a href='upgrade20.php?step=5'>"._CONTINUE."</a>");

+			}

+		}

+		else {

+

+			$output .= write_message(_NEWTABLESSETUP." <a href='upgrade20.php?step=4&amp;install=automatic'>"._AUTO."</a> "._OR." <a href='upgrade20.php?step=4&amp;install=manual'>"._MANUAL2."</a>");

+		}

+	break;

+	case "3":			

+		if(!$_GET['sect']) $sect = "main";

+		else $sect = $_GET['sect'];

+		$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 = stripslashes($val);

+		}

+		define("SITEKEY", $sitekey);

+		define("TABLEPREFIX", $tableprefix);

+		define("STORIESPATH", $settings['storiespath']);

+		if($sect == "submissions") {

+			if($_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($sect == "main" && !isset($_POST['submit'])) $output .= write_message(_SKINWARNING);

+		if($sect == "email" && $_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='upgrade20.php?step=4'>"._CONTINUE."</a>");

+			}

+			else include("../admin/settings.php");

+		}

+		else include("../admin/settings.php");

+	break;

+	case "2":

+		$output .= "<div id='pagetitle'>"._CONFIGDATA."</div>";

+

+		if(isset($_POST['sitekey'])) {

+			include("../naughtywords.php");

+			// relative path

+			if(file_exists("../".$databasepath."/dbconfig.php")) include("../".$databasepath."/dbconfig.php");

+			// absolute path

+			else if(file_exists($databasepath."/dbconfig.php")) include($databasepath."/dbconfig.php");

+			include_once("../includes/dbfunctions.php");

+			$dbconnect = dbconnect($dbhost, $dbuser, $dbpass, $dbname );

+			$sitekey = !empty($_POST['sitekey']) ? descript($_POST['sitekey']) : random_string($randomcharset, 10);

+			$settingsprefix = descript($_POST['settingsprefix']);

+			$sitesettings = dbquery("INSERT INTO ".$settingsprefix."fanfiction_settings(

+				`sitekey`, `sitename`, `slogan`, `url`, `siteemail`, `tableprefix`, `skin`, `language`, 

+				`submissionsoff`, `storiespath`, `store`, `autovalidate`, `maxwords`, `minwords`, 

+				`imageupload`, `imageheight`, `imagewidth`, `roundrobins`, `tinyMCE`, `allowed_tags`, 

+				`favorites`, `multiplecats`, `newscomments`, `recentdays`, `displaycolumns`,

+				`itemsperpage`, `displayindex`, `defaultsort`, `reviewsallowed`, `ratings`, 

+				`anonreviews`, `revdelete`, `rateonly`, `pwdsetting`, `alertson`, `disablepopups`, 

+				`agestatement`, `words`, `smtp_host`, `smtp_username`, `smtp_password`) VALUES(

+				'".$sitekey."', '".addslashes(stripslashes($sitename))."', '".addslashes(stripslashes($slogan))."', '".addslashes($url)."', '".addslashes($siteemail)."',

+				'$tableprefix', '$skin', '$language', $submissionsoff, '".addslashes($storiespath)."', '$store', $autovalidate,

+				".($maxwords ? $maxwords : 0).", ".($minwords ? $minwords : 0).", $imageupload, ".($imageheight ? $imageheight : 0).", 

+				".($imagewidth ? $imagewidth : 0).", $roundrobins, $tinyMCE, '".addslashes($allowed_tags)."',

+				$favorites, ".($numcats == 1 ? 0 : 1).", $newscomments, ".($recentdays ? $recentdays : 0).", ".($columns ? $columns : 1).",

+				".($itemsperpage > 0 ? $itemsperpage : 10).", ".($displayindex ? 1 : 0)." , ".($defaultsort ? 1 : 0).", 

+				".($reviewsallowed ? 1 : 0).", ".($ratings ? $ratings : 0).",

+				".($anonreviews ? 1 : 0).", ".($revdelete  ? 1 : 0).", ".($rateonly ? 1 : 0).", 

+				".($pwdsetting ? 1 : 0).", ".($alertson ? 1 : 0).", ".($disablePopups ? 1 : 0).",

+				 ".($agestatement ? 1 : 0).", '".implode(",", $words)."', '".addslashes($smtp_host)."', 

+				'".addslashes($smtp_username)."', '".addslashes($smtp_password)."');");

+			if($sitesettings) $output .= write_message("<img src=\"../images/check.gif\">"._SITESETTINGSMOVED);

+			$handle = fopen("../config.php", 'w');

+			if(!$handle) {

+				@chmod("../config.php", 0666);

+				$handle = fopen("../config.php", 'w');

+			}

+			if ($handle) {

+				$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("<img src=\"../images/check.gif\">"._CONFIG_WRITTEN."<br /><a href='upgrade20.php?step=3'>"._CONTINUE."</a>");

+			}

+			else $output .= write_message(_ERROR_CONFIGWRITE);						

+		}

+		else {

+			$output .=  

+				"<form method='POST' enctype='multipart/form-data' action='upgrade20.php?step=2' class='tblborder' style='width: 325px; margin: 1em auto;'>

+						<label for='sitekey'>"._SITEKEY."</label><input type='text' name='sitekey' value='".random_string($randomcharset, 10)."' id='sitekey'><br />

+						<input type='hidden' name='settingsprefix' value='".$_GET['settingsprefix']."'>

+						<div style='text-align: center; margin: 1em;'><INPUT type=\"submit\"class=\"button\" name=\"submit\" value=\"submit\"></div>

+					</form>";

+			$output .= write_message(_HELP_SITEKEY." "._SITEKEYNOTE);

+		}

+	break;

+	default:

+		$output .= "<div id='pagetitle'>"._SETTINGSTABLE."</div>";

+

+		if(isset($_POST['submit'])) {

+			// relative path

+			if(file_exists("../".$databasepath."/dbconfig.php")) include("../".$databasepath."/dbconfig.php");

+			// absolute path

+			else if(file_exists($databasepath."/dbconfig.php")) include($databasepath."/dbconfig.php");

+			include("../includes/dbfunctions.php");

+			$dbconnect = dbconnect($dbhost, $dbuser, $dbpass, $dbname );

+			$set1 = dbquery("DROP TABLE IF EXISTS ".$_POST['settingsprefix']."fanfiction_settings");

+								$settings = dbquery("CREATE TABLE `".$_POST['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) 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 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`)

+) TYPE=MyISAM;");

+if($settings) $output .= write_message("<img src=\"../images/check.gif\"> "._SETTINGSTABLESUCCESS." <br /><a href='upgrade20.php?step=2&amp;settingsprefix=".$_POST['settingsprefix']."'>"._CONTINUE."</a>");

+else $output .= write_message(_SETTINGSTABLEAUTOFAIL." <br /><a href='upgrade20.php?step=2&amp;settingsprefix=".$_POST['settingsprefix']."'>"._CONTINUE."</a> ");

+		}

+		else {

+			$install = isset($_GET['install']) ? $_GET['install'] : false;

+			if($install == "manual") {

+				$output .= write_message(_SETTINGSTABLEMANUALUP."<br /><a href='upgrade20.php?step=2'>"._CONTINUE."</a>");

+			}

+			else if($install == "automatic") {

+				$output .=  

+					"<form method='POST' enctype='multipart/form-data' action='upgrade20.php?step=1' class='tblborder' style='width: 325px; margin: 1em auto;'>

+						<label for='settingsprefix'>"._SETTINGSPREFIX."</label><input type='text' name='settingsprefix' id='settingsprefix' value='".$tableprefix."'><br />

+						<div style='text-align: center; margin: 1em;'><INPUT type=\"submit\"class=\"button\" name=\"submit\" value=\"submit\"></div>

+					</form>";

+				$output .= write_message(_SETTINGSTABLENOTE);

+			}

+			else { 

+				$output .= write_message(_SETTINGSTABLESETUP." <a href='upgrade20.php?install=automatic'>"._AUTO."</a> "._OR." <a href='upgrade20.php?install=manual'>"._MANUAL2."</a>");

+			}

+		}

+}

+$tpl->assign("output", $output);

+

+$tpl->printToScreen();

+dbclose( );

+?>

file:b/languages/en.php (new)
--- /dev/null
+++ b/languages/en.php
@@ -1,1 +1,446 @@
-
+<?php

+// Defines the character set for your language/location

+

+define ("_CHARSET", "ISO-8859-1");

+

+// Defines the doc type.  Most people will not need to change this.

+define ("_DOCTYPE", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">");

+

+// 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.");

+?>

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/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 title 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`)

+	) TYPE=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.*, UNIX_TIMESTAMP(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, UNIX_TIMESTAMP(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.*, UNIX_TIMESTAMP(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,420 @@
-
+<?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) {

+					$coauthors = array( );

+					$coQuery = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_coauthors WHERE sid = '$item'");

+					while($c = dbassoc($coQuery)) {

+						$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, $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`) VALUES('".escapestring(sprintf(_LOG_REVIEW, $reviewname, truncate_text($review), $title))."', '0', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'RE')");

+				else dbquery("INSERT INTO ".TABLEPREFIX."fanfiction_log (`log_action`, `log_uid`, `log_ip`, `log_type`) VALUES('".escapestring(sprintf(_LOG_EDIT_REVIEW, USERPENNAME, USERUID, $title, $reviewid))."', '0', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'RE')");

+			}

+		}

+	}

+	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'];

+		if(!empty($story['coauthors'])) {

+			$colist = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_coauthors WHERE sid = '$item'");

+			while($c = dbassoc($colist)) {

+				$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, UNIX_TIMESTAMP(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, UNIX_TIMESTAMP(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, UNIX_TIMESTAMP(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($coauthors) && in_array(USERUID, $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,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

+// ----------------------------------------------------------------------

+

+define("_BASEDIR", "");

+  include_once("includes/dbfunctions.php");    

+  include_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);

+  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/rss+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, UNIX_TIMESTAMP(stories.date) as date, UNIX_TIMESTAMP(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, UNIX_TIMESTAMP(stories.date) as date, UNIX_TIMESTAMP(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`) VALUES('".escapestring(sprintf(_LOG_ADMIN_EDIT_SERIES, USERPENNAME, USERUID, $title, $seriesid))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'ED')");

+				}

+				$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= "author.penname REGEXP '^[^a-z]'";

+			else $letter = "author.penname 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,443 @@
+/* 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;}

 

--- /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,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/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/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,426 @@
-
+/*

+		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 fonts */

+@import url(http://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700|Courgette);

+@import url(http://netdna.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.css); 

+

+/* 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,980 @@
-
+<?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($_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)) {

+			$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)) {

+					$coauthors[] = $c['uid'];

+				}

+			}

+			if($story['uid'] != USERUID && (is_array($coauthors) && !in_array(USERUID, $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(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( );

+	$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($coauthors)) {

+		$au = array_merge($au, $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', now(), now(), '$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', now(), now(), '$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($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 = NOW( ) 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.*, UNIX_TIMESTAMP(s.updated) as updated, UNIX_TIMESTAMP(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>";

+	$sresult = dbquery("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."' ORDER BY title");

+	$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`) VALUES('".escapestring(sprintf(_LOG_ADMIN_EDIT_CHAPTER, USERPENNAME, USERUID, $title, $sid, $chappenname, $chapuid, $inorder))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'ED')");

+			}

+			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( );

+		$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($coauthors)) {

+			$au = array_merge($au, $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`) VALUES('".escapestring(sprintf(_LOG_ADMIN_EDIT_AUTHOR, USERPENNAME, USERUID, $title, $sid, $newpenname, $uid, $oldpenname, $olduid))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'ED')");

+					}

+				}

+

+			}

+			// 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 = NOW( ) 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 = '".(is_array($coauthors) ? implode(",", $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`) VALUES('".escapestring(sprintf(_LOG_ADMIN_EDIT, USERPENNAME, USERUID, $title, $sid, $penname, $uid))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'ED')");

+				}

+			}

+			$output .= write_message(_STORYUPDATED."  ".($admin ? _BACK2ADMIN : _BACK2ACCT));

+			$tpl->assign( "output", $output );

+			$tpl->printToScreen( );

+			dbclose( );

+			exit( );

+		}

+	}

+	$query = dbquery("SELECT DATE_FORMAT(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, UNIX_TIMESTAMP(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.*, UNIX_TIMESTAMP(s.date) as date, UNIX_TIMESTAMP(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`) VALUES('".escapestring(sprintf(_LOG_ADMIN_DEL_CHAPTER, USERPENNAME, USERUID, $story['title'], $sid, $penname, $uid, $inorder))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'DL')");

+			}

+			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

--- /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

 

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, UNIX_TIMESTAMP(stories.date) as date, UNIX_TIMESTAMP(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,334 @@
-
+<?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'

+) TYPE=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`)

+) TYPE=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`)

+			) TYPE=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`)

+			) TYPE=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);");

+	}	

+	$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] < 3))) $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);

+$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'], $_POST['email'], 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`) VALUES('".escapestring(sprintf(_LOG_REGISTER, $penname, $useruid, $_SERVER['REMOTE_ADDR']))."', '".$useruid."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'RG')");

+					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`) VALUES('".escapestring(sprintf(_NEWPEN, USERPENNAME, USERUID, $_POST[oldpenname], $uid, $penname))."', '".USERUID."', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'EB')");

+				}

+			}

+/* 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,129 @@
+<?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");

+	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)) {

+						$pennames[] = $pRes['penname'];

+					}

+					$pennames = implode(", ", $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)) {

+						$pennames[] = $pRes['penname'];

+					}

+					$pennames = implode(", ", $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,  UNIX_TIMESTAMP(stories.date) as date, UNIX_TIMESTAMP(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`) VALUES('".escapestring(sprintf(_LOG_LOST_PASSWORD, $penname, $uid, ($result ? _YES : _NO)))."', '$uid', INET_ATON('".$_SERVER['REMOTE_ADDR']."'), 'LP')");

+			}

+

+		}

+		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 = "";

+		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,90 @@
-
+<?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 *, UNIX_TIMESTAMP(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, UNIX_TIMESTAMP(stories.date) as date, UNIX_TIMESTAMP(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.*, UNIX_TIMESTAMP(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,126 @@
-
+<?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.*, UNIX_TIMESTAMP(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));

+		if(!empty($user['coauthors'])) {

+			$coQuery = dbquery("SELECT uid FROM ".TABLEPREFIX."fanfiction_coauthors WHERE sid = '".$reviews['item']."'");

+			while($c = dbassoc($coQuery)) {

+				$coauthors[] = $c['uid'];

+			}

+		}

+		if(USERUID == $user['uid'] || (!empty($user['coauthors']) && in_array(USERUID, $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, UNIX_TIMESTAMP(stories.date) as date, UNIX_TIMESTAMP(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,4 @@
-
+<?php

+if(!defined("_CHARSET")) exit( );

+$version = "3.5.5";

+?>

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.*, UNIX_TIMESTAMP(story.date) as date, UNIX_TIMESTAMP(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) {

+		$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)) {

+			$coauthors[$c['uid']] = $c['penname'];

+		}

+		$storyinfo['coauthors'] = $coauthors;

+		unset($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['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( );

+?>